@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.
Files changed (274) hide show
  1. package/.storybook/preview.tsx +3 -0
  2. package/.turbo/turbo-build.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/CHANGELOG.md +16 -0
  5. package/build/components/CurrencyInput/CurrencyInput.js +1 -1
  6. package/build/components/DatePicker/DatePicker.context.d.ts +19 -0
  7. package/build/components/DatePicker/DatePicker.context.js +3 -0
  8. package/build/components/DatePicker/DatePicker.d.ts +19 -0
  9. package/build/components/DatePicker/DatePicker.js +479 -0
  10. package/build/components/DatePicker/DatePicker.props.d.ts +125 -0
  11. package/build/components/DatePicker/DatePicker.props.js +1 -0
  12. package/build/components/DatePicker/DatePickerCalendar.d.ts +2 -0
  13. package/build/components/DatePicker/DatePickerCalendar.js +28 -0
  14. package/build/components/DatePicker/DatePickerDay.d.ts +11 -0
  15. package/build/components/DatePicker/DatePickerDay.js +242 -0
  16. package/build/components/DatePicker/DatePickerDays.d.ts +2 -0
  17. package/build/components/DatePicker/DatePickerDays.js +157 -0
  18. package/build/components/DatePicker/DatePickerFooter.d.ts +2 -0
  19. package/build/components/DatePicker/DatePickerFooter.js +23 -0
  20. package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.d.ts +8 -0
  21. package/build/components/DatePicker/DatePickerHeader/DatePickerHeader.props.js +1 -0
  22. package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.d.ts +2 -0
  23. package/build/components/DatePicker/DatePickerHeader/DatePickerMonthButton.js +14 -0
  24. package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.d.ts +2 -0
  25. package/build/components/DatePicker/DatePickerHeader/DatePickerNextButton.js +32 -0
  26. package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.d.ts +2 -0
  27. package/build/components/DatePicker/DatePickerHeader/DatePickerPrevButton.js +32 -0
  28. package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.d.ts +6 -0
  29. package/build/components/DatePicker/DatePickerHeader/DatePickerSelectors.js +64 -0
  30. package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.d.ts +1 -0
  31. package/build/components/DatePicker/DatePickerHeader/DatePickerTimeButton.js +22 -0
  32. package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.d.ts +2 -0
  33. package/build/components/DatePicker/DatePickerHeader/DatePickerYearButton.js +25 -0
  34. package/build/components/DatePicker/DatePickerHeader/index.d.ts +3 -0
  35. package/build/components/DatePicker/DatePickerHeader/index.js +30 -0
  36. package/build/components/DatePicker/DatePickerMonths.d.ts +2 -0
  37. package/build/components/DatePicker/DatePickerMonths.js +69 -0
  38. package/build/components/DatePicker/DatePickerWeekdays.d.ts +8 -0
  39. package/build/components/DatePicker/DatePickerWeekdays.js +26 -0
  40. package/build/components/DatePicker/DatePickerYears.d.ts +2 -0
  41. package/build/components/DatePicker/DatePickerYears.js +83 -0
  42. package/build/components/DatePicker/TimePicker.d.ts +3 -0
  43. package/build/components/DatePicker/TimePicker.js +84 -0
  44. package/build/components/DatePicker/enums.d.ts +12 -0
  45. package/build/components/DatePicker/enums.js +12 -0
  46. package/build/components/DatePicker/index.d.ts +4 -0
  47. package/build/components/DatePicker/index.js +3 -0
  48. package/build/components/DatePicker/polyfill.d.ts +0 -0
  49. package/build/components/DatePicker/polyfill.js +22 -0
  50. package/build/components/DatePicker/time-picker/animated-math.d.ts +4 -0
  51. package/build/components/DatePicker/time-picker/animated-math.js +19 -0
  52. package/build/components/DatePicker/time-picker/period-native.d.ts +6 -0
  53. package/build/components/DatePicker/time-picker/period-native.js +17 -0
  54. package/build/components/DatePicker/time-picker/period-picker.d.ts +6 -0
  55. package/build/components/DatePicker/time-picker/period-picker.js +10 -0
  56. package/build/components/DatePicker/time-picker/period-web.d.ts +6 -0
  57. package/build/components/DatePicker/time-picker/period-web.js +21 -0
  58. package/build/components/DatePicker/time-picker/wheel-native.d.ts +8 -0
  59. package/build/components/DatePicker/time-picker/wheel-native.js +19 -0
  60. package/build/components/DatePicker/time-picker/wheel-picker/index.d.ts +2 -0
  61. package/build/components/DatePicker/time-picker/wheel-picker/index.js +2 -0
  62. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.d.ts +16 -0
  63. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.js +97 -0
  64. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.d.ts +21 -0
  65. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.js +88 -0
  66. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.d.ts +23 -0
  67. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.js +21 -0
  68. package/build/components/DatePicker/time-picker/wheel-web.d.ts +8 -0
  69. package/build/components/DatePicker/time-picker/wheel-web.js +148 -0
  70. package/build/components/DatePicker/time-picker/wheel.d.ts +8 -0
  71. package/build/components/DatePicker/time-picker/wheel.js +10 -0
  72. package/build/components/DatePicker/utils.d.ts +212 -0
  73. package/build/components/DatePicker/utils.js +391 -0
  74. package/build/components/DatePickerInput/DatePickerInput.d.ts +6 -0
  75. package/build/components/DatePickerInput/DatePickerInput.js +126 -0
  76. package/build/components/DatePickerInput/DatePickerInput.props.d.ts +47 -0
  77. package/build/components/DatePickerInput/DatePickerInput.props.js +1 -0
  78. package/build/components/DatePickerInput/DatePickerInputDoneButton.d.ts +8 -0
  79. package/build/components/DatePickerInput/DatePickerInputDoneButton.js +19 -0
  80. package/build/components/DatePickerInput/DatePickerInputDoneButton.web.d.ts +5 -0
  81. package/build/components/DatePickerInput/DatePickerInputDoneButton.web.js +5 -0
  82. package/build/components/DatePickerInput/index.d.ts +2 -0
  83. package/build/components/DatePickerInput/index.js +1 -0
  84. package/build/components/Input/InputField.d.ts +1 -1
  85. package/build/components/Input/InputField.js +1 -1
  86. package/build/components/Input/InputSlot.d.ts +1 -1
  87. package/build/components/Input/InputSlot.js +3 -3
  88. package/build/components/UnstyledIconButton/UnstyledIconButton.js +2 -2
  89. package/build/components/UnstyledIconButton/UnstyledIconButtonRoot.js +1 -1
  90. package/build/components/index.d.ts +2 -0
  91. package/build/components/index.js +2 -0
  92. package/build/core/themes.d.ts +482 -0
  93. package/build/core/themes.js +31 -0
  94. package/build/hooks/index.d.ts +4 -3
  95. package/build/hooks/index.js +4 -3
  96. package/build/hooks/usePrevious.d.ts +1 -0
  97. package/build/hooks/usePrevious.js +8 -0
  98. package/build/hooks/useTheme.d.ts +2 -1
  99. package/build/hooks/useTheme.js +2 -2
  100. package/build/legacyTokens/common/brand.d.ts +16 -0
  101. package/build/legacyTokens/common/brand.js +17 -0
  102. package/build/legacyTokens/common/index.d.ts +8 -0
  103. package/build/legacyTokens/common/index.js +9 -0
  104. package/build/legacyTokens/common/service.d.ts +20 -0
  105. package/build/legacyTokens/common/service.js +21 -0
  106. package/build/legacyTokens/dark/apple.d.ts +28 -0
  107. package/build/legacyTokens/dark/apple.js +29 -0
  108. package/build/legacyTokens/dark/cyan.d.ts +48 -0
  109. package/build/legacyTokens/dark/cyan.js +49 -0
  110. package/build/legacyTokens/dark/gold.d.ts +44 -0
  111. package/build/legacyTokens/dark/gold.js +45 -0
  112. package/build/legacyTokens/dark/grape.d.ts +28 -0
  113. package/build/legacyTokens/dark/grape.js +29 -0
  114. package/build/legacyTokens/dark/green.d.ts +40 -0
  115. package/build/legacyTokens/dark/green.js +41 -0
  116. package/build/legacyTokens/dark/grey.d.ts +60 -0
  117. package/build/legacyTokens/dark/grey.js +61 -0
  118. package/build/legacyTokens/dark/index.d.ts +40 -0
  119. package/build/legacyTokens/dark/index.js +41 -0
  120. package/build/legacyTokens/dark/pink.d.ts +28 -0
  121. package/build/legacyTokens/dark/pink.js +29 -0
  122. package/build/legacyTokens/dark/purple.d.ts +48 -0
  123. package/build/legacyTokens/dark/purple.js +49 -0
  124. package/build/legacyTokens/dark/red.d.ts +40 -0
  125. package/build/legacyTokens/dark/red.js +41 -0
  126. package/build/legacyTokens/dark/rose.d.ts +28 -0
  127. package/build/legacyTokens/dark/rose.js +29 -0
  128. package/build/legacyTokens/index.d.ts +12 -0
  129. package/build/legacyTokens/index.js +13 -0
  130. package/build/legacyTokens/light/apple.d.ts +28 -0
  131. package/build/legacyTokens/light/apple.js +29 -0
  132. package/build/legacyTokens/light/cyan.d.ts +48 -0
  133. package/build/legacyTokens/light/cyan.js +49 -0
  134. package/build/legacyTokens/light/gold.d.ts +44 -0
  135. package/build/legacyTokens/light/gold.js +45 -0
  136. package/build/legacyTokens/light/grape.d.ts +28 -0
  137. package/build/legacyTokens/light/grape.js +29 -0
  138. package/build/legacyTokens/light/green.d.ts +40 -0
  139. package/build/legacyTokens/light/green.js +41 -0
  140. package/build/legacyTokens/light/grey.d.ts +60 -0
  141. package/build/legacyTokens/light/grey.js +61 -0
  142. package/build/legacyTokens/light/index.d.ts +40 -0
  143. package/build/legacyTokens/light/index.js +41 -0
  144. package/build/legacyTokens/light/pink.d.ts +28 -0
  145. package/build/legacyTokens/light/pink.js +29 -0
  146. package/build/legacyTokens/light/purple.d.ts +48 -0
  147. package/build/legacyTokens/light/purple.js +49 -0
  148. package/build/legacyTokens/light/red.d.ts +40 -0
  149. package/build/legacyTokens/light/red.js +41 -0
  150. package/build/legacyTokens/light/rose.d.ts +32 -0
  151. package/build/legacyTokens/light/rose.js +33 -0
  152. package/build/tokens/components/dark/date-picker.d.ts +1 -0
  153. package/build/tokens/components/dark/date-picker.js +1 -0
  154. package/build/tokens/components/dark/illustrations.d.ts +7 -0
  155. package/build/tokens/components/dark/illustrations.js +6 -0
  156. package/build/tokens/components/dark/index.d.ts +1 -0
  157. package/build/tokens/components/dark/index.js +1 -0
  158. package/build/tokens/components/dark/segmented-control.d.ts +2 -2
  159. package/build/tokens/components/dark/segmented-control.js +2 -2
  160. package/build/tokens/components/dark/table.d.ts +3 -0
  161. package/build/tokens/components/dark/table.js +3 -0
  162. package/build/tokens/components/light/date-picker.d.ts +1 -0
  163. package/build/tokens/components/light/date-picker.js +1 -0
  164. package/build/tokens/components/light/illustrations.d.ts +7 -0
  165. package/build/tokens/components/light/illustrations.js +6 -0
  166. package/build/tokens/components/light/index.d.ts +1 -0
  167. package/build/tokens/components/light/index.js +1 -0
  168. package/build/tokens/components/light/segmented-control.d.ts +2 -2
  169. package/build/tokens/components/light/segmented-control.js +2 -2
  170. package/build/tokens/components/light/table.d.ts +3 -0
  171. package/build/tokens/components/light/table.js +3 -0
  172. package/build/utils/index.d.ts +1 -0
  173. package/build/utils/index.js +1 -0
  174. package/build/utils/isEqual.d.ts +2 -0
  175. package/build/utils/isEqual.js +29 -0
  176. package/chromatic.config.json +6 -0
  177. package/docs/components/AllComponents.web.tsx +43 -1
  178. package/docs/components/ViewWrap.tsx +32 -0
  179. package/docs/components/index.ts +1 -0
  180. package/docs/getting-started.mdx +6 -6
  181. package/package.json +11 -8
  182. package/src/components/CurrencyInput/CurrencyInput.tsx +2 -1
  183. package/src/components/DatePicker/DatePicker.context.ts +23 -0
  184. package/src/components/DatePicker/DatePicker.docs.mdx +239 -0
  185. package/src/components/DatePicker/DatePicker.props.ts +139 -0
  186. package/src/components/DatePicker/DatePicker.stories.tsx +98 -0
  187. package/src/components/DatePicker/DatePicker.tsx +669 -0
  188. package/src/components/DatePicker/DatePickerCalendar.tsx +41 -0
  189. package/src/components/DatePicker/DatePickerDay.tsx +302 -0
  190. package/src/components/DatePicker/DatePickerDays.tsx +241 -0
  191. package/src/components/DatePicker/DatePickerFooter.tsx +35 -0
  192. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.props.ts +10 -0
  193. package/src/components/DatePicker/DatePickerHeader/DatePickerMonthButton.tsx +29 -0
  194. package/src/components/DatePicker/DatePickerHeader/DatePickerNextButton.tsx +46 -0
  195. package/src/components/DatePicker/DatePickerHeader/DatePickerPrevButton.tsx +46 -0
  196. package/src/components/DatePicker/DatePickerHeader/DatePickerSelectors.tsx +96 -0
  197. package/src/components/DatePicker/DatePickerHeader/DatePickerTimeButton.tsx +48 -0
  198. package/src/components/DatePicker/DatePickerHeader/DatePickerYearButton.tsx +50 -0
  199. package/src/components/DatePicker/DatePickerHeader/index.tsx +64 -0
  200. package/src/components/DatePicker/DatePickerMonths.tsx +101 -0
  201. package/src/components/DatePicker/DatePickerWeekdays.tsx +49 -0
  202. package/src/components/DatePicker/DatePickerYears.tsx +119 -0
  203. package/src/components/DatePicker/TimePicker.tsx +141 -0
  204. package/src/components/DatePicker/enums.ts +14 -0
  205. package/src/components/DatePicker/index.ts +13 -0
  206. package/src/components/DatePicker/polyfill.ts +21 -0
  207. package/src/components/DatePicker/time-picker/animated-math.ts +33 -0
  208. package/src/components/DatePicker/time-picker/period-native.tsx +34 -0
  209. package/src/components/DatePicker/time-picker/period-picker.tsx +16 -0
  210. package/src/components/DatePicker/time-picker/period-web.tsx +36 -0
  211. package/src/components/DatePicker/time-picker/wheel-native.tsx +37 -0
  212. package/src/components/DatePicker/time-picker/wheel-picker/index.ts +3 -0
  213. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.tsx +132 -0
  214. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.ts +22 -0
  215. package/src/components/DatePicker/time-picker/wheel-picker/wheel-picker.tsx +200 -0
  216. package/src/components/DatePicker/time-picker/wheel-web.tsx +181 -0
  217. package/src/components/DatePicker/time-picker/wheel.tsx +18 -0
  218. package/src/components/DatePicker/utils.ts +549 -0
  219. package/src/components/DatePickerInput/DatePickerInput.docs.mdx +237 -0
  220. package/src/components/DatePickerInput/DatePickerInput.props.ts +50 -0
  221. package/src/components/DatePickerInput/DatePickerInput.stories.tsx +178 -0
  222. package/src/components/DatePickerInput/DatePickerInput.tsx +265 -0
  223. package/src/components/DatePickerInput/DatePickerInputDoneButton.tsx +42 -0
  224. package/src/components/DatePickerInput/DatePickerInputDoneButton.web.tsx +7 -0
  225. package/src/components/DatePickerInput/index.ts +2 -0
  226. package/src/components/Icon/Icon.stories.tsx +4 -3
  227. package/src/components/Input/InputField.tsx +0 -2
  228. package/src/components/Input/InputSlot.tsx +14 -3
  229. package/src/components/Modal/Modal.stories.tsx +2 -30
  230. package/src/components/UnstyledIconButton/UnstyledIconButton.tsx +14 -2
  231. package/src/components/UnstyledIconButton/UnstyledIconButtonRoot.tsx +7 -3
  232. package/src/components/index.ts +2 -0
  233. package/src/core/themes.ts +31 -0
  234. package/src/hooks/index.ts +4 -3
  235. package/src/hooks/usePrevious.ts +9 -0
  236. package/src/hooks/useTheme.ts +4 -3
  237. package/src/legacyTokens/common/brand.ts +18 -0
  238. package/src/legacyTokens/common/index.ts +10 -0
  239. package/src/legacyTokens/common/service.ts +22 -0
  240. package/src/legacyTokens/dark/apple.ts +30 -0
  241. package/src/legacyTokens/dark/cyan.ts +50 -0
  242. package/src/legacyTokens/dark/gold.ts +46 -0
  243. package/src/legacyTokens/dark/grape.ts +30 -0
  244. package/src/legacyTokens/dark/green.ts +42 -0
  245. package/src/legacyTokens/dark/grey.ts +62 -0
  246. package/src/legacyTokens/dark/index.ts +42 -0
  247. package/src/legacyTokens/dark/pink.ts +30 -0
  248. package/src/legacyTokens/dark/purple.ts +50 -0
  249. package/src/legacyTokens/dark/red.ts +42 -0
  250. package/src/legacyTokens/dark/rose.ts +30 -0
  251. package/src/legacyTokens/index.ts +14 -0
  252. package/src/legacyTokens/light/apple.ts +30 -0
  253. package/src/legacyTokens/light/cyan.ts +50 -0
  254. package/src/legacyTokens/light/gold.ts +46 -0
  255. package/src/legacyTokens/light/grape.ts +30 -0
  256. package/src/legacyTokens/light/green.ts +42 -0
  257. package/src/legacyTokens/light/grey.ts +62 -0
  258. package/src/legacyTokens/light/index.ts +42 -0
  259. package/src/legacyTokens/light/pink.ts +30 -0
  260. package/src/legacyTokens/light/purple.ts +50 -0
  261. package/src/legacyTokens/light/red.ts +42 -0
  262. package/src/legacyTokens/light/rose.ts +34 -0
  263. package/src/tokens/components/dark/date-picker.ts +1 -0
  264. package/src/tokens/components/dark/illustrations.ts +7 -0
  265. package/src/tokens/components/dark/index.ts +1 -0
  266. package/src/tokens/components/dark/segmented-control.ts +2 -2
  267. package/src/tokens/components/dark/table.ts +3 -0
  268. package/src/tokens/components/light/date-picker.ts +1 -0
  269. package/src/tokens/components/light/illustrations.ts +7 -0
  270. package/src/tokens/components/light/index.ts +1 -0
  271. package/src/tokens/components/light/segmented-control.ts +2 -2
  272. package/src/tokens/components/light/table.ts +3 -0
  273. package/src/utils/index.ts +1 -0
  274. package/src/utils/isEqual.ts +30 -0
@@ -73,6 +73,9 @@ const preview = {
73
73
  'Hooks',
74
74
  'Layout Components',
75
75
  'All Components',
76
+ 'Primitives',
77
+ 'Typography',
78
+ 'Forms',
76
79
  ],
77
80
  },
78
81
  },
@@ -1,4 +1,4 @@
1
1
 
2
- > @utilitywarehouse/hearth-react-native@0.3.1 build /home/runner/work/hearth/hearth/packages/react-native
2
+ > @utilitywarehouse/hearth-react-native@0.4.1 build /home/runner/work/hearth/hearth/packages/react-native
3
3
  > tsc
4
4
 
@@ -1,5 +1,5 @@
1
1
 
2
- > @utilitywarehouse/hearth-react-native@0.3.1 lint /home/runner/work/hearth/hearth/packages/react-native
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,3 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const DatePickerContext = createContext({});
3
+ export const useDatePickerContext = () => useContext(DatePickerContext);
@@ -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;