react-native-dates-picker 0.1.2 → 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 -84
  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 -86
  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 -107
  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,12 +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
- }, [mode, date, startDate, endDate, dates, minDate, timePicker, currentDate]);
292
+ }, [mode, date, startDate, endDate, dates, minDate, timePicker, maxDate]);
210
293
 
211
294
  const setCalendarView = useCallback((view: CalendarViews) => {
212
295
  dispatch({ type: CalendarActionKind.SET_CALENDAR_VIEW, payload: view });
@@ -226,8 +309,8 @@ const DateTimePicker: React.FC<
226
309
  date: newDate,
227
310
  });
228
311
  } else if (mode === 'range') {
229
- const sd = state.startDate;
230
- const ed = state.endDate;
312
+ const sd = stateRef.current.startDate;
313
+ const ed = stateRef.current.endDate;
231
314
  let isStart: boolean = true;
232
315
 
233
316
  if (sd && !ed && dateToUnix(datetime) >= dateToUnix(sd!))
@@ -245,7 +328,7 @@ const DateTimePicker: React.FC<
245
328
 
246
329
  (onChange as RangeChange)?.(newDateRang);
247
330
  } else if (mode === 'multiple') {
248
- const safeDates = (state.dates as DateType[]) || [];
331
+ const safeDates = (stateRef.current.dates as DateType[]) || [];
249
332
  const newDate = getStartOfDay(datetime);
250
333
 
251
334
  const exists = safeDates.some((ed) => areDatesOnSameDay(ed, newDate));
@@ -281,57 +364,48 @@ const DateTimePicker: React.FC<
281
364
  });
282
365
  }
283
366
  },
284
- [onChange, mode, timePicker, state.startDate, state.endDate, state.dates]
367
+ [onChange, mode, timePicker]
285
368
  );
286
369
 
287
370
  const onSelectMonth = useCallback(
288
371
  (month: number) => {
289
- let newDate = getDate(state.currentDate).month(month);
290
- if (maxDate && newDate.isAfter(maxDate)) newDate = getDate(maxDate);
291
- 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);
292
375
  dispatch({
293
376
  type: CalendarActionKind.CHANGE_CURRENT_DATE,
294
- payload: getFormatted(newDate),
295
- });
296
- dispatch({
297
- type: CalendarActionKind.SET_CALENDAR_VIEW,
298
- payload: 'day',
377
+ payload: newDate,
299
378
  });
379
+ if (mode !== 'wheel') setCalendarView('day');
300
380
  if (mode === 'single' || mode === 'wheel')
301
381
  (onChange as SingleChange)?.({ date: getFormatted(newDate) });
302
382
  },
303
- [maxDate, minDate, mode, onChange, state.currentDate]
383
+ [maxDate, minDate, mode, onChange, setCalendarView]
304
384
  );
305
385
 
306
386
  const onSelectYear = useCallback(
307
387
  (year: number) => {
308
- let newDate = getDate(state.currentDate).year(year);
309
- if (maxDate && newDate.isAfter(maxDate)) newDate = getDate(maxDate);
310
- 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);
311
391
  dispatch({
312
392
  type: CalendarActionKind.CHANGE_CURRENT_DATE,
313
- payload: getFormatted(newDate),
314
- });
315
- dispatch({
316
- type: CalendarActionKind.SET_CALENDAR_VIEW,
317
- payload: initialView,
393
+ payload: newDate,
318
394
  });
395
+ if (mode !== 'wheel') setCalendarView('day');
319
396
  if (mode === 'single' || mode === 'wheel')
320
397
  (onChange as SingleChange)?.({ date: getFormatted(newDate) });
321
398
  },
322
- [state.currentDate, maxDate, minDate, initialView, mode, onChange]
399
+ [maxDate, minDate, mode, setCalendarView, onChange]
323
400
  );
324
401
 
325
- const onChangeMonth = useCallback(
326
- (month: number) => {
327
- const newDate = getDate(state.currentDate).add(month, 'month');
328
- dispatch({
329
- type: CalendarActionKind.CHANGE_CURRENT_DATE,
330
- payload: getFormatted(newDate),
331
- });
332
- },
333
- [state.currentDate]
334
- );
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
+ }, []);
335
409
 
336
410
  const onChangeYear = useCallback((year: number) => {
337
411
  dispatch({
@@ -340,34 +414,79 @@ const DateTimePicker: React.FC<
340
414
  });
341
415
  }, []);
342
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
+
343
478
  return (
344
- <CalendarContext.Provider
345
- value={{
346
- ...state,
347
- locale,
348
- mode,
349
- displayFullDays,
350
- timePicker,
351
- minDate,
352
- maxDate,
353
- firstDayOfWeek: firstDay,
354
- height,
355
- theme: rest,
356
- columns,
357
- setCalendarView,
358
- onSelectDate,
359
- onSelectMonth,
360
- onSelectYear,
361
- onChangeMonth,
362
- onChangeYear,
363
- }}
364
- >
365
- <Calendar
366
- buttonPrevIcon={buttonPrevIcon}
367
- buttonNextIcon={buttonNextIcon}
368
- height={height}
369
- containerStyle={containerStyle}
370
- />
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
+ )}
371
490
  </CalendarContext.Provider>
372
491
  );
373
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