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.
- package/lib/commonjs/DateTimePicker.js +144 -84
- 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 -86
- 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 -107
- 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,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 =
|
|
230
|
-
const ed =
|
|
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 = (
|
|
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
|
|
367
|
+
[onChange, mode, timePicker]
|
|
285
368
|
);
|
|
286
369
|
|
|
287
370
|
const onSelectMonth = useCallback(
|
|
288
371
|
(month: number) => {
|
|
289
|
-
let newDate =
|
|
290
|
-
if (maxDate && newDate.isAfter(maxDate)) newDate =
|
|
291
|
-
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);
|
|
292
375
|
dispatch({
|
|
293
376
|
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
294
|
-
payload:
|
|
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,
|
|
383
|
+
[maxDate, minDate, mode, onChange, setCalendarView]
|
|
304
384
|
);
|
|
305
385
|
|
|
306
386
|
const onSelectYear = useCallback(
|
|
307
387
|
(year: number) => {
|
|
308
|
-
let newDate =
|
|
309
|
-
if (maxDate && newDate.isAfter(maxDate)) newDate =
|
|
310
|
-
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);
|
|
311
391
|
dispatch({
|
|
312
392
|
type: CalendarActionKind.CHANGE_CURRENT_DATE,
|
|
313
|
-
payload:
|
|
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
|
-
[
|
|
399
|
+
[maxDate, minDate, mode, setCalendarView, onChange]
|
|
323
400
|
);
|
|
324
401
|
|
|
325
|
-
const onChangeMonth = useCallback(
|
|
326
|
-
(month
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
|
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
|
|