react-native-dates-picker 0.1.3 → 0.1.4

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 (84) hide show
  1. package/lib/commonjs/DateTimePicker.js +144 -85
  2. package/lib/commonjs/DateTimePicker.js.map +1 -1
  3. package/lib/commonjs/components/Calendar.js +3 -5
  4. package/lib/commonjs/components/Calendar.js.map +1 -1
  5. package/lib/commonjs/components/DatePicker.js +16 -83
  6. package/lib/commonjs/components/DatePicker.js.map +1 -1
  7. package/lib/commonjs/components/Day.js +3 -8
  8. package/lib/commonjs/components/Day.js.map +1 -1
  9. package/lib/commonjs/components/TimeSelector.js +3 -3
  10. package/lib/commonjs/components/TimeSelector.js.map +1 -1
  11. package/lib/commonjs/components/WheelPicker/WheelNative.js +2 -2
  12. package/lib/commonjs/components/WheelPicker/WheelNative.js.map +1 -1
  13. package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker-item.js +56 -72
  14. package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker-item.js.map +1 -1
  15. package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker.js +26 -48
  16. package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
  17. package/lib/commonjs/components/WheelPicker/WheelWeb.js +5 -7
  18. package/lib/commonjs/components/WheelPicker/WheelWeb.js.map +1 -1
  19. package/lib/commonjs/components/WheelSelector.js +129 -0
  20. package/lib/commonjs/components/WheelSelector.js.map +1 -0
  21. package/lib/commonjs/utils.js +68 -0
  22. package/lib/commonjs/utils.js.map +1 -1
  23. package/lib/module/DateTimePicker.js +146 -87
  24. package/lib/module/DateTimePicker.js.map +1 -1
  25. package/lib/module/components/Calendar.js +3 -5
  26. package/lib/module/components/Calendar.js.map +1 -1
  27. package/lib/module/components/DatePicker.js +16 -81
  28. package/lib/module/components/DatePicker.js.map +1 -1
  29. package/lib/module/components/Day.js +3 -8
  30. package/lib/module/components/Day.js.map +1 -1
  31. package/lib/module/components/TimeSelector.js +3 -3
  32. package/lib/module/components/TimeSelector.js.map +1 -1
  33. package/lib/module/components/WheelPicker/WheelNative.js +2 -2
  34. package/lib/module/components/WheelPicker/WheelNative.js.map +1 -1
  35. package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker-item.js +57 -73
  36. package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker-item.js.map +1 -1
  37. package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js +26 -48
  38. package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
  39. package/lib/module/components/WheelPicker/WheelWeb.js +5 -7
  40. package/lib/module/components/WheelPicker/WheelWeb.js.map +1 -1
  41. package/lib/module/components/WheelSelector.js +120 -0
  42. package/lib/module/components/WheelSelector.js.map +1 -0
  43. package/lib/module/utils.js +65 -0
  44. package/lib/module/utils.js.map +1 -1
  45. package/lib/typescript/DateTimePicker.d.ts +2 -2
  46. package/lib/typescript/DateTimePicker.d.ts.map +1 -1
  47. package/lib/typescript/components/Calendar.d.ts.map +1 -1
  48. package/lib/typescript/components/DatePicker.d.ts +6 -1
  49. package/lib/typescript/components/DatePicker.d.ts.map +1 -1
  50. package/lib/typescript/components/Day.d.ts.map +1 -1
  51. package/lib/typescript/components/WheelPicker/Wheel.d.ts +1 -1
  52. package/lib/typescript/components/WheelPicker/WheelNative.d.ts +1 -1
  53. package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker-item.d.ts.map +1 -1
  54. package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker.d.ts +1 -2
  55. package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker.d.ts.map +1 -1
  56. package/lib/typescript/components/WheelPicker/WheelWeb.d.ts +1 -1
  57. package/lib/typescript/components/WheelPicker/WheelWeb.d.ts.map +1 -1
  58. package/lib/typescript/components/WheelSelector.d.ts +8 -0
  59. package/lib/typescript/components/WheelSelector.d.ts.map +1 -0
  60. package/lib/typescript/types.d.ts +1 -1
  61. package/lib/typescript/types.d.ts.map +1 -1
  62. package/lib/typescript/utils.d.ts +9 -0
  63. package/lib/typescript/utils.d.ts.map +1 -1
  64. package/package.json +2 -3
  65. package/src/DateTimePicker.tsx +226 -108
  66. package/src/components/Calendar.tsx +3 -11
  67. package/src/components/DatePicker.tsx +17 -138
  68. package/src/components/Day.tsx +1 -4
  69. package/src/components/TimeSelector.tsx +3 -3
  70. package/src/components/WheelPicker/Wheel.tsx +1 -1
  71. package/src/components/WheelPicker/WheelNative.tsx +3 -3
  72. package/src/components/WheelPicker/WheelNativePicker/wheel-picker-item.tsx +65 -74
  73. package/src/components/WheelPicker/WheelNativePicker/wheel-picker.tsx +20 -48
  74. package/src/components/WheelPicker/WheelWeb.tsx +6 -7
  75. package/src/components/WheelSelector.tsx +170 -0
  76. package/src/types.ts +1 -1
  77. package/src/utils.ts +77 -0
  78. package/lib/commonjs/components/WheelPicker/AnimatedMath.js +0 -26
  79. package/lib/commonjs/components/WheelPicker/AnimatedMath.js.map +0 -1
  80. package/lib/module/components/WheelPicker/AnimatedMath.js +0 -20
  81. package/lib/module/components/WheelPicker/AnimatedMath.js.map +0 -1
  82. package/lib/typescript/components/WheelPicker/AnimatedMath.d.ts +0 -5
  83. package/lib/typescript/components/WheelPicker/AnimatedMath.d.ts.map +0 -1
  84. package/src/components/WheelPicker/AnimatedMath.tsx +0 -33
@@ -1,4 +1,11 @@
1
- import React, { memo, useCallback, useEffect, useReducer } from 'react';
1
+ import React, {
2
+ memo,
3
+ useCallback,
4
+ useEffect,
5
+ useMemo,
6
+ useReducer,
7
+ useRef,
8
+ } from 'react';
2
9
  import dayjs from 'dayjs';
3
10
  import utc from 'dayjs/plugin/utc';
4
11
  import localeData from 'dayjs/plugin/localeData';
@@ -7,7 +14,6 @@ import localizedFormat from 'dayjs/plugin/localizedFormat';
7
14
  import 'dayjs/locale/zh-cn';
8
15
  import {
9
16
  getFormatted,
10
- getDate,
11
17
  dateToUnix,
12
18
  getEndOfDay,
13
19
  getStartOfDay,
@@ -27,6 +33,7 @@ import type {
27
33
  MultiChange,
28
34
  } from './types';
29
35
  import Calendar from './components/Calendar';
36
+ import DatePicker from './components/DatePicker';
30
37
 
31
38
  dayjs.extend(utc);
32
39
  dayjs.extend(localeData);
@@ -37,7 +44,7 @@ export interface DatePickerSingleProps
37
44
  extends CalendarThemeProps,
38
45
  HeaderProps,
39
46
  DatePickerBaseProps {
40
- mode?: 'single';
47
+ mode: 'single';
41
48
  columns?: never;
42
49
  date?: DateType;
43
50
  onChange?: SingleChange;
@@ -58,7 +65,7 @@ export interface DatePickerMultipleProps
58
65
  extends CalendarThemeProps,
59
66
  HeaderProps,
60
67
  DatePickerBaseProps {
61
- mode?: 'multiple';
68
+ mode: 'multiple';
62
69
  columns?: never;
63
70
  dates?: DateType[];
64
71
  onChange?: MultiChange;
@@ -100,31 +107,89 @@ const DateTimePicker: React.FC<
100
107
  columns = ['year', 'month', 'day'],
101
108
  ...rest
102
109
  } = props;
110
+ dayjs.locale(locale);
103
111
 
104
- const initialCalendarView: CalendarViews =
105
- mode !== 'single' && initialView === 'time' ? 'day' : initialView;
112
+ const initialCalendarView: CalendarViews = useMemo(
113
+ () => (mode !== 'single' && initialView === 'time' ? 'day' : initialView),
114
+ [mode, initialView]
115
+ );
106
116
 
107
- const firstDay =
108
- firstDayOfWeek && firstDayOfWeek > 0 && firstDayOfWeek <= 6
109
- ? firstDayOfWeek
110
- : 0;
117
+ const firstDay = useMemo(
118
+ () =>
119
+ firstDayOfWeek && firstDayOfWeek > 0 && firstDayOfWeek <= 6
120
+ ? firstDayOfWeek
121
+ : 0,
122
+ [firstDayOfWeek]
123
+ );
111
124
 
112
- let currentDate = dayjs();
125
+ const initialState: LocalState = useMemo(() => {
126
+ let initialDate = dayjs();
127
+
128
+ if (mode === 'single' && date) {
129
+ initialDate = dayjs(date);
130
+ }
113
131
 
114
- if ((mode === 'single' || mode === 'wheel') && date)
115
- currentDate = dayjs(date);
132
+ if (mode === 'range' && startDate) {
133
+ initialDate = dayjs(startDate);
134
+ }
116
135
 
117
- if (mode === 'range' && startDate) currentDate = dayjs(startDate);
136
+ if (mode === 'multiple' && dates && dates.length > 0) {
137
+ initialDate = dayjs(dates[0]);
138
+ }
118
139
 
119
- if (mode === 'multiple' && dates && dates.length > 0)
120
- currentDate = dayjs(dates[0]);
140
+ if (minDate && initialDate.isBefore(minDate)) {
141
+ initialDate = dayjs(minDate);
142
+ }
121
143
 
122
- if (minDate && currentDate.isBefore(minDate)) currentDate = dayjs(minDate);
123
- if (maxDate && currentDate.isAfter(maxDate)) currentDate = dayjs(maxDate);
144
+ let _date = (date ? dayjs(date) : date) as DateType;
124
145
 
125
- let currentYear = currentDate.year();
146
+ if (_date && maxDate && dayjs(_date).isAfter(maxDate)) {
147
+ _date = dayjs(maxDate);
148
+ }
126
149
 
127
- dayjs.locale(locale);
150
+ if (_date && minDate && dayjs(_date).isBefore(minDate)) {
151
+ _date = dayjs(minDate);
152
+ }
153
+
154
+ let start = (startDate ? dayjs(startDate) : startDate) as DateType;
155
+
156
+ if (start && maxDate && dayjs(start).isAfter(maxDate)) {
157
+ start = dayjs(maxDate);
158
+ }
159
+
160
+ if (start && minDate && dayjs(start).isBefore(minDate)) {
161
+ start = dayjs(minDate);
162
+ }
163
+
164
+ let end = (endDate ? dayjs(endDate) : endDate) as DateType;
165
+
166
+ if (end && maxDate && dayjs(end).isAfter(maxDate)) {
167
+ end = dayjs(maxDate);
168
+ }
169
+
170
+ if (end && minDate && dayjs(end).isBefore(minDate)) {
171
+ end = dayjs(minDate);
172
+ }
173
+
174
+ return {
175
+ date: _date,
176
+ startDate: start,
177
+ endDate: end,
178
+ dates,
179
+ calendarView: initialCalendarView,
180
+ currentDate: initialDate,
181
+ currentYear: initialDate.year(),
182
+ };
183
+ }, [
184
+ mode,
185
+ date,
186
+ startDate,
187
+ endDate,
188
+ dates,
189
+ minDate,
190
+ maxDate,
191
+ initialCalendarView,
192
+ ]);
128
193
 
129
194
  const [state, dispatch] = useReducer(
130
195
  (prevState: LocalState, action: CalendarAction) => {
@@ -145,53 +210,76 @@ const DateTimePicker: React.FC<
145
210
  currentYear: action.payload,
146
211
  };
147
212
  case CalendarActionKind.CHANGE_SELECTED_DATE:
148
- const { date } = action.payload;
213
+ const { date: selectDate } = action.payload;
149
214
  return {
150
215
  ...prevState,
151
- date,
152
- currentDate: date,
216
+ date: selectDate,
217
+ currentDate: selectDate,
153
218
  };
154
219
  case CalendarActionKind.CHANGE_SELECTED_RANGE:
155
- const { startDate, endDate } = action.payload;
220
+ const { start, end } = action.payload;
156
221
  return {
157
222
  ...prevState,
158
- startDate,
159
- endDate,
223
+ startDate: start,
224
+ endDate: end,
160
225
  };
161
226
  case CalendarActionKind.CHANGE_SELECTED_MULTIPLE:
162
- const { dates } = action.payload;
227
+ const { dates: selectedDates } = action.payload;
163
228
  return {
164
229
  ...prevState,
165
- dates,
230
+ dates: selectedDates,
166
231
  };
232
+ default:
233
+ return prevState;
167
234
  }
168
235
  },
169
- {
170
- date,
171
- startDate,
172
- endDate,
173
- dates,
174
- calendarView: initialCalendarView,
175
- currentDate,
176
- currentYear,
177
- }
236
+ initialState
178
237
  );
179
238
 
239
+ const stateRef = useRef(state);
240
+ stateRef.current = state;
241
+
180
242
  useEffect(() => {
181
243
  if (mode === 'single') {
182
- const newDate =
183
- (date && (timePicker ? date : getStartOfDay(date))) ?? minDate;
244
+ let newDate = (date && (timePicker ? date : getStartOfDay(date))) ?? date;
245
+
246
+ if (newDate && maxDate && dayjs(newDate).isAfter(maxDate)) {
247
+ newDate = dayjs(maxDate);
248
+ }
249
+ if (newDate && minDate && dayjs(newDate).isBefore(minDate)) {
250
+ newDate = dayjs(minDate);
251
+ }
184
252
 
185
253
  dispatch({
186
254
  type: CalendarActionKind.CHANGE_SELECTED_DATE,
187
255
  payload: { date: newDate },
188
256
  });
189
- } else if (mode === 'range')
257
+ } else if (mode === 'range') {
258
+ let start = startDate ? dayjs(startDate) : startDate;
259
+
260
+ if (start && maxDate && dayjs(start).isAfter(maxDate)) {
261
+ start = dayjs(maxDate);
262
+ }
263
+ if (start && minDate && dayjs(start).isBefore(minDate)) {
264
+ start = dayjs(minDate);
265
+ }
266
+
267
+ let end = endDate ? dayjs(endDate) : endDate;
268
+
269
+ if (end && maxDate && dayjs(end).isAfter(maxDate)) {
270
+ end = dayjs(maxDate);
271
+ }
272
+ if (end && minDate && dayjs(end).isBefore(minDate)) {
273
+ end = dayjs(minDate);
274
+ }
190
275
  dispatch({
191
276
  type: CalendarActionKind.CHANGE_SELECTED_RANGE,
192
- payload: { startDate, endDate },
277
+ payload: {
278
+ startDate: start,
279
+ endDate: end,
280
+ },
193
281
  });
194
- else if (mode === 'multiple')
282
+ } else if (mode === 'multiple')
195
283
  dispatch({
196
284
  type: CalendarActionKind.CHANGE_SELECTED_MULTIPLE,
197
285
  payload: { dates },
@@ -201,13 +289,7 @@ const DateTimePicker: React.FC<
201
289
  type: CalendarActionKind.CHANGE_SELECTED_DATE,
202
290
  payload: { date },
203
291
  });
204
-
205
- dispatch({
206
- type: CalendarActionKind.CHANGE_CURRENT_DATE,
207
- payload: currentDate,
208
- });
209
- // eslint-disable-next-line react-hooks/exhaustive-deps
210
- }, [mode, date, startDate, endDate, dates, minDate, timePicker]);
292
+ }, [mode, date, startDate, endDate, dates, minDate, timePicker, maxDate]);
211
293
 
212
294
  const setCalendarView = useCallback((view: CalendarViews) => {
213
295
  dispatch({ type: CalendarActionKind.SET_CALENDAR_VIEW, payload: view });
@@ -227,8 +309,8 @@ const DateTimePicker: React.FC<
227
309
  date: newDate,
228
310
  });
229
311
  } else if (mode === 'range') {
230
- const sd = state.startDate;
231
- const ed = state.endDate;
312
+ const sd = stateRef.current.startDate;
313
+ const ed = stateRef.current.endDate;
232
314
  let isStart: boolean = true;
233
315
 
234
316
  if (sd && !ed && dateToUnix(datetime) >= dateToUnix(sd!))
@@ -246,7 +328,7 @@ const DateTimePicker: React.FC<
246
328
 
247
329
  (onChange as RangeChange)?.(newDateRang);
248
330
  } else if (mode === 'multiple') {
249
- const safeDates = (state.dates as DateType[]) || [];
331
+ const safeDates = (stateRef.current.dates as DateType[]) || [];
250
332
  const newDate = getStartOfDay(datetime);
251
333
 
252
334
  const exists = safeDates.some((ed) => areDatesOnSameDay(ed, newDate));
@@ -282,57 +364,48 @@ const DateTimePicker: React.FC<
282
364
  });
283
365
  }
284
366
  },
285
- [onChange, mode, timePicker, state.startDate, state.endDate, state.dates]
367
+ [onChange, mode, timePicker]
286
368
  );
287
369
 
288
370
  const onSelectMonth = useCallback(
289
371
  (month: number) => {
290
- let newDate = getDate(state.currentDate).month(month);
291
- if (maxDate && newDate.isAfter(maxDate)) newDate = getDate(maxDate);
292
- if (minDate && newDate.isBefore(minDate)) newDate = getDate(minDate);
372
+ let newDate = dayjs(stateRef.current.currentDate).month(month);
373
+ if (maxDate && newDate.isAfter(maxDate)) newDate = dayjs(maxDate);
374
+ if (minDate && newDate.isBefore(minDate)) newDate = dayjs(minDate);
293
375
  dispatch({
294
376
  type: CalendarActionKind.CHANGE_CURRENT_DATE,
295
- payload: getFormatted(newDate),
296
- });
297
- dispatch({
298
- type: CalendarActionKind.SET_CALENDAR_VIEW,
299
- payload: 'day',
377
+ payload: newDate,
300
378
  });
379
+ if (mode !== 'wheel') setCalendarView('day');
301
380
  if (mode === 'single' || mode === 'wheel')
302
381
  (onChange as SingleChange)?.({ date: getFormatted(newDate) });
303
382
  },
304
- [maxDate, minDate, mode, onChange, state.currentDate]
383
+ [maxDate, minDate, mode, onChange, setCalendarView]
305
384
  );
306
385
 
307
386
  const onSelectYear = useCallback(
308
387
  (year: number) => {
309
- let newDate = getDate(state.currentDate).year(year);
310
- if (maxDate && newDate.isAfter(maxDate)) newDate = getDate(maxDate);
311
- if (minDate && newDate.isBefore(minDate)) newDate = getDate(minDate);
388
+ let newDate = dayjs(stateRef.current.currentDate).year(year);
389
+ if (maxDate && newDate.isAfter(maxDate)) newDate = dayjs(maxDate);
390
+ if (minDate && newDate.isBefore(minDate)) newDate = dayjs(minDate);
312
391
  dispatch({
313
392
  type: CalendarActionKind.CHANGE_CURRENT_DATE,
314
- payload: getFormatted(newDate),
315
- });
316
- dispatch({
317
- type: CalendarActionKind.SET_CALENDAR_VIEW,
318
- payload: initialView,
393
+ payload: newDate,
319
394
  });
395
+ if (mode !== 'wheel') setCalendarView('day');
320
396
  if (mode === 'single' || mode === 'wheel')
321
397
  (onChange as SingleChange)?.({ date: getFormatted(newDate) });
322
398
  },
323
- [state.currentDate, maxDate, minDate, initialView, mode, onChange]
399
+ [maxDate, minDate, mode, setCalendarView, onChange]
324
400
  );
325
401
 
326
- const onChangeMonth = useCallback(
327
- (month: number) => {
328
- const newDate = getDate(state.currentDate).add(month, 'month');
329
- dispatch({
330
- type: CalendarActionKind.CHANGE_CURRENT_DATE,
331
- payload: getFormatted(newDate),
332
- });
333
- },
334
- [state.currentDate]
335
- );
402
+ const onChangeMonth = useCallback((month: number) => {
403
+ const newDate = dayjs(stateRef.current.currentDate).add(month, 'month');
404
+ dispatch({
405
+ type: CalendarActionKind.CHANGE_CURRENT_DATE,
406
+ payload: dayjs(newDate),
407
+ });
408
+ }, []);
336
409
 
337
410
  const onChangeYear = useCallback((year: number) => {
338
411
  dispatch({
@@ -341,34 +414,79 @@ const DateTimePicker: React.FC<
341
414
  });
342
415
  }, []);
343
416
 
417
+ const baseContextValue = useMemo(
418
+ () => ({
419
+ columns,
420
+ mode,
421
+ locale,
422
+ timePicker,
423
+ minDate,
424
+ maxDate,
425
+ startDate,
426
+ endDate,
427
+ dates,
428
+ displayFullDays,
429
+ firstDayOfWeek: firstDay,
430
+ height,
431
+ theme: rest,
432
+ }),
433
+ [
434
+ columns,
435
+ mode,
436
+ locale,
437
+ timePicker,
438
+ minDate,
439
+ maxDate,
440
+ startDate,
441
+ endDate,
442
+ dates,
443
+ displayFullDays,
444
+ firstDay,
445
+ height,
446
+ rest,
447
+ ]
448
+ );
449
+
450
+ const handlerContextValue = useMemo(
451
+ () => ({
452
+ setCalendarView,
453
+ onSelectDate,
454
+ onSelectMonth,
455
+ onSelectYear,
456
+ onChangeMonth,
457
+ onChangeYear,
458
+ }),
459
+ [
460
+ setCalendarView,
461
+ onSelectDate,
462
+ onSelectMonth,
463
+ onSelectYear,
464
+ onChangeMonth,
465
+ onChangeYear,
466
+ ]
467
+ );
468
+
469
+ const memoizedValue = useMemo(
470
+ () => ({
471
+ ...state,
472
+ ...baseContextValue,
473
+ ...handlerContextValue,
474
+ }),
475
+ [state, baseContextValue, handlerContextValue]
476
+ );
477
+
344
478
  return (
345
- <CalendarContext.Provider
346
- value={{
347
- ...state,
348
- locale,
349
- mode,
350
- displayFullDays,
351
- timePicker,
352
- minDate,
353
- maxDate,
354
- firstDayOfWeek: firstDay,
355
- height,
356
- theme: rest,
357
- columns,
358
- setCalendarView,
359
- onSelectDate,
360
- onSelectMonth,
361
- onSelectYear,
362
- onChangeMonth,
363
- onChangeYear,
364
- }}
365
- >
366
- <Calendar
367
- buttonPrevIcon={buttonPrevIcon}
368
- buttonNextIcon={buttonNextIcon}
369
- height={height}
370
- containerStyle={containerStyle}
371
- />
479
+ <CalendarContext.Provider value={memoizedValue}>
480
+ {mode !== 'wheel' ? (
481
+ <Calendar
482
+ buttonPrevIcon={buttonPrevIcon}
483
+ buttonNextIcon={buttonNextIcon}
484
+ height={height}
485
+ containerStyle={containerStyle}
486
+ />
487
+ ) : (
488
+ <DatePicker height={height} containerStyle={containerStyle} />
489
+ )}
372
490
  </CalendarContext.Provider>
373
491
  );
374
492
  };
@@ -9,7 +9,6 @@ import YearSelector from './YearSelector';
9
9
  import MonthSelector from './MonthSelector';
10
10
  import DaySelector from './DaySelector';
11
11
  import TimeSelector from './TimeSelector';
12
- import DatePicker from './DatePicker';
13
12
 
14
13
  const CalendarView: Record<CalendarViews, ReactNode> = {
15
14
  year: <YearSelector />,
@@ -29,7 +28,7 @@ const Calendar: React.FC<PropTypes> = ({
29
28
  height,
30
29
  containerStyle,
31
30
  }) => {
32
- const { calendarView, mode } = useCalendarContext();
31
+ const { calendarView } = useCalendarContext();
33
32
 
34
33
  const styles = StyleSheet.create({
35
34
  container: {
@@ -43,15 +42,8 @@ const Calendar: React.FC<PropTypes> = ({
43
42
 
44
43
  return (
45
44
  <View style={[styles.container, containerStyle]}>
46
- {mode !== 'wheel' && (
47
- <Header
48
- buttonPrevIcon={buttonPrevIcon}
49
- buttonNextIcon={buttonNextIcon}
50
- />
51
- )}
52
- <View style={styles.calendarContainer}>
53
- {mode === 'wheel' ? <DatePicker /> : CalendarView[calendarView]}
54
- </View>
45
+ <Header buttonPrevIcon={buttonPrevIcon} buttonNextIcon={buttonNextIcon} />
46
+ <View style={styles.calendarContainer}>{CalendarView[calendarView]}</View>
55
47
  </View>
56
48
  );
57
49
  };
@@ -1,143 +1,28 @@
1
- import React, { useCallback, useMemo } from 'react';
1
+ import React from 'react';
2
2
  import { View, StyleSheet } from 'react-native';
3
3
  import { useCalendarContext } from '../CalendarContext';
4
4
  import { CONTAINER_HEIGHT } from '../enums';
5
- import {
6
- getFormatted,
7
- getParsedDate,
8
- getDaysNumInMonth,
9
- getTimeRange,
10
- getDate,
11
- } from '../utils';
12
- import Wheel from './WheelPicker/Wheel';
5
+ import WheelSelector from './WheelSelector';
6
+ import { CalendarThemeProps } from '../types';
13
7
 
14
- function createNumberList(start: number, end: number, first: number = 1) {
15
- return new Array(end - start).fill(0).map((_, index) => ({
16
- value: index + first + start,
17
- text: String(index + first + start).padStart(2, '0'),
18
- }));
8
+ interface DatePickerProps {
9
+ height?: number;
10
+ containerStyle?: CalendarThemeProps['containerStyle'];
19
11
  }
20
12
 
21
- const DatePicker: React.FC = () => {
22
- const {
23
- columns,
24
- currentDate,
25
- onSelectYear,
26
- onSelectMonth,
27
- onSelectDate,
28
- minDate = '1900-01-01',
29
- maxDate = '2099-12-31',
30
- } = useCalendarContext();
31
- const { year, month } = useMemo(
32
- () =>
33
- getParsedDate(
34
- getDate(currentDate).isAfter(getDate(maxDate))
35
- ? maxDate
36
- : getDate(currentDate).isBefore(getDate(minDate))
37
- ? minDate
38
- : currentDate
39
- ),
40
- [currentDate, maxDate, minDate]
41
- );
42
-
43
- const { year: startYear, month: startMonth } = getParsedDate(minDate);
44
- const { year: endYear, month: endMonth } = getParsedDate(maxDate);
45
- const { hour, minute, second } = getParsedDate(currentDate);
46
- const years = createNumberList(startYear - 1, endYear);
47
- const months = useMemo(
48
- () =>
49
- createNumberList(
50
- startYear === year ? startMonth : 0,
51
- endYear === year ? endMonth + 1 : 12
52
- ),
53
- [endMonth, endYear, startMonth, startYear, year]
54
- );
55
-
56
- const days = useMemo(
57
- () => getDaysNumInMonth(year, month + 1, minDate, maxDate),
58
- [year, month, minDate, maxDate]
59
- );
60
- const hours = useMemo(
61
- () =>
62
- createNumberList(
63
- ...getTimeRange(currentDate, minDate, maxDate, 'hour'),
64
- 0
65
- ),
66
- [currentDate, maxDate, minDate]
67
- );
68
- const minutes = useMemo(
69
- () =>
70
- createNumberList(
71
- ...getTimeRange(currentDate, minDate, maxDate, 'minute'),
72
- 0
73
- ),
74
- [currentDate, maxDate, minDate]
75
- );
76
- const seconds = useMemo(
77
- () =>
78
- createNumberList(
79
- ...getTimeRange(currentDate, minDate, maxDate, 'second'),
80
- 0
81
- ),
82
- [currentDate, maxDate, minDate]
83
- );
84
-
85
- const handleChangeDate = useCallback(
86
- (value: number, type: 'date' | 'hour' | 'minute' | 'second') => {
87
- const newDate = getDate(currentDate).set(type, value);
88
- onSelectDate(getFormatted(newDate));
89
- },
90
- [currentDate, onSelectDate]
91
- );
13
+ const DatePicker: React.FC<DatePickerProps> = ({ height, containerStyle }) => {
14
+ const { columns } = useCalendarContext();
92
15
 
93
16
  return (
94
- <View style={styles.container}>
95
- <View style={styles.datePickerContainer}>
17
+ <View style={[styles.container, containerStyle]}>
18
+ <View
19
+ style={[
20
+ styles.datePickerContainer,
21
+ { height: height || CONTAINER_HEIGHT },
22
+ ]}
23
+ >
96
24
  {columns?.map((item) => (
97
- <View style={styles.wheelContainer} key={item}>
98
- {item === 'year' && (
99
- <Wheel
100
- value={year}
101
- items={years}
102
- setValue={(value) => onSelectYear(value)}
103
- />
104
- )}
105
- {item === 'month' && (
106
- <Wheel
107
- value={month + 1}
108
- items={months}
109
- setValue={(value) => onSelectMonth(value - 1)}
110
- />
111
- )}
112
- {item === 'day' && (
113
- <Wheel
114
- value={getDate(currentDate).date()}
115
- items={days}
116
- setValue={(value) => handleChangeDate(value, 'date')}
117
- />
118
- )}
119
- {item === 'hour' && (
120
- <Wheel
121
- value={hour}
122
- items={hours}
123
- setValue={(value) => handleChangeDate(value, 'hour')}
124
- />
125
- )}
126
- {item === 'minute' && (
127
- <Wheel
128
- value={minute}
129
- items={minutes}
130
- setValue={(value) => handleChangeDate(value, 'minute')}
131
- />
132
- )}
133
- {item === 'second' && (
134
- <Wheel
135
- value={second}
136
- items={seconds}
137
- setValue={(value) => handleChangeDate(value, 'second')}
138
- />
139
- )}
140
- </View>
25
+ <WheelSelector key={item} type={item} />
141
26
  ))}
142
27
  </View>
143
28
  </View>
@@ -146,21 +31,15 @@ const DatePicker: React.FC = () => {
146
31
 
147
32
  const styles = StyleSheet.create({
148
33
  container: {
149
- flex: 1,
150
- alignItems: 'center',
151
- justifyContent: 'center',
152
34
  width: '100%',
153
35
  },
154
- wheelContainer: {
155
- flex: 1,
156
- },
157
36
  datePickerContainer: {
158
37
  width: '100%',
159
38
  flexDirection: 'row',
160
39
  alignItems: 'center',
161
40
  justifyContent: 'center',
162
41
  paddingHorizontal: 16,
163
- height: CONTAINER_HEIGHT / 2,
42
+ height: CONTAINER_HEIGHT,
164
43
  },
165
44
  });
166
45