@utilitywarehouse/hearth-react-native 0.3.1 → 0.4.1
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/.storybook/preview.tsx +3 -0
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +16 -0
- package/build/components/CurrencyInput/CurrencyInput.js +1 -1
- package/build/components/DatePicker/DatePicker.context.d.ts +19 -0
- package/build/components/DatePicker/DatePicker.context.js +3 -0
- package/build/components/DatePicker/DatePicker.d.ts +19 -0
- package/build/components/DatePicker/DatePicker.js +479 -0
- package/build/components/DatePicker/DatePicker.props.d.ts +125 -0
- package/build/components/DatePicker/DatePicker.props.js +1 -0
- package/build/components/DatePicker/DatePickerCalendar.d.ts +2 -0
- package/build/components/DatePicker/DatePickerCalendar.js +28 -0
- package/build/components/DatePicker/DatePickerDay.d.ts +11 -0
- package/build/components/DatePicker/DatePickerDay.js +242 -0
- package/build/components/DatePicker/DatePickerDays.d.ts +2 -0
- package/build/components/DatePicker/DatePickerDays.js +157 -0
- package/build/components/DatePicker/DatePickerFooter.d.ts +2 -0
- package/build/components/DatePicker/DatePickerFooter.js +23 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.d.ts +8 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.js +1 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.d.ts +2 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.js +14 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.d.ts +2 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.js +32 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.d.ts +2 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.js +32 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.d.ts +6 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.js +64 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.d.ts +1 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.js +22 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.d.ts +2 -0
- package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.js +25 -0
- package/build/components/DatePicker/DatePickerHeader/index.d.ts +3 -0
- package/build/components/DatePicker/DatePickerHeader/index.js +30 -0
- package/build/components/DatePicker/DatePickerMonths.d.ts +2 -0
- package/build/components/DatePicker/DatePickerMonths.js +69 -0
- package/build/components/DatePicker/DatePickerWeekdays.d.ts +8 -0
- package/build/components/DatePicker/DatePickerWeekdays.js +26 -0
- package/build/components/DatePicker/DatePickerYears.d.ts +2 -0
- package/build/components/DatePicker/DatePickerYears.js +83 -0
- package/build/components/DatePicker/TimePicker.d.ts +3 -0
- package/build/components/DatePicker/TimePicker.js +84 -0
- package/build/components/DatePicker/enums.d.ts +12 -0
- package/build/components/DatePicker/enums.js +12 -0
- package/build/components/DatePicker/index.d.ts +4 -0
- package/build/components/DatePicker/index.js +3 -0
- package/build/components/DatePicker/polyfill.d.ts +0 -0
- package/build/components/DatePicker/polyfill.js +22 -0
- package/build/components/DatePicker/time-picker/animated-math.d.ts +4 -0
- package/build/components/DatePicker/time-picker/animated-math.js +19 -0
- package/build/components/DatePicker/time-picker/period-native.d.ts +6 -0
- package/build/components/DatePicker/time-picker/period-native.js +17 -0
- package/build/components/DatePicker/time-picker/period-picker.d.ts +6 -0
- package/build/components/DatePicker/time-picker/period-picker.js +10 -0
- package/build/components/DatePicker/time-picker/period-web.d.ts +6 -0
- package/build/components/DatePicker/time-picker/period-web.js +21 -0
- package/build/components/DatePicker/time-picker/wheel-native.d.ts +8 -0
- package/build/components/DatePicker/time-picker/wheel-native.js +19 -0
- package/build/components/DatePicker/time-picker/wheel-picker/index.d.ts +2 -0
- package/build/components/DatePicker/time-picker/wheel-picker/index.js +2 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.d.ts +16 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.js +97 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.d.ts +21 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.js +88 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.d.ts +23 -0
- package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.js +21 -0
- package/build/components/DatePicker/time-picker/wheel-web.d.ts +8 -0
- package/build/components/DatePicker/time-picker/wheel-web.js +148 -0
- package/build/components/DatePicker/time-picker/wheel.d.ts +8 -0
- package/build/components/DatePicker/time-picker/wheel.js +10 -0
- package/build/components/DatePicker/utils.d.ts +212 -0
- package/build/components/DatePicker/utils.js +391 -0
- package/build/components/DatePickerInput/DatePickerInput.d.ts +6 -0
- package/build/components/DatePickerInput/DatePickerInput.js +126 -0
- package/build/components/DatePickerInput/DatePickerInput.props.d.ts +47 -0
- package/build/components/DatePickerInput/DatePickerInput.props.js +1 -0
- package/build/components/DatePickerInput/DatePickerInputDoneButton.d.ts +8 -0
- package/build/components/DatePickerInput/DatePickerInputDoneButton.js +19 -0
- package/build/components/DatePickerInput/DatePickerInputDoneButton.web.d.ts +5 -0
- package/build/components/DatePickerInput/DatePickerInputDoneButton.web.js +5 -0
- package/build/components/DatePickerInput/index.d.ts +2 -0
- package/build/components/DatePickerInput/index.js +1 -0
- package/build/components/Input/InputField.d.ts +1 -1
- package/build/components/Input/InputField.js +1 -1
- package/build/components/Input/InputSlot.d.ts +1 -1
- package/build/components/Input/InputSlot.js +3 -3
- package/build/components/UnstyledIconButton/UnstyledIconButton.js +2 -2
- package/build/components/UnstyledIconButton/UnstyledIconButtonRoot.js +1 -1
- package/build/components/index.d.ts +2 -0
- package/build/components/index.js +2 -0
- package/build/core/themes.d.ts +482 -0
- package/build/core/themes.js +31 -0
- package/build/hooks/index.d.ts +4 -3
- package/build/hooks/index.js +4 -3
- package/build/hooks/usePrevious.d.ts +1 -0
- package/build/hooks/usePrevious.js +8 -0
- package/build/hooks/useTheme.d.ts +2 -1
- package/build/hooks/useTheme.js +2 -2
- package/build/legacyTokens/common/brand.d.ts +16 -0
- package/build/legacyTokens/common/brand.js +17 -0
- package/build/legacyTokens/common/index.d.ts +8 -0
- package/build/legacyTokens/common/index.js +9 -0
- package/build/legacyTokens/common/service.d.ts +20 -0
- package/build/legacyTokens/common/service.js +21 -0
- package/build/legacyTokens/dark/apple.d.ts +28 -0
- package/build/legacyTokens/dark/apple.js +29 -0
- package/build/legacyTokens/dark/cyan.d.ts +48 -0
- package/build/legacyTokens/dark/cyan.js +49 -0
- package/build/legacyTokens/dark/gold.d.ts +44 -0
- package/build/legacyTokens/dark/gold.js +45 -0
- package/build/legacyTokens/dark/grape.d.ts +28 -0
- package/build/legacyTokens/dark/grape.js +29 -0
- package/build/legacyTokens/dark/green.d.ts +40 -0
- package/build/legacyTokens/dark/green.js +41 -0
- package/build/legacyTokens/dark/grey.d.ts +60 -0
- package/build/legacyTokens/dark/grey.js +61 -0
- package/build/legacyTokens/dark/index.d.ts +40 -0
- package/build/legacyTokens/dark/index.js +41 -0
- package/build/legacyTokens/dark/pink.d.ts +28 -0
- package/build/legacyTokens/dark/pink.js +29 -0
- package/build/legacyTokens/dark/purple.d.ts +48 -0
- package/build/legacyTokens/dark/purple.js +49 -0
- package/build/legacyTokens/dark/red.d.ts +40 -0
- package/build/legacyTokens/dark/red.js +41 -0
- package/build/legacyTokens/dark/rose.d.ts +28 -0
- package/build/legacyTokens/dark/rose.js +29 -0
- package/build/legacyTokens/index.d.ts +12 -0
- package/build/legacyTokens/index.js +13 -0
- package/build/legacyTokens/light/apple.d.ts +28 -0
- package/build/legacyTokens/light/apple.js +29 -0
- package/build/legacyTokens/light/cyan.d.ts +48 -0
- package/build/legacyTokens/light/cyan.js +49 -0
- package/build/legacyTokens/light/gold.d.ts +44 -0
- package/build/legacyTokens/light/gold.js +45 -0
- package/build/legacyTokens/light/grape.d.ts +28 -0
- package/build/legacyTokens/light/grape.js +29 -0
- package/build/legacyTokens/light/green.d.ts +40 -0
- package/build/legacyTokens/light/green.js +41 -0
- package/build/legacyTokens/light/grey.d.ts +60 -0
- package/build/legacyTokens/light/grey.js +61 -0
- package/build/legacyTokens/light/index.d.ts +40 -0
- package/build/legacyTokens/light/index.js +41 -0
- package/build/legacyTokens/light/pink.d.ts +28 -0
- package/build/legacyTokens/light/pink.js +29 -0
- package/build/legacyTokens/light/purple.d.ts +48 -0
- package/build/legacyTokens/light/purple.js +49 -0
- package/build/legacyTokens/light/red.d.ts +40 -0
- package/build/legacyTokens/light/red.js +41 -0
- package/build/legacyTokens/light/rose.d.ts +32 -0
- package/build/legacyTokens/light/rose.js +33 -0
- package/build/tokens/components/dark/date-picker.d.ts +1 -0
- package/build/tokens/components/dark/date-picker.js +1 -0
- package/build/tokens/components/dark/illustrations.d.ts +7 -0
- package/build/tokens/components/dark/illustrations.js +6 -0
- package/build/tokens/components/dark/index.d.ts +1 -0
- package/build/tokens/components/dark/index.js +1 -0
- package/build/tokens/components/dark/segmented-control.d.ts +2 -2
- package/build/tokens/components/dark/segmented-control.js +2 -2
- package/build/tokens/components/dark/table.d.ts +3 -0
- package/build/tokens/components/dark/table.js +3 -0
- package/build/tokens/components/light/date-picker.d.ts +1 -0
- package/build/tokens/components/light/date-picker.js +1 -0
- package/build/tokens/components/light/illustrations.d.ts +7 -0
- package/build/tokens/components/light/illustrations.js +6 -0
- package/build/tokens/components/light/index.d.ts +1 -0
- package/build/tokens/components/light/index.js +1 -0
- package/build/tokens/components/light/segmented-control.d.ts +2 -2
- package/build/tokens/components/light/segmented-control.js +2 -2
- package/build/tokens/components/light/table.d.ts +3 -0
- package/build/tokens/components/light/table.js +3 -0
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.js +1 -0
- package/build/utils/isEqual.d.ts +2 -0
- package/build/utils/isEqual.js +29 -0
- package/chromatic.config.json +6 -0
- package/docs/components/AllComponents.web.tsx +43 -1
- package/docs/components/ViewWrap.tsx +32 -0
- package/docs/components/index.ts +1 -0
- package/docs/getting-started.mdx +6 -6
- package/package.json +11 -8
- package/src/components/CurrencyInput/CurrencyInput.tsx +2 -1
- package/src/components/DatePicker/DatePicker.context.ts +23 -0
- package/src/components/DatePicker/DatePicker.docs.mdx +239 -0
- package/src/components/DatePicker/DatePicker.props.ts +139 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +98 -0
- package/src/components/DatePicker/DatePicker.tsx +669 -0
- package/src/components/DatePicker/DatePickerCalendar.tsx +41 -0
- package/src/components/DatePicker/DatePickerDay.tsx +302 -0
- package/src/components/DatePicker/DatePickerDays.tsx +241 -0
- package/src/components/DatePicker/DatePickerFooter.tsx +35 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.props.ts +10 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerMonthButton.tsx +29 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerNextButton.tsx +46 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerPrevButton.tsx +46 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerSelectors.tsx +96 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerTimeButton.tsx +48 -0
- package/src/components/DatePicker/DatePickerHeader/DatePickerYearButton.tsx +50 -0
- package/src/components/DatePicker/DatePickerHeader/index.tsx +64 -0
- package/src/components/DatePicker/DatePickerMonths.tsx +101 -0
- package/src/components/DatePicker/DatePickerWeekdays.tsx +49 -0
- package/src/components/DatePicker/DatePickerYears.tsx +119 -0
- package/src/components/DatePicker/TimePicker.tsx +141 -0
- package/src/components/DatePicker/enums.ts +14 -0
- package/src/components/DatePicker/index.ts +13 -0
- package/src/components/DatePicker/polyfill.ts +21 -0
- package/src/components/DatePicker/time-picker/animated-math.ts +33 -0
- package/src/components/DatePicker/time-picker/period-native.tsx +34 -0
- package/src/components/DatePicker/time-picker/period-picker.tsx +16 -0
- package/src/components/DatePicker/time-picker/period-web.tsx +36 -0
- package/src/components/DatePicker/time-picker/wheel-native.tsx +37 -0
- package/src/components/DatePicker/time-picker/wheel-picker/index.ts +3 -0
- package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.tsx +132 -0
- package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.ts +22 -0
- package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.tsx +200 -0
- package/src/components/DatePicker/time-picker/wheel-web.tsx +181 -0
- package/src/components/DatePicker/time-picker/wheel.tsx +18 -0
- package/src/components/DatePicker/utils.ts +549 -0
- package/src/components/DatePickerInput/DatePickerInput.docs.mdx +237 -0
- package/src/components/DatePickerInput/DatePickerInput.props.ts +50 -0
- package/src/components/DatePickerInput/DatePickerInput.stories.tsx +178 -0
- package/src/components/DatePickerInput/DatePickerInput.tsx +265 -0
- package/src/components/DatePickerInput/DatePickerInputDoneButton.tsx +42 -0
- package/src/components/DatePickerInput/DatePickerInputDoneButton.web.tsx +7 -0
- package/src/components/DatePickerInput/index.ts +2 -0
- package/src/components/Icon/Icon.stories.tsx +4 -3
- package/src/components/Input/InputField.tsx +0 -2
- package/src/components/Input/InputSlot.tsx +14 -3
- package/src/components/Modal/Modal.stories.tsx +2 -30
- package/src/components/UnstyledIconButton/UnstyledIconButton.tsx +14 -2
- package/src/components/UnstyledIconButton/UnstyledIconButtonRoot.tsx +7 -3
- package/src/components/index.ts +2 -0
- package/src/core/themes.ts +31 -0
- package/src/hooks/index.ts +4 -3
- package/src/hooks/usePrevious.ts +9 -0
- package/src/hooks/useTheme.ts +4 -3
- package/src/legacyTokens/common/brand.ts +18 -0
- package/src/legacyTokens/common/index.ts +10 -0
- package/src/legacyTokens/common/service.ts +22 -0
- package/src/legacyTokens/dark/apple.ts +30 -0
- package/src/legacyTokens/dark/cyan.ts +50 -0
- package/src/legacyTokens/dark/gold.ts +46 -0
- package/src/legacyTokens/dark/grape.ts +30 -0
- package/src/legacyTokens/dark/green.ts +42 -0
- package/src/legacyTokens/dark/grey.ts +62 -0
- package/src/legacyTokens/dark/index.ts +42 -0
- package/src/legacyTokens/dark/pink.ts +30 -0
- package/src/legacyTokens/dark/purple.ts +50 -0
- package/src/legacyTokens/dark/red.ts +42 -0
- package/src/legacyTokens/dark/rose.ts +30 -0
- package/src/legacyTokens/index.ts +14 -0
- package/src/legacyTokens/light/apple.ts +30 -0
- package/src/legacyTokens/light/cyan.ts +50 -0
- package/src/legacyTokens/light/gold.ts +46 -0
- package/src/legacyTokens/light/grape.ts +30 -0
- package/src/legacyTokens/light/green.ts +42 -0
- package/src/legacyTokens/light/grey.ts +62 -0
- package/src/legacyTokens/light/index.ts +42 -0
- package/src/legacyTokens/light/pink.ts +30 -0
- package/src/legacyTokens/light/purple.ts +50 -0
- package/src/legacyTokens/light/red.ts +42 -0
- package/src/legacyTokens/light/rose.ts +34 -0
- package/src/tokens/components/dark/date-picker.ts +1 -0
- package/src/tokens/components/dark/illustrations.ts +7 -0
- package/src/tokens/components/dark/index.ts +1 -0
- package/src/tokens/components/dark/segmented-control.ts +2 -2
- package/src/tokens/components/dark/table.ts +3 -0
- package/src/tokens/components/light/date-picker.ts +1 -0
- package/src/tokens/components/light/illustrations.ts +7 -0
- package/src/tokens/components/light/index.ts +1 -0
- package/src/tokens/components/light/segmented-control.ts +2 -2
- package/src/tokens/components/light/table.ts +3 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/isEqual.ts +30 -0
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { isEqual } from '../../utils';
|
|
4
|
+
import type {
|
|
5
|
+
CalendarDay,
|
|
6
|
+
CalendarMonth,
|
|
7
|
+
CalendarWeek,
|
|
8
|
+
DateType,
|
|
9
|
+
Numerals,
|
|
10
|
+
} from './DatePicker.props';
|
|
11
|
+
|
|
12
|
+
export const CALENDAR_FORMAT = 'YYYY-MM-DD HH:mm';
|
|
13
|
+
export const DATE_FORMAT = 'YYYY-MM-DD';
|
|
14
|
+
export const YEAR_PAGE_SIZE = 12;
|
|
15
|
+
|
|
16
|
+
export const getMonths = () => dayjs.months();
|
|
17
|
+
|
|
18
|
+
export const getMonthName = (month: number) => dayjs.months()[month];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get months array
|
|
22
|
+
*
|
|
23
|
+
* @returns months array
|
|
24
|
+
*/
|
|
25
|
+
export const getMonthsArray = (): CalendarMonth[] => {
|
|
26
|
+
const monthNames = dayjs.months();
|
|
27
|
+
const monthShortNames = dayjs.monthsShort();
|
|
28
|
+
|
|
29
|
+
return monthNames.map((name, index) => ({
|
|
30
|
+
index,
|
|
31
|
+
name: {
|
|
32
|
+
full: name,
|
|
33
|
+
short: monthShortNames[index] || '',
|
|
34
|
+
},
|
|
35
|
+
isSelected: false,
|
|
36
|
+
}));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get weekdays
|
|
41
|
+
*
|
|
42
|
+
* @param locale - locale
|
|
43
|
+
* @param firstDayOfWeek - first day of week
|
|
44
|
+
* @param format - format short, min or full
|
|
45
|
+
*
|
|
46
|
+
* @returns weekdays
|
|
47
|
+
*/
|
|
48
|
+
export const getWeekdays = (firstDayOfWeek: number): CalendarWeek[] => {
|
|
49
|
+
dayjs.locale('en');
|
|
50
|
+
|
|
51
|
+
const weekdayNames = dayjs.weekdays();
|
|
52
|
+
const weekdayShortNames = dayjs.weekdaysShort();
|
|
53
|
+
const weekdayMinNames = dayjs.weekdaysMin();
|
|
54
|
+
|
|
55
|
+
let weekdays: CalendarWeek[] = weekdayNames.map((name, index) => ({
|
|
56
|
+
index,
|
|
57
|
+
name: {
|
|
58
|
+
full: name,
|
|
59
|
+
short: weekdayShortNames[index] || '',
|
|
60
|
+
min: weekdayMinNames[index][0] || '',
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
if (firstDayOfWeek > 0) {
|
|
65
|
+
weekdays = [
|
|
66
|
+
...weekdays.slice(firstDayOfWeek, weekdays.length),
|
|
67
|
+
...weekdays.slice(0, firstDayOfWeek),
|
|
68
|
+
] as CalendarWeek[];
|
|
69
|
+
}
|
|
70
|
+
return weekdays;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const getFormated = (date: DateType) => dayjs(date).format(CALENDAR_FORMAT);
|
|
74
|
+
|
|
75
|
+
export const getDateMonth = (date: DateType) => dayjs(date).month();
|
|
76
|
+
|
|
77
|
+
export const getDateYear = (date: DateType) => dayjs(date).year();
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Check if two dates are on the same day
|
|
81
|
+
*
|
|
82
|
+
* @param a - date to check
|
|
83
|
+
* @param b - date to check
|
|
84
|
+
*
|
|
85
|
+
* @returns true if dates are on the same day, false otherwise
|
|
86
|
+
*/
|
|
87
|
+
export function areDatesOnSameDay(a: DateType, b: DateType) {
|
|
88
|
+
if (!a || !b) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const date_a = dayjs(a).format(DATE_FORMAT);
|
|
93
|
+
const date_b = dayjs(b).format(DATE_FORMAT);
|
|
94
|
+
|
|
95
|
+
return date_a === date_b;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Check if date is between two dates
|
|
100
|
+
*
|
|
101
|
+
* @param date - date to check
|
|
102
|
+
* @param options - options
|
|
103
|
+
*
|
|
104
|
+
* @returns true if date is between two dates, false otherwise
|
|
105
|
+
*/
|
|
106
|
+
export function isDateBetween(
|
|
107
|
+
date: DateType,
|
|
108
|
+
{
|
|
109
|
+
startDate,
|
|
110
|
+
endDate,
|
|
111
|
+
}: {
|
|
112
|
+
startDate?: DateType;
|
|
113
|
+
endDate?: DateType;
|
|
114
|
+
}
|
|
115
|
+
): boolean {
|
|
116
|
+
if (!startDate || !endDate) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return dayjs(date) <= endDate && dayjs(date) >= startDate;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Check if date is disabled
|
|
125
|
+
*
|
|
126
|
+
* @param date - date to check
|
|
127
|
+
* @param options - options
|
|
128
|
+
*
|
|
129
|
+
* @returns true if date is disabled, false otherwise
|
|
130
|
+
*/
|
|
131
|
+
export function isDateDisabled(
|
|
132
|
+
date: dayjs.Dayjs,
|
|
133
|
+
{
|
|
134
|
+
minDate,
|
|
135
|
+
maxDate,
|
|
136
|
+
enabledDates,
|
|
137
|
+
disabledDates,
|
|
138
|
+
}: {
|
|
139
|
+
minDate?: DateType;
|
|
140
|
+
maxDate?: DateType;
|
|
141
|
+
enabledDates?: DateType[] | ((date: DateType) => boolean) | undefined;
|
|
142
|
+
disabledDates?: DateType[] | ((date: DateType) => boolean) | undefined;
|
|
143
|
+
}
|
|
144
|
+
): boolean {
|
|
145
|
+
if (minDate && date.isBefore(dayjs(minDate).startOf('day'))) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
if (maxDate && date.isAfter(dayjs(maxDate).endOf('day'))) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (enabledDates) {
|
|
153
|
+
if (Array.isArray(enabledDates)) {
|
|
154
|
+
const isEnabled = enabledDates.some(enabledDate => areDatesOnSameDay(date, enabledDate));
|
|
155
|
+
return !isEnabled;
|
|
156
|
+
} else if (enabledDates instanceof Function) {
|
|
157
|
+
return !enabledDates(date);
|
|
158
|
+
}
|
|
159
|
+
} else if (disabledDates) {
|
|
160
|
+
if (Array.isArray(disabledDates)) {
|
|
161
|
+
const isDisabled = disabledDates.some(disabledDate => areDatesOnSameDay(date, disabledDate));
|
|
162
|
+
return isDisabled;
|
|
163
|
+
} else if (disabledDates instanceof Function) {
|
|
164
|
+
return disabledDates(date);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Check if year is disabled
|
|
173
|
+
*
|
|
174
|
+
* @param year - year to check
|
|
175
|
+
* @param options - options
|
|
176
|
+
*
|
|
177
|
+
* @returns true if year is disabled, false otherwise
|
|
178
|
+
*/
|
|
179
|
+
export function isYearDisabled(
|
|
180
|
+
year: number,
|
|
181
|
+
{
|
|
182
|
+
minDate,
|
|
183
|
+
maxDate,
|
|
184
|
+
}: {
|
|
185
|
+
minDate?: DateType;
|
|
186
|
+
maxDate?: DateType;
|
|
187
|
+
}
|
|
188
|
+
): boolean {
|
|
189
|
+
if (minDate && year < getDateYear(minDate)) return true;
|
|
190
|
+
if (maxDate && year > getDateYear(maxDate)) return true;
|
|
191
|
+
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Check if month is disabled
|
|
197
|
+
*
|
|
198
|
+
* @param month - month to check
|
|
199
|
+
* @param date - date to check
|
|
200
|
+
* @param options - options
|
|
201
|
+
*
|
|
202
|
+
* @returns true if month is disabled, false otherwise
|
|
203
|
+
*/
|
|
204
|
+
export function isMonthDisabled(
|
|
205
|
+
month: number,
|
|
206
|
+
date: DateType,
|
|
207
|
+
{
|
|
208
|
+
minDate,
|
|
209
|
+
maxDate,
|
|
210
|
+
}: {
|
|
211
|
+
minDate?: DateType;
|
|
212
|
+
maxDate?: DateType;
|
|
213
|
+
}
|
|
214
|
+
): boolean {
|
|
215
|
+
if (minDate && month < getDateMonth(minDate) && getDateYear(date) === getDateYear(minDate))
|
|
216
|
+
return true;
|
|
217
|
+
if (maxDate && month > getDateMonth(maxDate) && getDateYear(date) === getDateYear(maxDate))
|
|
218
|
+
return true;
|
|
219
|
+
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get formated date
|
|
225
|
+
*
|
|
226
|
+
* @param date - date to get formated date from
|
|
227
|
+
* @param format - format to get formated date from
|
|
228
|
+
*
|
|
229
|
+
* @returns formated date
|
|
230
|
+
*/
|
|
231
|
+
export const getFormatedDate = (date: DateType, format: string) => dayjs(date).format(format);
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Get date
|
|
235
|
+
*
|
|
236
|
+
* @param date - date to get
|
|
237
|
+
*
|
|
238
|
+
* @returns date
|
|
239
|
+
*/
|
|
240
|
+
export const getDate = (date: DateType) => dayjs(date);
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Get year range
|
|
244
|
+
*
|
|
245
|
+
* @param year - year to get year range from
|
|
246
|
+
*
|
|
247
|
+
* @returns year range
|
|
248
|
+
*/
|
|
249
|
+
export const getYearRange = (year: number) => {
|
|
250
|
+
const endYear = YEAR_PAGE_SIZE * Math.ceil(year / YEAR_PAGE_SIZE);
|
|
251
|
+
let startYear = endYear === year ? endYear : endYear - YEAR_PAGE_SIZE;
|
|
252
|
+
|
|
253
|
+
if (startYear < 0) {
|
|
254
|
+
startYear = 0;
|
|
255
|
+
}
|
|
256
|
+
return Array.from({ length: YEAR_PAGE_SIZE }, (_, i) => startYear + i);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Get days in month
|
|
261
|
+
*
|
|
262
|
+
* @param date - date to get days in month from
|
|
263
|
+
* @param showOutsideDays - whether to show outside days
|
|
264
|
+
* @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
|
|
265
|
+
*
|
|
266
|
+
* @returns days in month
|
|
267
|
+
*/
|
|
268
|
+
export function getDaysInMonth(
|
|
269
|
+
date: DateType,
|
|
270
|
+
showOutsideDays: boolean | undefined,
|
|
271
|
+
firstDayOfWeek: number
|
|
272
|
+
) {
|
|
273
|
+
const daysInCurrentMonth = dayjs(date).daysInMonth();
|
|
274
|
+
|
|
275
|
+
const prevMonthDays = dayjs(date).add(-1, 'month').daysInMonth();
|
|
276
|
+
const firstDay = dayjs(date).date(1 - firstDayOfWeek);
|
|
277
|
+
const prevMonthOffset = firstDay.day() % 7;
|
|
278
|
+
const daysInPrevMonth = showOutsideDays ? prevMonthOffset : 0;
|
|
279
|
+
const monthDaysOffset = prevMonthOffset + daysInCurrentMonth;
|
|
280
|
+
const daysInNextMonth = showOutsideDays
|
|
281
|
+
? monthDaysOffset > 35
|
|
282
|
+
? 42 - monthDaysOffset
|
|
283
|
+
: 35 - monthDaysOffset
|
|
284
|
+
: 0;
|
|
285
|
+
|
|
286
|
+
const fullDaysInMonth = daysInPrevMonth + daysInCurrentMonth + daysInNextMonth;
|
|
287
|
+
|
|
288
|
+
return {
|
|
289
|
+
prevMonthDays,
|
|
290
|
+
prevMonthOffset,
|
|
291
|
+
daysInCurrentMonth,
|
|
292
|
+
daysInNextMonth,
|
|
293
|
+
fullDaysInMonth,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Get first day of month
|
|
299
|
+
*
|
|
300
|
+
* @param date - date to get first day of month from
|
|
301
|
+
* @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
|
|
302
|
+
*
|
|
303
|
+
* @returns first day of month
|
|
304
|
+
*/
|
|
305
|
+
export function getFirstDayOfMonth(date: DateType, firstDayOfWeek: number): number {
|
|
306
|
+
const d = getDate(date);
|
|
307
|
+
return d.date(1 - firstDayOfWeek).day();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Get start of day
|
|
312
|
+
*
|
|
313
|
+
* @param date - date to get start of day from
|
|
314
|
+
*
|
|
315
|
+
* @returns start of day
|
|
316
|
+
*/
|
|
317
|
+
export function getStartOfDay(date: DateType): DateType {
|
|
318
|
+
return dayjs(date).startOf('day');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Get end of day
|
|
323
|
+
*
|
|
324
|
+
* @param date - date to get end of day from
|
|
325
|
+
*
|
|
326
|
+
* @returns end of day
|
|
327
|
+
*/
|
|
328
|
+
export function getEndOfDay(date: DateType): DateType {
|
|
329
|
+
return dayjs(date).endOf('day');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Convert date to unix timestamp
|
|
334
|
+
*
|
|
335
|
+
* @param date - date to convert
|
|
336
|
+
*
|
|
337
|
+
* @returns unix timestamp
|
|
338
|
+
*/
|
|
339
|
+
export function dateToUnix(date: DateType): number {
|
|
340
|
+
return dayjs(date).unix();
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Remove time from date
|
|
345
|
+
*
|
|
346
|
+
* @param date - date to remove time from
|
|
347
|
+
*
|
|
348
|
+
* @returns date with time removed
|
|
349
|
+
*/
|
|
350
|
+
export function removeTime(date: DateType, timeZone: string | undefined): DateType {
|
|
351
|
+
return date ? dayjs.tz(date, timeZone).startOf('day') : undefined;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Get detailed date object
|
|
356
|
+
*
|
|
357
|
+
* @param date Get detailed date object
|
|
358
|
+
*
|
|
359
|
+
* @returns parsed date object
|
|
360
|
+
*/
|
|
361
|
+
export const getParsedDate = (date: DateType) => {
|
|
362
|
+
return {
|
|
363
|
+
year: dayjs(date).year(),
|
|
364
|
+
month: dayjs(date).month(),
|
|
365
|
+
hour: dayjs(date).hour(),
|
|
366
|
+
hour12: parseInt(dayjs(date).format('hh')),
|
|
367
|
+
minute: dayjs(date).minute(),
|
|
368
|
+
period: dayjs(date).format('A'),
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Calculate month days array based on current date
|
|
374
|
+
*
|
|
375
|
+
* @param datetime - The current date that selected
|
|
376
|
+
* @param showOutsideDays
|
|
377
|
+
* @param minDate - min selectable date
|
|
378
|
+
* @param maxDate - max selectable date
|
|
379
|
+
* @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
|
|
380
|
+
* @param enabledDates - array of enabled dates, or a function that returns true for a given date (takes precedence over disabledDates)
|
|
381
|
+
* @param disabledDates - array of disabled dates, or a function that returns true for a given date
|
|
382
|
+
* @param prevMonthDays - number of days in the previous month
|
|
383
|
+
* @param prevMonthOffset - number of days to offset the previous month
|
|
384
|
+
* @param daysInCurrentMonth - number of days in the current month
|
|
385
|
+
* @param daysInNextMonth - number of days in the next month
|
|
386
|
+
*
|
|
387
|
+
* @returns days array based on current date
|
|
388
|
+
*/
|
|
389
|
+
export const getMonthDays = (
|
|
390
|
+
datetime: DateType,
|
|
391
|
+
showOutsideDays: boolean,
|
|
392
|
+
minDate: DateType,
|
|
393
|
+
maxDate: DateType,
|
|
394
|
+
firstDayOfWeek: number,
|
|
395
|
+
enabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
|
|
396
|
+
disabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
|
|
397
|
+
prevMonthDays: number,
|
|
398
|
+
prevMonthOffset: number,
|
|
399
|
+
daysInCurrentMonth: number,
|
|
400
|
+
daysInNextMonth: number,
|
|
401
|
+
numerals: Numerals
|
|
402
|
+
): CalendarDay[] => {
|
|
403
|
+
const date = dayjs(datetime);
|
|
404
|
+
|
|
405
|
+
const prevDays = showOutsideDays
|
|
406
|
+
? Array.from({ length: prevMonthOffset }, (_, index) => {
|
|
407
|
+
const number = index + (prevMonthDays - prevMonthOffset + 1);
|
|
408
|
+
const thisDay = date.add(-1, 'month').date(number);
|
|
409
|
+
return generateCalendarDay(
|
|
410
|
+
number,
|
|
411
|
+
thisDay,
|
|
412
|
+
minDate,
|
|
413
|
+
maxDate,
|
|
414
|
+
enabledDates,
|
|
415
|
+
disabledDates,
|
|
416
|
+
false,
|
|
417
|
+
index + 1,
|
|
418
|
+
firstDayOfWeek,
|
|
419
|
+
numerals
|
|
420
|
+
);
|
|
421
|
+
})
|
|
422
|
+
: Array(prevMonthOffset).fill(null);
|
|
423
|
+
|
|
424
|
+
const currentDays = Array.from({ length: daysInCurrentMonth }, (_, index) => {
|
|
425
|
+
const day = index + 1;
|
|
426
|
+
const thisDay = date.date(day);
|
|
427
|
+
return generateCalendarDay(
|
|
428
|
+
day,
|
|
429
|
+
thisDay,
|
|
430
|
+
minDate,
|
|
431
|
+
maxDate,
|
|
432
|
+
enabledDates,
|
|
433
|
+
disabledDates,
|
|
434
|
+
true,
|
|
435
|
+
prevMonthOffset + day,
|
|
436
|
+
firstDayOfWeek,
|
|
437
|
+
numerals
|
|
438
|
+
);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
const nextDays = Array.from({ length: daysInNextMonth }, (_, index) => {
|
|
442
|
+
const day = index + 1;
|
|
443
|
+
const thisDay = date.add(1, 'month').date(day);
|
|
444
|
+
return generateCalendarDay(
|
|
445
|
+
day,
|
|
446
|
+
thisDay,
|
|
447
|
+
minDate,
|
|
448
|
+
maxDate,
|
|
449
|
+
enabledDates,
|
|
450
|
+
disabledDates,
|
|
451
|
+
false,
|
|
452
|
+
daysInCurrentMonth + prevMonthOffset + day,
|
|
453
|
+
firstDayOfWeek,
|
|
454
|
+
numerals
|
|
455
|
+
);
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
return [...prevDays, ...currentDays, ...nextDays];
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Generate day object for displaying inside day cell
|
|
463
|
+
*
|
|
464
|
+
* @param number - number of day
|
|
465
|
+
* @param date - calculated date based on day, month, and year
|
|
466
|
+
* @param minDate - min selectable date
|
|
467
|
+
* @param maxDate - max selectable date
|
|
468
|
+
* @param enabledDates - array of enabled dates, or a function that returns true for a given date (takes precedence over disabledDates)
|
|
469
|
+
* @param disabledDates - array of disabled dates, or a function that returns true for a given date
|
|
470
|
+
* @param isCurrentMonth - define the day is in the current month
|
|
471
|
+
* @param dayOfMonth - number the day in the current month
|
|
472
|
+
* @param firstDayOfWeek - first day of week, number 0-6, 0 – Sunday, 6 – Saturday
|
|
473
|
+
*
|
|
474
|
+
* @returns days object based on current date
|
|
475
|
+
*/
|
|
476
|
+
const generateCalendarDay = (
|
|
477
|
+
number: number,
|
|
478
|
+
date: dayjs.Dayjs,
|
|
479
|
+
minDate: DateType,
|
|
480
|
+
maxDate: DateType,
|
|
481
|
+
enabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
|
|
482
|
+
disabledDates: DateType[] | ((date: DateType) => boolean) | undefined,
|
|
483
|
+
isCurrentMonth: boolean,
|
|
484
|
+
dayOfMonth: number,
|
|
485
|
+
firstDayOfWeek: number,
|
|
486
|
+
numerals: Numerals
|
|
487
|
+
) => {
|
|
488
|
+
const startOfWeek = dayjs(date).startOf('week').add(firstDayOfWeek, 'day');
|
|
489
|
+
|
|
490
|
+
return {
|
|
491
|
+
text: formatNumber(number, numerals),
|
|
492
|
+
number,
|
|
493
|
+
date: date,
|
|
494
|
+
isDisabled: isDateDisabled(date, {
|
|
495
|
+
minDate,
|
|
496
|
+
maxDate,
|
|
497
|
+
enabledDates,
|
|
498
|
+
disabledDates,
|
|
499
|
+
}),
|
|
500
|
+
isCurrentMonth,
|
|
501
|
+
dayOfMonth,
|
|
502
|
+
isStartOfWeek: date.isSame(startOfWeek, 'day'),
|
|
503
|
+
isEndOfWeek: date.day() === (firstDayOfWeek + 6) % 7,
|
|
504
|
+
};
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Deep compare memo
|
|
509
|
+
*
|
|
510
|
+
* @param value - value to compare
|
|
511
|
+
* @param deps - dependencies
|
|
512
|
+
*
|
|
513
|
+
* @returns memoized value
|
|
514
|
+
*/
|
|
515
|
+
export function useDeepCompareMemo<T>(value: T, deps: any[]): T {
|
|
516
|
+
const ref = useRef<T>(null);
|
|
517
|
+
const depsRef = useRef<any[]>(null);
|
|
518
|
+
|
|
519
|
+
if (!depsRef.current || !deps.every((dep, i) => isEqual(dep, depsRef.current![i]))) {
|
|
520
|
+
ref.current = value;
|
|
521
|
+
depsRef.current = deps;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return ref.current as T;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
export const numeralSystems: Record<Numerals, readonly string[]> = {
|
|
528
|
+
latn: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
|
|
529
|
+
} as const;
|
|
530
|
+
|
|
531
|
+
function getDigitMap(numerals: Numerals): Record<string, string> {
|
|
532
|
+
const digitMap: Record<string, string> = {};
|
|
533
|
+
const numeralDigits = numeralSystems[numerals];
|
|
534
|
+
|
|
535
|
+
for (let i = 0; i < 10; i++) {
|
|
536
|
+
digitMap[i.toString()] = numeralDigits[i]!;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
return digitMap;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
function replaceDigits(input: string, numerals: Numerals): string {
|
|
543
|
+
const digitMap = getDigitMap(numerals);
|
|
544
|
+
return input.replace(/\d/g, digit => digitMap[digit] || digit);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
export function formatNumber(value: number, numerals: Numerals): string {
|
|
548
|
+
return replaceDigits(value.toString(), numerals);
|
|
549
|
+
}
|