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.
- package/lib/commonjs/DateTimePicker.js +144 -85
- package/lib/commonjs/DateTimePicker.js.map +1 -1
- package/lib/commonjs/components/Calendar.js +3 -5
- package/lib/commonjs/components/Calendar.js.map +1 -1
- package/lib/commonjs/components/DatePicker.js +16 -83
- package/lib/commonjs/components/DatePicker.js.map +1 -1
- package/lib/commonjs/components/Day.js +3 -8
- package/lib/commonjs/components/Day.js.map +1 -1
- package/lib/commonjs/components/TimeSelector.js +3 -3
- package/lib/commonjs/components/TimeSelector.js.map +1 -1
- package/lib/commonjs/components/WheelPicker/WheelNative.js +2 -2
- package/lib/commonjs/components/WheelPicker/WheelNative.js.map +1 -1
- package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker-item.js +56 -72
- package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker-item.js.map +1 -1
- package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker.js +26 -48
- package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
- package/lib/commonjs/components/WheelPicker/WheelWeb.js +5 -7
- package/lib/commonjs/components/WheelPicker/WheelWeb.js.map +1 -1
- package/lib/commonjs/components/WheelSelector.js +129 -0
- package/lib/commonjs/components/WheelSelector.js.map +1 -0
- package/lib/commonjs/utils.js +68 -0
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/DateTimePicker.js +146 -87
- package/lib/module/DateTimePicker.js.map +1 -1
- package/lib/module/components/Calendar.js +3 -5
- package/lib/module/components/Calendar.js.map +1 -1
- package/lib/module/components/DatePicker.js +16 -81
- package/lib/module/components/DatePicker.js.map +1 -1
- package/lib/module/components/Day.js +3 -8
- package/lib/module/components/Day.js.map +1 -1
- package/lib/module/components/TimeSelector.js +3 -3
- package/lib/module/components/TimeSelector.js.map +1 -1
- package/lib/module/components/WheelPicker/WheelNative.js +2 -2
- package/lib/module/components/WheelPicker/WheelNative.js.map +1 -1
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker-item.js +57 -73
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker-item.js.map +1 -1
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js +26 -48
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
- package/lib/module/components/WheelPicker/WheelWeb.js +5 -7
- package/lib/module/components/WheelPicker/WheelWeb.js.map +1 -1
- package/lib/module/components/WheelSelector.js +120 -0
- package/lib/module/components/WheelSelector.js.map +1 -0
- package/lib/module/utils.js +65 -0
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/DateTimePicker.d.ts +2 -2
- package/lib/typescript/DateTimePicker.d.ts.map +1 -1
- package/lib/typescript/components/Calendar.d.ts.map +1 -1
- package/lib/typescript/components/DatePicker.d.ts +6 -1
- package/lib/typescript/components/DatePicker.d.ts.map +1 -1
- package/lib/typescript/components/Day.d.ts.map +1 -1
- package/lib/typescript/components/WheelPicker/Wheel.d.ts +1 -1
- package/lib/typescript/components/WheelPicker/WheelNative.d.ts +1 -1
- package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker-item.d.ts.map +1 -1
- package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker.d.ts +1 -2
- package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker.d.ts.map +1 -1
- package/lib/typescript/components/WheelPicker/WheelWeb.d.ts +1 -1
- package/lib/typescript/components/WheelPicker/WheelWeb.d.ts.map +1 -1
- package/lib/typescript/components/WheelSelector.d.ts +8 -0
- package/lib/typescript/components/WheelSelector.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +1 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils.d.ts +9 -0
- package/lib/typescript/utils.d.ts.map +1 -1
- package/package.json +2 -3
- package/src/DateTimePicker.tsx +226 -108
- package/src/components/Calendar.tsx +3 -11
- package/src/components/DatePicker.tsx +17 -138
- package/src/components/Day.tsx +1 -4
- package/src/components/TimeSelector.tsx +3 -3
- package/src/components/WheelPicker/Wheel.tsx +1 -1
- package/src/components/WheelPicker/WheelNative.tsx +3 -3
- package/src/components/WheelPicker/WheelNativePicker/wheel-picker-item.tsx +65 -74
- package/src/components/WheelPicker/WheelNativePicker/wheel-picker.tsx +20 -48
- package/src/components/WheelPicker/WheelWeb.tsx +6 -7
- package/src/components/WheelSelector.tsx +170 -0
- package/src/types.ts +1 -1
- package/src/utils.ts +77 -0
- package/lib/commonjs/components/WheelPicker/AnimatedMath.js +0 -26
- package/lib/commonjs/components/WheelPicker/AnimatedMath.js.map +0 -1
- package/lib/module/components/WheelPicker/AnimatedMath.js +0 -20
- package/lib/module/components/WheelPicker/AnimatedMath.js.map +0 -1
- package/lib/typescript/components/WheelPicker/AnimatedMath.d.ts +0 -5
- package/lib/typescript/components/WheelPicker/AnimatedMath.d.ts.map +0 -1
- package/src/components/WheelPicker/AnimatedMath.tsx +0 -33
package/src/DateTimePicker.tsx
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import 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
|
|
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
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
const firstDay = useMemo(
|
|
118
|
+
() =>
|
|
119
|
+
firstDayOfWeek && firstDayOfWeek > 0 && firstDayOfWeek <= 6
|
|
120
|
+
? firstDayOfWeek
|
|
121
|
+
: 0,
|
|
122
|
+
[firstDayOfWeek]
|
|
123
|
+
);
|
|
111
124
|
|
|
112
|
-
|
|
125
|
+
const initialState: LocalState = useMemo(() => {
|
|
126
|
+
let initialDate = dayjs();
|
|
127
|
+
|
|
128
|
+
if (mode === 'single' && date) {
|
|
129
|
+
initialDate = dayjs(date);
|
|
130
|
+
}
|
|
113
131
|
|
|
114
|
-
|
|
115
|
-
|
|
132
|
+
if (mode === 'range' && startDate) {
|
|
133
|
+
initialDate = dayjs(startDate);
|
|
134
|
+
}
|
|
116
135
|
|
|
117
|
-
|
|
136
|
+
if (mode === 'multiple' && dates && dates.length > 0) {
|
|
137
|
+
initialDate = dayjs(dates[0]);
|
|
138
|
+
}
|
|
118
139
|
|
|
119
|
-
|
|
120
|
-
|
|
140
|
+
if (minDate && initialDate.isBefore(minDate)) {
|
|
141
|
+
initialDate = dayjs(minDate);
|
|
142
|
+
}
|
|
121
143
|
|
|
122
|
-
|
|
123
|
-
if (maxDate && currentDate.isAfter(maxDate)) currentDate = dayjs(maxDate);
|
|
144
|
+
let _date = (date ? dayjs(date) : date) as DateType;
|
|
124
145
|
|
|
125
|
-
|
|
146
|
+
if (_date && maxDate && dayjs(_date).isAfter(maxDate)) {
|
|
147
|
+
_date = dayjs(maxDate);
|
|
148
|
+
}
|
|
126
149
|
|
|
127
|
-
|
|
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:
|
|
216
|
+
date: selectDate,
|
|
217
|
+
currentDate: selectDate,
|
|
153
218
|
};
|
|
154
219
|
case CalendarActionKind.CHANGE_SELECTED_RANGE:
|
|
155
|
-
const {
|
|
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
|
-
|
|
183
|
-
|
|
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: {
|
|
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 =
|
|
231
|
-
const ed =
|
|
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 = (
|
|
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
|
|
367
|
+
[onChange, mode, timePicker]
|
|
286
368
|
);
|
|
287
369
|
|
|
288
370
|
const onSelectMonth = useCallback(
|
|
289
371
|
(month: number) => {
|
|
290
|
-
let newDate =
|
|
291
|
-
if (maxDate && newDate.isAfter(maxDate)) newDate =
|
|
292
|
-
if (minDate && newDate.isBefore(minDate)) newDate =
|
|
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:
|
|
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,
|
|
383
|
+
[maxDate, minDate, mode, onChange, setCalendarView]
|
|
305
384
|
);
|
|
306
385
|
|
|
307
386
|
const onSelectYear = useCallback(
|
|
308
387
|
(year: number) => {
|
|
309
|
-
let newDate =
|
|
310
|
-
if (maxDate && newDate.isAfter(maxDate)) newDate =
|
|
311
|
-
if (minDate && newDate.isBefore(minDate)) newDate =
|
|
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:
|
|
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
|
-
[
|
|
399
|
+
[maxDate, minDate, mode, setCalendarView, onChange]
|
|
324
400
|
);
|
|
325
401
|
|
|
326
|
-
const onChangeMonth = useCallback(
|
|
327
|
-
(month
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
|
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
|
-
{
|
|
47
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
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
|
-
<
|
|
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
|
|
42
|
+
height: CONTAINER_HEIGHT,
|
|
164
43
|
},
|
|
165
44
|
});
|
|
166
45
|
|