1 | import React, { useContext, useMemo } from 'react';
|
2 | import * as IntlLocalizers from './IntlLocalizer';
|
3 | import { getMessages } from './messages';
|
4 |
|
5 | function mergeWithDefaults(date, number, messages, formatOverrides = {}) {
|
6 | if (!date && !number) throw new Error('This component requires a Localizer but none was provided');
|
7 | return {
|
8 | formatOverrides,
|
9 | messages: getMessages(messages),
|
10 |
|
11 | formatDate(value, format, userFormat) {
|
12 | return date[format](value, userFormat != null ? userFormat : this.formatOverrides[format]);
|
13 | },
|
14 |
|
15 | formatNumber(value, userFormat) {
|
16 | return number.format(value, userFormat != null ? userFormat : this.formatOverrides.number);
|
17 | },
|
18 |
|
19 | parseDate: date.parse.bind(date),
|
20 | parseNumber: number.parse.bind(number),
|
21 | decimalCharacter: number.decimalCharacter.bind(number),
|
22 | firstOfWeek: date.firstOfWeek.bind(date)
|
23 | };
|
24 | }
|
25 |
|
26 | const LocalizerContext = React.createContext(mergeWithDefaults(new IntlLocalizers.DateLocalizer(), new IntlLocalizers.NumberLocalizer()));
|
27 |
|
28 | const Localization = ({
|
29 | date: _date = new IntlLocalizers.DateLocalizer(),
|
30 | number: _number = new IntlLocalizers.NumberLocalizer(),
|
31 | messages,
|
32 | children
|
33 | }) => {
|
34 |
|
35 | const localizer = useMemo(() => mergeWithDefaults(_date, _number, messages), [_date, _number,
|
36 | JSON.stringify(messages)]);
|
37 | return React.createElement(LocalizerContext.Provider, {
|
38 | value: localizer
|
39 | }, children);
|
40 | };
|
41 |
|
42 | export const useLocalizer = (messages, formats) => {
|
43 | const localizer = useContext(LocalizerContext);
|
44 | return useMemo(() => {
|
45 | if (!messages && !formats) return localizer;
|
46 | return Object.assign({}, localizer, {
|
47 | messages: getMessages(Object.assign({}, localizer.messages, messages)),
|
48 | formatOverrides: Object.assign({}, localizer.formatOverrides, formats)
|
49 | });
|
50 | }, [messages, formats, localizer]);
|
51 | };
|
52 | Localization.useLocalizer = useLocalizer;
|
53 | export default Localization; |
\ | No newline at end of file |