@flow97/react-toolkit 0.0.2 → 0.0.4

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.
package/locale/hooks.js CHANGED
@@ -1,19 +1,269 @@
1
- import { template, has, get } from 'lodash-es';
1
+ import { isEqual, template, has, get } from 'lodash-es';
2
2
  import { createContext, useMemo, useContext } from 'react';
3
- import { useStore } from 'zustand';
4
- import 'zustand/middleware';
5
- import 'jwt-decode';
3
+ import { create, useStore } from 'zustand';
4
+ import { jwtDecode } from 'jwt-decode';
5
+ import { persist, createJSONStorage } from 'zustand/middleware';
6
6
  import 'react/jsx-runtime';
7
7
 
8
8
  // src/locale/hooks.ts
9
- var ToolkitsContext = createContext(null);
10
- function useToolkitsStore(selector) {
11
- const store = useContext(ToolkitsContext);
9
+
10
+ // src/locale/zh_CN.ts
11
+ var locale = {
12
+ global: {
13
+ noEntitlement: "\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",
14
+ name: "\u540D\u79F0",
15
+ creationTime: "\u521B\u5EFA\u65F6\u95F4",
16
+ operation: "\u64CD\u4F5C",
17
+ update: "\u66F4\u65B0",
18
+ edit: "\u7F16\u8F91",
19
+ delete: "\u5220\u9664",
20
+ selectAll: "\u5168\u9009",
21
+ game: "\u6E38\u620F",
22
+ user: "\u7528\u6237",
23
+ role: "\u89D2\u8272",
24
+ username: "\u7528\u6237\u540D",
25
+ password: "\u5BC6\u7801",
26
+ label: "\u6807\u7B7E",
27
+ method: "\u65B9\u6CD5",
28
+ route: "\u8DEF\u7531",
29
+ request: "\u8BF7\u6C42",
30
+ response: "\u54CD\u5E94",
31
+ add: "\u6DFB\u52A0",
32
+ signIn: "\u767B\u5F55",
33
+ projectGroup: "\u9879\u76EE\u7EC4",
34
+ view: "\u67E5\u770B",
35
+ back: "\u8FD4\u56DE"
36
+ },
37
+ SignIn: {
38
+ title: "\u767B\u5F55\u65B9\u5F0F",
39
+ signInWithIDass: "IDass \u767B\u5F55",
40
+ unregistered: "\u60A8\u8FD8\u672A\u5728\u5E73\u53F0\u6CE8\u518C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",
41
+ welcome: "\u6B22\u8FCE"
42
+ },
43
+ NotFound: {
44
+ subTitle: "\u8BBF\u95EE\u7684\u9875\u9762\u4E0D\u5B58\u5728",
45
+ buttonText: "\u8FD4\u56DE\u9996\u9875"
46
+ },
47
+ FilterFormWrapper: {
48
+ confirmText: "\u67E5\u8BE2",
49
+ resetText: "\u91CD\u7F6E"
50
+ },
51
+ FormModal: {
52
+ confirmText: "\u786E\u8BA4",
53
+ cancelText: "\u53D6\u6D88"
54
+ },
55
+ GameSelect: {
56
+ label: "\u5F53\u524D\u6E38\u620F",
57
+ placeholder: "\u8BF7\u9009\u62E9\u6E38\u620F"
58
+ },
59
+ RequireGame: {
60
+ description: "\u8BF7\u9009\u62E9\u6E38\u620F"
61
+ },
62
+ UserDropdown: {
63
+ signOutText: "\u767B\u51FA"
64
+ },
65
+ User: {
66
+ createTitle: "\u521B\u5EFA\u7528\u6237",
67
+ createSuccessfully: "\u7528\u6237\u521B\u5EFA\u6210\u529F",
68
+ updateTitle: "\u66F4\u65B0\u7528\u6237",
69
+ updateSuccessfully: "\u7528\u6237\u66F4\u65B0\u6210\u529F",
70
+ deleteTitle: "\u5220\u9664\u7528\u6237",
71
+ deleteContent: "\u786E\u5B9A\u8981\u5220\u9664\u7528\u6237 <%= user %> \u5417\uFF1F",
72
+ deleteSuccessfully: "\u7528\u6237\u5220\u9664\u6210\u529F"
73
+ },
74
+ Role: {
75
+ createTitle: "\u521B\u5EFA\u89D2\u8272",
76
+ createSuccessfully: "\u89D2\u8272\u521B\u5EFA\u6210\u529F",
77
+ updateTitle: "\u66F4\u65B0\u89D2\u8272",
78
+ updateSuccessfully: "\u89D2\u8272\u66F4\u65B0\u6210\u529F",
79
+ deleteTitle: "\u5220\u9664\u89D2\u8272",
80
+ deleteContent: "\u786E\u5B9A\u8981\u5220\u9664\u89D2\u8272 <%= role %> \u5417\uFF1F",
81
+ deleteSuccessfully: "\u89D2\u8272\u5220\u9664\u6210\u529F"
82
+ },
83
+ PermissionList: {
84
+ failedDescription: "\u83B7\u53D6\u6743\u9650\u5217\u8868\u5931\u8D25",
85
+ baseSectionTitle: "\u5E73\u53F0\u57FA\u7840\u6743\u9650",
86
+ gameSectionTitle: "\u6E38\u620F\u6743\u9650",
87
+ gameSectionDescription: "\u8BF7\u5148\u9009\u62E9\u6E38\u620F",
88
+ gameSelectPlaceholder: "\u8BF7\u5148\u9009\u62E9\u6E38\u620F",
89
+ removeText: "\u79FB\u9664",
90
+ addText: "\u6DFB\u52A0\u6E38\u620F\u6743\u9650"
91
+ },
92
+ RoleDetail: {
93
+ title: "\u89D2\u8272\u8BE6\u60C5"
94
+ },
95
+ InfiniteList: {
96
+ loadingText: "\u52A0\u8F7D\u4E2D",
97
+ reachEndText: "\u5DF2\u7ECF\u5230\u5E95\u4E86",
98
+ loadMoreText: "\u52A0\u8F7D\u66F4\u591A"
99
+ }
100
+ };
101
+ var zh_CN_default = locale;
102
+
103
+ // src/utils/mixedStorage.ts
104
+ var mixedStorage = {
105
+ getItem(name) {
106
+ return sessionStorage.getItem(name) ?? localStorage.getItem(name);
107
+ },
108
+ setItem(name, value) {
109
+ sessionStorage.setItem(name, value);
110
+ localStorage.setItem(name, value);
111
+ },
112
+ removeItem(name) {
113
+ sessionStorage.removeItem(name);
114
+ localStorage.removeItem(name);
115
+ }
116
+ };
117
+
118
+ // src/stores/index.ts
119
+ var defaultContextSlice = {
120
+ useGameApiV2: false,
121
+ loginPath: "/sign_in",
122
+ homePath: "/",
123
+ sidebarWidth: 250,
124
+ sidebarCollapsible: false,
125
+ gameScoped: false,
126
+ locale: zh_CN_default,
127
+ authMode: "game_scoped" /* GAME_SCOPED */
128
+ };
129
+ var decodeToken = (token) => {
130
+ if (!token) return null;
131
+ try {
132
+ return jwtDecode(token);
133
+ } catch {
134
+ return null;
135
+ }
136
+ };
137
+ var createStore = (initProps) => {
138
+ return create()(
139
+ persist(
140
+ (set, get2, store) => {
141
+ const context = {
142
+ ...defaultContextSlice,
143
+ ...initProps
144
+ };
145
+ return {
146
+ // Context 配置
147
+ context,
148
+ // Token 状态
149
+ token: {
150
+ token: void 0,
151
+ user: null,
152
+ setToken: (token) => {
153
+ set((state) => ({
154
+ token: {
155
+ ...state.token,
156
+ token,
157
+ user: decodeToken(token)
158
+ }
159
+ }));
160
+ },
161
+ clearToken: () => {
162
+ set((state) => ({
163
+ token: {
164
+ ...state.token,
165
+ token: void 0,
166
+ user: null
167
+ }
168
+ }));
169
+ }
170
+ },
171
+ // Game 状态
172
+ game: {
173
+ appId: void 0,
174
+ setAppId: (id) => {
175
+ set((state) => ({
176
+ game: {
177
+ ...state.game,
178
+ appId: id
179
+ }
180
+ }));
181
+ }
182
+ },
183
+ // Layout 状态
184
+ layout: {
185
+ collapsed: false,
186
+ toggleCollapsed: () => {
187
+ set((state) => ({
188
+ layout: {
189
+ ...state.layout,
190
+ collapsed: !state.layout.collapsed
191
+ }
192
+ }));
193
+ }
194
+ },
195
+ // Nav 状态
196
+ nav: {
197
+ openKeys: [],
198
+ selectedKeys: [],
199
+ setOpenKeys: (keys) => {
200
+ const current = get2();
201
+ if (!isEqual(current.nav.openKeys, keys)) {
202
+ set((state) => ({
203
+ nav: {
204
+ ...state.nav,
205
+ openKeys: keys
206
+ }
207
+ }));
208
+ }
209
+ },
210
+ setSelectedKeys: (keys) => {
211
+ const current = get2();
212
+ if (!isEqual(current.nav.selectedKeys, keys)) {
213
+ set((state) => ({
214
+ nav: {
215
+ ...state.nav,
216
+ selectedKeys: keys
217
+ }
218
+ }));
219
+ }
220
+ }
221
+ },
222
+ // 清除所有状态
223
+ clear: () => {
224
+ get2().token.clearToken();
225
+ store.persist.clearStorage();
226
+ }
227
+ };
228
+ },
229
+ {
230
+ name: "ToolkitStore",
231
+ storage: createJSONStorage(() => mixedStorage),
232
+ partialize: (state) => ({
233
+ token: state.token.token,
234
+ appId: state.game.appId,
235
+ user: state.token.user,
236
+ collapsed: state.layout.collapsed,
237
+ openKeys: state.nav.openKeys,
238
+ selectedKeys: state.nav.selectedKeys
239
+ }),
240
+ merge: (persistedState, currentState) => {
241
+ const { token, user, appId, collapsed, openKeys, selectedKeys } = persistedState;
242
+ return {
243
+ ...currentState,
244
+ token: { ...currentState.token, token, user },
245
+ game: { ...currentState.game, appId },
246
+ layout: { ...currentState.layout, collapsed: collapsed ?? currentState.layout.collapsed },
247
+ nav: {
248
+ ...currentState.nav,
249
+ openKeys: openKeys ?? currentState.nav.openKeys,
250
+ selectedKeys: selectedKeys ?? currentState.nav.selectedKeys
251
+ }
252
+ };
253
+ }
254
+ }
255
+ )
256
+ );
257
+ };
258
+ createStore();
259
+ var ToolkitContext = createContext(null);
260
+ function useToolkitStore(selector) {
261
+ const store = useContext(ToolkitContext);
12
262
  if (!store) {
13
263
  const componentStack = new Error().stack;
14
264
  const componentName = componentStack?.split("\n")[2]?.trim() || "Unknown";
15
265
  throw new Error(
16
- `Missing ToolkitsProvider in the tree. Component "${componentName}" must be wrapped with <ToolkitsProvider>. Please ensure ToolkitsProvider is rendered above this component in the component tree.`
266
+ `Missing ToolkitProvider in the tree. Component "${componentName}" must be wrapped with <ToolkitProvider>. Please ensure ToolkitProvider is rendered above this component in the component tree.`
17
267
  );
18
268
  }
19
269
  return useStore(store, ((state) => state));
@@ -24,7 +274,7 @@ if (process.env.NODE_ENV !== "production") ;
24
274
  function useTranslation() {
25
275
  const {
26
276
  context: { locale: locale2 }
27
- } = useToolkitsStore();
277
+ } = useToolkitStore();
28
278
  const t = useMemo(
29
279
  () => (key, data) => has(locale2, key) ? template(get(locale2, key))(data) : key,
30
280
  [locale2]
package/locale/index.js CHANGED
@@ -1,19 +1,269 @@
1
- import { template, has, get } from 'lodash-es';
1
+ import { isEqual, template, has, get } from 'lodash-es';
2
2
  import { createContext, useMemo, useContext } from 'react';
3
- import { useStore } from 'zustand';
4
- import 'zustand/middleware';
5
- import 'jwt-decode';
3
+ import { create, useStore } from 'zustand';
4
+ import { jwtDecode } from 'jwt-decode';
5
+ import { persist, createJSONStorage } from 'zustand/middleware';
6
6
  import 'react/jsx-runtime';
7
7
 
8
8
  // src/locale/hooks.ts
9
- var ToolkitsContext = createContext(null);
10
- function useToolkitsStore(selector) {
11
- const store = useContext(ToolkitsContext);
9
+
10
+ // src/locale/zh_CN.ts
11
+ var locale = {
12
+ global: {
13
+ noEntitlement: "\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",
14
+ name: "\u540D\u79F0",
15
+ creationTime: "\u521B\u5EFA\u65F6\u95F4",
16
+ operation: "\u64CD\u4F5C",
17
+ update: "\u66F4\u65B0",
18
+ edit: "\u7F16\u8F91",
19
+ delete: "\u5220\u9664",
20
+ selectAll: "\u5168\u9009",
21
+ game: "\u6E38\u620F",
22
+ user: "\u7528\u6237",
23
+ role: "\u89D2\u8272",
24
+ username: "\u7528\u6237\u540D",
25
+ password: "\u5BC6\u7801",
26
+ label: "\u6807\u7B7E",
27
+ method: "\u65B9\u6CD5",
28
+ route: "\u8DEF\u7531",
29
+ request: "\u8BF7\u6C42",
30
+ response: "\u54CD\u5E94",
31
+ add: "\u6DFB\u52A0",
32
+ signIn: "\u767B\u5F55",
33
+ projectGroup: "\u9879\u76EE\u7EC4",
34
+ view: "\u67E5\u770B",
35
+ back: "\u8FD4\u56DE"
36
+ },
37
+ SignIn: {
38
+ title: "\u767B\u5F55\u65B9\u5F0F",
39
+ signInWithIDass: "IDass \u767B\u5F55",
40
+ unregistered: "\u60A8\u8FD8\u672A\u5728\u5E73\u53F0\u6CE8\u518C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",
41
+ welcome: "\u6B22\u8FCE"
42
+ },
43
+ NotFound: {
44
+ subTitle: "\u8BBF\u95EE\u7684\u9875\u9762\u4E0D\u5B58\u5728",
45
+ buttonText: "\u8FD4\u56DE\u9996\u9875"
46
+ },
47
+ FilterFormWrapper: {
48
+ confirmText: "\u67E5\u8BE2",
49
+ resetText: "\u91CD\u7F6E"
50
+ },
51
+ FormModal: {
52
+ confirmText: "\u786E\u8BA4",
53
+ cancelText: "\u53D6\u6D88"
54
+ },
55
+ GameSelect: {
56
+ label: "\u5F53\u524D\u6E38\u620F",
57
+ placeholder: "\u8BF7\u9009\u62E9\u6E38\u620F"
58
+ },
59
+ RequireGame: {
60
+ description: "\u8BF7\u9009\u62E9\u6E38\u620F"
61
+ },
62
+ UserDropdown: {
63
+ signOutText: "\u767B\u51FA"
64
+ },
65
+ User: {
66
+ createTitle: "\u521B\u5EFA\u7528\u6237",
67
+ createSuccessfully: "\u7528\u6237\u521B\u5EFA\u6210\u529F",
68
+ updateTitle: "\u66F4\u65B0\u7528\u6237",
69
+ updateSuccessfully: "\u7528\u6237\u66F4\u65B0\u6210\u529F",
70
+ deleteTitle: "\u5220\u9664\u7528\u6237",
71
+ deleteContent: "\u786E\u5B9A\u8981\u5220\u9664\u7528\u6237 <%= user %> \u5417\uFF1F",
72
+ deleteSuccessfully: "\u7528\u6237\u5220\u9664\u6210\u529F"
73
+ },
74
+ Role: {
75
+ createTitle: "\u521B\u5EFA\u89D2\u8272",
76
+ createSuccessfully: "\u89D2\u8272\u521B\u5EFA\u6210\u529F",
77
+ updateTitle: "\u66F4\u65B0\u89D2\u8272",
78
+ updateSuccessfully: "\u89D2\u8272\u66F4\u65B0\u6210\u529F",
79
+ deleteTitle: "\u5220\u9664\u89D2\u8272",
80
+ deleteContent: "\u786E\u5B9A\u8981\u5220\u9664\u89D2\u8272 <%= role %> \u5417\uFF1F",
81
+ deleteSuccessfully: "\u89D2\u8272\u5220\u9664\u6210\u529F"
82
+ },
83
+ PermissionList: {
84
+ failedDescription: "\u83B7\u53D6\u6743\u9650\u5217\u8868\u5931\u8D25",
85
+ baseSectionTitle: "\u5E73\u53F0\u57FA\u7840\u6743\u9650",
86
+ gameSectionTitle: "\u6E38\u620F\u6743\u9650",
87
+ gameSectionDescription: "\u8BF7\u5148\u9009\u62E9\u6E38\u620F",
88
+ gameSelectPlaceholder: "\u8BF7\u5148\u9009\u62E9\u6E38\u620F",
89
+ removeText: "\u79FB\u9664",
90
+ addText: "\u6DFB\u52A0\u6E38\u620F\u6743\u9650"
91
+ },
92
+ RoleDetail: {
93
+ title: "\u89D2\u8272\u8BE6\u60C5"
94
+ },
95
+ InfiniteList: {
96
+ loadingText: "\u52A0\u8F7D\u4E2D",
97
+ reachEndText: "\u5DF2\u7ECF\u5230\u5E95\u4E86",
98
+ loadMoreText: "\u52A0\u8F7D\u66F4\u591A"
99
+ }
100
+ };
101
+ var zh_CN_default = locale;
102
+
103
+ // src/utils/mixedStorage.ts
104
+ var mixedStorage = {
105
+ getItem(name) {
106
+ return sessionStorage.getItem(name) ?? localStorage.getItem(name);
107
+ },
108
+ setItem(name, value) {
109
+ sessionStorage.setItem(name, value);
110
+ localStorage.setItem(name, value);
111
+ },
112
+ removeItem(name) {
113
+ sessionStorage.removeItem(name);
114
+ localStorage.removeItem(name);
115
+ }
116
+ };
117
+
118
+ // src/stores/index.ts
119
+ var defaultContextSlice = {
120
+ useGameApiV2: false,
121
+ loginPath: "/sign_in",
122
+ homePath: "/",
123
+ sidebarWidth: 250,
124
+ sidebarCollapsible: false,
125
+ gameScoped: false,
126
+ locale: zh_CN_default,
127
+ authMode: "game_scoped" /* GAME_SCOPED */
128
+ };
129
+ var decodeToken = (token) => {
130
+ if (!token) return null;
131
+ try {
132
+ return jwtDecode(token);
133
+ } catch {
134
+ return null;
135
+ }
136
+ };
137
+ var createStore = (initProps) => {
138
+ return create()(
139
+ persist(
140
+ (set, get2, store) => {
141
+ const context = {
142
+ ...defaultContextSlice,
143
+ ...initProps
144
+ };
145
+ return {
146
+ // Context 配置
147
+ context,
148
+ // Token 状态
149
+ token: {
150
+ token: void 0,
151
+ user: null,
152
+ setToken: (token) => {
153
+ set((state) => ({
154
+ token: {
155
+ ...state.token,
156
+ token,
157
+ user: decodeToken(token)
158
+ }
159
+ }));
160
+ },
161
+ clearToken: () => {
162
+ set((state) => ({
163
+ token: {
164
+ ...state.token,
165
+ token: void 0,
166
+ user: null
167
+ }
168
+ }));
169
+ }
170
+ },
171
+ // Game 状态
172
+ game: {
173
+ appId: void 0,
174
+ setAppId: (id) => {
175
+ set((state) => ({
176
+ game: {
177
+ ...state.game,
178
+ appId: id
179
+ }
180
+ }));
181
+ }
182
+ },
183
+ // Layout 状态
184
+ layout: {
185
+ collapsed: false,
186
+ toggleCollapsed: () => {
187
+ set((state) => ({
188
+ layout: {
189
+ ...state.layout,
190
+ collapsed: !state.layout.collapsed
191
+ }
192
+ }));
193
+ }
194
+ },
195
+ // Nav 状态
196
+ nav: {
197
+ openKeys: [],
198
+ selectedKeys: [],
199
+ setOpenKeys: (keys) => {
200
+ const current = get2();
201
+ if (!isEqual(current.nav.openKeys, keys)) {
202
+ set((state) => ({
203
+ nav: {
204
+ ...state.nav,
205
+ openKeys: keys
206
+ }
207
+ }));
208
+ }
209
+ },
210
+ setSelectedKeys: (keys) => {
211
+ const current = get2();
212
+ if (!isEqual(current.nav.selectedKeys, keys)) {
213
+ set((state) => ({
214
+ nav: {
215
+ ...state.nav,
216
+ selectedKeys: keys
217
+ }
218
+ }));
219
+ }
220
+ }
221
+ },
222
+ // 清除所有状态
223
+ clear: () => {
224
+ get2().token.clearToken();
225
+ store.persist.clearStorage();
226
+ }
227
+ };
228
+ },
229
+ {
230
+ name: "ToolkitStore",
231
+ storage: createJSONStorage(() => mixedStorage),
232
+ partialize: (state) => ({
233
+ token: state.token.token,
234
+ appId: state.game.appId,
235
+ user: state.token.user,
236
+ collapsed: state.layout.collapsed,
237
+ openKeys: state.nav.openKeys,
238
+ selectedKeys: state.nav.selectedKeys
239
+ }),
240
+ merge: (persistedState, currentState) => {
241
+ const { token, user, appId, collapsed, openKeys, selectedKeys } = persistedState;
242
+ return {
243
+ ...currentState,
244
+ token: { ...currentState.token, token, user },
245
+ game: { ...currentState.game, appId },
246
+ layout: { ...currentState.layout, collapsed: collapsed ?? currentState.layout.collapsed },
247
+ nav: {
248
+ ...currentState.nav,
249
+ openKeys: openKeys ?? currentState.nav.openKeys,
250
+ selectedKeys: selectedKeys ?? currentState.nav.selectedKeys
251
+ }
252
+ };
253
+ }
254
+ }
255
+ )
256
+ );
257
+ };
258
+ createStore();
259
+ var ToolkitContext = createContext(null);
260
+ function useToolkitStore(selector) {
261
+ const store = useContext(ToolkitContext);
12
262
  if (!store) {
13
263
  const componentStack = new Error().stack;
14
264
  const componentName = componentStack?.split("\n")[2]?.trim() || "Unknown";
15
265
  throw new Error(
16
- `Missing ToolkitsProvider in the tree. Component "${componentName}" must be wrapped with <ToolkitsProvider>. Please ensure ToolkitsProvider is rendered above this component in the component tree.`
266
+ `Missing ToolkitProvider in the tree. Component "${componentName}" must be wrapped with <ToolkitProvider>. Please ensure ToolkitProvider is rendered above this component in the component tree.`
17
267
  );
18
268
  }
19
269
  return useStore(store, ((state) => state));
@@ -24,7 +274,7 @@ if (process.env.NODE_ENV !== "production") ;
24
274
  function useTranslation() {
25
275
  const {
26
276
  context: { locale: locale2 }
27
- } = useToolkitsStore();
277
+ } = useToolkitStore();
28
278
  const t = useMemo(
29
279
  () => (key, data) => has(locale2, key) ? template(get(locale2, key))(data) : key,
30
280
  [locale2]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flow97/react-toolkit",
3
3
  "type": "module",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "sideEffects": [
6
6
  "*.css"
7
7
  ],