react-native-molecules 0.5.0-beta.2 → 0.5.0-beta.20

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 (157) hide show
  1. package/README.md +1 -1
  2. package/components/Accordion/Accordion.tsx +2 -6
  3. package/components/Accordion/AccordionItem.tsx +16 -12
  4. package/components/Accordion/AccordionItemContent.tsx +6 -1
  5. package/components/Accordion/AccordionItemHeader.tsx +1 -1
  6. package/components/Accordion/utils.ts +6 -0
  7. package/components/ActivityIndicator/ActivityIndicator.tsx +6 -15
  8. package/components/Appbar/AppbarBase.tsx +18 -13
  9. package/components/Button/Button.tsx +209 -264
  10. package/components/Button/index.tsx +9 -3
  11. package/components/Button/types.ts +16 -2
  12. package/components/Button/utils.ts +230 -208
  13. package/components/Checkbox/CheckboxBase.tsx +23 -128
  14. package/components/Checkbox/utils.ts +0 -25
  15. package/components/Chip/Chip.tsx +40 -52
  16. package/components/Chip/utils.ts +3 -7
  17. package/components/DateField/DateField.tsx +110 -0
  18. package/components/DateField/index.tsx +6 -0
  19. package/components/{DatePickerInput/inputUtils.ts → DateField/useDateFieldState.ts} +17 -49
  20. package/components/DatePicker/DateCalendar.tsx +83 -0
  21. package/components/DatePicker/DatePickerActions.tsx +73 -0
  22. package/components/DatePicker/DatePickerModal.tsx +234 -0
  23. package/components/DatePicker/DatePickerPopover.tsx +79 -0
  24. package/components/DatePicker/DatePickerProvider.tsx +152 -0
  25. package/components/DatePicker/DatePickerTrigger.tsx +23 -0
  26. package/components/DatePicker/context.tsx +82 -0
  27. package/components/DatePicker/index.tsx +44 -0
  28. package/components/DatePicker/utils.ts +293 -0
  29. package/components/DatePickerInline/DatePickerContext.tsx +1 -0
  30. package/components/DatePickerInline/DatePickerDockedHeader.tsx +113 -0
  31. package/components/DatePickerInline/DatePickerInline.tsx +16 -15
  32. package/components/DatePickerInline/DatePickerInlineBase.tsx +7 -1
  33. package/components/DatePickerInline/Day.tsx +25 -1
  34. package/components/DatePickerInline/DayRange.tsx +2 -4
  35. package/components/DatePickerInline/HeaderItem.tsx +42 -27
  36. package/components/DatePickerInline/Month.tsx +45 -65
  37. package/components/DatePickerInline/MonthPicker.tsx +25 -41
  38. package/components/DatePickerInline/Swiper.native.tsx +21 -4
  39. package/components/DatePickerInline/Swiper.tsx +168 -13
  40. package/components/DatePickerInline/Week.tsx +6 -1
  41. package/components/DatePickerInline/YearPicker.tsx +206 -53
  42. package/components/DatePickerInline/dateUtils.tsx +17 -12
  43. package/components/DatePickerInline/types.ts +3 -0
  44. package/components/DatePickerInline/utils.ts +66 -29
  45. package/components/Drawer/Drawer.tsx +17 -6
  46. package/components/ElementGroup/ElementGroup.tsx +16 -14
  47. package/components/FilePicker/FilePicker.tsx +48 -78
  48. package/components/FilePicker/index.tsx +2 -1
  49. package/components/FilePicker/utils.ts +9 -0
  50. package/components/HelperText/HelperText.tsx +0 -35
  51. package/components/Icon/iconFactory.tsx +3 -3
  52. package/components/Icon/index.tsx +1 -1
  53. package/components/Icon/types.ts +17 -6
  54. package/components/IconButton/IconButton.tsx +42 -57
  55. package/components/IconButton/utils.ts +142 -33
  56. package/components/ListItem/ListItem.tsx +3 -1
  57. package/components/ListItem/utils.ts +1 -1
  58. package/components/LoadingIndicator/LoadingIndicator.tsx +253 -0
  59. package/components/LoadingIndicator/LoadingIndicator.web.tsx +136 -0
  60. package/components/LoadingIndicator/index.tsx +13 -0
  61. package/components/LoadingIndicator/utils.ts +117 -0
  62. package/components/Menu/Menu.tsx +3 -18
  63. package/components/NavigationRail/NavigationRail.tsx +15 -9
  64. package/components/Popover/Popover.tsx +122 -145
  65. package/components/Popover/PopoverRoot.tsx +74 -0
  66. package/components/Popover/common.ts +50 -34
  67. package/components/Popover/index.ts +18 -1
  68. package/components/Popover/usePlatformMeasure.native.ts +90 -0
  69. package/components/Popover/usePlatformMeasure.ts +118 -0
  70. package/components/Popover/utils.ts +34 -0
  71. package/components/Select/Select.tsx +368 -507
  72. package/components/Select/context.tsx +72 -0
  73. package/components/Select/index.ts +8 -14
  74. package/components/Select/types.ts +2 -4
  75. package/components/Select/utils.ts +144 -0
  76. package/components/Slot/Slot.tsx +244 -0
  77. package/components/Slot/compose-refs.tsx +62 -0
  78. package/components/Slot/index.tsx +8 -0
  79. package/components/Surface/Surface.android.tsx +34 -8
  80. package/components/Surface/Surface.ios.tsx +36 -29
  81. package/components/Surface/Surface.tsx +31 -4
  82. package/components/Surface/utils.ts +44 -30
  83. package/components/Switch/Switch.tsx +8 -2
  84. package/components/Tabs/TabItem.tsx +35 -58
  85. package/components/Tabs/TabLabel.tsx +5 -9
  86. package/components/Tabs/Tabs.tsx +154 -148
  87. package/components/Tabs/utils.ts +15 -2
  88. package/components/TextInput/TextInput.tsx +658 -575
  89. package/components/TextInput/index.tsx +19 -3
  90. package/components/TextInput/types.ts +76 -27
  91. package/components/TextInput/utils.ts +225 -145
  92. package/components/TimeField/TimeField.tsx +75 -0
  93. package/components/TimeField/index.tsx +6 -0
  94. package/components/TimeField/useTimeFieldState.ts +70 -0
  95. package/components/{TimePickerField/sanitizeTime.ts → TimeField/utils.ts} +77 -10
  96. package/components/TimePicker/TimeInput.tsx +87 -37
  97. package/components/TimePicker/TimeInputs.tsx +137 -49
  98. package/components/TimePicker/TimePicker.tsx +73 -10
  99. package/components/TimePicker/TimePickerModal.tsx +186 -0
  100. package/components/TimePicker/context.tsx +17 -0
  101. package/components/TimePicker/index.tsx +15 -3
  102. package/components/TimePicker/utils.ts +93 -0
  103. package/components/Tooltip/Tooltip.tsx +42 -67
  104. package/components/Tooltip/TooltipContent.tsx +32 -5
  105. package/components/Tooltip/TooltipTrigger.tsx +20 -20
  106. package/components/Tooltip/index.tsx +1 -1
  107. package/components/TouchableRipple/TouchableRipple.native.tsx +50 -14
  108. package/components/TouchableRipple/TouchableRipple.tsx +137 -47
  109. package/hocs/withPortal.tsx +1 -1
  110. package/hooks/index.tsx +0 -6
  111. package/hooks/useActionState.tsx +19 -8
  112. package/hooks/useControlledValue.tsx +20 -4
  113. package/hooks/useFilePicker.tsx +6 -16
  114. package/hooks/useWhatHasUpdated.tsx +48 -0
  115. package/package.json +17 -13
  116. package/shortcuts-manager/ShortcutsManager/ShortcutsManager.tsx +5 -2
  117. package/styles/shadow.ts +2 -1
  118. package/styles/themes/LightTheme.tsx +1 -1
  119. package/utils/DocumentPicker/documentPicker.ts +78 -27
  120. package/utils/DocumentPicker/types.ts +0 -1
  121. package/utils/extractPropertiesFromStyles.ts +25 -0
  122. package/utils/extractSubcomponents.ts +89 -0
  123. package/utils/lodash.ts +77 -5
  124. package/components/DatePickerDocked/DatePickerDocked.tsx +0 -30
  125. package/components/DatePickerDocked/DatePickerDockedHeader.tsx +0 -129
  126. package/components/DatePickerDocked/index.tsx +0 -17
  127. package/components/DatePickerDocked/types.ts +0 -11
  128. package/components/DatePickerDocked/utils.ts +0 -157
  129. package/components/DatePickerInput/DatePickerInput.tsx +0 -139
  130. package/components/DatePickerInput/DatePickerInputModal.tsx +0 -48
  131. package/components/DatePickerInput/DatePickerInputWithoutModal.tsx +0 -77
  132. package/components/DatePickerInput/DateRangeInput.tsx +0 -88
  133. package/components/DatePickerInput/index.tsx +0 -10
  134. package/components/DatePickerInput/types.ts +0 -28
  135. package/components/DatePickerInput/utils.ts +0 -15
  136. package/components/DatePickerModal/AnimatedCrossView.tsx +0 -94
  137. package/components/DatePickerModal/CalendarEdit.tsx +0 -139
  138. package/components/DatePickerModal/DatePickerModal.tsx +0 -85
  139. package/components/DatePickerModal/DatePickerModalContent.tsx +0 -155
  140. package/components/DatePickerModal/DatePickerModalContentHeader.tsx +0 -213
  141. package/components/DatePickerModal/DatePickerModalHeader.tsx +0 -74
  142. package/components/DatePickerModal/DatePickerModalHeaderBackground.tsx +0 -13
  143. package/components/DatePickerModal/index.tsx +0 -16
  144. package/components/DatePickerModal/types.ts +0 -92
  145. package/components/DatePickerModal/utils.ts +0 -122
  146. package/components/DateTimePicker/DateTimePicker.tsx +0 -172
  147. package/components/DateTimePicker/index.tsx +0 -10
  148. package/components/DateTimePicker/utils.ts +0 -12
  149. package/components/Popover/Popover.native.tsx +0 -185
  150. package/components/TimePickerField/TimePickerField.tsx +0 -152
  151. package/components/TimePickerField/index.tsx +0 -10
  152. package/components/TimePickerField/utils.ts +0 -94
  153. package/components/TimePickerModal/TimePickerModal.tsx +0 -115
  154. package/components/TimePickerModal/index.tsx +0 -10
  155. package/components/TimePickerModal/utils.ts +0 -47
  156. package/hooks/useSearchable.tsx +0 -74
  157. package/hooks/useSubcomponents.tsx +0 -59
@@ -1,7 +1,8 @@
1
- import { memo, useCallback, useMemo } from 'react';
2
- import { type StyleProp, View, type ViewStyle } from 'react-native';
1
+ import { memo, useCallback } from 'react';
2
+ import { View } from 'react-native';
3
3
 
4
- import { datePickerHeaderItemStyles } from '../DatePickerDocked/utils';
4
+ import { datePickerHeaderItemStyles } from '../DatePicker/utils';
5
+ import { Icon } from '../Icon';
5
6
  import { IconButton } from '../IconButton';
6
7
  import { Text } from '../Text';
7
8
  import { TouchableRipple } from '../TouchableRipple';
@@ -42,10 +43,11 @@ function HeaderItem({
42
43
  onNext && onNext(type);
43
44
  }, [onNext, type]);
44
45
 
45
- const containerStyle = useMemo(
46
- () =>
47
- [
46
+ return (
47
+ <View
48
+ style={[
48
49
  datePickerHeaderItemStyles.buttonContainer,
50
+ // eslint-disable-next-line react-native/no-inline-styles
49
51
  {
50
52
  justifyContent: !onPressDropdown
51
53
  ? 'flex-end'
@@ -53,22 +55,23 @@ function HeaderItem({
53
55
  ? 'flex-start'
54
56
  : 'center',
55
57
  },
56
- ] as StyleProp<ViewStyle>,
57
- [onPressDropdown, onNext],
58
- );
59
-
60
- return (
61
- <View style={containerStyle} pointerEvents={'box-none'}>
62
- {!selecting && onPrev && (
63
- <View style={datePickerHeaderItemStyles.buttonWrapper}>
58
+ ]}
59
+ pointerEvents={'box-none'}>
60
+ {onPrev && (
61
+ <View
62
+ style={[
63
+ datePickerHeaderItemStyles.buttonWrapper,
64
+ // eslint-disable-next-line react-native/no-inline-styles
65
+ (selecting || disabled) && { opacity: 0 },
66
+ ]}>
64
67
  <IconButton
65
68
  type="material-community"
66
69
  name="chevron-left"
67
- size="md"
70
+ size={24}
68
71
  // Todo: Translate
69
72
  accessibilityLabel={'Previous'}
70
73
  onPress={handleOnPrevious}
71
- disabled={value === startDateYear}
74
+ disabled={value === startDateYear || selecting || disabled}
72
75
  />
73
76
  </View>
74
77
  )}
@@ -80,27 +83,39 @@ function HeaderItem({
80
83
  accessibilityLabel={`${value}`}
81
84
  style={datePickerHeaderItemStyles.buttonStyle}>
82
85
  <View style={datePickerHeaderItemStyles.innerStyle}>
83
- <Text style={datePickerHeaderItemStyles.labelStyle} selectable={false}>
86
+ <Text
87
+ style={[
88
+ datePickerHeaderItemStyles.labelStyle,
89
+ // eslint-disable-next-line react-native/no-inline-styles
90
+ disabled && { opacity: 0.5 },
91
+ ]}
92
+ selectable={false}>
84
93
  {value}
85
94
  </Text>
86
- <IconButton
87
- onPress={handlePressDropDown}
88
- name={selecting && type === pickerType ? 'menu-up' : 'menu-down'}
89
- size="sm"
90
- disabled={disabled}
91
- />
95
+ {!disabled && (
96
+ <Icon
97
+ onPress={handlePressDropDown}
98
+ name={selecting && type === pickerType ? 'menu-up' : 'menu-down'}
99
+ size={18}
100
+ />
101
+ )}
92
102
  </View>
93
103
  </TouchableRipple>
94
104
  )}
95
- {!selecting && onNext && (
96
- <View style={datePickerHeaderItemStyles.buttonWrapper}>
105
+ {onNext && (
106
+ <View
107
+ style={[
108
+ datePickerHeaderItemStyles.buttonWrapper,
109
+ // eslint-disable-next-line react-native/no-inline-styles
110
+ (selecting || disabled) && { opacity: 0 },
111
+ ]}>
97
112
  <IconButton
98
113
  name="chevron-right"
99
- size="md"
114
+ size={24}
100
115
  // Todo: Translate
101
116
  accessibilityLabel={'Next'}
102
117
  onPress={handleOnNext}
103
- disabled={value === endDateYear}
118
+ disabled={value === endDateYear || selecting || disabled}
104
119
  />
105
120
  </View>
106
121
  )}
@@ -1,9 +1,8 @@
1
- import { memo, useCallback, useMemo } from 'react';
1
+ import { memo, useMemo } from 'react';
2
2
  import { View } from 'react-native';
3
3
 
4
4
  import { format } from '../../utils/date-fns';
5
5
  import { Text } from '../Text';
6
- import { useDatePickerStoreValue } from './DatePickerContext';
7
6
  import { getCalendarHeaderHeight } from './DatePickerInlineHeader';
8
7
  import {
9
8
  addMonths,
@@ -14,6 +13,7 @@ import {
14
13
  getRealIndex,
15
14
  gridCounts,
16
15
  startAtIndex,
16
+ totalMonths,
17
17
  useRangeChecker,
18
18
  } from './dateUtils';
19
19
  import type { MonthMultiProps, MonthRangeProps, MonthSingleProps } from './types';
@@ -42,11 +42,9 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) {
42
42
  scrollMode,
43
43
  disableWeekDays,
44
44
  validRange,
45
+ showOutsideDays,
45
46
  // customMonthStyles,
46
47
  } = props;
47
- const { localDate } = useDatePickerStoreValue(state => ({ localDate: state.localDate }));
48
- // const monthStyles = useComponentStyles('DatePicker_Month', customMonthStyles);
49
-
50
48
  const isHorizontal = scrollMode === 'horizontal';
51
49
  const { isDisabled, isWithinValidRange } = useRangeChecker(validRange);
52
50
 
@@ -54,11 +52,11 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) {
54
52
  const realIndex = getRealIndex(index);
55
53
 
56
54
  const md = addMonths(new Date(), realIndex);
57
- const y = mode === 'single' ? localDate.getFullYear() : md.getFullYear();
58
- const m = mode === 'single' ? localDate.getMonth() : md.getMonth();
55
+ const y = md.getFullYear();
56
+ const m = md.getMonth();
59
57
 
60
58
  return { monthName: format(md, 'LLLL'), month: m, year: y };
61
- }, [index, localDate, mode]);
59
+ }, [index]);
62
60
 
63
61
  const grid = useMemo(
64
62
  () =>
@@ -78,67 +76,34 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) {
78
76
  [year, month, index, isDisabled, mode, isWithinValidRange, startDate, endDate, dates, date],
79
77
  );
80
78
 
81
- const { headerStyle, yearButtonStyle, yearInnerStyle, monthLabelStyle, weekContainerStyle } =
82
- useMemo(() => {
83
- // const {
84
- // monthLabel: _monthLabel,
85
- // yearButton,
86
- // yearButtonInner,
87
- // month: _monthStyle,
88
- // monthHeader,
89
- // dockedHeaderStyle,
90
- // weekContainerStyle: weekContainer,
91
- // } = monthStyles;
92
- // const { typescale, ...monthLabel } = _monthLabel;
93
-
94
- return {
95
- headerStyle: [
96
- datePickerMonthStyles.monthHeader,
97
- isHorizontal
98
- ? [
99
- datePickerMonthStyles.dockedHeaderStyle,
100
- {
101
- marginTop: monthHeaderSingleMarginTop,
102
- marginBottom: monthHeaderSingleMarginBottom,
103
- },
104
- ]
105
- : null,
106
- ],
107
- yearButtonStyle: datePickerMonthStyles.yearButton,
108
- yearInnerStyle: datePickerMonthStyles.yearButtonInner,
109
- monthLabelStyle: [datePickerMonthStyles.monthLabel],
110
- weekContainerStyle: datePickerMonthStyles.weekContainerStyle,
111
- };
112
- }, [isHorizontal]);
113
-
114
- const renderHeader = useCallback(() => {
115
- if (!isHorizontal) {
116
- return (
79
+ const headerStyle = [
80
+ datePickerMonthStyles.monthHeader,
81
+ isHorizontal
82
+ ? [
83
+ datePickerMonthStyles.dockedHeaderStyle,
84
+ {
85
+ marginTop: monthHeaderSingleMarginTop,
86
+ marginBottom: monthHeaderSingleMarginBottom,
87
+ },
88
+ ]
89
+ : null,
90
+ ];
91
+
92
+ return (
93
+ <View>
94
+ {!isHorizontal ? (
117
95
  <View style={headerStyle}>
118
- <View accessibilityLabel={`${monthName} ${year}`} style={yearButtonStyle}>
119
- <View style={yearInnerStyle}>
120
- <Text style={monthLabelStyle} selectable={false}>
96
+ <View
97
+ accessibilityLabel={`${monthName} ${year}`}
98
+ style={[datePickerMonthStyles.yearButton]}>
99
+ <View style={[datePickerMonthStyles.yearButtonInner]}>
100
+ <Text style={datePickerMonthStyles.monthLabel} selectable={false}>
121
101
  {monthName} {year}
122
102
  </Text>
123
103
  </View>
124
104
  </View>
125
105
  </View>
126
- );
127
- }
128
- return null;
129
- }, [
130
- headerStyle,
131
- isHorizontal,
132
- monthLabelStyle,
133
- monthName,
134
- year,
135
- yearButtonStyle,
136
- yearInnerStyle,
137
- ]);
138
-
139
- return (
140
- <View>
141
- {renderHeader()}
106
+ ) : null}
142
107
  {grid.map(({ weekIndex, generatedDays }) => (
143
108
  <Week
144
109
  key={weekIndex}
@@ -146,7 +111,8 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) {
146
111
  generatedDays={generatedDays}
147
112
  disableWeekDays={disableWeekDays}
148
113
  onPressDate={onPressDate}
149
- style={weekContainerStyle}
114
+ showOutsideDays={showOutsideDays}
115
+ style={datePickerMonthStyles.weekContainerStyle}
150
116
  />
151
117
  ))}
152
118
  </View>
@@ -190,7 +156,21 @@ function weeksOffset(index: number): number {
190
156
  }
191
157
 
192
158
  export function getIndexFromHorizontalOffset(offset: number, width: number): number {
193
- return startAtIndex + Math.floor(offset / width);
159
+ if (!Number.isFinite(offset) || !Number.isFinite(width) || width <= 1) {
160
+ return startAtIndex;
161
+ }
162
+
163
+ const rawIndex = startAtIndex + Math.floor(offset / width);
164
+
165
+ if (rawIndex < 0) {
166
+ return 0;
167
+ }
168
+
169
+ if (rawIndex >= totalMonths) {
170
+ return totalMonths - 1;
171
+ }
172
+
173
+ return rawIndex;
194
174
  }
195
175
 
196
176
  export function getIndexFromVerticalOffset(offset: number): number {
@@ -5,10 +5,7 @@ import { StyleSheet } from 'react-native-unistyles';
5
5
 
6
6
  import { resolveStateVariant } from '../../utils';
7
7
  import { range } from '../../utils/dateTimePicker';
8
- import {
9
- datePickerDockedMonthItemStyles,
10
- datePickerMonthPickerStyles,
11
- } from '../DatePickerDocked/utils';
8
+ import { datePickerMonthItemStyles, datePickerMonthPickerStyles } from '../DatePicker/utils';
12
9
  import { HorizontalDivider } from '../HorizontalDivider';
13
10
  import { Icon } from '../Icon';
14
11
  import { ListItem } from '../ListItem/';
@@ -25,20 +22,6 @@ export default function MonthPicker() {
25
22
  const flatList = useRef<FlatList<number> | null>(null);
26
23
  const months = range(0, 11);
27
24
 
28
- const { containerStyle, monthStyle } = useMemo(() => {
29
- const { backgroundColor, ...rest } = datePickerMonthPickerStyles.root;
30
-
31
- return {
32
- containerStyle: [
33
- StyleSheet.absoluteFill,
34
- styles.root,
35
- { backgroundColor },
36
- selectingMonth ? styles.opacity1 : styles.opacity0,
37
- ],
38
- monthStyle: rest,
39
- };
40
- }, [selectingMonth]);
41
-
42
25
  const handleOnChange = useCallback(
43
26
  (month: number) => {
44
27
  setStore(prev => ({
@@ -56,11 +39,11 @@ export default function MonthPicker() {
56
39
  month={item}
57
40
  selected={localDate.getMonth() === item}
58
41
  onPressMonth={handleOnChange}
59
- monthStyles={monthStyle}
42
+ monthStyles={datePickerMonthPickerStyles.root}
60
43
  />
61
44
  );
62
45
  },
63
- [localDate, handleOnChange, monthStyle],
46
+ [localDate, handleOnChange],
64
47
  );
65
48
 
66
49
  if (!selectingMonth) {
@@ -68,7 +51,14 @@ export default function MonthPicker() {
68
51
  }
69
52
 
70
53
  return (
71
- <View style={containerStyle} pointerEvents={selectingMonth ? 'auto' : 'none'}>
54
+ <View
55
+ style={[
56
+ StyleSheet.absoluteFill,
57
+ styles.root,
58
+ // { backgroundColor },
59
+ selectingMonth ? styles.opacity1 : styles.opacity0,
60
+ ]}
61
+ pointerEvents={selectingMonth ? 'auto' : 'none'}>
72
62
  <HorizontalDivider />
73
63
  <FlatList<number>
74
64
  ref={flatList}
@@ -95,26 +85,20 @@ function MonthPure({
95
85
  const state = resolveStateVariant({
96
86
  selected,
97
87
  });
98
- datePickerDockedMonthItemStyles.useVariants({
88
+
89
+ datePickerMonthItemStyles.useVariants({
99
90
  state: state as any,
100
91
  });
101
- // const montLocalStyles = useComponentStyles('DatePickerDocked_MonthItem', monthStyles, {
102
- // state: resolveStateVariant({
103
- // selected,
104
- // }),
105
- // });
106
- const { monthInnerStyle, monthLabelStyle, monthButtonStyle, accessibilityState } =
107
- useMemo(() => {
108
- const { monthInner, monthLabel, monthButton } = datePickerDockedMonthItemStyles;
109
-
110
- return {
111
- monthInnerStyle: monthInner,
112
- monthLabelStyle: monthLabel,
113
- monthButtonStyle: [monthButton, monthStyles],
114
- accessibilityState: { selected },
115
- };
116
- // eslint-disable-next-line react-hooks/exhaustive-deps
117
- }, [selected, monthStyles, state]);
92
+
93
+ const { monthButtonStyle, accessibilityState } = useMemo(() => {
94
+ const { monthButton } = datePickerMonthItemStyles;
95
+
96
+ return {
97
+ monthButtonStyle: [monthButton, monthStyles],
98
+ accessibilityState: { selected },
99
+ };
100
+ // eslint-disable-next-line react-hooks/exhaustive-deps
101
+ }, [selected, monthStyles, state]);
118
102
 
119
103
  const handleMonthPress = useCallback(() => {
120
104
  onPressMonth(month);
@@ -137,8 +121,8 @@ function MonthPure({
137
121
  <View style={styles.spacer} />
138
122
  )
139
123
  }>
140
- <View style={monthInnerStyle}>
141
- <Text style={monthLabelStyle} selectable={false}>
124
+ <View style={datePickerMonthItemStyles.monthInner}>
125
+ <Text style={datePickerMonthItemStyles.monthLabel} selectable={false}>
142
126
  {format(new Date(2000, month, 1), 'MMMM')}
143
127
  </Text>
144
128
  </View>
@@ -1,4 +1,4 @@
1
- import { memo, useCallback, useMemo, useRef, useState } from 'react';
1
+ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import {
3
3
  type NativeScrollEvent,
4
4
  type NativeSyntheticEvent,
@@ -9,7 +9,9 @@ import {
9
9
  } from 'react-native';
10
10
 
11
11
  import AutoSizer from './AutoSizer';
12
- import { beginOffset, estimatedMonthHeight, totalMonths } from './dateUtils';
12
+ import { useDatePickerStore } from './DatePickerContext';
13
+ import { beginOffset, estimatedMonthHeight, getInitialIndex, totalMonths } from './dateUtils';
14
+ import { addMonths, getRealIndex } from './dateUtils';
13
15
  import {
14
16
  getHorizontalMonthOffset,
15
17
  getIndexFromVerticalOffset,
@@ -54,11 +56,16 @@ function SwiperInner({
54
56
  );
55
57
 
56
58
  const parentRef = useRef<ScrollView | null>(null);
59
+ const [{ localDate }, setStore] = useDatePickerStore(state => state);
57
60
 
58
61
  const scrollTo = useCallback(
59
62
  (index: number, animated: boolean) => {
60
63
  idx.current = index;
61
64
  setVisibleIndexes(getVisibleArray(index, { isHorizontal, height }));
65
+ setStore(prev => ({
66
+ ...prev,
67
+ localDate: addMonths(new Date(), getRealIndex(index)),
68
+ }));
62
69
 
63
70
  if (!parentRef.current) {
64
71
  return;
@@ -81,13 +88,19 @@ function SwiperInner({
81
88
  });
82
89
  }
83
90
  },
84
- [parentRef, isHorizontal, width, height],
91
+ [parentRef, isHorizontal, width, height, setStore],
85
92
  );
86
93
 
87
94
  const scrollToInitial = useCallback(() => {
88
95
  scrollTo(idx.current, false);
89
96
  }, [scrollTo]);
90
97
 
98
+ useEffect(() => {
99
+ const targetIndex = getInitialIndex(localDate);
100
+ if (targetIndex === idx.current) return;
101
+ scrollTo(targetIndex, false);
102
+ }, [localDate, scrollTo]);
103
+
91
104
  const onMomentumScrollEnd = useCallback(
92
105
  (e: NativeSyntheticEvent<NativeScrollEvent>) => {
93
106
  const contentOffset = e.nativeEvent.contentOffset;
@@ -103,9 +116,13 @@ function SwiperInner({
103
116
  if (idx.current !== newIndex) {
104
117
  idx.current = newIndex;
105
118
  setVisibleIndexes(getVisibleArray(newIndex, { isHorizontal, height }));
119
+ setStore(prev => ({
120
+ ...prev,
121
+ localDate: addMonths(new Date(), getRealIndex(newIndex)),
122
+ }));
106
123
  }
107
124
  },
108
- [idx, height, isHorizontal],
125
+ [idx, height, isHorizontal, setStore],
109
126
  );
110
127
 
111
128
  const { innerContainerStyle, itemContainerStyle } = useMemo(() => {