Skip to content

Commit e5c30f5

Browse files
authored
fix: picker locale trigger (#668)
1 parent 6919d7e commit e5c30f5

File tree

4 files changed

+94
-6
lines changed

4 files changed

+94
-6
lines changed

docs/demo/locale.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: locale
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../examples/locale.tsx"></code>

docs/examples/locale.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import type { Moment } from 'moment';
2+
import moment from 'moment';
3+
import 'moment/locale/zh-cn';
4+
import React from 'react';
5+
import '../../assets/index.less';
6+
import momentGenerateConfig from '../../src/generate/moment';
7+
import enUS from '../../src/locale/en_US';
8+
import zhCN from '../../src/locale/zh_CN';
9+
import Picker from '../../src/Picker';
10+
11+
// const defaultValue = moment('2019-09-03 05:02:03');
12+
const defaultValue = moment('2019-11-28 01:02:03');
13+
14+
export default () => {
15+
const [locale, setLocale] = React.useState(enUS);
16+
const [value, setValue] = React.useState<Moment | null>(defaultValue);
17+
18+
const onChange = (newValue: Moment | null, formatString?: string) => {
19+
console.log('Change:', newValue, formatString);
20+
setValue(newValue);
21+
};
22+
23+
const sharedProps = {
24+
generateConfig: momentGenerateConfig,
25+
value,
26+
onChange,
27+
presets: [
28+
{
29+
label: 'Hello World!',
30+
value: moment(),
31+
},
32+
{
33+
label: 'Now',
34+
value: () => moment(),
35+
},
36+
],
37+
};
38+
39+
return (
40+
<div>
41+
<Picker<Moment> {...sharedProps} locale={locale} format="dddd" />
42+
<button
43+
onClick={() =>
44+
setLocale((l) => {
45+
const next = l === zhCN ? enUS : zhCN;
46+
moment.locale(next.locale === 'zh-cn' ? 'zh-cn' : 'en');
47+
48+
return next;
49+
})
50+
}
51+
>
52+
{locale.locale}
53+
</button>
54+
</div>
55+
);
56+
};

src/hooks/useValueTexts.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ export default function useValueTexts<DateType>(
3636

3737
return [fullValueTexts, firstValueText];
3838
},
39-
[value, formatList],
39+
[value, formatList, locale],
4040
(prev, next) =>
4141
// Not Same Date
4242
!isEqual(generateConfig, prev[0], next[0]) ||
4343
// Not Same format
44-
!shallowEqual(prev[1], next[1], true),
44+
!shallowEqual(prev[1], next[1], true) ||
45+
// Not Same locale
46+
!shallowEqual(prev[2], next[2], true),
4547
);
4648
}

tests/picker.spec.tsx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
import { act, createEvent, fireEvent, render } from '@testing-library/react';
33
import type { Moment } from 'moment';
44
import moment from 'moment';
5+
import 'moment/locale/zh-cn';
56
import KeyCode from 'rc-util/lib/KeyCode';
67
import { spyElementPrototypes } from 'rc-util/lib/test/domHook';
78
import { resetWarned } from 'rc-util/lib/warning';
89
import React from 'react';
910
import type { PanelMode, PickerMode } from '../src/interface';
11+
import enUS from '../src/locale/en_US';
12+
import zhCN from '../src/locale/zh_CN';
1013
import {
1114
clearValue,
1215
closePicker,
@@ -555,7 +558,7 @@ describe('Picker.Basic', () => {
555558
);
556559
expect(document.querySelector('.rc-picker-input')).toMatchSnapshot();
557560
expect(errorSpy).toHaveBeenCalledWith(
558-
'Warning: `clearIcon` will be removed in future. Please use `allowClear` instead.'
561+
'Warning: `clearIcon` will be removed in future. Please use `allowClear` instead.',
559562
);
560563
});
561564

@@ -626,7 +629,9 @@ describe('Picker.Basic', () => {
626629
expect(errorSpy).not.toBeCalled();
627630
const { container } = render(<MomentPicker picker="time" hourStep={9} />);
628631
openPicker(container);
629-
expect(errorSpy).toBeCalledWith('Warning: `hourStep` 9 is invalid. It should be a factor of 24.');
632+
expect(errorSpy).toBeCalledWith(
633+
'Warning: `hourStep` 9 is invalid. It should be a factor of 24.',
634+
);
630635
});
631636

632637
it('should show warning when minute step is invalid', () => {
@@ -656,7 +661,9 @@ describe('Picker.Basic', () => {
656661
const { container } = render(<MomentPicker picker="time" {...props} />);
657662
openPicker(container);
658663

659-
const column = document.querySelector(`.rc-picker-time-panel-column:nth-child(${index + 1})`);
664+
const column = document.querySelector(
665+
`.rc-picker-time-panel-column:nth-child(${index + 1})`,
666+
);
660667
expect(column).toBeTruthy();
661668

662669
const cells = column.querySelectorAll('.rc-picker-time-panel-cell-inner');
@@ -748,7 +755,7 @@ describe('Picker.Basic', () => {
748755
it('defaultOpenValue in timePicker', () => {
749756
resetWarned();
750757
const onChange = jest.fn();
751-
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
758+
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
752759

753760
const { container } = render(
754761
<MomentPicker
@@ -1085,4 +1092,19 @@ describe('Picker.Basic', () => {
10851092

10861093
expect(onChange.mock.calls[1][0].format('YYYY-MM-DD HH:mm:ss')).toEqual('2023-05-01 12:34:56');
10871094
});
1095+
1096+
it('switch picker locale should reformat value', () => {
1097+
const { container, rerender } = render(
1098+
<MomentPicker value={getMoment('2011-11-11')} format={'dddd'} locale={enUS} />,
1099+
);
1100+
expect(container.querySelector('input').value).toEqual('Friday');
1101+
1102+
// Switch locale
1103+
moment.locale('zh-cn');
1104+
rerender(<MomentPicker value={getMoment('2011-11-11')} format={'dddd'} locale={zhCN} />);
1105+
expect(container.querySelector('input').value).toEqual('星期五');
1106+
1107+
// Reset locale
1108+
moment.locale('en');
1109+
});
10881110
});

0 commit comments

Comments
 (0)