@umijs/plugins 4.0.0-beta.11 → 4.0.0-beta.15

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.
Files changed (54) hide show
  1. package/README.md +4 -1
  2. package/dist/access.js +73 -1
  3. package/dist/{sass.d.ts → analytics.d.ts} +0 -0
  4. package/dist/analytics.js +67 -0
  5. package/dist/antd.js +89 -145
  6. package/dist/dva.d.ts +3 -0
  7. package/dist/dva.js +169 -4
  8. package/dist/initial-state.js +112 -1
  9. package/dist/layout.js +458 -1
  10. package/dist/locale.d.ts +1 -0
  11. package/dist/locale.js +199 -1
  12. package/dist/model.js +112 -1
  13. package/dist/moment2dayjs.d.ts +3 -0
  14. package/dist/moment2dayjs.js +96 -0
  15. package/dist/qiankun/constants.d.ts +5 -0
  16. package/dist/qiankun/constants.js +8 -0
  17. package/dist/qiankun/master.d.ts +6 -0
  18. package/dist/qiankun/master.js +116 -0
  19. package/dist/qiankun/slave.d.ts +3 -0
  20. package/dist/qiankun/slave.js +142 -0
  21. package/dist/qiankun.js +15 -1
  22. package/dist/request.js +293 -1
  23. package/dist/utils/astUtils.d.ts +3 -0
  24. package/dist/utils/astUtils.js +34 -0
  25. package/dist/utils/localeUtils.d.ts +33 -0
  26. package/dist/utils/localeUtils.js +135 -0
  27. package/dist/utils/modelUtils.d.ts +35 -0
  28. package/dist/utils/modelUtils.js +145 -0
  29. package/dist/utils/resolveProjectDep.d.ts +5 -0
  30. package/dist/utils/resolveProjectDep.js +15 -0
  31. package/dist/utils/withTmpPath.d.ts +6 -0
  32. package/dist/utils/withTmpPath.js +11 -0
  33. package/libs/dva.ts +10 -0
  34. package/libs/locale/SelectLang.tpl +478 -0
  35. package/libs/locale/locale.tpl +82 -0
  36. package/libs/locale/localeExports.tpl +271 -0
  37. package/libs/locale/runtime.tpl +33 -0
  38. package/libs/model.tsx +140 -0
  39. package/libs/qiankun/master/AntdErrorBoundary.tsx +34 -0
  40. package/libs/qiankun/master/AntdLoader.tsx +15 -0
  41. package/libs/qiankun/master/ErrorBoundary.tsx +7 -0
  42. package/libs/qiankun/master/MicroApp.tsx +262 -0
  43. package/libs/qiankun/master/MicroAppWithMemoHistory.tsx +43 -0
  44. package/libs/qiankun/master/common.ts +133 -0
  45. package/libs/qiankun/master/constants.ts +7 -0
  46. package/libs/qiankun/master/getMicroAppRouteComponent.tsx.tpl +45 -0
  47. package/libs/qiankun/master/masterRuntimePlugin.tsx +133 -0
  48. package/libs/qiankun/master/types.ts +44 -0
  49. package/libs/qiankun/slave/connectMaster.tsx +15 -0
  50. package/libs/qiankun/slave/lifecycles.ts +149 -0
  51. package/libs/qiankun/slave/qiankunModel.ts +19 -0
  52. package/libs/qiankun/slave/slaveRuntimePlugin.ts +21 -0
  53. package/package.json +21 -5
  54. package/dist/sass.js +0 -5
@@ -0,0 +1,35 @@
1
+ import * as t from '@umijs/bundler-utils/compiled/babel/types';
2
+ import { IApi } from 'umi';
3
+ interface IOpts {
4
+ contentTest?: (content: string) => Boolean;
5
+ astTest?: (opts: {
6
+ node: t.Node;
7
+ content: string;
8
+ }) => Boolean;
9
+ }
10
+ export declare class Model {
11
+ file: string;
12
+ namespace: string;
13
+ id: string;
14
+ exportName: string;
15
+ constructor(file: string, id: number);
16
+ }
17
+ export declare class ModelUtils {
18
+ api: IApi;
19
+ opts: IOpts;
20
+ count: number;
21
+ constructor(api: IApi | null, opts: IOpts);
22
+ getAllModels(opts: {
23
+ extraModels: string[];
24
+ }): Model[];
25
+ getModels(opts: {
26
+ base: string;
27
+ pattern?: string;
28
+ }): string[];
29
+ isModelValid(opts: {
30
+ content: string;
31
+ file: string;
32
+ }): boolean;
33
+ static getModelsContent(models: Model[]): string;
34
+ }
35
+ export {};
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.ModelUtils = exports.Model = void 0;
26
+ const parser = __importStar(require("@umijs/bundler-utils/compiled/babel/parser"));
27
+ const traverse_1 = __importDefault(require("@umijs/bundler-utils/compiled/babel/traverse"));
28
+ const esbuild_1 = require("@umijs/bundler-utils/compiled/esbuild");
29
+ const utils_1 = require("@umijs/utils");
30
+ const fs_1 = require("fs");
31
+ const path_1 = require("path");
32
+ const astUtils_1 = require("./astUtils");
33
+ class Model {
34
+ constructor(file, id) {
35
+ let namespace;
36
+ let exportName;
37
+ const [_file, meta] = file.split('#');
38
+ if (meta) {
39
+ const metaObj = JSON.parse(meta);
40
+ namespace = metaObj.namespace;
41
+ exportName = metaObj.exportName;
42
+ }
43
+ this.file = _file;
44
+ this.id = `model_${id}`;
45
+ this.namespace = namespace || (0, path_1.basename)(file, (0, path_1.extname)(file));
46
+ this.exportName = exportName || 'default';
47
+ }
48
+ }
49
+ exports.Model = Model;
50
+ class ModelUtils {
51
+ constructor(api, opts) {
52
+ this.opts = {};
53
+ this.count = 1;
54
+ this.api = api;
55
+ this.opts = opts;
56
+ }
57
+ getAllModels(opts) {
58
+ // reset count
59
+ this.count = 1;
60
+ return [
61
+ ...this.getModels({
62
+ base: (0, path_1.join)(this.api.paths.absSrcPath, 'models'),
63
+ pattern: '**/*.{ts,tsx,js,jsx}',
64
+ }),
65
+ ...this.getModels({
66
+ base: (0, path_1.join)(this.api.paths.absPagesPath),
67
+ pattern: '**/models/**/*.{ts,tsx,js,jsx}',
68
+ }),
69
+ ...this.getModels({
70
+ base: (0, path_1.join)(this.api.paths.absPagesPath),
71
+ pattern: '**/model.{ts,tsx,js,jsx}',
72
+ }),
73
+ ...opts.extraModels,
74
+ ].map((file) => {
75
+ return new Model(file, this.count++);
76
+ });
77
+ }
78
+ getModels(opts) {
79
+ return utils_1.glob
80
+ .sync(opts.pattern || '**/*.{ts,js}', {
81
+ cwd: opts.base,
82
+ absolute: true,
83
+ })
84
+ .map(utils_1.winPath)
85
+ .filter((file) => {
86
+ if (/\.d.ts$/.test(file))
87
+ return false;
88
+ if (/\.(test|e2e|spec).([jt])sx?$/.test(file))
89
+ return false;
90
+ const content = (0, fs_1.readFileSync)(file, 'utf-8');
91
+ return this.isModelValid({ content, file });
92
+ });
93
+ }
94
+ isModelValid(opts) {
95
+ const { file, content } = opts;
96
+ if (this.opts.contentTest && this.opts.contentTest(content)) {
97
+ return true;
98
+ }
99
+ // transform with esbuild first
100
+ // to reduce unexpected ast problem
101
+ const loader = (0, path_1.extname)(file).slice(1);
102
+ const result = (0, esbuild_1.transformSync)(content, {
103
+ loader,
104
+ sourcemap: false,
105
+ minify: false,
106
+ });
107
+ // transform with babel
108
+ let ret = false;
109
+ const ast = parser.parse(result.code, {
110
+ sourceType: 'module',
111
+ sourceFilename: file,
112
+ plugins: [],
113
+ });
114
+ (0, traverse_1.default)(ast, {
115
+ ExportDefaultDeclaration: (path) => {
116
+ let node = path.node.declaration;
117
+ node = (0, astUtils_1.getIdentifierDeclaration)(node, path);
118
+ if (this.opts.astTest && this.opts.astTest({ node, content })) {
119
+ ret = true;
120
+ }
121
+ },
122
+ });
123
+ return ret;
124
+ }
125
+ static getModelsContent(models) {
126
+ const imports = [];
127
+ const modelProps = [];
128
+ models.forEach((model) => {
129
+ if (model.exportName !== 'default') {
130
+ imports.push(`import { ${model.exportName} as ${model.id} } from '${model.file}';`);
131
+ }
132
+ else {
133
+ imports.push(`import ${model.id} from '${model.file}';`);
134
+ }
135
+ modelProps.push(`${model.id}: { namespace: '${model.namespace}', model: ${model.id} },`);
136
+ });
137
+ return `
138
+ ${imports.join('\n')}
139
+
140
+ export const models = {
141
+ ${modelProps.join('\n')}
142
+ }`;
143
+ }
144
+ }
145
+ exports.ModelUtils = ModelUtils;
@@ -0,0 +1,5 @@
1
+ export declare function resolveProjectDep(opts: {
2
+ pkg: any;
3
+ cwd: string;
4
+ dep: string;
5
+ }): string | undefined;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveProjectDep = void 0;
4
+ const path_1 = require("path");
5
+ const plugin_utils_1 = require("umi/plugin-utils");
6
+ function resolveProjectDep(opts) {
7
+ var _a, _b;
8
+ if (((_a = opts.pkg.dependencies) === null || _a === void 0 ? void 0 : _a[opts.dep]) ||
9
+ ((_b = opts.pkg.devDependencies) === null || _b === void 0 ? void 0 : _b[opts.dep])) {
10
+ return (0, path_1.dirname)(plugin_utils_1.resolve.sync(`${opts.dep}/package.json`, {
11
+ basedir: opts.cwd,
12
+ }));
13
+ }
14
+ }
15
+ exports.resolveProjectDep = resolveProjectDep;
@@ -0,0 +1,6 @@
1
+ import { IApi } from 'umi';
2
+ export declare function withTmpPath(opts: {
3
+ api: IApi;
4
+ path: string;
5
+ noPluginDir?: boolean;
6
+ }): string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withTmpPath = void 0;
4
+ const utils_1 = require("@umijs/utils");
5
+ const path_1 = require("path");
6
+ function withTmpPath(opts) {
7
+ return (0, utils_1.winPath)((0, path_1.join)(opts.api.paths.absTmpPath, opts.api.plugin.key && !opts.noPluginDir
8
+ ? `plugin-${opts.api.plugin.key}`
9
+ : '', opts.path));
10
+ }
11
+ exports.withTmpPath = withTmpPath;
package/libs/dva.ts ADDED
@@ -0,0 +1,10 @@
1
+ // @ts-ignore
2
+ export { create, saga, utils } from 'dva-core';
3
+ export {
4
+ connect,
5
+ Provider,
6
+ useDispatch,
7
+ useSelector,
8
+ useStore,
9
+ } from 'react-redux';
10
+ export { bindActionCreators } from 'redux';
@@ -0,0 +1,478 @@
1
+ import React,{ useState } from 'react';
2
+ {{#Antd}}
3
+ import { Menu, Dropdown } from 'antd';
4
+ import { ClickParam } from 'antd/{{{antdFiles}}}/menu';
5
+ import { DropDownProps } from 'antd/{{{antdFiles}}}/dropdown';
6
+ {{/Antd}}
7
+ import { getLocale, getAllLocales, setLocale } from './localeExports';
8
+
9
+ {{#Antd}}
10
+ export interface HeaderDropdownProps extends DropDownProps {
11
+ overlayClassName?: string;
12
+ placement?:
13
+ | 'bottomLeft'
14
+ | 'bottomRight'
15
+ | 'topLeft'
16
+ | 'topCenter'
17
+ | 'topRight'
18
+ | 'bottomCenter';
19
+ }
20
+
21
+ const HeaderDropdown: React.FC<HeaderDropdownProps> = ({
22
+ overlayClassName: cls,
23
+ ...restProps
24
+ }) => (
25
+ <Dropdown
26
+ overlayClassName={cls}
27
+ {...restProps}
28
+ />
29
+ );
30
+ {{/Antd}}
31
+
32
+ interface LocalData {
33
+ lang: string,
34
+ label?: string,
35
+ icon?: string,
36
+ title?: string,
37
+ }
38
+
39
+ interface SelectLangProps {
40
+ globalIconClassName?: string;
41
+ postLocalesData?: (locales: LocalData[]) => LocalData[];
42
+ onItemClick?: (params: ClickParam) => void;
43
+ className?: string;
44
+ reload?: boolean;
45
+ icon?: React.ReactNode;
46
+ }
47
+
48
+ const transformArrayToObject = (allLangUIConfig:LocalData[])=>{
49
+ return allLangUIConfig.reduce((obj, item) => {
50
+ if(!item.lang){
51
+ return obj;
52
+ }
53
+
54
+ return {
55
+ ...obj,
56
+ [item.lang]: item,
57
+ };
58
+ }, {});
59
+ }
60
+
61
+ const defaultLangUConfigMap = {
62
+ 'ar-EG': {
63
+ lang: 'ar-EG',
64
+ label: 'العربية',
65
+ icon: '🇪🇬',
66
+ title: 'لغة'
67
+ },
68
+ 'az-AZ': {
69
+ lang: 'az-AZ',
70
+ label: 'Azərbaycan dili',
71
+ icon: '🇦🇿',
72
+ title: 'Dil'
73
+ },
74
+ 'bg-BG': {
75
+ lang: 'bg-BG',
76
+ label: 'Български език',
77
+ icon: '🇧🇬',
78
+ title: 'език'
79
+ },
80
+ 'bn-BD': {
81
+ lang: 'bn-BD',
82
+ label: 'বাংলা',
83
+ icon: '🇧🇩',
84
+ title: 'ভাষা'
85
+ },
86
+ 'ca-ES': {
87
+ lang: 'ca-ES',
88
+ label: 'Catalá',
89
+ icon: '🇨🇦',
90
+ title: 'llengua'
91
+ },
92
+ 'cs-CZ': {
93
+ lang: 'cs-CZ',
94
+ label: 'Čeština',
95
+ icon: '🇨🇿',
96
+ title: 'Jazyk'
97
+ },
98
+ 'da-DK': {
99
+ lang: 'da-DK',
100
+ label: 'Dansk',
101
+ icon: '🇩🇰',
102
+ title: 'Sprog'
103
+ },
104
+ 'de-DE': {
105
+ lang: 'de-DE',
106
+ label: 'Deutsch',
107
+ icon: '🇩🇪',
108
+ title: 'Sprache'
109
+ },
110
+ 'el-GR': {
111
+ lang: 'el-GR',
112
+ label: 'Ελληνικά',
113
+ icon: '🇬🇷',
114
+ title: 'Γλώσσα'
115
+ },
116
+ 'en-GB': {
117
+ lang: 'en-GB',
118
+ label: 'English',
119
+ icon: '🇬🇧',
120
+ title: 'Language'
121
+ },
122
+ 'en-US': {
123
+ lang: 'en-US',
124
+ label: 'English',
125
+ icon: '🇺🇸',
126
+ title: 'Language'
127
+ },
128
+ 'es-ES': {
129
+ lang: 'es-ES',
130
+ label: 'Español',
131
+ icon: '🇪🇸',
132
+ title: 'Idioma'
133
+ },
134
+ 'et-EE': {
135
+ lang: 'et-EE',
136
+ label: 'Eesti',
137
+ icon: '🇪🇪',
138
+ title: 'Keel'
139
+ },
140
+ 'fa-IR': {
141
+ lang: 'fa-IR',
142
+ label: 'فارسی',
143
+ icon: '🇮🇷',
144
+ title: 'زبان'
145
+ },
146
+ 'fi-FI': {
147
+ lang: 'fi-FI',
148
+ label: 'Suomi',
149
+ icon: '🇫🇮',
150
+ title: 'Kieli'
151
+ },
152
+ 'fr-BE': {
153
+ lang: 'fr-BE',
154
+ label: 'Français',
155
+ icon: '🇧🇪',
156
+ title: 'Langue'
157
+ },
158
+ 'fr-FR': {
159
+ lang: 'fr-FR',
160
+ label: 'Français',
161
+ icon: '🇫🇷',
162
+ title: 'Langue'
163
+ },
164
+ 'ga-IE': {
165
+ lang: 'ga-IE',
166
+ label: 'Gaeilge',
167
+ icon: '🇮🇪',
168
+ title: 'Teanga'
169
+ },
170
+ 'he-IL': {
171
+ lang: 'he-IL',
172
+ label: 'עברית',
173
+ icon: '🇮🇱',
174
+ title: 'שפה'
175
+ },
176
+ 'hi-IN': {
177
+ lang: 'hi-IN',
178
+ label: 'हिन्दी, हिंदी',
179
+ icon: '🇮🇳',
180
+ title: 'भाषा: हिन्दी'
181
+ },
182
+ 'hr-HR': {
183
+ lang: 'hr-HR',
184
+ label: 'Hrvatski jezik',
185
+ icon: '🇭🇷',
186
+ title: 'Jezik'
187
+ },
188
+ 'hu-HU': {
189
+ lang: 'hu-HU',
190
+ label: 'Magyar',
191
+ icon: '🇭🇺',
192
+ title: 'Nyelv'
193
+ },
194
+ 'hy-AM': {
195
+ lang: 'hu-HU',
196
+ label: 'Հայերեն',
197
+ icon: '🇦🇲',
198
+ title: 'Լեզու'
199
+ },
200
+ 'id-ID': {
201
+ lang: 'id-ID',
202
+ label: 'Bahasa Indonesia',
203
+ icon: '🇮🇩',
204
+ title: 'Bahasa'
205
+ },
206
+ 'it-IT': {
207
+ lang: 'it-IT',
208
+ label: 'Italiano',
209
+ icon: '🇮🇹',
210
+ title: 'Linguaggio'
211
+ },
212
+ 'is-IS': {
213
+ lang: 'is-IS',
214
+ label: 'Íslenska',
215
+ icon: '🇮🇸',
216
+ title: 'Tungumál'
217
+ },
218
+ 'ja-JP': {
219
+ lang: 'ja-JP',
220
+ label: '日本語',
221
+ icon: '🇯🇵',
222
+ title: '言語'
223
+ },
224
+ 'ku-IQ': {
225
+ lang: 'ku-IQ',
226
+ label: 'کوردی',
227
+ icon: '🇮🇶',
228
+ title: 'Ziman'
229
+ },
230
+ 'kn-IN': {
231
+ lang: 'zh-TW',
232
+ label: 'ಕನ್ನಡ',
233
+ icon: '🇮🇳',
234
+ title: 'ಭಾಷೆ'
235
+ },
236
+ 'ko-KR': {
237
+ lang: 'ko-KR',
238
+ label: '한국어',
239
+ icon: '🇰🇷',
240
+ title: '언어'
241
+ },
242
+ 'lv-LV': {
243
+ lang: 'lv-LV',
244
+ label: 'Latviešu valoda',
245
+ icon: '🇱🇮',
246
+ title: 'Kalba'
247
+ },
248
+ 'mk-MK': {
249
+ lang: 'mk-MK',
250
+ label: 'македонски јазик',
251
+ icon: '🇲🇰',
252
+ title: 'Јазик'
253
+ },
254
+ 'mn-MN': {
255
+ lang: 'mn-MN',
256
+ label: 'Монгол хэл',
257
+ icon: '🇲🇳',
258
+ title: 'Хэл'
259
+ },
260
+ 'ms-MY': {
261
+ lang: 'ms-MY',
262
+ label: 'بهاس ملايو‎',
263
+ icon: '🇲🇾',
264
+ title: 'Bahasa'
265
+ },
266
+ 'nb-NO': {
267
+ lang: 'nb-NO',
268
+ label: 'Norsk',
269
+ icon: '🇳🇴',
270
+ title: 'Språk'
271
+ },
272
+ 'ne-NP': {
273
+ lang: 'ne-NP',
274
+ label: 'नेपाली',
275
+ icon: '🇳🇵',
276
+ title: 'भाषा'
277
+ },
278
+ 'nl-BE': {
279
+ lang: 'nl-BE',
280
+ label: 'Vlaams',
281
+ icon: '🇧🇪',
282
+ title: 'Taal'
283
+ },
284
+ 'nl-NL': {
285
+ lang: 'nl-NL',
286
+ label: 'Vlaams',
287
+ icon: '🇳🇱',
288
+ title: 'Taal'
289
+ },
290
+ 'pl-PL': {
291
+ lang: 'pl-PL',
292
+ label: 'Polski',
293
+ icon: '🇵🇱',
294
+ title: 'Język'
295
+ },
296
+ 'pt-BR': {
297
+ lang: 'pt-BR',
298
+ label: 'Português',
299
+ icon: '🇧🇷',
300
+ title: 'Idiomas'
301
+ },
302
+ 'pt-PT': {
303
+ lang: 'pt-PT',
304
+ label: 'Português',
305
+ icon: '🇵🇹',
306
+ title: 'Idiomas'
307
+ },
308
+ 'ro-RO': {
309
+ lang: 'ro-RO',
310
+ label: 'Română',
311
+ icon: '🇷🇴',
312
+ title: 'Limba'
313
+ },
314
+ 'ru-RU': {
315
+ lang: 'ru-RU',
316
+ label: 'Русский',
317
+ icon: '🇷🇺',
318
+ title: 'язык'
319
+ },
320
+ 'sk-SK': {
321
+ lang: 'sk-SK',
322
+ label: 'Slovenčina',
323
+ icon: '🇸🇰',
324
+ title: 'Jazyk'
325
+ },
326
+ 'sr-RS': {
327
+ lang: 'sr-RS',
328
+ label: 'српски језик',
329
+ icon: '🇸🇷',
330
+ title: 'Језик'
331
+ },
332
+ 'sl-SI': {
333
+ lang: 'sl-SI',
334
+ label: 'Slovenščina',
335
+ icon: '🇸🇱',
336
+ title: 'Jezik'
337
+ },
338
+ 'sv-SE': {
339
+ lang: 'sv-SE',
340
+ label: 'Svenska',
341
+ icon: '🇸🇪',
342
+ title: 'Språk'
343
+ },
344
+ 'ta-IN': {
345
+ lang: 'ta-IN',
346
+ label: 'தமிழ்',
347
+ icon: '🇮🇳',
348
+ title: 'மொழி'
349
+ },
350
+ 'th-TH': {
351
+ lang: 'th-TH',
352
+ label: 'ไทย',
353
+ icon: '🇹🇭',
354
+ title: 'ภาษา'
355
+ },
356
+ 'tr-TR': {
357
+ lang: 'tr-TR',
358
+ label: 'Türkçe',
359
+ icon: '🇹🇷',
360
+ title: 'Dil'
361
+ },
362
+ 'uk-UA': {
363
+ lang: 'uk-UA',
364
+ label: 'Українська',
365
+ icon: '🇺🇰',
366
+ title: 'Мова'
367
+ },
368
+ 'vi-VN': {
369
+ lang: 'vi-VN',
370
+ label: 'Tiếng Việt',
371
+ icon: '🇻🇳',
372
+ title: 'Ngôn ngữ'
373
+ },
374
+ 'zh-CN': {
375
+ lang: 'zh-CN',
376
+ label: '简体中文',
377
+ icon: '🇨🇳',
378
+ title: '语言'
379
+ },
380
+ 'zh-TW': {
381
+ lang: 'zh-TW',
382
+ label: '繁體中文',
383
+ icon: '🇭🇰',
384
+ title: '語言'
385
+ }
386
+ };
387
+
388
+ export const SelectLang: React.FC<SelectLangProps> = (props) => {
389
+ {{#ShowSelectLang}}
390
+ const {
391
+ globalIconClassName,
392
+ postLocalesData,
393
+ onItemClick,
394
+ icon,
395
+ style,
396
+ reload,
397
+ ...restProps
398
+ } = props;
399
+ const [selectedLang, setSelectedLang] = useState(() => getLocale());
400
+
401
+ const changeLang = ({ key }: ClickParam): void => {
402
+ setLocale(key, reload);
403
+ setSelectedLang(getLocale())
404
+ };
405
+
406
+
407
+ const defaultLangUConfig = getAllLocales().map(
408
+ (key) =>
409
+ defaultLangUConfigMap[key] || {
410
+ lang: key,
411
+ label: key,
412
+ icon: "🌐",
413
+ title: key,
414
+ }
415
+ );
416
+
417
+ const allLangUIConfig =
418
+ postLocalesData?.(defaultLangUConfig) || defaultLangUConfig;
419
+ const handleClick = onItemClick
420
+ ? (params: ClickParam) => onItemClick(params)
421
+ : changeLang;
422
+
423
+ const menuItemStyle = { minWidth: "160px" };
424
+ const menuItemIconStyle = { marginRight: "8px" };
425
+ const langMenu = (
426
+ <Menu selectedKeys={[selectedLang]} onClick={handleClick}>
427
+ {allLangUIConfig.map((localeObj) => {
428
+ return (
429
+ <Menu.Item key={localeObj.lang || localeObj.key} style={menuItemStyle}>
430
+ <span role="img" aria-label={localeObj?.label || "en-US"} style={menuItemIconStyle}>
431
+ {localeObj?.icon || "🌐"}
432
+ </span>
433
+ {localeObj?.label || "en-US"}
434
+ </Menu.Item>
435
+ );
436
+ })}
437
+ </Menu>
438
+ );
439
+
440
+ const inlineStyle = {
441
+ cursor: "pointer",
442
+ padding: "12px",
443
+ display: "inline-flex",
444
+ alignItems: "center",
445
+ justifyContent: "center",
446
+ fontSize: 18,
447
+ verticalAlign: "middle",
448
+ ...style,
449
+ };
450
+
451
+ return (
452
+ <HeaderDropdown overlay={langMenu} placement="bottomRight" {...restProps}>
453
+ <span className={globalIconClassName} style={inlineStyle}>
454
+ <i className="anticon" title={allLangUIConfig[selectedLang]?.title}>
455
+ { icon ?
456
+ icon : (
457
+ <svg
458
+ viewBox="0 0 24 24"
459
+ focusable="false"
460
+ width="1em"
461
+ height="1em"
462
+ fill="currentColor"
463
+ aria-hidden="true"
464
+ >
465
+ <path d="M0 0h24v24H0z" fill="none" />
466
+ <path
467
+ d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z "
468
+ className="css-c4d79v"
469
+ />
470
+ </svg>
471
+ )}
472
+ </i>
473
+ </span>
474
+ </HeaderDropdown>
475
+ );
476
+ {{/ShowSelectLang}}
477
+ return <></>
478
+ };