Skip to content

Commit 839f1b6

Browse files
authored
Merge pull request #878 from thundersdata-frontend/rn-issue
fix: 修复日期组件在mode='time'时的bug
2 parents d252083 + 3d5401a commit 839f1b6

File tree

7 files changed

+23
-91
lines changed

7 files changed

+23
-91
lines changed

.changeset/curvy-rice-yell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@td-design/react-native-picker': minor
3+
---
4+
5+
fix: 修复日期组件在mode='time'时的bug

.changeset/smooth-pans-return.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@td-design/react-native-tabs': patch
3+
---
4+
5+
fix: 优化PagerView的业务逻辑

packages/react-native-picker/src/components/DatePicker/useDatePicker.ts

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export default function useDatePicker({
1111
labelUnit,
1212
format,
1313
value,
14-
minDate = '1970-01-01 00:00:00',
15-
maxDate = '2100-01-01 00:00:00',
14+
minDate = '1970-01-01',
15+
maxDate = '2100-01-01',
1616
onChange,
1717
}: Required<Pick<DatePickerPropsBase, 'value' | 'mode' | 'labelUnit' | 'format'>> &
1818
Pick<DatePickerPropsBase, 'minDate' | 'maxDate' | 'onChange'>) {
@@ -34,20 +34,6 @@ export default function useDatePicker({
3434
if (dayjs(date).isAfter(maxDayjs.add(1, 'day'))) {
3535
return cloneDate(maxDayjs);
3636
}
37-
} else if (mode === 'time') {
38-
const maxHour = maxDayjs.get('hour');
39-
const maxMinutes = maxDayjs.get('minute');
40-
const minHour = minDayjs.get('hour');
41-
const minMinutes = minDayjs.get('minute');
42-
const hour = dayjs(date).get('hour');
43-
const minutes = dayjs(date).get('minute');
44-
45-
if (hour < minHour || (hour === minHour && minutes < minMinutes)) {
46-
return cloneDate(minDayjs);
47-
}
48-
if (hour > maxHour || (hour === maxHour && minutes > maxMinutes)) {
49-
return cloneDate(maxDayjs);
50-
}
5137
}
5238
return dayjs(date);
5339
};
@@ -80,22 +66,6 @@ export default function useDatePicker({
8066
return maxDayjs.get('date');
8167
};
8268

83-
const getMinHour = () => {
84-
return minDayjs.get('hour');
85-
};
86-
87-
const getMaxHour = () => {
88-
return maxDayjs.get('hour');
89-
};
90-
91-
const getMinMinute = () => {
92-
return minDayjs.get('minute');
93-
};
94-
95-
const getMaxMinute = () => {
96-
return maxDayjs.get('minute');
97-
};
98-
9969
const cloneDate = (date: Dayjs) => {
10070
return dayjs(date);
10171
};
@@ -166,45 +136,6 @@ export default function useDatePicker({
166136
let maxHour = 23;
167137
let minMinute = 0;
168138
let maxMinute = 59;
169-
const minDateMinute = getMinMinute();
170-
const maxDateMinute = getMaxMinute();
171-
const minDateHour = getMinHour();
172-
const maxDateHour = getMaxHour();
173-
const hour = date.get('hour');
174-
175-
if (mode === 'datetime') {
176-
const year = date.get('year');
177-
const month = date.get('month');
178-
const day = date.get('date');
179-
const minDateYear = getMinYear();
180-
const maxDateYear = getMaxYear();
181-
const minDateMonth = getMinMonth();
182-
const maxDateMonth = getMaxMonth();
183-
const minDateDay = getMinDay();
184-
const maxDateDay = getMaxDay();
185-
186-
if (minDateYear === year && minDateMonth === month && minDateDay === day) {
187-
minHour = minDateHour;
188-
if (minDateHour === hour) {
189-
minMinute = minDateMinute;
190-
}
191-
}
192-
if (maxDateYear === year && maxDateMonth === month && maxDateDay === day) {
193-
maxHour = maxDateHour;
194-
if (maxDateHour === hour) {
195-
maxMinute = maxDateMinute;
196-
}
197-
}
198-
} else {
199-
minHour = minDateHour;
200-
if (minDateHour === hour) {
201-
minMinute = minDateMinute;
202-
}
203-
maxHour = maxDateHour;
204-
if (maxDateHour === hour) {
205-
maxMinute = maxDateMinute;
206-
}
207-
}
208139

209140
const hours: CascadePickerItemProps[] = [];
210141
for (let i = minHour; i <= maxHour; i++) {

packages/react-native-picker/src/picker/components/Cascade/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const Cascader = ({
2222
value,
2323
onClose,
2424
onChange,
25+
...restProps
2526
}: CascaderProps) => {
2627
const { childrenTree, stateValue, handleOk, handleValueChange } = useCascader({
2728
data,
@@ -41,6 +42,7 @@ const Cascader = ({
4142
{childrenTree.map((item: CascadePickerItemProps[] = [], index) => (
4243
<WheelPicker
4344
key={index}
45+
{...restProps}
4446
{...{ data: item.map(el => ({ ...el, value: `${el.value}` })), index, value: `${stateValue[index]}` }}
4547
onChange={handleValueChange}
4648
/>

packages/react-native-picker/src/picker/components/Normal/index.tsx

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,6 @@ const NormalPicker: FC<PickerProps & ModalPickerProps> = props => {
3636
if (!visible) return null;
3737
if (pickerData.length === 0) return null;
3838

39-
if (pickerData.length === 1)
40-
return (
41-
<Flex backgroundColor="white">
42-
<WheelPicker
43-
{...restProps}
44-
{...{ data: pickerData[0], index: 0, value: selectedValue?.[0] ?? '' }}
45-
onChange={handleChange}
46-
/>
47-
</Flex>
48-
);
49-
5039
return (
5140
<Flex backgroundColor="white">
5241
{pickerData.map((item, index) => (

packages/react-native-picker/src/picker/type.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ export type PickerRefProps = {
3535
getValue: () => { value: ItemValue[] };
3636
};
3737

38-
export type CascaderProps = Omit<PickerProps, 'data'> & {
38+
export type CascaderProps = Omit<PickerProps, 'data' | 'cascade'> & {
3939
data: CascadePickerItemProps[];
4040
} & ModalPickerProps;

packages/react-native-tabs/src/usePagerView.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useEffect, useMemo, useRef } from 'react';
2-
import { Animated, Platform } from 'react-native';
2+
import { Animated } from 'react-native';
33
import PagerView, {
44
PagerViewOnPageScrollEventData,
55
PagerViewOnPageSelectedEvent,
@@ -11,7 +11,7 @@ import { useMemoizedFn, useSafeState } from '@td-design/rn-hooks';
1111
export default function usePagerView(initialPage: number, page?: number, onChange?: (page: number) => void) {
1212
const pagerViewRef = useRef<PagerView>(null);
1313

14-
const [activePage, setActivePage] = useSafeState(page || initialPage);
14+
const [activePage, setActivePage] = useSafeState(initialPage);
1515
const [isIdle, setIdle] = useSafeState(true);
1616

1717
const setPage = useMemoizedFn((page: number, animated = true) => {
@@ -24,15 +24,17 @@ export default function usePagerView(initialPage: number, page?: number, onChang
2424
setActivePage(page);
2525
if (activePage !== page) {
2626
setIdle(false);
27+
} else {
28+
setIdle(true);
2729
}
2830
onChange?.(page);
2931
});
3032

3133
useEffect(() => {
32-
if (!isNaN(Number(page))) {
33-
setPage(Number(page));
34+
if (page !== undefined && page !== activePage) {
35+
setPage(page);
3436
}
35-
}, [page]);
37+
}, [page, activePage]);
3638

3739
const offset = useRef(new Animated.Value(initialPage)).current;
3840
const position = useRef(new Animated.Value(0)).current;
@@ -63,9 +65,7 @@ export default function usePagerView(initialPage: number, page?: number, onChang
6365
const onPageSelected = useMemoizedFn((e: PagerViewOnPageSelectedEvent) => {
6466
setActivePage(e.nativeEvent.position);
6567
onChange?.(e.nativeEvent.position);
66-
if (Platform.OS === 'ios') {
67-
setIdle(true);
68-
}
68+
setIdle(true);
6969
});
7070

7171
const [scrollState, setScrollState] = useSafeState<'idle' | 'dragging' | 'settling'>('idle');

0 commit comments

Comments
 (0)