-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUseCalendar.js
150 lines (134 loc) · 4.73 KB
/
UseCalendar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// hooks/useCalendar.js
import { useState } from 'react';
/**
* Vérifie si une année est bissextile.
*
* @param {number} year - L'année à vérifier.
* @returns {boolean} - `true` si l'année est bissextile, sinon `false`.
*/
const isLeapYear = (year) => {
return (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0))
}
/**
* Obtient le nombre de jours en février pour une année donnée.
*
* @param {number} year - L'année pour laquelle obtenir le nombre de jours de février.
* @returns {number} - Le nombre de jours en février pour l'année donnée.
*/
const getFebDays = (year) => {
return isLeapYear(year) ? 29 : 28
}
/**
* Hook personnalisé pour gérer les données du calendrier.
*
* @returns {object} - Un objet contenant les propriétés et fonctions du calendrier.
*/
const useCalendar = () => {
// État pour le mois courant
const [currentMonth, setCurrentMonth] = useState(new Date().getMonth())
// État pour l'année courante
const [currentYear, setCurrentYear] = useState(new Date().getFullYear())
// État pour le jour courant
const [currentDay, setCurrentDay] = useState(new Date().getDate())
// État pour afficher ou masquer la liste des mois
const [showMonthList, setShowMonthList] = useState(false)
// État pour la date surlignée
const [highlightedDateState, setHighlightedDateState] = useState(null)
// Noms des mois en anglais
const monthNames = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
]
/**
* Alterne la visibilité de la liste des mois.
*/
const toggleMonthList = () => {
setShowMonthList(prevState => !prevState)
}
/**
* Gère la sélection d'un mois dans la liste.
*
* @param {number} month - L'indice du mois sélectionné (0 pour janvier, 11 pour décembre).
*/
const handleMonthSelect = (month) => {
setCurrentMonth(month)
setShowMonthList(false) // Ferme la liste des mois après la sélection
}
/**
* Génère les jours du calendrier pour un mois et une année donnés.
*
* @param {number} month - Le mois pour lequel générer les jours (0 pour janvier, 11 pour décembre).
* @param {number} year - L'année pour laquelle générer les jours.
* @returns {Array<object>} - Un tableau d'objets représentant les jours du mois.
*/
const generateCalendarDays = (month, year) => {
const daysOfMonth = [
31, getFebDays(year), 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
]
const firstDay = new Date(year, month).getDay()
const days = []
days.forEach(day => {
day.ariaLabel = new Date(year, month, day.day).toLocaleDateString()
})
// Remplit les jours du mois avec les informations nécessaires
for (let i = 0; i < daysOfMonth[month] + firstDay; i++) {
if (i >= firstDay) {
const dayNumber = i - firstDay + 1
days.push({
day: dayNumber,
isCurrentDate: (
dayNumber === new Date().getDate() &&
year === new Date().getFullYear() &&
month === new Date().getMonth()
),
isHighlighted: (
highlightedDateState &&
dayNumber === new Date(highlightedDateState).getDate() &&
year === new Date(highlightedDateState).getFullYear() &&
month === new Date(highlightedDateState).getMonth()
)
})
} else {
days.push({ day: null, isCurrentDate: false, isHighlighted: false })
}
}
return days
}
/**
* Met à jour la date surlignée.
*
* @param {Date} date - La date à surligner.
*/
const setHighlightedDate = (date) => {
if (date instanceof Date && !isNaN(date.getTime())) {
if (!highlightedDateState || date.getTime() !== highlightedDateState.getTime()) {
setHighlightedDateState(date)
}
}
}
/**
* Met à jour le jour courant.
*
* @param {number} day - Le jour à mettre à jour.
*/
const updateCurrentDay = (day) => {
setCurrentDay(day)
}
return {
currentMonth,
currentYear,
currentDay,
monthNames,
generateCalendarDays,
showMonthList,
toggleMonthList,
handleMonthSelect,
setCurrentYear,
setCurrentMonth,
setCurrentDay,
updateCurrentDay,
setHighlightedDate
}
}
export default useCalendar;