@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
package/.storybook/preview.tsx
CHANGED
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-lint.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @utilitywarehouse/hearth-react-native@0.
|
|
2
|
+
> @utilitywarehouse/hearth-react-native@0.4.1 lint /home/runner/work/hearth/hearth/packages/react-native
|
|
3
3
|
> TIMING=1 eslint --max-warnings 0
|
|
4
4
|
|
|
5
5
|
Rule | Time (ms) | Relative
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @utilitywarehouse/hearth-react-native
|
|
2
2
|
|
|
3
|
+
## 0.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#544](https://github.com/utilitywarehouse/hearth/pull/544) [`98e6423`](https://github.com/utilitywarehouse/hearth/commit/98e642347a0aca8c23babb15ea6b5c70b6adca0f) Thanks [@jordmccord](https://github.com/jordmccord)! - Adds legacy colour palette for backwards compatibility
|
|
8
|
+
|
|
9
|
+
## 0.4.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#511](https://github.com/utilitywarehouse/hearth/pull/511) [`04f804c`](https://github.com/utilitywarehouse/hearth/commit/04f804ca93d6e8881f649a0374a3b878c3217623) Thanks [@jordmccord](https://github.com/jordmccord)! - Adds `DatePicker` and `DatePickerInput` components
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#511](https://github.com/utilitywarehouse/hearth/pull/511) [`04f804c`](https://github.com/utilitywarehouse/hearth/commit/04f804ca93d6e8881f649a0374a3b878c3217623) Thanks [@jordmccord](https://github.com/jordmccord)! - Fixes `useTheme` typing
|
|
18
|
+
|
|
3
19
|
## 0.3.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -21,7 +21,7 @@ const CurrencyInput = ({ validationStatus = 'initial', disabled, focused, readon
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
const displayValue = autoFormatThousands && typeof value === 'string' ? formatThousands(value) : value;
|
|
24
|
-
return (_jsxs(Input, { validationStatus: validationStatusFromContext, disabled: formFieldDisabled ?? disabled, readonly: readonly, focused: focused, style: styles.wrap, children: [_jsx(InputSlot, { children: _jsx(DetailText, { size: "4xl", style: styles.text, children: "\u00A3" }) }), _jsx(InputField, { inputMode: "decimal", inBottomSheet: inBottomSheet, ...rest, placeholder: getPlaceholder, keyboardType: "decimal-pad", style: styles.input, value: displayValue, onChangeText: handleChangeText })] }));
|
|
24
|
+
return (_jsxs(Input, { validationStatus: validationStatusFromContext, disabled: formFieldDisabled ?? disabled, readonly: readonly, focused: focused, style: styles.wrap, children: [_jsx(InputSlot, { children: _jsx(DetailText, { size: "4xl", style: styles.text, accessible: false, children: "\u00A3" }) }), _jsx(InputField, { inputMode: "decimal", inBottomSheet: inBottomSheet, accessibilityHint: 'Enter the amount in pounds and pence, for example "10.99"', ...rest, placeholder: getPlaceholder, keyboardType: "decimal-pad", style: styles.input, value: displayValue, onChangeText: handleChangeText })] }));
|
|
25
25
|
};
|
|
26
26
|
CurrencyInput.displayName = 'CurrencyInput';
|
|
27
27
|
const styles = StyleSheet.create(theme => ({
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatePickerBaseProps, DateType } from './DatePicker.props';
|
|
2
|
+
import { CalendarViews } from './enums';
|
|
3
|
+
export interface DatePickerContextType extends DatePickerBaseProps {
|
|
4
|
+
showOutsideDays: boolean;
|
|
5
|
+
firstDayOfWeek: number;
|
|
6
|
+
calendarView: CalendarViews;
|
|
7
|
+
currentDate: DateType;
|
|
8
|
+
currentYear: number;
|
|
9
|
+
numerals: 'latn';
|
|
10
|
+
setCalendarView: (value: CalendarViews) => void;
|
|
11
|
+
onSelectDate: (date: DateType) => void;
|
|
12
|
+
onSelectMonth: (month: number) => void;
|
|
13
|
+
onSelectYear: (year: number) => void;
|
|
14
|
+
onChangeMonth: (value: number) => void;
|
|
15
|
+
onChangeYear: (value: number) => void;
|
|
16
|
+
closeDatePicker: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare const DatePickerContext: import("react").Context<DatePickerContextType>;
|
|
19
|
+
export declare const useDatePickerContext: () => DatePickerContextType;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatePickerBaseProps, DateType, MultiChange, RangeChange, SingleChange } from './DatePicker.props';
|
|
2
|
+
export interface DatePickerSingleProps extends DatePickerBaseProps {
|
|
3
|
+
mode: 'single';
|
|
4
|
+
date?: DateType;
|
|
5
|
+
onChange?: SingleChange;
|
|
6
|
+
}
|
|
7
|
+
export interface DatePickerRangeProps extends DatePickerBaseProps {
|
|
8
|
+
mode: 'range';
|
|
9
|
+
startDate?: DateType;
|
|
10
|
+
endDate?: DateType;
|
|
11
|
+
onChange?: RangeChange;
|
|
12
|
+
}
|
|
13
|
+
export interface DatePickerMultipleProps extends DatePickerBaseProps {
|
|
14
|
+
mode: 'multiple';
|
|
15
|
+
dates?: DateType[];
|
|
16
|
+
onChange?: MultiChange;
|
|
17
|
+
}
|
|
18
|
+
declare const DateTimePicker: (props: DatePickerSingleProps | DatePickerRangeProps | DatePickerMultipleProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export default DateTimePicker;
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import duration from 'dayjs/plugin/duration';
|
|
4
|
+
import localeData from 'dayjs/plugin/localeData';
|
|
5
|
+
import localizedFormat from 'dayjs/plugin/localizedFormat';
|
|
6
|
+
import relativeTime from 'dayjs/plugin/relativeTime';
|
|
7
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
8
|
+
import utc from 'dayjs/plugin/utc';
|
|
9
|
+
import { useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from 'react';
|
|
10
|
+
import { AccessibilityInfo, findNodeHandle, Platform, View as RNView } from 'react-native';
|
|
11
|
+
import { usePrevious } from '../../hooks/usePrevious';
|
|
12
|
+
import { BottomSheetModal, BottomSheetScrollView } from '../BottomSheet';
|
|
13
|
+
import { DatePickerContext } from './DatePicker.context';
|
|
14
|
+
import Calendar from './DatePickerCalendar';
|
|
15
|
+
import { CalendarActionKind, CONTAINER_HEIGHT, WEEKDAYS_HEIGHT } from './enums';
|
|
16
|
+
import { areDatesOnSameDay, dateToUnix, getEndOfDay, getStartOfDay, removeTime } from './utils';
|
|
17
|
+
dayjs.extend(localeData);
|
|
18
|
+
dayjs.extend(relativeTime);
|
|
19
|
+
dayjs.extend(localizedFormat);
|
|
20
|
+
dayjs.extend(utc);
|
|
21
|
+
dayjs.extend(timezone);
|
|
22
|
+
dayjs.extend(duration);
|
|
23
|
+
const DateTimePicker = (props) => {
|
|
24
|
+
const numerals = 'latn';
|
|
25
|
+
const { mode = 'single', timeZone, showOutsideDays = true, timePicker = false, firstDayOfWeek = 1,
|
|
26
|
+
// startYear,
|
|
27
|
+
// endYear,
|
|
28
|
+
minDate, maxDate, enabledDates, disabledDates, date, startDate, endDate, dates, min, max, onChange, initialView = 'day', containerHeight = CONTAINER_HEIGHT, weekdaysHeight = WEEKDAYS_HEIGHT, navigationPosition = 'right', weekdaysFormat = 'min', monthsFormat = 'short', monthCaptionFormat = 'full', multiRangeMode, hideHeader, hideFooter, hideWeekdays, disableMonthPicker, disableYearPicker, month, year, onMonthChange = () => { }, onYearChange = () => { }, use12Hours, ref, onCancel = () => { }, } = props;
|
|
29
|
+
dayjs.tz.setDefault(timeZone);
|
|
30
|
+
dayjs.locale('en');
|
|
31
|
+
const modalRef = useRef(null);
|
|
32
|
+
const calendarViewRef = useRef(null);
|
|
33
|
+
const scrollViewRef = useRef(null);
|
|
34
|
+
// Forward ref methods to parent component
|
|
35
|
+
useImperativeHandle(ref, () => modalRef.current);
|
|
36
|
+
const closeDatePicker = useCallback(() => {
|
|
37
|
+
modalRef.current?.close();
|
|
38
|
+
}, [modalRef.current]);
|
|
39
|
+
const prevTimezone = usePrevious(timeZone);
|
|
40
|
+
const initialCalendarView = useMemo(() => (mode !== 'single' && initialView === 'time' ? 'day' : initialView), [mode, initialView]);
|
|
41
|
+
const firstDay = useMemo(() => (firstDayOfWeek && firstDayOfWeek > 0 && firstDayOfWeek <= 6 ? firstDayOfWeek : 0), [firstDayOfWeek]);
|
|
42
|
+
const initialState = useMemo(() => {
|
|
43
|
+
let initialDate = dayjs().tz(timeZone);
|
|
44
|
+
if (mode === 'single' && date) {
|
|
45
|
+
initialDate = dayjs(date);
|
|
46
|
+
}
|
|
47
|
+
if (mode === 'range' && startDate) {
|
|
48
|
+
initialDate = dayjs(startDate);
|
|
49
|
+
}
|
|
50
|
+
if (mode === 'multiple' && dates && dates.length > 0) {
|
|
51
|
+
initialDate = dayjs(dates[0]);
|
|
52
|
+
}
|
|
53
|
+
if (minDate && initialDate.isBefore(minDate)) {
|
|
54
|
+
initialDate = dayjs(minDate);
|
|
55
|
+
}
|
|
56
|
+
if (month !== undefined && month && month >= 0 && month <= 11) {
|
|
57
|
+
initialDate = initialDate.month(month);
|
|
58
|
+
}
|
|
59
|
+
if (year !== undefined && year >= 0) {
|
|
60
|
+
initialDate = initialDate.year(year);
|
|
61
|
+
}
|
|
62
|
+
let _date = (date ? dayjs(date) : date);
|
|
63
|
+
if (_date && maxDate && dayjs(_date).isAfter(maxDate)) {
|
|
64
|
+
_date = dayjs(maxDate);
|
|
65
|
+
}
|
|
66
|
+
if (_date && minDate && dayjs(_date).isBefore(minDate)) {
|
|
67
|
+
_date = dayjs(minDate);
|
|
68
|
+
}
|
|
69
|
+
let start = (startDate ? dayjs(startDate) : startDate);
|
|
70
|
+
if (start && maxDate && dayjs(start).isAfter(maxDate)) {
|
|
71
|
+
start = dayjs(maxDate);
|
|
72
|
+
}
|
|
73
|
+
if (start && minDate && dayjs(start).isBefore(minDate)) {
|
|
74
|
+
start = dayjs(minDate);
|
|
75
|
+
}
|
|
76
|
+
let end = (endDate ? dayjs(endDate) : endDate);
|
|
77
|
+
if (end && maxDate && dayjs(end).isAfter(maxDate)) {
|
|
78
|
+
end = dayjs(maxDate);
|
|
79
|
+
}
|
|
80
|
+
if (end && minDate && dayjs(end).isBefore(minDate)) {
|
|
81
|
+
end = dayjs(minDate);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
date: _date,
|
|
85
|
+
startDate: start,
|
|
86
|
+
endDate: end,
|
|
87
|
+
dates,
|
|
88
|
+
calendarView: initialCalendarView,
|
|
89
|
+
currentDate: initialDate,
|
|
90
|
+
currentYear: initialDate.year(),
|
|
91
|
+
};
|
|
92
|
+
}, [
|
|
93
|
+
mode,
|
|
94
|
+
date,
|
|
95
|
+
startDate,
|
|
96
|
+
endDate,
|
|
97
|
+
dates,
|
|
98
|
+
minDate,
|
|
99
|
+
maxDate,
|
|
100
|
+
month,
|
|
101
|
+
year,
|
|
102
|
+
timeZone,
|
|
103
|
+
initialCalendarView,
|
|
104
|
+
]);
|
|
105
|
+
const [state, dispatch] = useReducer((prevState, action) => {
|
|
106
|
+
switch (action.type) {
|
|
107
|
+
case CalendarActionKind.SET_CALENDAR_VIEW:
|
|
108
|
+
return {
|
|
109
|
+
...prevState,
|
|
110
|
+
calendarView: action.payload,
|
|
111
|
+
};
|
|
112
|
+
case CalendarActionKind.CHANGE_CURRENT_DATE:
|
|
113
|
+
return {
|
|
114
|
+
...prevState,
|
|
115
|
+
currentDate: action.payload,
|
|
116
|
+
};
|
|
117
|
+
case CalendarActionKind.CHANGE_CURRENT_YEAR:
|
|
118
|
+
return {
|
|
119
|
+
...prevState,
|
|
120
|
+
currentYear: action.payload,
|
|
121
|
+
};
|
|
122
|
+
case CalendarActionKind.CHANGE_SELECTED_DATE:
|
|
123
|
+
const { date: selectedDate } = action.payload;
|
|
124
|
+
return {
|
|
125
|
+
...prevState,
|
|
126
|
+
date: selectedDate,
|
|
127
|
+
currentDate: selectedDate,
|
|
128
|
+
};
|
|
129
|
+
case CalendarActionKind.CHANGE_SELECTED_RANGE:
|
|
130
|
+
const { startDate: start, endDate: end } = action.payload;
|
|
131
|
+
return {
|
|
132
|
+
...prevState,
|
|
133
|
+
startDate: start,
|
|
134
|
+
endDate: end,
|
|
135
|
+
};
|
|
136
|
+
case CalendarActionKind.CHANGE_SELECTED_MULTIPLE:
|
|
137
|
+
const { dates: selectedDates } = action.payload;
|
|
138
|
+
return {
|
|
139
|
+
...prevState,
|
|
140
|
+
dates: selectedDates,
|
|
141
|
+
};
|
|
142
|
+
case CalendarActionKind.RESET_STATE:
|
|
143
|
+
return action.payload;
|
|
144
|
+
default:
|
|
145
|
+
return prevState;
|
|
146
|
+
}
|
|
147
|
+
}, initialState);
|
|
148
|
+
const stateRef = useRef(state);
|
|
149
|
+
stateRef.current = state;
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
const newState = {
|
|
152
|
+
...initialState,
|
|
153
|
+
};
|
|
154
|
+
dispatch({ type: CalendarActionKind.RESET_STATE, payload: newState });
|
|
155
|
+
}, []);
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (prevTimezone !== timeZone) {
|
|
158
|
+
const newDate = dayjs().tz(timeZone);
|
|
159
|
+
dispatch({
|
|
160
|
+
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
161
|
+
payload: newDate,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}, [timeZone, prevTimezone]);
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
if (mode === 'single') {
|
|
167
|
+
let _date = (date &&
|
|
168
|
+
(timePicker ? dayjs.tz(date, timeZone) : getStartOfDay(dayjs.tz(date, timeZone)))) ??
|
|
169
|
+
date;
|
|
170
|
+
if (_date && maxDate && dayjs.tz(_date, timeZone).isAfter(maxDate)) {
|
|
171
|
+
_date = dayjs.tz(maxDate, timeZone);
|
|
172
|
+
}
|
|
173
|
+
if (_date && minDate && dayjs.tz(_date, timeZone).isBefore(minDate)) {
|
|
174
|
+
_date = dayjs.tz(minDate, timeZone);
|
|
175
|
+
}
|
|
176
|
+
dispatch({
|
|
177
|
+
type: CalendarActionKind.CHANGE_SELECTED_DATE,
|
|
178
|
+
payload: { date: _date },
|
|
179
|
+
});
|
|
180
|
+
if (prevTimezone !== timeZone) {
|
|
181
|
+
onChange({
|
|
182
|
+
date: _date ? dayjs(_date).toDate() : _date,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (mode === 'range') {
|
|
187
|
+
let start = (startDate ? dayjs.tz(startDate, timeZone) : startDate);
|
|
188
|
+
if (start && maxDate && dayjs.tz(start, timeZone).isAfter(maxDate)) {
|
|
189
|
+
start = dayjs.tz(maxDate, timeZone);
|
|
190
|
+
}
|
|
191
|
+
if (start && minDate && dayjs.tz(start, timeZone).isBefore(minDate)) {
|
|
192
|
+
start = dayjs.tz(minDate, timeZone);
|
|
193
|
+
}
|
|
194
|
+
let end = (endDate ? dayjs.tz(endDate, timeZone) : endDate);
|
|
195
|
+
if (end && maxDate && dayjs.tz(end, timeZone).isAfter(maxDate)) {
|
|
196
|
+
end = dayjs.tz(maxDate, timeZone);
|
|
197
|
+
}
|
|
198
|
+
if (end && minDate && dayjs.tz(end, timeZone).isBefore(minDate)) {
|
|
199
|
+
end = dayjs.tz(minDate, timeZone);
|
|
200
|
+
}
|
|
201
|
+
dispatch({
|
|
202
|
+
type: CalendarActionKind.CHANGE_SELECTED_RANGE,
|
|
203
|
+
payload: {
|
|
204
|
+
startDate: start,
|
|
205
|
+
endDate: end,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
if (prevTimezone !== timeZone) {
|
|
209
|
+
onChange({
|
|
210
|
+
startDate: start ? dayjs(start).toDate() : start,
|
|
211
|
+
endDate: end ? dayjs(end).toDate() : end,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (mode === 'multiple') {
|
|
216
|
+
const _dates = dates?.map(date => dayjs(date).tz(timeZone));
|
|
217
|
+
dispatch({
|
|
218
|
+
type: CalendarActionKind.CHANGE_SELECTED_MULTIPLE,
|
|
219
|
+
payload: { dates: _dates },
|
|
220
|
+
});
|
|
221
|
+
if (prevTimezone !== timeZone) {
|
|
222
|
+
onChange({
|
|
223
|
+
dates: _dates.map(item => dayjs(item).toDate()),
|
|
224
|
+
change: 'updated',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}, [mode, date, startDate, endDate, dates, minDate, maxDate, timePicker, prevTimezone, timeZone]);
|
|
229
|
+
const setCalendarView = useCallback((view) => {
|
|
230
|
+
dispatch({ type: CalendarActionKind.SET_CALENDAR_VIEW, payload: view });
|
|
231
|
+
}, []);
|
|
232
|
+
const onSelectDate = useCallback((selectedDate) => {
|
|
233
|
+
if (onChange) {
|
|
234
|
+
if (mode === 'single') {
|
|
235
|
+
const newDate = timePicker
|
|
236
|
+
? dayjs.tz(selectedDate, timeZone)
|
|
237
|
+
: dayjs.tz(getStartOfDay(selectedDate), timeZone);
|
|
238
|
+
dispatch({
|
|
239
|
+
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
240
|
+
payload: newDate,
|
|
241
|
+
});
|
|
242
|
+
onChange({
|
|
243
|
+
date: newDate ? dayjs(newDate).toDate() : newDate,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else if (mode === 'range') {
|
|
247
|
+
// set time to 00:00:00
|
|
248
|
+
let start = removeTime(stateRef.current.startDate, timeZone);
|
|
249
|
+
let end = removeTime(stateRef.current.endDate, timeZone);
|
|
250
|
+
const selected = removeTime(selectedDate, timeZone);
|
|
251
|
+
let isStart = true;
|
|
252
|
+
let isReset = false;
|
|
253
|
+
if (dateToUnix(selected) !== dateToUnix(end) &&
|
|
254
|
+
dateToUnix(selected) >= dateToUnix(start) &&
|
|
255
|
+
dateToUnix(start) !== dateToUnix(end)) {
|
|
256
|
+
isStart = false;
|
|
257
|
+
}
|
|
258
|
+
else if (start && dateToUnix(selected) === dateToUnix(start)) {
|
|
259
|
+
isReset = true;
|
|
260
|
+
}
|
|
261
|
+
if (start && end) {
|
|
262
|
+
if (dateToUnix(start) === dateToUnix(end) && dateToUnix(selected) > dateToUnix(start)) {
|
|
263
|
+
isStart = false;
|
|
264
|
+
}
|
|
265
|
+
if (dateToUnix(selected) > dateToUnix(start) &&
|
|
266
|
+
dateToUnix(selected) === dateToUnix(end)) {
|
|
267
|
+
end = undefined;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (start && !end && dateToUnix(selected) < dateToUnix(start)) {
|
|
271
|
+
end = start;
|
|
272
|
+
}
|
|
273
|
+
if (isStart && end && (min || max)) {
|
|
274
|
+
const numberOfDays = dayjs(end).diff(selected, 'day');
|
|
275
|
+
if ((max && numberOfDays > max) || (min && numberOfDays < min)) {
|
|
276
|
+
isStart = true;
|
|
277
|
+
end = undefined;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (!isStart && start && (min || max)) {
|
|
281
|
+
const numberOfDays = dayjs(selected).diff(start, 'day');
|
|
282
|
+
if (dateToUnix(selected) === dateToUnix(start)) {
|
|
283
|
+
isReset = true;
|
|
284
|
+
}
|
|
285
|
+
else if ((max && numberOfDays > max) || (min && numberOfDays < min)) {
|
|
286
|
+
isStart = true;
|
|
287
|
+
end = undefined;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (isReset) {
|
|
291
|
+
onChange({
|
|
292
|
+
startDate: undefined,
|
|
293
|
+
endDate: undefined,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
onChange({
|
|
298
|
+
startDate: isStart
|
|
299
|
+
? dayjs(selected).toDate()
|
|
300
|
+
: start
|
|
301
|
+
? dayjs.tz(start).toDate()
|
|
302
|
+
: start,
|
|
303
|
+
endDate: !isStart
|
|
304
|
+
? dayjs.tz(getEndOfDay(selected), timeZone).toDate()
|
|
305
|
+
: end
|
|
306
|
+
? dayjs.tz(getEndOfDay(end), timeZone).toDate()
|
|
307
|
+
: end,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else if (mode === 'multiple') {
|
|
312
|
+
const safeDates = stateRef.current.dates || [];
|
|
313
|
+
const newDate = dayjs(selectedDate, timeZone).startOf('day');
|
|
314
|
+
const exists = safeDates.some(ed => areDatesOnSameDay(ed, newDate));
|
|
315
|
+
const newDates = exists
|
|
316
|
+
? safeDates.filter(ed => !areDatesOnSameDay(ed, newDate))
|
|
317
|
+
: [...safeDates, newDate];
|
|
318
|
+
if (max && newDates.length > max) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
newDates.sort((a, b) => (dayjs(a).isAfter(dayjs(b)) ? 1 : -1));
|
|
322
|
+
const _dates = newDates.map(date => dayjs(date).tz(timeZone));
|
|
323
|
+
onChange({
|
|
324
|
+
dates: _dates.map(item => dayjs(item).toDate()),
|
|
325
|
+
datePressed: newDate ? dayjs(newDate).toDate() : newDate,
|
|
326
|
+
change: exists ? 'removed' : 'added',
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}, [mode, timePicker, min, max, timeZone]);
|
|
331
|
+
// set the active displayed month
|
|
332
|
+
const onSelectMonth = useCallback((value) => {
|
|
333
|
+
const currentMonth = dayjs(stateRef.current.currentDate).month();
|
|
334
|
+
const newDate = dayjs(stateRef.current.currentDate).month(value);
|
|
335
|
+
// Only call onMonthChange if the month actually changed
|
|
336
|
+
if (value !== currentMonth) {
|
|
337
|
+
onMonthChange(value);
|
|
338
|
+
}
|
|
339
|
+
dispatch({
|
|
340
|
+
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
341
|
+
payload: newDate,
|
|
342
|
+
});
|
|
343
|
+
setCalendarView('day');
|
|
344
|
+
}, [setCalendarView, onMonthChange]);
|
|
345
|
+
// set the active displayed year
|
|
346
|
+
const onSelectYear = useCallback((value) => {
|
|
347
|
+
const currentYear = dayjs(stateRef.current.currentDate).year();
|
|
348
|
+
const newDate = dayjs(stateRef.current.currentDate).year(value);
|
|
349
|
+
// Only call onYearChange if the year actually changed
|
|
350
|
+
if (value !== currentYear) {
|
|
351
|
+
onYearChange(value);
|
|
352
|
+
}
|
|
353
|
+
dispatch({
|
|
354
|
+
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
355
|
+
payload: newDate,
|
|
356
|
+
});
|
|
357
|
+
setCalendarView('day');
|
|
358
|
+
}, [setCalendarView, onYearChange]);
|
|
359
|
+
const onChangeMonth = useCallback((value) => {
|
|
360
|
+
const newDate = dayjs(stateRef.current.currentDate).add(value, 'month');
|
|
361
|
+
dispatch({
|
|
362
|
+
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
363
|
+
payload: dayjs(newDate),
|
|
364
|
+
});
|
|
365
|
+
}, [stateRef, dispatch]);
|
|
366
|
+
const onChangeYear = useCallback((value) => {
|
|
367
|
+
dispatch({
|
|
368
|
+
type: CalendarActionKind.CHANGE_CURRENT_YEAR,
|
|
369
|
+
payload: value,
|
|
370
|
+
});
|
|
371
|
+
}, [dispatch]);
|
|
372
|
+
useEffect(() => {
|
|
373
|
+
if (month !== undefined && month >= 0 && month <= 11) {
|
|
374
|
+
onSelectMonth(month);
|
|
375
|
+
}
|
|
376
|
+
}, [month]);
|
|
377
|
+
useEffect(() => {
|
|
378
|
+
if (year !== undefined && year >= 0) {
|
|
379
|
+
onSelectYear(year);
|
|
380
|
+
}
|
|
381
|
+
}, [year]);
|
|
382
|
+
const baseContextValue = useMemo(() => ({
|
|
383
|
+
mode,
|
|
384
|
+
numerals,
|
|
385
|
+
timeZone,
|
|
386
|
+
showOutsideDays,
|
|
387
|
+
timePicker,
|
|
388
|
+
minDate,
|
|
389
|
+
maxDate,
|
|
390
|
+
min,
|
|
391
|
+
max,
|
|
392
|
+
enabledDates,
|
|
393
|
+
disabledDates,
|
|
394
|
+
firstDayOfWeek: firstDay,
|
|
395
|
+
containerHeight,
|
|
396
|
+
weekdaysHeight,
|
|
397
|
+
navigationPosition,
|
|
398
|
+
weekdaysFormat,
|
|
399
|
+
monthsFormat,
|
|
400
|
+
monthCaptionFormat,
|
|
401
|
+
multiRangeMode,
|
|
402
|
+
hideHeader,
|
|
403
|
+
hideFooter,
|
|
404
|
+
hideWeekdays,
|
|
405
|
+
disableMonthPicker,
|
|
406
|
+
disableYearPicker,
|
|
407
|
+
use12Hours,
|
|
408
|
+
closeDatePicker,
|
|
409
|
+
}), [
|
|
410
|
+
mode,
|
|
411
|
+
numerals,
|
|
412
|
+
timeZone,
|
|
413
|
+
showOutsideDays,
|
|
414
|
+
timePicker,
|
|
415
|
+
minDate,
|
|
416
|
+
maxDate,
|
|
417
|
+
min,
|
|
418
|
+
max,
|
|
419
|
+
enabledDates,
|
|
420
|
+
disabledDates,
|
|
421
|
+
firstDay,
|
|
422
|
+
containerHeight,
|
|
423
|
+
weekdaysHeight,
|
|
424
|
+
navigationPosition,
|
|
425
|
+
weekdaysFormat,
|
|
426
|
+
monthsFormat,
|
|
427
|
+
monthCaptionFormat,
|
|
428
|
+
multiRangeMode,
|
|
429
|
+
hideHeader,
|
|
430
|
+
hideFooter,
|
|
431
|
+
hideWeekdays,
|
|
432
|
+
disableMonthPicker,
|
|
433
|
+
disableYearPicker,
|
|
434
|
+
use12Hours,
|
|
435
|
+
closeDatePicker,
|
|
436
|
+
]);
|
|
437
|
+
const handlerContextValue = useMemo(() => ({
|
|
438
|
+
setCalendarView,
|
|
439
|
+
onSelectDate,
|
|
440
|
+
onSelectMonth,
|
|
441
|
+
onSelectYear,
|
|
442
|
+
onChangeMonth,
|
|
443
|
+
onChangeYear,
|
|
444
|
+
onCancel,
|
|
445
|
+
}), [
|
|
446
|
+
setCalendarView,
|
|
447
|
+
onSelectDate,
|
|
448
|
+
onSelectMonth,
|
|
449
|
+
onSelectYear,
|
|
450
|
+
onChangeMonth,
|
|
451
|
+
onChangeYear,
|
|
452
|
+
onCancel,
|
|
453
|
+
]);
|
|
454
|
+
const memoizedValue = useMemo(() => ({
|
|
455
|
+
...state,
|
|
456
|
+
...baseContextValue,
|
|
457
|
+
...handlerContextValue,
|
|
458
|
+
}), [state, baseContextValue, handlerContextValue]);
|
|
459
|
+
const handleChange = useCallback((index) => {
|
|
460
|
+
if (index > -1) {
|
|
461
|
+
// Add a small delay to ensure the bottom sheet is fully rendered
|
|
462
|
+
setTimeout(() => {
|
|
463
|
+
// Announce to screen readers
|
|
464
|
+
AccessibilityInfo.announceForAccessibility('Date picker opened.');
|
|
465
|
+
// Set focus for screen readers - different refs for iOS vs Android
|
|
466
|
+
const scrollViewTargetRef = scrollViewRef.current?.getInnerViewNode();
|
|
467
|
+
const targetRef = calendarViewRef.current;
|
|
468
|
+
if ((Platform.OS === 'android' && targetRef) || scrollViewTargetRef) {
|
|
469
|
+
const nodeHandle = findNodeHandle(Platform.OS === 'android' ? targetRef : scrollViewTargetRef);
|
|
470
|
+
if (nodeHandle) {
|
|
471
|
+
AccessibilityInfo.setAccessibilityFocus(nodeHandle);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}, 50);
|
|
475
|
+
}
|
|
476
|
+
}, []);
|
|
477
|
+
return (_jsx(BottomSheetModal, { ref: modalRef, onChange: handleChange, accessible: false, children: _jsx(BottomSheetScrollView, { ref: scrollViewRef, children: _jsx(RNView, { ref: calendarViewRef, accessible: Platform.OS === 'android' ? true : undefined, accessibilityLabel: Platform.OS === 'android' ? 'Date picker calendar' : undefined, importantForAccessibility: Platform.OS === 'android' ? 'yes' : 'auto', children: _jsx(DatePickerContext.Provider, { value: memoizedValue, children: _jsx(Calendar, {}) }) }) }) }));
|
|
478
|
+
};
|
|
479
|
+
export default DateTimePicker;
|