@arcblock/ux 2.10.38 → 2.10.40

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- export interface IBlockletStore extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, 'title' | 'className'> {
2
+ import { CardProps } from '@mui/material';
3
+ export interface IBlockletStore extends CardProps {
3
4
  did?: string;
4
5
  title: string;
5
6
  description?: string;
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { isValidElement } from 'react';
3
3
  import Download from '@iconify-icons/tabler/cloud-download';
4
4
  import { Icon } from '@iconify/react';
5
- import { Card, CardContent, CircularProgress, Stack, Typography } from '@mui/material';
5
+ import { Card, CircularProgress, Stack, Typography } from '@mui/material';
6
6
  import Avatar from '../Avatar';
7
7
  import Button from '../Button';
8
8
  import { useTheme } from '../Theme';
@@ -61,67 +61,65 @@ export default function BlockletStore(props) {
61
61
  };
62
62
  return /*#__PURE__*/_jsxs(Card, {
63
63
  variant: "outlined",
64
- sx: {
65
- borderRadius: 2
66
- },
67
64
  onClick: handleMainClick,
68
65
  ...rest,
69
- children: [/*#__PURE__*/_jsx(CardContent, {
70
- sx: {
71
- display: 'flex',
72
- justifyContent: 'space-between'
66
+ sx: {
67
+ p: {
68
+ xs: 2,
69
+ md: 3
73
70
  },
74
- children: /*#__PURE__*/_jsxs(Stack, {
71
+ borderRadius: 2,
72
+ ...rest.sx
73
+ },
74
+ children: [/*#__PURE__*/_jsxs(Stack, {
75
+ flex: 1,
76
+ direction: "row",
77
+ gap: 2,
78
+ alignItems: "center",
79
+ overflow: "hidden",
80
+ children: [/*#__PURE__*/_jsx(Avatar, {
81
+ src: cover,
82
+ did: did,
83
+ size: 48,
84
+ variant: "rounded"
85
+ }), /*#__PURE__*/_jsx(Typography, {
75
86
  flex: 1,
76
- direction: "row",
77
- gap: 2,
78
- alignItems: "center",
79
- overflow: "hidden",
80
- children: [/*#__PURE__*/_jsx(Avatar, {
81
- src: cover,
82
- did: did,
83
- size: 40,
84
- variant: "rounded"
85
- }), /*#__PURE__*/_jsx(Typography, {
86
- flex: 1,
87
- component: "h6",
88
- variant: "h6",
89
- sx: {
90
- textOverflow: 'ellipsis',
91
- whiteSpace: 'nowrap',
92
- overflow: 'hidden'
93
- },
94
- ...titleProps
95
- }), button || onButtonClick && /*#__PURE__*/_jsxs(Button, {
96
- color: "reverse",
97
- variant: "outlined",
98
- size: "small",
99
- disabled: buttonDisabled || buttonLoading,
87
+ fontWeight: "typography.fontWeightMedium",
88
+ sx: {
89
+ fontSize: 16,
90
+ textOverflow: 'ellipsis',
91
+ whiteSpace: 'nowrap',
92
+ overflow: 'hidden'
93
+ },
94
+ ...titleProps
95
+ }), button || onButtonClick && /*#__PURE__*/_jsxs(Button, {
96
+ color: "reverse",
97
+ variant: "outlined",
98
+ size: "small",
99
+ disabled: buttonDisabled || buttonLoading,
100
+ style: {
101
+ borderColor: theme.palette.grey[300],
102
+ borderRadius: 8,
103
+ fontSize: 13,
104
+ fontWeight: theme.typography.fontWeightMedium
105
+ },
106
+ onClick: handleButtonClick,
107
+ children: [buttonLoading && /*#__PURE__*/_jsx(CircularProgress, {
108
+ size: 15,
100
109
  style: {
101
- borderColor: theme.palette.grey[300],
102
- borderRadius: 8
103
- },
104
- onClick: handleButtonClick,
105
- children: [buttonLoading && /*#__PURE__*/_jsx(CircularProgress, {
106
- size: 15,
107
- style: {
108
- marginRight: 3,
109
- color: 'inherit'
110
- }
111
- }), buttonText]
112
- })]
113
- })
114
- }), /*#__PURE__*/_jsx(CardContent, {
115
- sx: {
116
- py: 0
117
- },
110
+ marginRight: 3,
111
+ color: 'inherit'
112
+ }
113
+ }), buttonText]
114
+ })]
115
+ }), /*#__PURE__*/_jsx(Stack, {
116
+ py: 2,
118
117
  children: /*#__PURE__*/_jsx(Typography, {
119
- component: "div",
120
118
  variant: "body2",
121
119
  color: "text.secondary",
122
120
  sx: {
123
- lineClamp: 2,
124
121
  display: '-webkit-box',
122
+ lineClamp: 2,
125
123
  WebkitLineClamp: 2,
126
124
  WebkitBoxOrient: 'vertical',
127
125
  overflow: 'hidden',
@@ -129,13 +127,11 @@ export default function BlockletStore(props) {
129
127
  },
130
128
  ...descriptionProps
131
129
  })
132
- }), /*#__PURE__*/_jsxs(CardContent, {
133
- sx: {
134
- display: 'flex',
135
- alignItems: 'center',
136
- gap: 4,
137
- color: 'grey.800'
138
- },
130
+ }), /*#__PURE__*/_jsxs(Stack, {
131
+ direction: "row",
132
+ alignItems: "center",
133
+ gap: 2,
134
+ color: "text.secondary",
139
135
  children: [/*#__PURE__*/_jsx(IconText, {
140
136
  icon: /*#__PURE__*/_jsx(Avatar, {
141
137
  src: avatar,
@@ -7,7 +7,7 @@ export default function IconText({
7
7
  maxWidth = 100,
8
8
  title
9
9
  }) {
10
- return children && /*#__PURE__*/_jsxs(Stack, {
10
+ return (children === 0 || children) && /*#__PURE__*/_jsxs(Stack, {
11
11
  direction: "row",
12
12
  alignItems: "center",
13
13
  gap: 1,
@@ -1,39 +1,23 @@
1
- export function LocaleProvider({ children, locale, fallbackLocale, translations, onLoadingTranslation, languages, ...rest }: {
2
- [x: string]: any;
3
- children: any;
4
- locale: any;
5
- fallbackLocale: any;
6
- translations: any;
7
- onLoadingTranslation: any;
8
- languages: any;
9
- }): import("react/jsx-runtime").JSX.Element;
10
- export namespace LocaleProvider {
11
- namespace propTypes {
12
- let children: PropTypes.Validator<any>;
13
- let translations: PropTypes.Validator<object>;
14
- let onLoadingTranslation: PropTypes.Requireable<(...args: any[]) => any>;
15
- let locale: PropTypes.Requireable<string>;
16
- let fallbackLocale: PropTypes.Requireable<string>;
17
- let languages: PropTypes.Requireable<(PropTypes.InferProps<{
18
- code: PropTypes.Requireable<string>;
19
- name: PropTypes.Requireable<string>;
20
- }> | null | undefined)[]>;
21
- }
22
- namespace defaultProps {
23
- let locale_1: string;
24
- export { locale_1 as locale };
25
- let fallbackLocale_1: string;
26
- export { fallbackLocale_1 as fallbackLocale };
27
- let languages_1: never[];
28
- export { languages_1 as languages };
29
- export function onLoadingTranslation_1(): void;
30
- export { onLoadingTranslation_1 as onLoadingTranslation };
31
- }
1
+ import React, { ReactNode } from 'react';
2
+ declare const getLocale: (languages?: {
3
+ code: string;
4
+ }[]) => string;
5
+ declare const setLocale: (locale: string) => void;
6
+ interface LocaleProviderProps {
7
+ children: ReactNode;
8
+ locale?: string;
9
+ fallbackLocale?: string;
10
+ translations: Record<string, any>;
11
+ onLoadingTranslation?: (locale: string, languages: {
12
+ code: string;
13
+ }[]) => void;
14
+ languages?: {
15
+ code: string;
16
+ name: string;
17
+ }[];
32
18
  }
33
- declare const Consumer: import("react").Consumer<any>;
34
- export const LocaleContext: import("react").Context<any>;
35
- export function useLocaleContext(): any;
36
- export function setLocale(locale: any): void;
37
- export function getLocale(languages?: any[]): any;
38
- import PropTypes from 'prop-types';
39
- export { Consumer as LocaleConsumer };
19
+ declare const LocaleContext: React.Context<any>;
20
+ declare const Consumer: React.Consumer<any>;
21
+ declare function LocaleProvider({ children, locale, fallbackLocale, translations, onLoadingTranslation, languages, ...rest }: LocaleProviderProps): import("react/jsx-runtime").JSX.Element;
22
+ declare function useLocaleContext(): any;
23
+ export { LocaleProvider, Consumer as LocaleConsumer, LocaleContext, useLocaleContext, setLocale, getLocale };
@@ -1,8 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /* eslint-disable no-prototype-builtins */
3
- import { createContext, useState, useEffect, useContext, useRef, useCallback } from 'react';
3
+ import React, { createContext, useState, useEffect, useContext, useRef, useCallback } from 'react';
4
4
  import get from 'lodash/get';
5
- import PropTypes from 'prop-types';
6
5
  import Cookie from 'js-cookie';
7
6
  import browserLang from './browser-lang';
8
7
  import { translate } from './util';
@@ -53,7 +52,7 @@ const getLanguages = arg => {
53
52
  name: '简体中文'
54
53
  }];
55
54
  };
56
- const LocaleContext = /*#__PURE__*/createContext();
55
+ const LocaleContext = /*#__PURE__*/createContext(null);
57
56
  const {
58
57
  Provider,
59
58
  Consumer
@@ -64,13 +63,13 @@ function LocaleProvider({
64
63
  fallbackLocale,
65
64
  translations,
66
65
  onLoadingTranslation,
67
- languages,
66
+ languages = [],
68
67
  ...rest
69
68
  }) {
70
69
  const langs = getLanguages(languages);
71
70
  // eslint-disable-next-line prefer-const
72
71
  let [currentLocale, setCurrentLocale] = useState(locale || getLocale(langs));
73
- const lastCurrentLocale = useRef(fallbackLocale);
72
+ const lastCurrentLocale = useRef(fallbackLocale || '');
74
73
  const [, setForceUpdate] = useState(0);
75
74
  const changeLocale = newLocale => {
76
75
  setCurrentLocale(newLocale);
@@ -97,7 +96,7 @@ function LocaleProvider({
97
96
  } catch (err) {
98
97
  console.error(err);
99
98
  }
100
- onLoadingTranslation(tmpLocale, langs);
99
+ onLoadingTranslation?.(tmpLocale, langs);
101
100
  currentLocale = lastCurrentLocale.current;
102
101
  } else {
103
102
  lastCurrentLocale.current = currentLocale;
@@ -118,22 +117,4 @@ function useLocaleContext() {
118
117
  const context = useContext(LocaleContext);
119
118
  return context;
120
119
  }
121
- LocaleProvider.propTypes = {
122
- children: PropTypes.any.isRequired,
123
- translations: PropTypes.object.isRequired,
124
- onLoadingTranslation: PropTypes.func,
125
- locale: PropTypes.string,
126
- // 会影响 translate(key) 的结果 - 当 key 无效时查找 fallbackLocale 对应的翻译结果
127
- fallbackLocale: PropTypes.string,
128
- languages: PropTypes.arrayOf(PropTypes.shape({
129
- code: PropTypes.string,
130
- name: PropTypes.string
131
- }))
132
- };
133
- LocaleProvider.defaultProps = {
134
- locale: '',
135
- fallbackLocale: '',
136
- languages: [],
137
- onLoadingTranslation: () => {}
138
- };
139
120
  export { LocaleProvider, Consumer as LocaleConsumer, LocaleContext, useLocaleContext, setLocale, getLocale };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/ux",
3
- "version": "2.10.38",
3
+ "version": "2.10.40",
4
4
  "description": "Common used react components for arcblock products",
5
5
  "keywords": [
6
6
  "react",
@@ -53,6 +53,7 @@
53
53
  "jest": "^29.7.0",
54
54
  "jest-environment-jsdom": "^29.7.0",
55
55
  "moment-timezone": "^0.5.37",
56
+ "prettier": "^3.3.3",
56
57
  "typescript": "5.5.4"
57
58
  },
58
59
  "peerDependencies": {
@@ -63,12 +64,12 @@
63
64
  "react": ">=18.2.0",
64
65
  "react-router-dom": ">=6.22.3"
65
66
  },
66
- "gitHead": "ec30518daa2eb50dc076fe00e7dfde253ba8b7cb",
67
+ "gitHead": "cad80dfa31fd28039f02bc14379a19a254a36000",
67
68
  "dependencies": {
68
69
  "@arcblock/did-motif": "^1.1.13",
69
- "@arcblock/icons": "^2.10.38",
70
- "@arcblock/nft-display": "^2.10.38",
71
- "@arcblock/react-hooks": "^2.10.38",
70
+ "@arcblock/icons": "^2.10.40",
71
+ "@arcblock/nft-display": "^2.10.40",
72
+ "@arcblock/react-hooks": "^2.10.40",
72
73
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
73
74
  "@fontsource/inter": "^5.0.16",
74
75
  "@fontsource/ubuntu-mono": "^5.0.18",
@@ -2,15 +2,14 @@ import React, { isValidElement } from 'react';
2
2
 
3
3
  import Download from '@iconify-icons/tabler/cloud-download';
4
4
  import { Icon } from '@iconify/react';
5
- import { Card, CardContent, CircularProgress, Stack, Typography } from '@mui/material';
5
+ import { Card, CardProps, CircularProgress, Stack, Typography } from '@mui/material';
6
6
  import Avatar from '../Avatar';
7
7
  import Button from '../Button';
8
8
  import { useTheme } from '../Theme';
9
9
  import IconText from './components/icon-text';
10
10
  import { formatDownloadCount, strippedString } from './utils';
11
11
 
12
- export interface IBlockletStore
13
- extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, 'title' | 'className'> {
12
+ export interface IBlockletStore extends CardProps {
14
13
  did?: string;
15
14
  title: string;
16
15
  description?: string;
@@ -77,40 +76,45 @@ export default function BlockletStore(props: IBlockletStore) {
77
76
  : { title: strippedString(description), dangerouslySetInnerHTML: { __html: description } };
78
77
 
79
78
  return (
80
- <Card variant="outlined" sx={{ borderRadius: 2 }} onClick={handleMainClick} {...rest}>
81
- <CardContent sx={{ display: 'flex', justifyContent: 'space-between' }}>
82
- <Stack flex={1} direction="row" gap={2} alignItems="center" overflow="hidden">
83
- <Avatar src={cover} did={did} size={40} variant="rounded" />
84
- <Typography
85
- flex={1}
86
- component="h6"
87
- variant="h6"
88
- sx={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden' }}
89
- {...titleProps}
90
- />
91
- {button ||
92
- (onButtonClick && (
93
- <Button
94
- color="reverse"
95
- variant="outlined"
96
- size="small"
97
- disabled={buttonDisabled || buttonLoading}
98
- style={{ borderColor: theme.palette.grey[300], borderRadius: 8 }}
99
- onClick={handleButtonClick}>
100
- {buttonLoading && <CircularProgress size={15} style={{ marginRight: 3, color: 'inherit' }} />}
101
- {buttonText}
102
- </Button>
103
- ))}
104
- </Stack>
105
- </CardContent>
106
- <CardContent sx={{ py: 0 }}>
79
+ <Card
80
+ variant="outlined"
81
+ onClick={handleMainClick}
82
+ {...rest}
83
+ sx={{ p: { xs: 2, md: 3 }, borderRadius: 2, ...rest.sx }}>
84
+ <Stack flex={1} direction="row" gap={2} alignItems="center" overflow="hidden">
85
+ <Avatar src={cover} did={did} size={48} variant="rounded" />
86
+ <Typography
87
+ flex={1}
88
+ fontWeight="typography.fontWeightMedium"
89
+ sx={{ fontSize: 16, textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden' }}
90
+ {...titleProps}
91
+ />
92
+ {button ||
93
+ (onButtonClick && (
94
+ <Button
95
+ color="reverse"
96
+ variant="outlined"
97
+ size="small"
98
+ disabled={buttonDisabled || buttonLoading}
99
+ style={{
100
+ borderColor: theme.palette.grey[300],
101
+ borderRadius: 8,
102
+ fontSize: 13,
103
+ fontWeight: theme.typography.fontWeightMedium,
104
+ }}
105
+ onClick={handleButtonClick}>
106
+ {buttonLoading && <CircularProgress size={15} style={{ marginRight: 3, color: 'inherit' }} />}
107
+ {buttonText}
108
+ </Button>
109
+ ))}
110
+ </Stack>
111
+ <Stack py={2}>
107
112
  <Typography
108
- component="div"
109
113
  variant="body2"
110
114
  color="text.secondary"
111
115
  sx={{
112
- lineClamp: 2,
113
116
  display: '-webkit-box',
117
+ lineClamp: 2,
114
118
  WebkitLineClamp: 2,
115
119
  WebkitBoxOrient: 'vertical',
116
120
  overflow: 'hidden',
@@ -118,13 +122,13 @@ export default function BlockletStore(props: IBlockletStore) {
118
122
  }}
119
123
  {...descriptionProps}
120
124
  />
121
- </CardContent>
122
- <CardContent sx={{ display: 'flex', alignItems: 'center', gap: 4, color: 'grey.800' }}>
125
+ </Stack>
126
+ <Stack direction="row" alignItems="center" gap={2} color="text.secondary">
123
127
  <IconText icon={<Avatar src={avatar} did={did} size={20} variant="circle" />}>{author}</IconText>
124
128
  <IconText icon={<Icon icon={Download} />} title={download}>
125
129
  {formatDownloadCount(download)}
126
130
  </IconText>
127
- </CardContent>
131
+ </Stack>
128
132
  </Card>
129
133
  );
130
134
  }
@@ -13,7 +13,7 @@ export default function IconText({
13
13
  title?: string;
14
14
  }) {
15
15
  return (
16
- children && (
16
+ (children === 0 || children) && (
17
17
  <Stack direction="row" alignItems="center" gap={1} sx={{ maxWidth, overflow: 'hidden' }}>
18
18
  {icon}
19
19
  <Typography
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable no-prototype-builtins */
2
- import { createContext, useState, useEffect, useContext, useRef, useCallback } from 'react';
2
+ import React, { createContext, useState, useEffect, useContext, useRef, useCallback, ReactNode } from 'react';
3
3
  import get from 'lodash/get';
4
- import PropTypes from 'prop-types';
5
4
  import Cookie from 'js-cookie';
6
5
 
7
6
  import browserLang from './browser-lang';
@@ -12,7 +11,10 @@ import { getCookieOptions } from '../Util';
12
11
  const cookieName = 'nf_lang';
13
12
 
14
13
  // 跨应用传递多语言选择的方式是在 query string 中添加 locale 参数,LocaleSelector 要高优先级遵守这个参数
15
- const getLocaleFromSearchParams = (languages, url = window.location.href) => {
14
+ const getLocaleFromSearchParams = (
15
+ languages: { code: string }[],
16
+ url: string = window.location.href
17
+ ): string | null => {
16
18
  const locale = new URL(url).searchParams.get('locale');
17
19
  if (languages.find((x) => x.code === locale)) {
18
20
  return locale;
@@ -20,7 +22,7 @@ const getLocaleFromSearchParams = (languages, url = window.location.href) => {
20
22
  return null;
21
23
  };
22
24
 
23
- const setLocaleParam = (locale, url = window.location.href) => {
25
+ const setLocaleParam = (locale: string, url: string = window.location.href) => {
24
26
  const urlObj = new URL(url);
25
27
  const hasLocaleParam = urlObj.searchParams.has('locale');
26
28
  if (hasLocaleParam) {
@@ -29,7 +31,7 @@ const setLocaleParam = (locale, url = window.location.href) => {
29
31
  }
30
32
  };
31
33
 
32
- const getLocale = (languages = []) => {
34
+ const getLocale = (languages: { code: string }[] = []): string => {
33
35
  const langParams = {
34
36
  languages: languages.map((item) => item.code),
35
37
  // 取 languages 首个元素的 code 值, 如果不存在则取 'en'
@@ -38,12 +40,12 @@ const getLocale = (languages = []) => {
38
40
  return getLocaleFromSearchParams(languages) || Cookie.get(cookieName) || browserLang(langParams);
39
41
  };
40
42
 
41
- const setLocale = (locale) => {
43
+ const setLocale = (locale: string) => {
42
44
  Cookie.set(cookieName, locale, getCookieOptions());
43
45
  setLocaleParam(locale);
44
46
  };
45
47
 
46
- const getLanguages = (arg) => {
48
+ const getLanguages = (arg?: { code: string; name: string }[]): { code: string; name: string }[] => {
47
49
  const env = get(window, 'blocklet.languages');
48
50
  if (Array.isArray(env) && env.length) {
49
51
  return env;
@@ -59,16 +61,35 @@ const getLanguages = (arg) => {
59
61
  ];
60
62
  };
61
63
 
62
- const LocaleContext = createContext();
64
+ interface LocaleProviderProps {
65
+ children: ReactNode;
66
+ locale?: string;
67
+ fallbackLocale?: string;
68
+ translations: Record<string, any>;
69
+ // eslint-disable-next-line no-unused-vars
70
+ onLoadingTranslation?: (locale: string, languages: { code: string }[]) => void;
71
+ languages?: { code: string; name: string }[];
72
+ }
73
+
74
+ const LocaleContext = createContext<any>(null);
63
75
  const { Provider, Consumer } = LocaleContext;
64
- function LocaleProvider({ children, locale, fallbackLocale, translations, onLoadingTranslation, languages, ...rest }) {
76
+
77
+ function LocaleProvider({
78
+ children,
79
+ locale,
80
+ fallbackLocale,
81
+ translations,
82
+ onLoadingTranslation,
83
+ languages = [],
84
+ ...rest
85
+ }: LocaleProviderProps) {
65
86
  const langs = getLanguages(languages);
66
87
  // eslint-disable-next-line prefer-const
67
- let [currentLocale, setCurrentLocale] = useState(locale || getLocale(langs));
68
- const lastCurrentLocale = useRef(fallbackLocale);
88
+ let [currentLocale, setCurrentLocale] = useState<string>(locale || getLocale(langs));
89
+ const lastCurrentLocale = useRef<string>(fallbackLocale || '');
69
90
  const [, setForceUpdate] = useState(0);
70
91
 
71
- const changeLocale = (newLocale) => {
92
+ const changeLocale = (newLocale: string) => {
72
93
  setCurrentLocale(newLocale);
73
94
  setLocale(newLocale);
74
95
  };
@@ -95,14 +116,14 @@ function LocaleProvider({ children, locale, fallbackLocale, translations, onLoad
95
116
  console.error(err);
96
117
  }
97
118
 
98
- onLoadingTranslation(tmpLocale, langs);
119
+ onLoadingTranslation?.(tmpLocale, langs);
99
120
  currentLocale = lastCurrentLocale.current;
100
121
  } else {
101
122
  lastCurrentLocale.current = currentLocale;
102
123
  }
103
124
 
104
125
  const t = useCallback(
105
- (key, data) => translate(translations, key, currentLocale, fallbackLocale, data),
126
+ (key: string, data?: any) => translate(translations, key, currentLocale, fallbackLocale, data),
106
127
  [translations, currentLocale, fallbackLocale]
107
128
  );
108
129
 
@@ -114,21 +135,4 @@ function useLocaleContext() {
114
135
  return context;
115
136
  }
116
137
 
117
- LocaleProvider.propTypes = {
118
- children: PropTypes.any.isRequired,
119
- translations: PropTypes.object.isRequired,
120
- onLoadingTranslation: PropTypes.func,
121
- locale: PropTypes.string,
122
- // 会影响 translate(key) 的结果 - 当 key 无效时查找 fallbackLocale 对应的翻译结果
123
- fallbackLocale: PropTypes.string,
124
- languages: PropTypes.arrayOf(PropTypes.shape({ code: PropTypes.string, name: PropTypes.string })),
125
- };
126
-
127
- LocaleProvider.defaultProps = {
128
- locale: '',
129
- fallbackLocale: '',
130
- languages: [],
131
- onLoadingTranslation: () => {},
132
- };
133
-
134
138
  export { LocaleProvider, Consumer as LocaleConsumer, LocaleContext, useLocaleContext, setLocale, getLocale };