react-toolkits 2.22.9 → 2.22.11

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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +63 -10
  3. package/lib/components.d.ts +10 -111
  4. package/lib/components.js +1 -1
  5. package/lib/constants.js +2 -1
  6. package/lib/hooks.d.ts +108 -0
  7. package/lib/hooks.js +1 -0
  8. package/lib/index.css +808 -1
  9. package/lib/index.d.ts +5 -4
  10. package/lib/index.js +2 -1
  11. package/lib/modules.js +1 -1
  12. package/lib/pages.js +2 -1
  13. package/lib/services.js +1 -1
  14. package/lib/types.js +0 -1
  15. package/lib/utils.js +1 -1
  16. package/locale/context.js +1 -9
  17. package/locale/en_GB.js +1 -96
  18. package/locale/hooks.js +1 -29
  19. package/locale/index.js +1 -29
  20. package/locale/ja_JP.js +1 -96
  21. package/locale/ko_KR.js +1 -96
  22. package/locale/zh_CN.js +1 -96
  23. package/package.json +12 -6
  24. package/lib/chunk-3OYXD4UE.js +0 -1
  25. package/lib/chunk-4GULXGNG.js +0 -1
  26. package/lib/chunk-7NM3DK6A.js +0 -1
  27. package/lib/chunk-FXPGR372.js +0 -0
  28. package/lib/chunk-JIBSYGRB.js +0 -1
  29. package/lib/chunk-JTDKSGJR.js +0 -1
  30. package/lib/chunk-K5HXGCZ4.js +0 -1
  31. package/lib/chunk-LRMME3YZ.js +0 -2
  32. package/lib/chunk-OLM4QNJB.js +0 -1
  33. package/lib/chunk-P5SX5RW3.js +0 -1
  34. package/lib/chunk-RITI5HRV.js +0 -1
  35. package/lib/chunk-TRRCT3ST.js +0 -1
  36. package/lib/chunk-TYDTFWYK.js +0 -1
  37. package/lib/chunk-WHOTHZUW.js +0 -1
  38. package/lib/chunk-X6ZI7RL7.js +0 -1
  39. package/lib/chunk-XQERUQGQ.js +0 -1
  40. package/lib/chunk-XWIQENHQ.js +0 -2
  41. package/lib/components.js.map +0 -1
  42. package/lib/constants.js.map +0 -1
  43. package/lib/createMenuItem-HUQG2HQY.js +0 -1
  44. package/lib/index.css.map +0 -1
  45. package/lib/index.js.map +0 -1
  46. package/lib/menuItemList-AS6ZDOTZ.js +0 -1
  47. package/lib/modules.js.map +0 -1
  48. package/lib/pages.js.map +0 -1
  49. package/lib/roleDetail-PFVKUPYB.js +0 -1
  50. package/lib/roleList-AHH4PNYW.js +0 -1
  51. package/lib/services.js.map +0 -1
  52. package/lib/types.js.map +0 -1
  53. package/lib/updateMenuItem-7SUIOBXS.js +0 -1
  54. package/lib/userDetail-JJNDBV5T.js +0 -1
  55. package/lib/userList-KX3POGAU.js +0 -1
  56. package/lib/utils.js.map +0 -1
  57. package/locale/chunk-GHHHKGNN.js +0 -1
  58. package/locale/context.js.map +0 -1
  59. package/locale/en_GB.js.map +0 -1
  60. package/locale/hooks.js.map +0 -1
  61. package/locale/index.js.map +0 -1
  62. package/locale/ja_JP.js.map +0 -1
  63. package/locale/ko_KR.js.map +0 -1
  64. package/locale/zh_CN.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # react-toolkits
2
2
 
3
+ ## 2.22.11
4
+
5
+ ### Patch Changes
6
+
7
+ - dc31008: 优化InfiniteList组件,统一使用filters替代formValue,重构请求参数构建逻辑,增强代码可读性。同时引入默认payload以稳定状态管理,简化实例注册和更新流程。
8
+
9
+ ## 2.22.10
10
+
11
+ ### Patch Changes
12
+
13
+ - 426c6cb: 新增hooks子路径导出,重构相关组件,移除不再使用的drawer和modal组件,优化README文档以反映最新的结构和使用方式,提升代码可读性和用户体验。
14
+
3
15
  ## 2.22.9
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -66,7 +66,8 @@ root.render(
66
66
 
67
67
  ## 子路径导出(推荐)
68
68
 
69
- - `react-toolkits/components`:组件与 Hooks(如 `Layout`、`ToolkitsProvider`、`useFormDrawer`、`InfiniteList`)
69
+ - `react-toolkits/components`:组件与 Hooks(如 `Layout`、`ToolkitsProvider`、`InfiniteList`)
70
+ - `react-toolkits/hooks`:表单弹层 Hooks(如 `useFormDrawer`、`useFormModal`)
70
71
  - `react-toolkits/pages`:内置页面与路由片段(如 `permissionRoutes`、`menuRoutes`、`SignIn`)
71
72
  - `react-toolkits/services`:请求相关 Hooks(如 `usePermission`、`useMenuList`、`useGames`)
72
73
  - `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`PermissionVersion`)
@@ -77,7 +78,8 @@ root.render(
77
78
  示例:
78
79
 
79
80
  ```ts
80
- import { Layout, useFormDrawer } from 'react-toolkits/components'
81
+ import { Layout } from 'react-toolkits/components'
82
+ import { useFormDrawer } from 'react-toolkits/hooks'
81
83
  import { permissionRoutes } from 'react-toolkits/pages'
82
84
  import { usePermission } from 'react-toolkits/services'
83
85
  import { APP_ID_HEADER } from 'react-toolkits/constants'
@@ -132,6 +134,7 @@ const { t } = useTranslation()
132
134
  ```
133
135
  src/
134
136
  components/ // 组件与 Hooks(以 react-toolkits/components 导出)
137
+ hooks/ // 表单弹层 Hooks(以 react-toolkits/hooks 导出)
135
138
  features/ // 特性模块(权限/菜单等:hooks/组件/服务聚合)
136
139
  pages/ // 内置页面与路由片段
137
140
  services/ // 数据服务 hooks(依赖 libs/ky 与全局上下文)
@@ -189,18 +192,29 @@ export default function LogList() {
189
192
 
190
193
  ```tsx
191
194
  import { Button } from 'antd'
192
- import { useFormDrawer } from 'react-toolkits/components'
195
+ import { useFormDrawer } from 'react-toolkits/hooks'
193
196
 
194
197
  export default function CreateUser() {
195
198
  const { show, drawer } = useFormDrawer({
196
199
  title: '新建用户',
197
- onSubmit: async values => {
200
+ onConfirm: async values => {
198
201
  await fetch('/api/users', { method: 'POST', body: JSON.stringify(values) })
199
202
  },
200
- schema: [
201
- { name: 'name', label: '姓名', type: 'input' },
202
- { name: 'role', label: '角色', type: 'select', options: ['admin', 'user'] },
203
- ],
203
+ content: (
204
+ <>
205
+ <Form.Item name="name" label="姓名" rules={[{ required: true }]}>
206
+ <Input />
207
+ </Form.Item>
208
+ <Form.Item name="role" label="角色" rules={[{ required: true }]}>
209
+ <Select
210
+ options={[
211
+ { value: 'admin', label: '管理员' },
212
+ { value: 'user', label: '用户' },
213
+ ]}
214
+ />
215
+ </Form.Item>
216
+ </>
217
+ ),
204
218
  })
205
219
 
206
220
  return (
@@ -212,6 +226,44 @@ export default function CreateUser() {
212
226
  }
213
227
  ```
214
228
 
229
+ ### 表单弹层(`useFormModal`)
230
+
231
+ ```tsx
232
+ import { Button, Form, Input, Select } from 'antd'
233
+ import { useFormModal } from 'react-toolkits/hooks'
234
+
235
+ export default function EditUser() {
236
+ const { show, modal } = useFormModal({
237
+ title: '编辑用户',
238
+ onConfirm: async values => {
239
+ await fetch('/api/users', { method: 'PUT', body: JSON.stringify(values) })
240
+ },
241
+ content: (
242
+ <>
243
+ <Form.Item name="name" label="姓名" rules={[{ required: true }]}>
244
+ <Input />
245
+ </Form.Item>
246
+ <Form.Item name="role" label="角色" rules={[{ required: true }]}>
247
+ <Select
248
+ options={[
249
+ { value: 'admin', label: '管理员' },
250
+ { value: 'user', label: '用户' },
251
+ ]}
252
+ />
253
+ </Form.Item>
254
+ </>
255
+ ),
256
+ })
257
+
258
+ return (
259
+ <>
260
+ <Button onClick={() => show({ initialValues: { name: 'John', role: 'user' } })}>编辑</Button>
261
+ {modal}
262
+ </>
263
+ )
264
+ }
265
+ ```
266
+
215
267
  ### 服务层 Hooks(`react-toolkits/services`)
216
268
 
217
269
  ```tsx
@@ -257,13 +309,14 @@ export default function FetchWithKy() {
257
309
  过去:
258
310
 
259
311
  ```ts
260
- import { ToolkitsProvider, Layout } from 'react-toolkits'
312
+ import { ToolkitsProvider, Layout, useFormDrawer } from 'react-toolkits'
261
313
  ```
262
314
 
263
315
  现在(推荐):
264
316
 
265
317
  ```ts
266
318
  import { ToolkitsProvider, Layout } from 'react-toolkits/components'
319
+ import { useFormDrawer, useFormModal } from 'react-toolkits/hooks'
267
320
  import { permissionRoutes } from 'react-toolkits/pages'
268
321
  import { usePermission } from 'react-toolkits/services'
269
322
  ```
@@ -301,7 +354,7 @@ pnpm -C packages/react-toolkits build
301
354
  pnpm -C packages/react-toolkits dev
302
355
  ```
303
356
 
304
- 构建将产出多入口:`lib/index.js`、`lib/components.js`、`lib/pages.js`、`lib/services.js`、`lib/types.js`、`lib/utils.js`,以及 `locale/*`。
357
+ 构建将产出多入口:`lib/index.js`、`lib/components.js`、`lib/hooks.js`、`lib/pages.js`、`lib/services.js`、`lib/types.js`、`lib/utils.js`,以及 `locale/*`。
305
358
 
306
359
  提示:发布前请确保示例应用验证通过,并更新 `CHANGELOG.md` 描述变更与迁移说明。
307
360
 
@@ -1,71 +1,17 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { DrawerProps, Button, FormProps, FormInstance, MenuProps, SelectProps, ModalProps, ButtonProps } from 'antd';
3
1
  import * as react from 'react';
4
- import { ReactNode, ComponentProps, FC, PropsWithChildren, Key, ReactElement, Ref, DetailedHTMLProps, ImgHTMLAttributes, ComponentType } from 'react';
5
- import { AnyObject } from 'antd/es/_util/type';
6
- import { RecursivePartial } from './types.js';
7
- import * as zustand from 'zustand';
2
+ import { FC, PropsWithChildren, Key, ReactNode, ReactElement, Ref, DetailedHTMLProps, ImgHTMLAttributes, ComponentType } from 'react';
8
3
  import { ParagraphProps } from 'antd/es/typography/Paragraph';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import { FormInstance, MenuProps, SelectProps, ButtonProps } from 'antd';
6
+ import { AnyObject } from 'antd/es/_util/type';
9
7
  import { TableProps } from 'antd/es/table';
8
+ import * as zustand from 'zustand';
10
9
  import { ItemType, SubMenuType, MenuItemGroupType, MenuItemType } from 'antd/es/menu/interface';
11
10
  import { Merge } from 'ts-essentials';
12
11
  import { G as Game } from './types-DVKf5poe.js';
13
12
  import { Options } from 'ky';
14
13
  import { PermissionVersion } from './constants.js';
15
14
 
16
- interface UseDrawerOperation {
17
- hide: () => void;
18
- }
19
- interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {
20
- content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode);
21
- onConfirm?: () => void | Promise<void>;
22
- afterOpen?: () => void | Promise<void>;
23
- afterClose?: () => void | Promise<void>;
24
- footer?: ReactNode | null;
25
- confirmText?: string;
26
- cancelText?: string;
27
- confirmButtonProps?: ComponentProps<typeof Button>;
28
- cancelButtonProps?: ComponentProps<typeof Button>;
29
- }
30
- declare function useDrawer(props: UseDrawerProps): {
31
- id: number;
32
- show: () => Promise<void>;
33
- hide: () => void;
34
- confirmLoading: boolean;
35
- drawer: react_jsx_runtime.JSX.Element;
36
- };
37
-
38
- interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
39
- formProps?: Omit<FormProps, 'form'>;
40
- form?: FormInstance<Values>;
41
- content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode);
42
- onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>;
43
- onSuccess?: () => void;
44
- afterClose?: (form: FormInstance<Values>) => void;
45
- }
46
- declare function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormDrawerProps<Values, ExtraValues>): {
47
- id: number;
48
- show: (options?: {
49
- initialValues?: RecursivePartial<Values>;
50
- extraValues?: ExtraValues;
51
- }) => void;
52
- hide: () => void;
53
- drawer: react_jsx_runtime.JSX.Element;
54
- };
55
-
56
- interface DrawerState {
57
- open: Map<number, boolean>;
58
- usedIds: Set<number>;
59
- isOpen: (uuid: number) => boolean;
60
- show: (uuid: number) => void;
61
- hide: (uuid: number) => void;
62
- hideAll: () => void;
63
- checkUniqueness: (uuid: number) => boolean;
64
- registerIds: (uuid: number) => boolean;
65
- cleanup: (uuid: number) => void;
66
- }
67
- declare const useDrawerStore: zustand.UseBoundStore<zustand.StoreApi<DrawerState>>;
68
-
69
15
  interface DynamicTagsProps {
70
16
  initialTags?: string[];
71
17
  addable?: boolean;
@@ -98,7 +44,7 @@ declare const Highlight: (props: HighlightProps) => react_jsx_runtime.JSX.Elemen
98
44
 
99
45
  interface InfiniteListPayload<Values = any> {
100
46
  page?: number;
101
- formValue?: Values;
47
+ filters?: Values;
102
48
  }
103
49
  interface InfiniteListRequestConfig<Values = any> {
104
50
  url: string;
@@ -129,8 +75,8 @@ interface InfiniteListRef<Item = any, Values = any, Data = any> {
129
75
  hasNextPage: boolean;
130
76
  isFetchingNextPage: boolean;
131
77
  }
132
- interface InfiniteListProps<Item, Values, Data> extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'>, Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {
133
- identifier: string;
78
+ interface InfiniteListProps<Item, Values, Data> extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>, Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {
79
+ identifier?: string;
134
80
  code?: string;
135
81
  form?: FormInstance<Values>;
136
82
  refreshInterval?: number;
@@ -144,7 +90,7 @@ interface InfiniteListProps<Item, Values, Data> extends Pick<TableProps<Item>, '
144
90
  footer?: (data: Data[] | undefined) => ReactNode;
145
91
  }
146
92
  declare const InfiniteList: <Item extends AnyObject = AnyObject, Values extends object | undefined = undefined, Data = any>(props: InfiniteListProps<Item, Values, Data> & {
147
- ref?: Ref<InfiniteListRef<Item, Data>>;
93
+ ref?: Ref<InfiniteListRef<Item, Values, Data>>;
148
94
  }) => ReactElement;
149
95
 
150
96
  type InfiniteQueryRefetchFunction = () => void | Promise<unknown>;
@@ -236,53 +182,6 @@ declare const Layout: FC<PropsWithChildren<LayoutProps>>;
236
182
  type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>;
237
183
  declare const Logo: FC<LogoProps>;
238
184
 
239
- interface UseModalOperation {
240
- hide: () => void;
241
- }
242
- interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {
243
- content?: ReactNode | ((operation: UseModalOperation) => ReactNode);
244
- onConfirm?: () => void | Promise<void>;
245
- afterOpen?: () => void | Promise<void>;
246
- afterClose?: () => void | Promise<void>;
247
- }
248
- declare function useModal(props: UseModalProps): {
249
- id: number;
250
- show: () => Promise<void>;
251
- hide: () => void;
252
- modal: react_jsx_runtime.JSX.Element;
253
- };
254
-
255
- interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
256
- formProps?: Omit<FormProps, 'form'>;
257
- form?: FormInstance<Values>;
258
- content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode);
259
- onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>;
260
- onSuccess?: () => void;
261
- afterClose?: (form: FormInstance<Values>) => void;
262
- }
263
- declare function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormModalProps<Values, ExtraValues>): {
264
- id: number;
265
- show: (options?: {
266
- initialValues?: RecursivePartial<Values>;
267
- extraValues?: ExtraValues;
268
- }) => void;
269
- hide: () => void;
270
- modal: react_jsx_runtime.JSX.Element;
271
- };
272
-
273
- interface ModalState {
274
- open: Map<number, boolean>;
275
- usedIds: Set<number>;
276
- isOpen: (uuid: number) => boolean;
277
- show: (uuid: number) => void;
278
- hide: (uuid: number) => void;
279
- hideAll: () => void;
280
- checkUniqueness: (uuid: number) => boolean;
281
- registerIds: (uuid: number) => boolean;
282
- cleanup: (uuid: number) => void;
283
- }
284
- declare const useModalStore: zustand.UseBoundStore<zustand.StoreApi<ModalState>>;
285
-
286
185
  interface PermissionButtonProps extends ButtonProps {
287
186
  code?: string | string[];
288
187
  showLoading?: boolean;
@@ -527,4 +426,4 @@ declare const withContext: (Component: ComponentType, providerProps: Omit<Toolki
527
426
 
528
427
  declare const UserWidget: FC;
529
428
 
530
- export { DynamicTags, type DynamicTagsProps, ExpandableParagraph, type ExpandableParagraphProps, FilterFormWrapper, type FilterFormWrapperProps, Game, Highlight, type HighlightProps, InfiniteList, InfiniteListAction, type InfiniteListPayload, type InfiniteListProps, type InfiniteListRef, type InfiniteListRequestConfig, Layout, type LayoutProps, Logo, type LogoProps, NavMenu, type NavMenuItem, PermissionButton, type PermissionButtonProps, QueryList, QueryListAction, type QueryListPayload, type QueryListProps, type QueryListRef, RequireGame, RequirePermission, type RequirePermissionProps, ToolkitsProvider, type ToolkitsProviderProps, type UseFormDrawerProps, type UseFormModalProps, UserWidget, useDrawer, useDrawerStore, useFormDrawer, useFormModal, useInfiniteListStore, useModal, useModalStore, useQueryListStore, useToolkitsStore, withContext };
429
+ export { DynamicTags, type DynamicTagsProps, ExpandableParagraph, type ExpandableParagraphProps, FilterFormWrapper, type FilterFormWrapperProps, Game, Highlight, type HighlightProps, InfiniteList, InfiniteListAction, type InfiniteListPayload, type InfiniteListProps, type InfiniteListRef, type InfiniteListRequestConfig, Layout, type LayoutProps, Logo, type LogoProps, NavMenu, type NavMenuItem, PermissionButton, type PermissionButtonProps, QueryList, QueryListAction, type QueryListPayload, type QueryListProps, type QueryListRef, RequireGame, RequirePermission, type RequirePermissionProps, ToolkitsProvider, type ToolkitsProviderProps, UserWidget, useInfiniteListStore, useQueryListStore, useToolkitsStore, withContext };
package/lib/components.js CHANGED
@@ -1 +1 @@
1
- export{d as DynamicTags,f as InfiniteList,j as Layout,g as NavMenu,h as RequireGame,k as RequirePermission,i as UserWidget,b as useDrawer,a as useDrawerStore,c as useFormDrawer,e as useInfiniteListStore}from'./chunk-K5HXGCZ4.js';export{a as Highlight}from'./chunk-RITI5HRV.js';export{d as PermissionButton,c as useFormModal,b as useModal,a as useModalStore}from'./chunk-3OYXD4UE.js';export{a as ExpandableParagraph,b as Logo}from'./chunk-JTDKSGJR.js';export{a as FilterFormWrapper,d as QueryList,c as QueryListAction,b as useQueryListStore}from'./chunk-4GULXGNG.js';import'./chunk-7NM3DK6A.js';import'./chunk-X6ZI7RL7.js';export{c as ToolkitsProvider,a as useToolkitsStore,b as withContext}from'./chunk-WHOTHZUW.js';import'./chunk-LRMME3YZ.js';import'./chunk-OLM4QNJB.js';
1
+ import {PlusOutlined,LogoutOutlined,UserOutlined,MenuUnfoldOutlined,MenuFoldOutlined}from'@ant-design/icons';import*as ge from'antd';import {Spin,Menu,Form,Result,Table,Button,App,theme,Space,Input,Tag,Typography,Empty,Dropdown,Divider,Tooltip,Select}from'antd';import {createContext,forwardRef,memo,useRef,useMemo,useCallback,useEffect,useContext,useState,useImperativeHandle,cloneElement,Fragment as Fragment$1,Suspense}from'react';import {isEqual,has,template,get}from'lodash-es';import {create,useStore,createStore}from'zustand';import {persist,createJSONStorage,devtools,subscribeWithSelector}from'zustand/middleware';import {jwtDecode}from'jwt-decode';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {flushSync}from'react-dom';import {createRoot}from'react-dom/client';import {useInfiniteQuery,useQuery,useQueryClient}from'@tanstack/react-query';import kr from'ky';import {Link,useLocation,useNavigate}from'react-router-dom';import Nn from'./logo-L6MFCL6M.png';var Xe={getItem:e=>sessionStorage.getItem(e)||localStorage.getItem(e),setItem:(e,r)=>{sessionStorage.setItem(e,r),localStorage.setItem(e,r);},removeItem(e){sessionStorage.removeItem(e),localStorage.removeItem(e);}};var ae="App-ID";var _t={global:{noEntitlement:"No permission, please contact the administrator.",name:"Name",creationTime:"Creation Time",operation:"Operation",update:"Update",edit:"Edit",delete:"Delete",selectAll:"Select All",game:"Game",user:"User",role:"Role",username:"Username",password:"Password",label:"Label",method:"Method",route:"Route",request:"Request",response:"Response",add:"Add",signIn:"Sign In",projectGroup:"Project Group",view:"View"},SignIn:{title:"Sign In Method",thirdParty:"Third party sign in",signInWithIDass:"Sign in with IDass",unregistered:"You are not yet registered on the platform, please contact the administrator",welcome:"Welcome"},NotFound:{subTitle:"The page you visited does not exist",buttonText:"Return to homepage"},FilterFormWrapper:{confirmText:"Search",resetText:"Reset"},FormModal:{confirmText:"Confirm",cancelText:"Cancel"},GameSelect:{label:"Current Game",placeholder:"Please select a game"},RequireGame:{description:"Please select a game"},UserWidget:{signOutText:"Sign Out"},User:{createTitle:"Create User",createSuccessfully:"User created successfully",updateTitle:"Update User",updateSuccessfully:"User updated successfully",deleteTitle:"Delete User",deleteContent:"Are you sure you want to delete user <%= user %>?",deleteSuccessfully:"User deleted successfully"},Role:{createTitle:"Create Role",createSuccessfully:"Role created successfully",updateTitle:"Update Role",updateSuccessfully:"Role updated successfully",deleteTitle:"Delete Role",deleteContent:"Are you sure you want to delete role <%= role %>?",deleteSuccessfully:"Role deleted successfully"},PermissionList:{failedDescription:"Failed to get permission list",baseSectionTitle:"Platform Basic Permissions",gameSectionTitle:"Game Permissions",gameSectionDescription:"Please select a game first",gameSelectPlaceholder:"Please select a game first",removeText:"Remove",addText:"Add Game Permissions"},RoleDetail:{title:"Role Details"},InfiniteList:{loadingText:"Loading...",reachEndText:"You've reached the end",loadMoreText:"Load more"}},Ze=_t;var et=e=>({locale:Ze,gameApiV2:!1,isGlobal:!1,signInPath:"/sign_in",mainPagePath:"/",permissionVersion:"v1",setContext(r){e(t=>({...t,...r}));}});var tt=e=>({setGameId:r=>{e({gameId:r});}});var rt=(e,r)=>({getUser:()=>{let t=r().token;if(t)try{return jwtDecode(t)}catch{return null}return null},setToken:t=>e({token:t})});var nt=e=>createStore()(persist((...r)=>{let[,t,n]=r,o=()=>{t().setToken(""),n.persist.clearStorage();};return {...rt(...r),...tt(...r),...et(...r),clearToken:o,...e}},{name:"toolkits",storage:createJSONStorage(()=>Xe),partialize:r=>({token:r.token,gameId:r.gameId,collapsed:r.collapsed})}));var qe=createContext(null);function O(e){let r=useContext(qe);if(!r)throw new Error("Missing ToolkitsProvider in the tree");return useStore(r,e||(t=>t))}var st=e=>{let{children:r,...t}=e,n=useRef(),o=useContext(qe)?.getState();if(n.current||(n.current=nt({...o,...t})),!n.current.getState().signInPath)throw new Error('ToolkitsProvider: \u8BF7\u914D\u7F6E "signInPath"');return jsx(qe.Provider,{value:n.current,children:jsx(App,{children:r})})},Xt=(e,r)=>{let t=n=>jsx(st,{...r,children:jsx(e,{...n})});return t.displayName=`withContext(${e.displayName||e.name||"Component"})`,t},Zt=st;function E(){let e=O(t=>t.locale);return {t:useMemo(()=>(t,n)=>has(e,t)?template(get(e,t))(n):t,[e])}}var ar=e=>{let{initialTags:r,addable:t,removable:n,addCallback:o,removeCallback:a}=e,{t:s}=E(),{token:i}=theme.useToken(),[l,g]=useState([]),[u,P]=useState(!1),[b,F]=useState(""),[h,f]=useState(-1),[v,k]=useState(""),V=useRef(null),D=useRef(null);useEffect(()=>{g(r??[]);},[r]),useEffect(()=>{u&&V.current?.focus();},[u]),useEffect(()=>{D.current?.focus();},[b]);let d=async c=>{if(await a?.(c)){let R=l.filter(w=>w!==c);g(R);}},I=()=>{P(!0);},M=c=>{F(c.target.value);},q=async()=>{b&&l.indexOf(b)===-1&&await o?.(b)&&g([...l,b]),P(!1),F("");},p=c=>{k(c.target.value);},m=()=>{let c=[...l];c[h]=v,g(c),f(-1),F("");},y={width:78,verticalAlign:"top"},L={background:i.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:l.map((c,C)=>h===C?jsx(Input,{ref:D,size:"small",style:y,value:v,onChange:p,onBlur:m,onPressEnter:m},c):jsx(Tag,{closable:n,style:{userSelect:"none"},onClose:async R=>{R.preventDefault(),await d(c);},children:jsx("span",{onDoubleClick:R=>{C!==0&&(f(C),k(c),R.preventDefault());},children:c})},c))}),t&&(u?jsx(Input,{ref:V,type:"text",size:"small",style:y,value:b,onChange:M,onBlur:q,onPressEnter:q}):jsxs(Tag,{style:L,onClick:I,children:[jsx(PlusOutlined,{}),"\xA0",s("global.add")]}))]})},ir=ar;var ur=e=>{let{children:r,...t}=e,[n,o]=useState(!1);return jsx(Typography.Paragraph,{...t,className:"mb-0",ellipsis:{rows:2,expandable:"collapsible",expanded:n,onExpand:(a,s)=>{o(s.expanded);}},children:r})},pr=ur;var gr=e=>{let{extras:r,isConfirming:t,onConfirm:n,onReset:o,children:a,buttonsAlign:s="left",showReset:i}=e,{t:l}=E(),{token:{colorFillAlter:g,lineWidth:u,lineType:P,colorBorder:b,borderRadiusLG:F}}=theme.useToken();return jsx("div",{style:{maxWidth:"none",background:g,borderWidth:u,borderStyle:P,borderColor:b,borderRadius:F,padding:24,marginBottom:24},children:jsxs("div",{className:`flex ${s==="bottom"?"flex-col":"flex-row"}`,children:[jsx("div",{className:`${s==="left"?"flex-grow-0":"flex-1"}`,children:a}),jsx("div",{className:`${s==="bottom"?"text-end":"text-start"} ml-4`,children:jsxs(Space,{children:[jsx(Button,{type:"primary",disabled:t,onClick:n,children:l("FilterFormWrapper.confirmText")}),r?.map(f=>jsx(Fragment$1,{children:f.children},f.key)),i&&jsx(Button,{onClick:o,children:l("FilterFormWrapper.resetText")})]})})]})})},ye=gr;var xr=e=>{let r=/(<[^>]*>)/;return e.split(r).filter(t=>t!=="")};function Ir(e){let r=document.createElement("div"),t=createRoot(r);return new Promise(n=>{setTimeout(()=>{flushSync(()=>{t.render(e);}),n(r.innerHTML);});})}var Sr=e=>{let{texts:r,children:t}=e,[n,o]=useState("");return useEffect(()=>{Ir(t).then(a=>{let s=xr(a);for(let i of r)for(let l=0;l<s.length;l++)s[l]=s[l].replace(String(i),`<span style='color: #DC143C;'>${i}</span>`);o(s.join(""));});},[t,r]),jsx("div",{dangerouslySetInnerHTML:{__html:n}})},vr=Sr;var Ge=[0,1,200],Le={OK:200,UNAUTHORIZED:401,FORBIDDEN:403,UNREGISTERED:412},Er=3e4;var mt=e=>!e||typeof e!="object"?"Unknown error":e.msg||e.message||e.error||"Unknown error",Fr=e=>{let{value:r,allowedCodes:t}=e;return r==null||typeof r!="number"?!1:t.includes(r)},Dr=(e,r)=>{if(r<Le.OK||r>=300)return !1;if(!e||typeof e!="object")return !0;let t=[{field:"code",value:e.code,allowedCodes:Ge},{field:"status",value:e.status,allowedCodes:Ge},{field:"errno",value:e.errno,allowedCodes:Ge}];return t.some(o=>o.value!==void 0&&o.value!==null)?t.every(o=>o.value===void 0||o.value===null||Fr(o)):!0},Or=async(e,r)=>{switch(r){case"blob":return e.blob();case"text":return e.text();case"arrayBuffer":return e.arrayBuffer();case"formData":return e.formData();case"json":default:return e.json()}},j=e=>{let{notification:r}=App.useApp(),t=O(),{token:n,isGlobal:o,gameId:a,permissionVersion:s,signInPath:i,clearToken:l}=t,g=()=>{l(),i&&(window.location.href=i);},u=()=>{if(l(),i){let p=new URL(i,window.location.origin);p.searchParams.set("unregistered","true"),window.location.href=p.toString();}},P=()=>{r.error({message:"\u8BBF\u95EE\u88AB\u7981\u6B62",description:"\u60A8\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6B64\u8D44\u6E90\u3002"});},b=p=>async(m,y,L)=>{if(p==="blob"||p==="arrayBuffer"||p==="text"||p==="formData")return L;let c;try{c=await L.clone().json();}catch{return L}if(Dr(c,L.status)){let w=c.data!==void 0?c.data:c;return new Response(JSON.stringify(w),{status:L.status,statusText:L.statusText,headers:L.headers})}let C=mt(c);r.error({message:"Request failed",description:C});let R=new Error(C);throw R.response=L,R.data=c,R},F=(p,m)=>{switch(p){case Le.UNAUTHORIZED:g();break;case Le.UNREGISTERED:u();break;case Le.FORBIDDEN:P();break;default:{let y=mt(m)||`HTTP ${p} Error`;r.error({message:"Request failed",description:y});break}}},h=useMemo(()=>kr.create({prefixUrl:e,retry:0,timeout:Er,headers:{Accept:"application/json","Content-Type":"application/json"},hooks:{beforeRequest:[m=>{n&&m.headers.set("Authorization",`Bearer ${n}`),!m.headers.has(ae)&&s!=="v1"&&(o||!a?m.headers.set(ae,"global"):m.headers.set(ae,encodeURIComponent(String(a))));}],beforeError:[async m=>{let{response:y}=m;if(y){let L=y.status,c;try{let C=y.headers.get("content-type")||"";(C.includes("application/json")||C.startsWith("text/"))&&(c=await y.clone().json());}catch{}F(L,c);}else r.error({message:"Network Error",description:m.message||"Network request failed"});return m}]}}),[e,n,o,a,s]),f=async(p,m,y,L)=>{let{responseType:c,...C}=L||{},R={...C,hooks:{...C.hooks,afterResponse:[...C.hooks?.afterResponse||[],b(c)]}},w;return y?w=await h(m,{method:p,json:y,...R}):w=await h(m,{method:p,...R}),Or(w,c)};return {get:(p,m)=>f("GET",p,void 0,m),post:(p,m,y)=>f("POST",p,m,y),put:(p,m,y)=>f("PUT",p,m,y),delete:(p,m)=>f("DELETE",p,void 0,m),patch:(p,m,y)=>f("PATCH",p,m,y),options:(p,m)=>f("OPTIONS",p,void 0,m),head:(p,m)=>f("HEAD",p,void 0,m),request:p=>{let{url:m,...y}=p;return f(y.method||"GET",m,void 0,y)},instance:h}};var Qe={permissions:{check:(e,r)=>["permissions","check",e,r],allPermissions:["permissions","all"],allPermissionsV2:["permissions","allV2"]},users:{all:["users"],detail:e=>["users","detail",e],create:["users","create"],update:["users","update"],delete:["users","delete"]},roles:{all:["roles"],detail:(e,r)=>["roles","detail",e,r],create:e=>["roles","create",e],update:e=>["roles","update",e],delete:["roles","delete"]},menus:{all:["menus"],navbar:e=>["menus","navbar",e],detail:e=>["menus","detail",e],create:["menus","create"],update:["menus","update"],delete:["menus","delete"]},enums:{gameGroups:["enums","gameGroups"],gameIds:e=>["enums","gameIds",e]}};function z(e,r){let t=j(),{permissionVersion:n}=O(),o=n!=="v1"?"/api/usystem/user/checkV2":"/api/usystem/user/check",a=typeof e<"u"?typeof e=="string"?[e]:e:[],s=n!=="v1"?"v2":"v1",{data:i,...l}=useQuery({queryKey:a.length>0?Qe.permissions.check(a,s):["permissions","disabled"],queryFn:()=>t.post(o,{json:{permissions:a},...r}),enabled:a.length>0}),g=!0;return typeof e=="string"?g=i?.has_all?!0:i?.[e]??!1:Array.isArray(e)&&e.length>0&&(g=a.reduce((u,P)=>(u[P]=i?.has_all?!0:i?.[P]??!1,u),{})),{...l,data:g}}var Ce=()=>{let{gameApiV2:e,permissionVersion:r}=O(),t=j(),n=r!=="v1"?e?"/api/game/list":"/api/usystem/game/all":null;return useQuery({queryKey:Qe.enums.gameGroups,queryFn:async()=>{if(!n)return [];let o={headers:{[ae]:"global"}};return e?(await t.get(n,o))?.list??[]:await t.get(n,o)??[]},enabled:!!n,staleTime:1/0})};var gt=Object.freeze({page:0,filters:Object.freeze({})}),Vr=()=>create()(devtools(subscribeWithSelector((e,r)=>({instances:new Map,registerInstance(t,n,o,a,s){e(i=>{let l=i.instances.get(t);if(l){if(l.refetch!==a||l.fetchNextPage!==s){let P={...l,refetch:a,fetchNextPage:s},b=new Map(i.instances);return b.set(t,P),{instances:b}}return i}let g={id:t,url:n,queryKey:o,payload:gt,refetch:a,fetchNextPage:s},u=new Map(i.instances);return u.set(t,g),{instances:u}});},unregisterInstance(t){e(n=>{let o=new Map(n.instances);return o.delete(t)?{instances:o}:n});},updatePayload(t,n){e(o=>{let a=o.instances.get(t);if(!a)return o;let s={...a.payload,...n};if(!isEqual(a.payload,s)){let i={...a,payload:s},l=new Map(o.instances);return l.set(t,i),{instances:l}}return o});},getPayload(t){return r().instances.get(t)?.payload??gt},async refetch(t,n){let o=r().instances.get(t);if(!o)return;let a=!1;if(n){let s=o.payload,i={...s,...n};isEqual(s,i)||(r().updatePayload(t,n),a=!0);}if(!a)try{await o.refetch();}catch(s){throw s}},async fetchNextPage(t){let n=r().instances.get(t);if(n)try{await n.fetchNextPage();}catch(o){throw o}},getInstance(t){return r().instances.get(t)},getAllInstances(){return Array.from(r().instances.values())}})),{name:"infinite-list-store"})),qr=Vr(),G=qr;var zr=5*60*1e3,$r=30*1e3,Yr={display:"flex",justifyContent:"center",alignItems:"center",height:300},Jr=0,Xr=()=>`infiniteList_${Date.now()}_${++Jr}`,Zr=(e,r)=>{let n={refreshInterval:0,initialPageParam:0,...e,dataAdapter:{...{items:T=>T?T.flatMap(S=>S?.list||S||[]):[],hasMore:T=>{if(!T)return !1;let S=T;return S?.hasMore||S?.has_more||!1},nextPageParam:(T,S,B)=>(_=>{if(!_)return !1;let X=_;return X?.hasMore||X?.has_more||!1})(T)?S.length:void 0},...e.dataAdapter}},{identifier:o,code:a,buttonsAlign:s,showReset:i,refreshInterval:l,request:g,tableExtra:u,renderForm:P,afterSuccess:b,afterError:F,dataAdapter:h,initialPageParam:f,footer:v,form:k,...V}=n,{t:D}=E(),[d]=Form.useForm(k),[I,M]=useState(!1),q=useRef(!1),p=useRef(3),m=j(),{data:y,isLoading:L}=z(a),c=useMemo(()=>o||Xr(),[o]),C=G(T=>T.getPayload(c)),R=useMemo(()=>d,[d]),{url:w,method:$="GET",body:K,params:Pe,headers:te,cacheTime:re=zr,staleTime:Me=$r}=g,ue=useMemo(()=>typeof te=="function"?te(R):te,[te,R]),pe=useMemo(()=>["infiniteList",w,c,y,I,C,ue],[w,c,y,I,C,ue]),{data:ne,fetchNextPage:de,hasNextPage:Te,isFetchingNextPage:Y,refetch:Ne,isFetching:be}=useInfiniteQuery({queryKey:pe,queryFn:async({pageParam:T=f})=>{try{let S=C,B=typeof Pe=="function"?Pe(S,T):Pe,J=typeof K=="function"?K(S,T):K,_={method:$,searchParams:B,headers:ue};J&&(J instanceof FormData?_.body=J:_.json=J);let X=await m.request({url:w,..._});return q.current=!0,b?.(p.current,R,[X]),X}catch(S){let B=S instanceof Error?S:new Error(String(S));throw F?.(B,p.current,R),B}},initialPageParam:f,getNextPageParam:(T,S)=>h?.nextPageParam?.(T,S,f),enabled:y&&I,retry:(T,S)=>!(T>=3||S?.message?.includes("401")),retryDelay:T=>Math.min(1e3*2**T,3e4),refetchOnWindowFocus:!1,refetchInterval:q.current?l:0,gcTime:re,staleTime:Me});useEffect(()=>(G.getState().registerInstance(c,w,pe,Ne,de),()=>{G.getState().unregisterInstance(c);}),[c,w,pe,Ne,de]);let oe=h?.items?.(ne?.pages,R),se=Y,U=!Te,Ve=!oe||oe.length===0,xe=async()=>{p.current=0;let T=await d.getFieldsValue();try{await d.validateFields(),M(!0),G.getState().refetch(c,{page:0,filters:T});}catch{M(!1);}},Ie=()=>{p.current=2,de();},Se=async()=>{p.current=1;try{d.resetFields();let T=await d.getFieldsValue();G.getState().updatePayload(c,{page:0,filters:T}),await d.validateFields({validateOnly:!0}),G.getState().refetch(c);}catch{}};if(useEffect(()=>{setTimeout(()=>{y&&d.validateFields({validateOnly:!0}).then(T=>{M(!0),G.getState().updatePayload(c,{page:0,filters:T});}).catch(()=>{M(!1);});},300);},[y,d,c]),useImperativeHandle(r,()=>({data:ne?.pages,dataSource:oe,form:d,refetch:()=>G.getState().refetch(c),fetchNextPage:()=>G.getState().fetchNextPage(c),hasNextPage:!!Te,isFetchingNextPage:Y})),L)return jsx(Spin,{style:Yr});if(!y)return jsx(Result,{status:403,subTitle:D("global.noEntitlement")});let Q=v&&(()=>v(ne?.pages)),ve=()=>typeof u=="function"?u(R,ne?.pages):u,me=typeof P=="function"?jsx(ye,{showReset:i,buttonsAlign:s,isConfirming:be,onReset:Se,onConfirm:xe,children:cloneElement(P(d),{onKeyUp:T=>{T.key==="Enter"&&xe();}})}):jsx(Form,{form:d});return jsxs(Fragment,{children:[me,ve(),jsx("div",{style:{minHeight:"400px"},children:jsx(Table,{...V,dataSource:oe,loading:be,pagination:!1,footer:Q})}),!Ve&&jsx(Button,{block:!0,loading:se,type:"link",htmlType:"button",disabled:se||U,onClick:Ie,children:D(se?"InfiniteList.loadingText":U?"InfiniteList.reachEndText":"InfiniteList.loadMoreText")})]})},en=forwardRef(Zr),tn=en;var bt=create()(persist((e,r)=>({openKeys:[],setOpenKeys:t=>{let n=r();(n.openKeys.length!==t.length||!n.openKeys.every((o,a)=>o===t[a]))&&e({openKeys:t});},selectedKeys:[],setSelectedKeys:t=>{let n=r();(n.selectedKeys.length!==t.length||!n.selectedKeys.every((o,a)=>o===t[a]))&&e({selectedKeys:t});}}),{name:"nav",storage:createJSONStorage(()=>localStorage),partialize:e=>({openKeys:e.openKeys,selectedKeys:e.selectedKeys}),skipHydration:!1,version:1}));var xt=memo(({to:e,children:r})=>jsx(Link,{to:e,children:r}));xt.displayName="MemoizedLink";function we(e){let r=[];if(e)for(let t=0;t<e.length;t++)if(e[t]===null||e[t].type==="divider")r[t]=e[t];else if(e[t].children){let{children:n,...o}=e[t];r[t]={...o,children:we(n)};}else {let{route:n,label:o,...a}=e[t],s=n?jsx(xt,{to:n,children:o}):o;r[t]={...a,label:s};}return r}function Ee(e,r=[],t=[]){for(let n of e){let o=n?.children;if(Array.isArray(o)){let a=n.type!=="group"&&n.key?[...t,n.key]:t;Ee(o,r,a);}else n&&r.push(Object.assign(n,{keypath:t}));}return r}var gn=memo(function(r){let{items:t=[],theme:n,loading:o}=r,a=useLocation(),s=useRef(),i=useRef(),l=useMemo(()=>s.current===t?s.current?Ee(s.current):[]:(s.current=t,Ee(t)),[t]),g=useMemo(()=>s.current===t?s.current?we(s.current):[]:we(t),[t]),{openKeys:u,selectedKeys:P,setOpenKeys:b,setSelectedKeys:F}=bt(),h=useCallback(f=>{let v=f.find(k=>!u.includes(k));if(v){let k=l.find(D=>D.key===v),V=k?.keypath?[...k.keypath,v]:[v];b(V);}else b(f);},[l,u,b]);return useEffect(()=>{if(i.current===a.pathname)return;i.current=a.pathname;let f=l.find(v=>a.pathname===v.route);if(f){let v=f.key,k=f.keypath;(P[0]!==v||!u.every((V,D)=>V===k[D]))&&(F([v]),b(k));}},[l,a.pathname,P,u,F,b]),o?jsx("div",{className:"flex justify-center items-center",style:{height:"calc(100vh - 64px)"},children:jsx(Spin,{})}):jsx(Menu,{theme:n,style:{borderRight:"none"},items:g,mode:"inline",openKeys:u,selectedKeys:P,onOpenChange:h})}),_e=gn;var {Spin:Tn}=ge,bn=({children:e})=>{let{permissionVersion:r,gameId:t,isGlobal:n}=O(s=>s),{isLoading:o}=Ce(),{t:a}=E();return o?jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:400},children:jsx(Tn,{})}):r==="v1"||n?e:t?jsx(Fragment$1,{children:e},t):jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:a("RequireGame.description")})},He=bn;var Ln=()=>{let{t:e}=E(),r=useNavigate(),{clearToken:t,getUser:n,signInPath:o}=O(u=>u),a=n(),s=()=>{t(),r(o);},i=u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),s());},l=u=>{(u.key==="Enter"||u.key===" ")&&u.preventDefault();},g=[{key:"1",icon:jsx(LogoutOutlined,{}),label:jsx("a",{role:"button",tabIndex:0,onClick:s,onKeyDown:i,children:e("UserWidget.signOutText")})}];return jsx("div",{children:jsx(Dropdown,{menu:{selectable:!0,items:g},placement:"bottomRight",children:jsx("a",{role:"button",tabIndex:0,onClick:u=>{u.preventDefault();},onKeyDown:l,children:jsxs(Space,{align:"center",children:[jsx("span",{children:a?.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})})},We=Ln;var{Text:On}=Typography,An=e=>{let{filter:r,options:t}=e,{t:n}=E(),{gameApiV2:o,gameId:a,setGameId:s}=O(h=>h),{data:i,isLoading:l}=Ce(),g=useQueryClient(),u=i?.filter(h=>r?.(h)??!0),P=typeof t=="function"?t(u):u?.map(h=>({label:h.name,value:o?h.game_id:h.id})),b=h=>{F(),s(h);},F=()=>{g.removeQueries({predicate:h=>{let f=h.queryKey;return !f.includes("/api/game/list")&&!f.includes("/api/usystem/game/all")}});};return useEffect(()=>{if(i&&i.length>0){let h=o?i[0].game_id:i[0].id;i.every(f=>String(f.game_id||f.id)!==String(a))&&s(h);}},[i]),jsxs(Space,{children:[jsx(On,{children:n("GameSelect.label")}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:a,placeholder:n("GameSelect.placeholder"),loading:l,style:{width:"200px"},options:P,onChange:b})]})},Ct=An;var Vn=e=>jsx("img",{src:Nn,alt:"logo",...e}),Be=Vn;var wt=memo(({title:e,subtitle:r,mainPagePath:t,collapsed:n})=>jsxs("div",{className:"px-6 py-2 font-bold relative bg-gradient-to-r from-white to-gray-50/30",style:{height:"auto",display:"flex",flexDirection:"column",justifyContent:"center",backdropFilter:"blur(4px)",WebkitBackdropFilter:"blur(4px)"},children:[jsxs("div",{className:`flex items-center w-full ${n?"justify-center":""}`,children:[jsx(Link,{to:t,className:"hover:opacity-80 transition-all duration-300 ease-out block rounded-lg p-1 hover:bg-white/50 hover:shadow-sm",style:{transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)",opacity:n?.8:1,transform:"translateX(0)"},children:jsx(Be,{width:36,style:{objectFit:"contain",display:"block",filter:"drop-shadow(0 1px 1px rgba(0, 0, 0, 0.05))",transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}})}),e&&jsx("div",{className:"ml-4 overflow-hidden min-w-0",style:{transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)",opacity:n?0:1,width:n?"0px":"auto",marginLeft:n?"0px":"16px",transform:n?"translateX(-8px)":"translateX(0)"},children:jsx(Link,{to:t,className:"text-xl leading-tight hover:text-blue-600 transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block bg-gradient-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent hover:from-blue-600 hover:to-blue-500",title:e,style:{letterSpacing:"0.02em",textShadow:"0 1px 2px rgba(0, 0, 0, 0.05)"},children:e})})]}),jsx("div",{className:"w-full mt-2 overflow-hidden",style:{height:r&&!n?"20px":"1px",transition:"height 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"},children:jsxs("div",{className:"flex items-center justify-center h-full w-full",children:[jsx("div",{className:"w-full border-t border-gray-200 absolute",style:{opacity:!r||n?1:0,transition:"opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}}),r&&jsxs("div",{className:"flex items-center w-full text-sm",style:{opacity:n?0:1,transform:n?"translateY(-3px)":"translateY(0)",transition:"all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"},children:[jsx("div",{className:"flex-1 border-t border-gray-200"}),jsx("span",{className:"px-3 text-gray-500 font-medium whitespace-nowrap",title:r,children:r}),jsx("div",{className:"flex-1 border-t border-gray-200"})]})]})})]}));wt.displayName="LayoutHeader";var Et=wt;var {Spin:Wn,theme:Bn}=ge,{Header:jn,Sider:zn,Content:$n}=ge.Layout,Yn=e=>{let{collapsible:r,isMenuLoading:t,items:n,headerExtra:o,children:a,navWidth:s,filter:i,gameSelectOptions:l,title:g,subtitle:u}=e,{token:{colorBgContainer:P,colorBorder:b}}=Bn.useToken(),{permissionVersion:F,navWidth:h,collapsible:f,mainPagePath:v,collapsed:k,setContext:V,isGlobal:D}=O(),[d,I]=useState(k),M=async()=>{I(!d),V({collapsed:!d});},q=r??f??!1;return jsxs(ge.Layout,{children:[jsxs(zn,{collapsible:q,theme:"light",trigger:null,collapsed:d,width:s??h,style:{height:"100vh",overflowX:"hidden",overflowY:"auto",borderRightWidth:1,borderRightStyle:"solid",borderRightColor:b,transition:"all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:[jsx(Et,{title:g,subtitle:u,mainPagePath:v,collapsed:d||!1}),jsx(_e,{items:n,loading:t})]}),jsxs(ge.Layout,{children:[jsx(jn,{style:{padding:"0 24px",background:P},children:jsxs("div",{className:"flex justify-between items-center h-full",children:[jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),className:"mr-6",children:[q&&jsx(Button,{type:"text",icon:d?jsx(MenuUnfoldOutlined,{}):jsx(MenuFoldOutlined,{}),style:{fontSize:"16px"},onClick:M}),F!=="v1"&&!D&&jsx(Ct,{filter:i,options:l}),o?.left?.map(p=>jsx("span",{children:p.children},p.key))]}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[o?.right?.map(p=>jsx("span",{children:p.children},p.key)),jsx(We,{})]})]})}),jsx($n,{style:{overflow:"auto",padding:"24px 16px",maxHeight:"calc(100vh - 64px)",transition:"margin-left 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:jsx(Suspense,{fallback:jsx(Wn,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"200px"}}),children:jsx(He,{children:a})})})]})]})},Jn=Yn;var Zn=e=>{let{children:r,code:t,showLoading:n,disabled:o,config:a,...s}=e,i=t?Array.isArray(t)?t:[t]:[],{data:l,isLoading:g}=z(i,a),{t:u}=E();return g?jsx(Button,{loading:n,disabled:!n,...s,children:r}):typeof l=="boolean"||l&&Object.values(l).some(Boolean)?jsx(Button,{disabled:o,...s,children:r}):jsx(Tooltip,{defaultOpen:!1,title:u("global.noEntitlement"),children:jsx(Button,{disabled:!0,...s,children:r})})},eo=Zn;var At=Object.freeze({page:1,size:10,filters:Object.freeze({})}),oo=()=>create()(devtools(subscribeWithSelector((e,r)=>({instances:new Map,registerInstance(t,n,o,a){e(s=>{let i=s.instances.get(t);if(i){if(i.refetch!==a){let u={...i,refetch:a},P=new Map(s.instances);return P.set(t,u),{instances:P}}return s}let l={id:t,url:n,queryKey:o,payload:At,refetch:a},g=new Map(s.instances);return g.set(t,l),{instances:g}});},unregisterInstance(t){e(n=>{let o=new Map(n.instances);return o.delete(t)?{instances:o}:n});},updatePayload(t,n){e(o=>{let a=o.instances.get(t);if(!a)return o;let s={...a.payload,...n};if(!isEqual(a.payload,s)){let i={...a,payload:s},l=new Map(o.instances);return l.set(t,i),{instances:l}}return o});},getPayload(t){return r().instances.get(t)?.payload??At},async refetch(t,n){let o=r().instances.get(t);if(!o)return;let a=!1;if(n){let s=o.payload,i={...s,...n};isEqual(s,i)||(r().updatePayload(t,n),a=!0);}if(!a)try{await o.refetch();}catch(s){throw s}},getInstance(t){return r().instances.get(t)},getAllInstances(){return Array.from(r().instances.values())}})),{name:"query-list-store"})),so=oo(),W=so;var Kt=(o=>(o[o.Confirm=0]="Confirm",o[o.Reset=1]="Reset",o[o.Jump=2]="Jump",o[o.Init=3]="Init",o))(Kt||{}),go=5*60*1e3,ho=30*1e3,Vt=["GET","HEAD"],qt=["POST","PUT","PATCH","DELETE"],Po={display:"flex",justifyContent:"center",alignItems:"center",height:300},To=0,bo=()=>`queryList_${Date.now()}_${++To}`,xo=(e,r)=>{let{t}=E(),{form:n,identifier:o,code:a,onePage:s,buttonsAlign:i,showReset:l,defaultSize:g=10,refreshInterval:u=0,tableExtra:P,renderForm:b,afterSuccess:F,afterError:h,footer:f,pageSizeOptions:v,request:k,dataAdapter:V,...D}=e,[d]=Form.useForm(n),I=useMemo(()=>o||bo(),[o]),M=useRef(3),{data:q,isLoading:p}=z(a),[m,y]=useState(!1),L=useRef(!1),c=useRef(!1),C=W(x=>x.getPayload(I)),R=j(),{page:w,size:$=g,filters:K}=C,te=typeof k=="function"?k({page:w,size:$,filters:K}):k,{url:re,method:Me="GET",body:ue,searchParams:pe,headers:ne,cacheTime:de=go,staleTime:Te=ho}=te,Y=Me.toUpperCase();let be=Vt.includes(Y),oe=qt.includes(Y),se={...K,...!s&&{page:w,size:$}},U=ue||(oe?se:void 0),Ve=pe||se,xe=ne,Ie=useRef(!1),Se=["queryList",re,I,w,$,K],{data:Q,isLoading:ve,refetch:me}=useQuery({queryKey:Se,queryFn:async()=>{try{let x={method:Y,searchParams:Ve,headers:xe};U&&!be&&(U instanceof FormData||typeof U=="string"?x.body=U:x.json=U);let N=await R.request({url:re,...x});return Ie.current=!0,F?.(M.current,d,N),N}catch(x){let N=x instanceof Error?x:new Error(String(x));throw h?.(N,M.current,d),N}},retry:(x,N)=>!(x>=3||N?.message?.includes("401")),retryDelay:x=>Math.min(1e3*2**x,3e4),refetchOnWindowFocus:!1,refetchInterval:Ie.current?u:0,gcTime:de,staleTime:Te,enabled:q&&m}),T=useMemo(()=>{let x=V,N={total:Q?.total,items:Q?.list};return typeof x=="function"?{...N,...x(Q)}:{...N,...x}},[V,Q]);useEffect(()=>(W.getState().registerInstance(I,re,Se,me),()=>{W.getState().unregisterInstance(I);}),[I,re]);let S=T.items,B=T.total,J=useMemo(()=>s?!1:{pageSizeOptions:v,showSizeChanger:!0,showQuickJumper:!0,current:w,pageSize:$,total:B,onChange:async(x,N)=>{M.current=2,W.getState().refetch(I,{page:x,size:N});}},[s,v,w,$,B,I]),_=useCallback(async()=>{M.current=0;try{await d.validateFields(),y(!0),W.getState().refetch(I,{page:1,filters:d.getFieldsValue()});}catch{y(!1);}},[d,I]),X=useCallback(async()=>{M.current=1,d.resetFields();try{await d.validateFields({validateOnly:!0}),y(!0),W.getState().refetch(I,{page:1,filters:d.getFieldsValue()});}catch{y(!1);}},[d,I]),Gt=typeof b=="function"?jsx(ye,{showReset:l,buttonsAlign:i,isConfirming:ve,onReset:X,onConfirm:_,children:cloneElement(b(d),{onKeyUp:x=>{x.key==="Enter"&&_();}})}):jsx(Form,{form:d}),Qt=typeof P=="function"?P(d,Q):P,Ut=f?()=>f(Q):void 0;return useEffect(()=>{if(!L.current||c.current)return;let x=d.getFieldsValue();K&&!isEqual(x,K)&&(c.current=!0,d.setFieldsValue(K),setTimeout(()=>{c.current=!1;},0));},[K,d]),useEffect(()=>{if(!q||L.current)return;let x=async()=>{try{d.resetFields();let Je=await d.validateFields({validateOnly:!0});W.getState().updatePayload(I,{page:1,filters:Je}),y(!0);}catch{y(!1);}finally{L.current=!0;}},N=requestAnimationFrame(()=>{Promise.resolve().then(x);});return ()=>{N&&cancelAnimationFrame(N);}},[q,I,d]),useImperativeHandle(r,()=>({data:Q,dataSource:S,form:d,refetch:me}),[Q,S,d,me]),p?jsx(Spin,{style:Po}):q?jsxs("div",{children:[Gt,Qt,jsx(Table,{...D,dataSource:S,loading:ve,pagination:J,footer:Ut})]}):jsx(Result,{status:403,subTitle:t("global.noEntitlement")})},Io=forwardRef(xo),So=Io;var Co=e=>{let{code:r,config:t,children:n}=e,{data:o,isLoading:a}=z(r,t),{t:s}=E();return a?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):o?jsx(Fragment,{children:n}):jsx(Result,{status:"403",subTitle:s("global.noEntitlement")})},ko=Co;export{ir as DynamicTags,pr as ExpandableParagraph,ye as FilterFormWrapper,vr as Highlight,tn as InfiniteList,Jn as Layout,Be as Logo,_e as NavMenu,eo as PermissionButton,So as QueryList,Kt as QueryListAction,He as RequireGame,ko as RequirePermission,Zt as ToolkitsProvider,We as UserWidget,G as useInfiniteListStore,W as useQueryListStore,O as useToolkitsStore,Xt as withContext};
package/lib/constants.js CHANGED
@@ -1 +1,2 @@
1
- export{b as APP_ID_HEADER,c as FRONTEND_ROUTE_PREFIX,d as PermissionVersion,a as SSO_URL,e as WILDCARD}from'./chunk-LRMME3YZ.js';
1
+ var c="https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1",o="App-ID",u="/console/",t=(p=>(p.V1="v1",p.V2="v2",p.V3="v3",p))(t||{}),n="*";
2
+ export{o as APP_ID_HEADER,u as FRONTEND_ROUTE_PREFIX,t as PermissionVersion,c as SSO_URL,n as WILDCARD};
package/lib/hooks.d.ts ADDED
@@ -0,0 +1,108 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { DrawerProps, Button, FormProps, FormInstance, ModalProps } from 'antd';
3
+ import { ReactNode, ComponentProps } from 'react';
4
+ import { AnyObject } from 'antd/es/_util/type';
5
+ import { RecursivePartial } from './types.js';
6
+ import * as zustand from 'zustand';
7
+
8
+ interface UseDrawerOperation {
9
+ hide: () => void;
10
+ }
11
+ interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {
12
+ content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode);
13
+ onConfirm?: () => void | Promise<void>;
14
+ afterOpen?: () => void | Promise<void>;
15
+ afterClose?: () => void | Promise<void>;
16
+ footer?: ReactNode | null;
17
+ confirmText?: string;
18
+ cancelText?: string;
19
+ confirmButtonProps?: ComponentProps<typeof Button>;
20
+ cancelButtonProps?: ComponentProps<typeof Button>;
21
+ }
22
+ declare function useDrawer(props: UseDrawerProps): {
23
+ id: number;
24
+ show: () => Promise<void>;
25
+ hide: () => void;
26
+ confirmLoading: boolean;
27
+ drawer: react_jsx_runtime.JSX.Element;
28
+ };
29
+
30
+ interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
31
+ formProps?: Omit<FormProps, 'form'>;
32
+ form?: FormInstance<Values>;
33
+ content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode);
34
+ onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>;
35
+ onSuccess?: () => void;
36
+ afterClose?: (form: FormInstance<Values>) => void;
37
+ }
38
+ declare function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormDrawerProps<Values, ExtraValues>): {
39
+ id: number;
40
+ show: (options?: {
41
+ initialValues?: RecursivePartial<Values>;
42
+ extraValues?: ExtraValues;
43
+ }) => void;
44
+ hide: () => void;
45
+ drawer: react_jsx_runtime.JSX.Element;
46
+ };
47
+
48
+ interface DrawerState {
49
+ open: Map<number, boolean>;
50
+ usedIds: Set<number>;
51
+ isOpen: (uuid: number) => boolean;
52
+ show: (uuid: number) => void;
53
+ hide: (uuid: number) => void;
54
+ hideAll: () => void;
55
+ checkUniqueness: (uuid: number) => boolean;
56
+ registerIds: (uuid: number) => boolean;
57
+ cleanup: (uuid: number) => void;
58
+ }
59
+ declare const useDrawerStore: zustand.UseBoundStore<zustand.StoreApi<DrawerState>>;
60
+
61
+ interface UseModalOperation {
62
+ hide: () => void;
63
+ }
64
+ interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {
65
+ content?: ReactNode | ((operation: UseModalOperation) => ReactNode);
66
+ onConfirm?: () => void | Promise<void>;
67
+ afterOpen?: () => void | Promise<void>;
68
+ afterClose?: () => void | Promise<void>;
69
+ }
70
+ declare function useModal(props: UseModalProps): {
71
+ id: number;
72
+ show: () => Promise<void>;
73
+ hide: () => void;
74
+ modal: react_jsx_runtime.JSX.Element;
75
+ };
76
+
77
+ interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = any> extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {
78
+ formProps?: Omit<FormProps, 'form'>;
79
+ form?: FormInstance<Values>;
80
+ content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode);
81
+ onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>;
82
+ onSuccess?: () => void;
83
+ afterClose?: (form: FormInstance<Values>) => void;
84
+ }
85
+ declare function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = any>(props: UseFormModalProps<Values, ExtraValues>): {
86
+ id: number;
87
+ show: (options?: {
88
+ initialValues?: RecursivePartial<Values>;
89
+ extraValues?: ExtraValues;
90
+ }) => void;
91
+ hide: () => void;
92
+ modal: react_jsx_runtime.JSX.Element;
93
+ };
94
+
95
+ interface ModalState {
96
+ open: Map<number, boolean>;
97
+ usedIds: Set<number>;
98
+ isOpen: (uuid: number) => boolean;
99
+ show: (uuid: number) => void;
100
+ hide: (uuid: number) => void;
101
+ hideAll: () => void;
102
+ checkUniqueness: (uuid: number) => boolean;
103
+ registerIds: (uuid: number) => boolean;
104
+ cleanup: (uuid: number) => void;
105
+ }
106
+ declare const useModalStore: zustand.UseBoundStore<zustand.StoreApi<ModalState>>;
107
+
108
+ export { type UseFormDrawerProps, type UseFormModalProps, useDrawer, useDrawerStore, useFormDrawer, useFormModal, useModal, useModalStore };
package/lib/hooks.js ADDED
@@ -0,0 +1 @@
1
+ import {Button,Drawer,Form,Modal}from'antd';import {useMemo,useEffect,useState,useCallback}from'react';import {create}from'zustand';import {jsxs,jsx}from'react/jsx-runtime';var _=0,v=()=>{let t=Date.now(),o=Math.floor(Math.random()*1e3),e=++_%1e3;return t*1e6+o*1e3+e};var F=create((t,o)=>({open:new Map,usedIds:new Set,isOpen:e=>o().open.get(e)??!1,show(e){t({open:new Map(o().open).set(e,!0)});},hide(e){t({open:new Map(o().open).set(e,!1)});},hideAll(){t({open:new Map});},checkUniqueness(e){let{usedIds:r}=o();return !r.has(e)},registerIds(e){let{usedIds:r}=o();return r.has(e)?!1:(t({usedIds:new Set(r).add(e)}),!0)},cleanup(e){let{open:r,usedIds:i}=o(),l=new Map(r),n=new Set(i);l.delete(e),n.delete(e),t({open:l,usedIds:n});}}));function O(t){let{content:o,onConfirm:e,afterOpen:r,afterClose:i,footer:l,confirmText:n="\u786E\u8BA4",cancelText:x="\u53D6\u6D88",confirmButtonProps:p,cancelButtonProps:P,...s}=t,d=useMemo(()=>v(),[]),{show:y,hide:u,isOpen:f,cleanup:h}=F();useEffect(()=>()=>{h(d);},[d,h]);let c=f(d),[a,m]=useState(!1),w=typeof o=="function",b=useCallback(async()=>{y(d),await r?.();},[d,y,r]),V=useCallback(()=>{u(d);},[d,u]),g=useCallback(async()=>{V(),await i?.();},[V,i]),A=useCallback(async()=>{try{m(!0),await e?.();}catch(B){throw B}finally{m(!1);}},[e]),N=l!==void 0?l:jsxs("div",{className:"flex gap-4 mx-4",children:[jsx(Button,{type:"primary",loading:a,...p,onClick:A,children:n}),jsx(Button,{...P,onClick:g,children:x})]}),k=jsx(Drawer,{...s,open:c,footer:N,onClose:g,children:w?o({hide:V}):o});return {id:d,show:b,hide:V,confirmLoading:a,drawer:k}}function K(t){let{content:o,form:e,formProps:r,onConfirm:i,onSuccess:l,afterClose:n,...x}=t,[p,P]=useState({}),[s]=Form.useForm();s=e||s;let d=typeof o=="function",{id:y,show:u,hide:f,drawer:h}=O({...x,content:a=>jsx(Form,{...r,form:s,children:d?o(p,a):o}),onConfirm:async()=>{try{let a=await s.validateFields();await i?.(a,p),l?.(),f();}catch(a){throw a}},afterClose:()=>{n?.(s);}}),c=useCallback(a=>{let{initialValues:m,extraValues:w}=a||{};w&&P(w),m&&s.setFieldsValue(m),u();},[s,u]);return {id:y,show:c,hide:f,drawer:h}}var S=create((t,o)=>({open:new Map,usedIds:new Set,isOpen:e=>o().open.get(e)??!1,show(e){t({open:new Map(o().open).set(e,!0)});},hide(e){t({open:new Map(o().open).set(e,!1)});},hideAll(){t({open:new Map});},checkUniqueness(e){let{usedIds:r}=o();return !r.has(e)},registerIds(e){let{usedIds:r}=o();return r.has(e)?!1:(t({usedIds:new Set(r).add(e)}),!0)},cleanup(e){let{open:r,usedIds:i}=o(),l=new Map(r),n=new Set(i);l.delete(e),n.delete(e),t({open:l,usedIds:n});}}));function D(t){let{content:o,onConfirm:e,afterOpen:r,afterClose:i,...l}=t,n=useMemo(()=>v(),[]),{show:x,hide:p,isOpen:P,cleanup:s}=S();useEffect(()=>()=>{s(n);},[n,s]);let d=P(n),[y,u]=useState(!1),f=typeof o=="function",h=useCallback(async()=>{x(n),await r?.();},[n,x,r]),c=useCallback(()=>{p(n);},[n,p]),a=useCallback(async()=>{c(),await i?.();},[c,i]),m=useCallback(async()=>{try{u(!0),await e?.(),c(),await i?.();}catch(b){throw b}finally{u(!1);}},[e,c,i]),w=jsx(Modal,{...l,open:d,confirmLoading:y,onOk:m,onCancel:a,children:f?o({hide:c}):o});return {id:n,show:h,hide:c,modal:w}}function te(t){let{content:o,form:e,formProps:r,onConfirm:i,onSuccess:l,afterClose:n,...x}=t,[p,P]=useState({}),[s]=Form.useForm();s=e||s;let d=typeof o=="function",{id:y,show:u,hide:f,modal:h}=D({...x,content:a=>jsx(Form,{...r,form:s,children:d?o(p,a):o}),onConfirm:async()=>{try{let a=await s.validateFields();await i?.(a,p),l?.(),f();}catch(a){throw a}},afterClose:()=>{n?.(s);}}),c=useCallback(a=>{let{initialValues:m,extraValues:w}=a||{};w&&P(w),m&&s.setFieldsValue(m),u();},[s,u]);return {id:y,show:c,hide:f,modal:h}}export{O as useDrawer,F as useDrawerStore,K as useFormDrawer,te as useFormModal,D as useModal,S as useModalStore};