mehdi-akbari-calendar 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +466 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +448 -8
- package/dist/index.js.map +1 -1
- package/dist/react.js +449 -4
- package/package.json +9 -9
- package/dist/components/Calendar/Calendar.js +0 -30
- package/dist/components/internal/CalendarHeader.js +0 -10
- package/dist/components/internal/DayCell.js +0 -16
- package/dist/components/internal/MonthPickerView.js +0 -10
- package/dist/components/internal/MonthView.js +0 -7
- package/dist/components/internal/YearView.js +0 -14
- package/dist/hooks/useCalendar.js +0 -139
- package/dist/types/index.js +0 -2
- package/dist/utils/dateAdapter.js +0 -45
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useState, useMemo, useCallback } from 'react';
|
|
3
|
-
// ✅ مرحله ۱: ایمپورت توابع از dateAdapter
|
|
4
|
-
import { getDateFunctions, getWeekDays } from '../utils/dateAdapter';
|
|
5
|
-
export const useCalendar = ({ initialDate = new Date(), minYear = 1300, maxYear = 1405, initialCalendarType = 'jalali', range } = {}) => {
|
|
6
|
-
const [calendarType, setCalendarType] = useState(initialCalendarType);
|
|
7
|
-
const dateFns = useMemo(() => getDateFunctions(calendarType), [calendarType]);
|
|
8
|
-
const effectiveMinYear = calendarType === 'gregorian' && minYear === 1300 ? 1920 : minYear;
|
|
9
|
-
const effectiveMaxYear = calendarType === 'gregorian' && maxYear === 1405 ? 2030 : maxYear;
|
|
10
|
-
const [viewMode, setViewMode] = useState('day');
|
|
11
|
-
const [currentDate, setCurrentDate] = useState(dateFns.startOfMonth(initialDate));
|
|
12
|
-
const [selectedDate, setSelectedDate] = useState(initialDate);
|
|
13
|
-
const daysOfMonth = useMemo(() => {
|
|
14
|
-
if (viewMode !== 'day')
|
|
15
|
-
return [];
|
|
16
|
-
const monthStart = dateFns.startOfMonth(currentDate);
|
|
17
|
-
const monthEnd = dateFns.endOfMonth(currentDate);
|
|
18
|
-
const startDate = dateFns.startOfWeek(monthStart);
|
|
19
|
-
const endDate = dateFns.endOfWeek(monthEnd);
|
|
20
|
-
return dateFns.eachDayOfInterval({ start: startDate, end: endDate });
|
|
21
|
-
}, [currentDate, viewMode, dateFns]);
|
|
22
|
-
const monthsOfYear = useMemo(() => {
|
|
23
|
-
if (viewMode !== 'month')
|
|
24
|
-
return [];
|
|
25
|
-
return dateFns.eachMonthOfInterval({
|
|
26
|
-
start: dateFns.startOfYear(currentDate),
|
|
27
|
-
end: dateFns.endOfYear(currentDate),
|
|
28
|
-
});
|
|
29
|
-
}, [currentDate, viewMode, dateFns]);
|
|
30
|
-
const yearsOfDecade = useMemo(() => {
|
|
31
|
-
if (viewMode !== 'year')
|
|
32
|
-
return [];
|
|
33
|
-
const year = dateFns.getYear(currentDate);
|
|
34
|
-
const decadeStartYear = Math.floor(year / 10) * 10;
|
|
35
|
-
const years = [];
|
|
36
|
-
for (let i = 0; i < 12; i++) {
|
|
37
|
-
years.push(decadeStartYear + i - 1);
|
|
38
|
-
}
|
|
39
|
-
return years;
|
|
40
|
-
}, [currentDate, viewMode, dateFns]);
|
|
41
|
-
const goToNext = useCallback(() => {
|
|
42
|
-
if (viewMode === 'day')
|
|
43
|
-
setCurrentDate(prev => dateFns.addMonths(prev, 1));
|
|
44
|
-
if (viewMode === 'month')
|
|
45
|
-
setCurrentDate(prev => dateFns.addYears(prev, 1));
|
|
46
|
-
if (viewMode === 'year')
|
|
47
|
-
setCurrentDate(prev => dateFns.addYears(prev, 10));
|
|
48
|
-
}, [viewMode, dateFns]);
|
|
49
|
-
const goToPrev = useCallback(() => {
|
|
50
|
-
if (viewMode === 'day')
|
|
51
|
-
setCurrentDate(prev => dateFns.subMonths(prev, 1));
|
|
52
|
-
if (viewMode === 'month')
|
|
53
|
-
setCurrentDate(prev => dateFns.subYears(prev, 1));
|
|
54
|
-
if (viewMode === 'year')
|
|
55
|
-
setCurrentDate(prev => dateFns.subYears(prev, 10));
|
|
56
|
-
}, [viewMode, dateFns]);
|
|
57
|
-
const handleSelectDay = useCallback((date) => {
|
|
58
|
-
setSelectedDate(date);
|
|
59
|
-
if (!dateFns.isSameMonth(currentDate, date)) {
|
|
60
|
-
setCurrentDate(dateFns.startOfMonth(date));
|
|
61
|
-
}
|
|
62
|
-
}, [currentDate, dateFns]);
|
|
63
|
-
const handleSelectMonth = useCallback((monthIndex) => {
|
|
64
|
-
setCurrentDate(prev => dateFns.setMonth(prev, monthIndex));
|
|
65
|
-
setViewMode('day');
|
|
66
|
-
}, [dateFns]);
|
|
67
|
-
const handleSelectYear = useCallback((year) => {
|
|
68
|
-
setCurrentDate(prev => dateFns.setYear(prev, year));
|
|
69
|
-
setViewMode('month');
|
|
70
|
-
}, [dateFns]);
|
|
71
|
-
const handleHeaderClick = useCallback(() => {
|
|
72
|
-
if (viewMode === 'day')
|
|
73
|
-
setViewMode('month');
|
|
74
|
-
if (viewMode === 'month')
|
|
75
|
-
setViewMode('year');
|
|
76
|
-
}, [viewMode]);
|
|
77
|
-
const toggleCalendarType = useCallback(() => {
|
|
78
|
-
setCalendarType(prev => prev === 'jalali' ? 'gregorian' : 'jalali');
|
|
79
|
-
setViewMode('day');
|
|
80
|
-
}, []);
|
|
81
|
-
const isDateSelected = useCallback((date) => {
|
|
82
|
-
if (range) {
|
|
83
|
-
return !!((range.from && dateFns.isSameDay(date, range.from)) ||
|
|
84
|
-
(range.to && dateFns.isSameDay(date, range.to)));
|
|
85
|
-
}
|
|
86
|
-
return selectedDate ? dateFns.isSameDay(date, selectedDate) : false;
|
|
87
|
-
}, [selectedDate, range, dateFns]);
|
|
88
|
-
const isInRange = useCallback((date) => {
|
|
89
|
-
if (!range?.from || !range?.to)
|
|
90
|
-
return false;
|
|
91
|
-
return dateFns.isWithinInterval(date, { start: range.from, end: range.to });
|
|
92
|
-
}, [range, dateFns]);
|
|
93
|
-
const isRangeStart = useCallback((date) => {
|
|
94
|
-
return !!(range?.from && dateFns.isSameDay(date, range.from));
|
|
95
|
-
}, [range, dateFns]);
|
|
96
|
-
const isRangeEnd = useCallback((date) => {
|
|
97
|
-
return !!(range?.to && dateFns.isSameDay(date, range.to));
|
|
98
|
-
}, [range, dateFns]);
|
|
99
|
-
const headerTitle = useMemo(() => {
|
|
100
|
-
if (viewMode === 'day')
|
|
101
|
-
return dateFns.format(currentDate, 'LLLL yyyy');
|
|
102
|
-
if (viewMode === 'month')
|
|
103
|
-
return dateFns.format(currentDate, 'yyyy');
|
|
104
|
-
if (viewMode === 'year') {
|
|
105
|
-
const start = yearsOfDecade[0];
|
|
106
|
-
const end = yearsOfDecade[yearsOfDecade.length - 1];
|
|
107
|
-
return `${end} - ${start}`;
|
|
108
|
-
}
|
|
109
|
-
return '';
|
|
110
|
-
}, [currentDate, viewMode, yearsOfDecade, dateFns]);
|
|
111
|
-
return {
|
|
112
|
-
viewMode,
|
|
113
|
-
currentDate,
|
|
114
|
-
selectedDate,
|
|
115
|
-
daysOfMonth,
|
|
116
|
-
monthsOfYear,
|
|
117
|
-
yearsOfDecade,
|
|
118
|
-
headerTitle,
|
|
119
|
-
calendarType,
|
|
120
|
-
weekDays: getWeekDays(calendarType),
|
|
121
|
-
dateFns,
|
|
122
|
-
toggleCalendarType,
|
|
123
|
-
goToNext,
|
|
124
|
-
goToPrev,
|
|
125
|
-
handleSelectDay,
|
|
126
|
-
handleSelectMonth,
|
|
127
|
-
handleSelectYear,
|
|
128
|
-
handleHeaderClick,
|
|
129
|
-
isSameMonthAsCurrent: (date) => dateFns.isSameMonth(currentDate, date),
|
|
130
|
-
isDateSelected,
|
|
131
|
-
isInRange,
|
|
132
|
-
isRangeStart,
|
|
133
|
-
isRangeEnd,
|
|
134
|
-
isToday: (date) => dateFns.isSameDay(date, new Date()),
|
|
135
|
-
isCurrentMonth: (monthIndex) => dateFns.getMonth(new Date()) === monthIndex && dateFns.getYear(new Date()) === dateFns.getYear(currentDate),
|
|
136
|
-
isCurrentYear: (year) => dateFns.getYear(new Date()) === year,
|
|
137
|
-
isYearDisabled: (year) => year > effectiveMaxYear || year < effectiveMinYear,
|
|
138
|
-
};
|
|
139
|
-
};
|
package/dist/types/index.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import * as jdf from 'date-fns-jalali';
|
|
2
|
-
import * as df from 'date-fns';
|
|
3
|
-
import { faIR } from 'date-fns-jalali/locale';
|
|
4
|
-
export const getDateFunctions = (type) => {
|
|
5
|
-
const isJalali = type === 'jalali';
|
|
6
|
-
const lib = isJalali ? jdf : df;
|
|
7
|
-
return {
|
|
8
|
-
startOfMonth: lib.startOfMonth,
|
|
9
|
-
endOfMonth: lib.endOfMonth,
|
|
10
|
-
startOfWeek: (date) => lib.startOfWeek(date, { locale: isJalali ? faIR : undefined, weekStartsOn: isJalali ? 6 : 1 }),
|
|
11
|
-
endOfWeek: (date) => lib.endOfWeek(date, { locale: isJalali ? faIR : undefined, weekStartsOn: isJalali ? 6 : 1 }),
|
|
12
|
-
eachDayOfInterval: lib.eachDayOfInterval,
|
|
13
|
-
isSameMonth: lib.isSameMonth,
|
|
14
|
-
isSameDay: lib.isSameDay,
|
|
15
|
-
format: (date, formatStr) => {
|
|
16
|
-
try {
|
|
17
|
-
return lib.format(date, formatStr, { locale: isJalali ? faIR : undefined });
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return '';
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
addMonths: lib.addMonths,
|
|
24
|
-
subMonths: lib.subMonths,
|
|
25
|
-
getYear: lib.getYear,
|
|
26
|
-
setYear: lib.setYear,
|
|
27
|
-
getMonth: lib.getMonth,
|
|
28
|
-
setMonth: lib.setMonth,
|
|
29
|
-
startOfYear: lib.startOfYear,
|
|
30
|
-
eachMonthOfInterval: lib.eachMonthOfInterval,
|
|
31
|
-
endOfYear: lib.endOfYear,
|
|
32
|
-
addYears: lib.addYears,
|
|
33
|
-
subYears: lib.subYears,
|
|
34
|
-
isDate: lib.isDate,
|
|
35
|
-
isWithinInterval: lib.isWithinInterval,
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
export const getWeekDays = (type) => {
|
|
39
|
-
if (type === 'jalali') {
|
|
40
|
-
return ['ش', 'ی', 'د', 'س', 'چ', 'پ', 'ج'];
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
return ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
|
|
44
|
-
}
|
|
45
|
-
};
|