react-toolkits 2.22.8 → 2.22.10

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 (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +350 -26
  3. package/lib/chunk-4GULXGNG.js +1 -0
  4. package/lib/chunk-7NM3DK6A.js +1 -0
  5. package/lib/chunk-FXPGR372.js +0 -0
  6. package/lib/chunk-HZHE6R72.js +1 -0
  7. package/lib/chunk-JIBSYGRB.js +1 -0
  8. package/lib/chunk-JLHCYGWL.js +1 -0
  9. package/lib/chunk-JTDKSGJR.js +1 -0
  10. package/lib/chunk-LRMME3YZ.js +2 -0
  11. package/lib/chunk-MSKNHKMD.js +1 -0
  12. package/lib/chunk-O7AQM3CB.js +1 -0
  13. package/lib/chunk-OLM4QNJB.js +1 -0
  14. package/lib/chunk-RITI5HRV.js +1 -0
  15. package/lib/chunk-SJK2ZPEL.js +1 -0
  16. package/lib/chunk-WHOTHZUW.js +1 -0
  17. package/lib/chunk-X6ZI7RL7.js +1 -0
  18. package/lib/chunk-XQERUQGQ.js +1 -0
  19. package/lib/chunk-XWIQENHQ.js +2 -0
  20. package/lib/chunk-YIJSACFM.js +1 -0
  21. package/lib/chunk-ZCPZYTPN.js +1 -0
  22. package/lib/components.d.ts +429 -0
  23. package/lib/components.js +1 -0
  24. package/lib/constants.d.ts +11 -0
  25. package/lib/constants.js +1 -0
  26. package/lib/createMenuItem-HUQG2HQY.js +1 -0
  27. package/lib/hooks.d.ts +108 -0
  28. package/lib/hooks.js +1 -0
  29. package/lib/index.d.ts +21 -789
  30. package/lib/index.js +1 -2
  31. package/lib/menuItemList-AS6ZDOTZ.js +1 -0
  32. package/lib/modules.d.ts +7 -0
  33. package/lib/modules.js +1 -0
  34. package/lib/pages.d.ts +20 -0
  35. package/lib/pages.js +1 -0
  36. package/lib/roleDetail-2QUBILZK.js +1 -0
  37. package/lib/roleList-KWWVOLWJ.js +1 -0
  38. package/lib/services.d.ts +196 -0
  39. package/lib/services.js +1 -0
  40. package/lib/types-DVKf5poe.d.ts +19 -0
  41. package/lib/types.d.ts +23 -0
  42. package/lib/types.js +1 -0
  43. package/lib/updateMenuItem-7SUIOBXS.js +1 -0
  44. package/lib/userDetail-TXGT2W7X.js +1 -0
  45. package/lib/userList-ELLBMK76.js +1 -0
  46. package/lib/utils.d.ts +6 -0
  47. package/lib/utils.js +1 -0
  48. package/locale/chunk-GHHHKGNN.js +1 -0
  49. package/locale/hooks.js +1 -1
  50. package/locale/index.js +1 -1
  51. package/package.json +35 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # react-toolkits
2
2
 
3
+ ## 2.22.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 426c6cb: 新增hooks子路径导出,重构相关组件,移除不再使用的drawer和modal组件,优化README文档以反映最新的结构和使用方式,提升代码可读性和用户体验。
8
+
9
+ ## 2.22.9
10
+
11
+ ### Patch Changes
12
+
13
+ - 92b3c0f: 新增多个子路径导出,优化包结构,提升Tree Shaking支持。同时更新README文档,增加特性描述和安装说明,确保用户更易于使用和理解。
14
+
3
15
  ## 2.22.8
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -1,44 +1,368 @@
1
1
  # React Toolkits
2
2
 
3
- ## Installation
3
+ 一套面向企业级应用的前端工具集,基于 React、Ant Design 与 TanStack Query。开箱即用的应用壳、权限/菜单、通用列表(分页/无限滚动)、抽屉/弹框表单与国际化支持,助你快速搭建一致、可维护的中后台应用。
4
+
5
+ ## 亮点特性
6
+
7
+ - 应用壳与导航:`Layout`、侧边菜单、面包屑、登录页、404
8
+ - 列表范式:`QueryList`(分页)、`InfiniteList`(无限滚动)
9
+ - 表单弹层:`useFormModal`、`useFormDrawer`
10
+ - 权限体系:`RequirePermission`、`PermissionButton`,以及权限/菜单路由片段
11
+ - 数据获取:内置 `useKy` 与服务层 hooks(如 `usePermission`、`useMenuList`、`useGames`)
12
+ - 子路径导出按域组织,Tree Shaking 友好
13
+
14
+ ## 安装与要求
4
15
 
5
16
  ```bash
6
- pnpm install react-toolkits
17
+ pnpm add react-toolkits
18
+ ```
19
+
20
+ 对等依赖(需由你的应用提供):
21
+
22
+ - react、react-dom:^18
23
+ - antd:^5
24
+ - react-router-dom:^6
25
+
26
+ 样式:
27
+
28
+ ```ts
29
+ import 'react-toolkits/style.css'
7
30
  ```
8
31
 
9
- ## Usage
32
+ ## 快速上手
10
33
 
11
34
  ```tsx
12
35
  import 'react-toolkits/style.css'
13
36
  import { createRoot } from 'react-dom/client'
14
- import { ReactToolkitsProvider } from 'react-toolkits'
15
- import type { NavMenuItem } from 'react-toolkits'
37
+ import { RouterProvider } from 'react-router-dom'
38
+ import { ToolkitsProvider } from 'react-toolkits/components'
39
+ import { PermissionVersion } from 'react-toolkits/constants'
16
40
 
17
- const container = document.getElementById('root') as HTMLElement
18
- const root = createRoot(container)
41
+ import router from './router'
19
42
 
20
- const items: NavMenuItem[] = []
43
+ const root = createRoot(document.getElementById('root') as HTMLElement)
21
44
 
22
45
  root.render(
23
- <ContextProvider title="React Web" menuItems={items}>
24
- <RouterProvider
25
- router={router}
26
- fallbackElement={
27
- <Spin
28
- style={{
29
- display: 'flex',
30
- justifyContent: 'center',
31
- alignItems: 'center',
32
- width: '100vw',
33
- height: '100vh',
34
- }}
35
- />
36
- }
37
- />
38
- </ContextProvider>,
46
+ <ToolkitsProvider
47
+ collapsible
48
+ gameApiV2
49
+ permissionVersion={PermissionVersion.V3}
50
+ signInPath="/sign_in"
51
+ mainPagePath="/"
52
+ >
53
+ <RouterProvider router={router} />
54
+ </ToolkitsProvider>,
39
55
  )
40
56
  ```
41
57
 
42
- ## TODO
58
+ ### 配置项(`ToolkitsProvider`)
59
+
60
+ - **signInPath**: 登录页路径(未鉴权时会跳转)
61
+ - **mainPagePath**: 登录后主页路径(鉴权通过时进入)
62
+ - **permissionVersion**: 权限版本,建议使用 `PermissionVersion.V3`
63
+ - **collapsible**: 侧边栏是否可折叠
64
+ - **gameApiV2**: 是否启用游戏相关 V2 接口适配(如不涉及可忽略)
65
+ - 其余高级配置见类型定义 `react-toolkits/components` 内导出的 Provider Props
66
+
67
+ ## 子路径导出(推荐)
68
+
69
+ - `react-toolkits/components`:组件与 Hooks(如 `Layout`、`ToolkitsProvider`、`InfiniteList`)
70
+ - `react-toolkits/hooks`:表单弹层 Hooks(如 `useFormDrawer`、`useFormModal`)
71
+ - `react-toolkits/pages`:内置页面与路由片段(如 `permissionRoutes`、`menuRoutes`、`SignIn`)
72
+ - `react-toolkits/services`:请求相关 Hooks(如 `usePermission`、`useMenuList`、`useGames`)
73
+ - `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`PermissionVersion`)
74
+ - `react-toolkits/types`:公共类型
75
+ - `react-toolkits/utils`:工具函数
76
+ - `react-toolkits/locale` 与 `react-toolkits/locale/*`:国际化资源与工具
77
+
78
+ 示例:
79
+
80
+ ```ts
81
+ import { Layout } from 'react-toolkits/components'
82
+ import { useFormDrawer } from 'react-toolkits/hooks'
83
+ import { permissionRoutes } from 'react-toolkits/pages'
84
+ import { usePermission } from 'react-toolkits/services'
85
+ import { APP_ID_HEADER } from 'react-toolkits/constants'
86
+ import type { NavMenuItem } from 'react-toolkits/types'
87
+ ```
88
+
89
+ ### 权限与菜单集成示例
90
+
91
+ ```tsx
92
+ import { createBrowserRouter } from 'react-router-dom'
93
+ import { Layout } from 'react-toolkits/components'
94
+ import { permissionRoutes, menuRoutes, SignIn } from 'react-toolkits/pages'
95
+
96
+ const router = createBrowserRouter([
97
+ {
98
+ path: '/',
99
+ element: <Layout />, // 自动接入面包屑、侧边栏与鉴权
100
+ children: [
101
+ // 权限/菜单内置片段(可按需选择)
102
+ ...permissionRoutes,
103
+ ...menuRoutes,
104
+ ],
105
+ },
106
+ { path: '/sign_in', element: <SignIn /> },
107
+ ])
108
+
109
+ export default router
110
+ ```
111
+
112
+ ## 国际化(Locale)
113
+
114
+ 内置基础语言包与上下文工具,也可与第三方 i18n 方案并存:
115
+
116
+ ```ts
117
+ import { useTranslation } from 'react-toolkits/locale'
118
+ import zhCN from 'react-toolkits/locale/zh_CN'
119
+ import enGB from 'react-toolkits/locale/en_GB'
120
+
121
+ const { t } = useTranslation()
122
+ // t('FilterFormWrapper.confirmText') → "查询"
123
+ ```
124
+
125
+ 如果你已使用 `react-i18next` 等,可以仅复用本包的页面/菜单能力。
126
+
127
+ ### 自定义菜单文案
128
+
129
+ - 使用 `react-toolkits/locale` 的 `useTranslation` 配合内置 key,或在你的 i18n 方案中映射同名 key
130
+ - 可按需引入 `react-toolkits/locale/zh_CN`、`en_GB` 等作为基础词条
131
+
132
+ ## 目录结构(概览)
133
+
134
+ ```
135
+ src/
136
+ components/ // 组件与 Hooks(以 react-toolkits/components 导出)
137
+ hooks/ // 表单弹层 Hooks(以 react-toolkits/hooks 导出)
138
+ features/ // 特性模块(权限/菜单等:hooks/组件/服务聚合)
139
+ pages/ // 内置页面与路由片段
140
+ services/ // 数据服务 hooks(依赖 libs/ky 与全局上下文)
141
+ constants/ // 常量与枚举
142
+ utils/ // 工具函数
143
+ locale/ // 国际化上下文与语言包
144
+ ```
145
+
146
+ ## 常用用法示例
147
+
148
+ ### 列表(分页 `QueryList`)
149
+
150
+ ```tsx
151
+ import { QueryList } from 'react-toolkits/components'
152
+
153
+ export default function UserTable() {
154
+ return (
155
+ <QueryList
156
+ queryKey={['users']}
157
+ queryFn={async ({ page, pageSize }) => {
158
+ // 返回 { list: T[]; total: number }
159
+ const res = await fetch(`/api/users?page=${page}&pageSize=${pageSize}`)
160
+ return res.json()
161
+ }}
162
+ columns={[
163
+ { title: 'ID', dataIndex: 'id' },
164
+ { title: 'Name', dataIndex: 'name' },
165
+ ]}
166
+ />
167
+ )
168
+ }
169
+ ```
170
+
171
+ ### 列表(无限滚动 `InfiniteList`)
172
+
173
+ ```tsx
174
+ import { InfiniteList } from 'react-toolkits/components'
175
+
176
+ export default function LogList() {
177
+ return (
178
+ <InfiniteList
179
+ queryKey={['logs']}
180
+ queryFn={async ({ pageParam = 1 }) => {
181
+ // 返回 { list: T[]; nextPage?: number }
182
+ const res = await fetch(`/api/logs?page=${pageParam}`)
183
+ return res.json()
184
+ }}
185
+ itemRender={item => <div>{item.message}</div>}
186
+ />
187
+ )
188
+ }
189
+ ```
190
+
191
+ ### 表单弹层(`useFormDrawer`)
192
+
193
+ ```tsx
194
+ import { Button } from 'antd'
195
+ import { useFormDrawer } from 'react-toolkits/hooks'
196
+
197
+ export default function CreateUser() {
198
+ const { show, drawer } = useFormDrawer({
199
+ title: '新建用户',
200
+ onConfirm: async values => {
201
+ await fetch('/api/users', { method: 'POST', body: JSON.stringify(values) })
202
+ },
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
+ ),
218
+ })
219
+
220
+ return (
221
+ <>
222
+ <Button onClick={show}>新建</Button>
223
+ {drawer}
224
+ </>
225
+ )
226
+ }
227
+ ```
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
+
267
+ ### 服务层 Hooks(`react-toolkits/services`)
268
+
269
+ ```tsx
270
+ import { usePermission, useMenuList } from 'react-toolkits/services'
271
+
272
+ export function UseDataExample() {
273
+ const { data: permissions } = usePermission()
274
+ const { data: menus } = useMenuList()
275
+ // 根据你的业务渲染
276
+ return null
277
+ }
278
+ ```
279
+
280
+ ### Ky 与请求拦截(`useKy`)
281
+
282
+ - 内置 `useKy` 封装了鉴权与 `APP_ID_HEADER` 注入逻辑,结合 Provider 的上下文使用
283
+ - 你也可以直接使用 `fetch`,但推荐统一通过 `services` 或 `useKy`
284
+
285
+ ```tsx
286
+ import { useEffect } from 'react'
287
+ import { useKy } from 'react-toolkits/components'
288
+ import { APP_ID_HEADER } from 'react-toolkits/constants'
289
+
290
+ export default function FetchWithKy() {
291
+ const ky = useKy({
292
+ headers: {
293
+ [APP_ID_HEADER]: 'my-app-id',
294
+ },
295
+ })
296
+
297
+ useEffect(() => {
298
+ ky.get('/api/ping').json()
299
+ }, [ky])
300
+
301
+ return null
302
+ }
303
+ ```
304
+
305
+ 提示:若你的应用已有全局请求层,可仅复用本包页面/组件,将头与鉴权逻辑放到你的层中保持一致性。
306
+
307
+ ## 迁移指南(从根导入 → 子路径导出)
308
+
309
+ 过去:
310
+
311
+ ```ts
312
+ import { ToolkitsProvider, Layout, useFormDrawer } from 'react-toolkits'
313
+ ```
314
+
315
+ 现在(推荐):
316
+
317
+ ```ts
318
+ import { ToolkitsProvider, Layout } from 'react-toolkits/components'
319
+ import { useFormDrawer, useFormModal } from 'react-toolkits/hooks'
320
+ import { permissionRoutes } from 'react-toolkits/pages'
321
+ import { usePermission } from 'react-toolkits/services'
322
+ ```
323
+
324
+ 收益:边界清晰、按需打包更友好(Tree Shaking)。
325
+
326
+ ### 权限版本兼容
327
+
328
+ - 历史上存在不同权限数据结构,`PermissionVersion` 用于适配后端变体
329
+ - 新项目建议使用 `V3`;旧项目如为 `V2`,只需在 `ToolkitsProvider` 中切换版本
330
+
331
+ ## 常见问题(FAQ)
332
+
333
+ - 如何引入样式?
334
+ - 在应用入口一次性引入:`import 'react-toolkits/style.css'`
335
+ - Provider 放哪?
336
+ - 在应用根部使用 `ToolkitsProvider`,传入登录路径、主页路径、权限版本等配置。
337
+ - 如何自定义菜单?
338
+ - 通过 `Layout` 的 `items` 或参考示例应用的 `menu-items.tsx`。
339
+ - 如何统一请求与拦截?
340
+ - 使用 `useKy` 或 `services` 中的 hooks(自动注入鉴权与 App-ID 头)。
341
+ - 若需要自定义拦截,传入 `useKy` 的配置或在应用层包裹一层。
342
+ - 列表的数据结构需要什么格式?
343
+ - 分页:`{ list: T[]; total: number }`;无限滚动:`{ list: T[]; nextPage?: number }`
344
+ - 可以只用页面和路由,不用 Provider 吗?
345
+ - 不建议。多数功能依赖上下文(鉴权、国际化、请求)。若必须,请自行在应用层提供等价上下文。
346
+
347
+ ## 本地开发与构建
348
+
349
+ ```bash
350
+ # 构建
351
+ pnpm -C packages/react-toolkits build
352
+
353
+ # 开发调试(监听)
354
+ pnpm -C packages/react-toolkits dev
355
+ ```
356
+
357
+ 构建将产出多入口:`lib/index.js`、`lib/components.js`、`lib/hooks.js`、`lib/pages.js`、`lib/services.js`、`lib/types.js`、`lib/utils.js`,以及 `locale/*`。
358
+
359
+ 提示:发布前请确保示例应用验证通过,并更新 `CHANGELOG.md` 描述变更与迁移说明。
360
+
361
+ ## 变更与发布
362
+
363
+ - 更新日志见 `CHANGELOG.md`
364
+ - 遵循 semver;涉及子路径导出/目录变更会在次版本提供迁移说明
365
+
366
+ ## 许可证
43
367
 
44
- - [ ] 移除导出的 axios 实例
368
+ MIT
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-7NM3DK6A.js';import {a as a$1}from'./chunk-X6ZI7RL7.js';import {d}from'./chunk-WHOTHZUW.js';import {Form,Spin,Table,Result,theme,Space,Button}from'antd';import {forwardRef,useMemo,useRef,useState,useEffect,useCallback,cloneElement,useImperativeHandle,Fragment}from'react';import {jsx,jsxs}from'react/jsx-runtime';import {isEqual}from'lodash-es';import {create}from'zustand';import {devtools,subscribeWithSelector}from'zustand/middleware';import {useQuery}from'@tanstack/react-query';var Oe=m=>{let{extras:l,isConfirming:r,onConfirm:o,onReset:e,children:s,buttonsAlign:n="left",showReset:u}=m,{t:d}=a(),{token:{colorFillAlter:h,lineWidth:F,lineType:p,colorBorder:S,borderRadiusLG:O}}=theme.useToken();return jsx("div",{style:{maxWidth:"none",background:h,borderWidth:F,borderStyle:p,borderColor:S,borderRadius:O,padding:24,marginBottom:24},children:jsxs("div",{className:`flex ${n==="bottom"?"flex-col":"flex-row"}`,children:[jsx("div",{className:`${n==="left"?"flex-grow-0":"flex-1"}`,children:s}),jsx("div",{className:`${n==="bottom"?"text-end":"text-start"} ml-4`,children:jsxs(Space,{children:[jsx(Button,{type:"primary",disabled:r,onClick:o,children:d("FilterFormWrapper.confirmText")}),l?.map(P=>jsx(Fragment,{children:P.children},P.key)),u&&jsx(Button,{onClick:e,children:d("FilterFormWrapper.resetText")})]})})]})})},k=Oe;var se=Object.freeze({page:1,size:10,filters:Object.freeze({})}),je=()=>create()(devtools(subscribeWithSelector((m,l)=>({instances:new Map,registerInstance(r,o,e,s){m(n=>{let u=n.instances.get(r);if(u){if(u.refetch!==s){let F={...u,refetch:s},p=new Map(n.instances);return p.set(r,F),{instances:p}}return n}let d={id:r,url:o,queryKey:e,payload:se,refetch:s},h=new Map(n.instances);return h.set(r,d),{instances:h}});},unregisterInstance(r){m(o=>{let e=new Map(o.instances);return e.delete(r)?{instances:e}:o});},updatePayload(r,o){m(e=>{let s=e.instances.get(r);if(!s)return e;let n={...s.payload,...o};if(!isEqual(s.payload,n)){let u={...s,payload:n},d=new Map(e.instances);return d.set(r,u),{instances:d}}return e});},getPayload(r){return l().instances.get(r)?.payload??se},async refetch(r,o){let e=l().instances.get(r);if(!e){console.warn(`QueryList instance with id "${r}" not found`);return}let s=!1;if(o){let n=e.payload,u={...n,...o};isEqual(n,u)||(l().updatePayload(r,o),s=!0);}if(!s)try{await e.refetch();}catch(n){throw console.error(`Failed to refetch QueryList instance "${r}":`,n),n}},getInstance(r){return l().instances.get(r)},getAllInstances(){return Array.from(l().instances.values())}})),{name:"query-list-store"})),We=je(),f=We;var le=(e=>(e[e.Confirm=0]="Confirm",e[e.Reset=1]="Reset",e[e.Jump=2]="Jump",e[e.Init=3]="Init",e))(le||{}),Ge=5*60*1e3,Ye=30*1e3,ce=["GET","HEAD"],ue=["POST","PUT","PATCH","DELETE"],Je={display:"flex",justifyContent:"center",alignItems:"center",height:300},Xe=0,Ze=()=>`queryList_${Date.now()}_${++Xe}`,et=(m,l)=>{let{t:r}=a(),{form:o,identifier:e,code:s,onePage:n,buttonsAlign:u,showReset:d$1,defaultSize:h=10,refreshInterval:F=0,tableExtra:p,renderForm:S,afterSuccess:O,afterError:_,footer:P,pageSizeOptions:B,request:V,dataAdapter:K,...de}=m,[a$2]=Form.useForm(o),c=useMemo(()=>e||Ze(),[e]),Q=useRef(3),{data:T,isLoading:fe}=a$1(s),[pe,b]=useState(!1),q=useRef(!1),M=useRef(!1),ye=f(t=>t.getPayload(c)),me=d(),{page:R,size:x=h,filters:g}=ye,ge=typeof V=="function"?V({page:R,size:x,filters:g}):V,{url:D,method:N="GET",body:he,searchParams:be,headers:Le,cacheTime:Ie=Ge,staleTime:Fe=Ye}=ge,E=N.toUpperCase();[...ce,...ue].includes(E)||console.warn(`QueryList: \u4E0D\u652F\u6301\u7684 HTTP \u8BF7\u6C42\u65B9\u6CD5 "${N}"\uFF0C\u5C06\u4F7F\u7528 GET \u65B9\u6CD5`);let Pe=ce.includes(E),Qe=ue.includes(E),U={...g,...!n&&{page:R,size:x}},L=he||(Qe?U:void 0),Re=be||U,xe=Le,$=useRef(!1),G=["queryList",D,c,R,x,g],{data:y,isLoading:Y,refetch:j}=useQuery({queryKey:G,queryFn:async()=>{try{let t={method:E,searchParams:Re,headers:xe};L&&!Pe&&(L instanceof FormData||typeof L=="string"?t.body=L:t.json=L);let i=await me.request({url:D,...t});return $.current=!0,O?.(Q.current,a$2,i),i}catch(t){let i=t instanceof Error?t:new Error(String(t));throw _?.(i,Q.current,a$2),i}},retry:(t,i)=>!(t>=3||i?.message?.includes("401")),retryDelay:t=>Math.min(1e3*2**t,3e4),refetchOnWindowFocus:!1,refetchInterval:$.current?F:0,gcTime:Ie,staleTime:Fe,enabled:T&&pe}),J=useMemo(()=>{let t=K,i={total:y?.total,items:y?.list};return typeof t=="function"?{...i,...t(y)}:{...i,...t}},[K,y]);useEffect(()=>(f.getState().registerInstance(c,D,G,j),()=>{f.getState().unregisterInstance(c);}),[c,D]);let W=J.items,X=J.total,Ae=useMemo(()=>n?!1:{pageSizeOptions:B,showSizeChanger:!0,showQuickJumper:!0,current:R,pageSize:x,total:X,onChange:async(t,i)=>{Q.current=2,f.getState().refetch(c,{page:t,size:i});}},[n,B,R,x,X,c]),Z=useCallback(async()=>{Q.current=0;try{await a$2.validateFields(),b(!0),f.getState().refetch(c,{page:1,filters:a$2.getFieldsValue()});}catch{b(!1);}},[a$2,c]),Se=useCallback(async()=>{Q.current=1,a$2.resetFields();try{await a$2.validateFields({validateOnly:!0}),b(!0),f.getState().refetch(c,{page:1,filters:a$2.getFieldsValue()});}catch{b(!1);}},[a$2,c]),Te=typeof S=="function"?jsx(k,{showReset:d$1,buttonsAlign:u,isConfirming:Y,onReset:Se,onConfirm:Z,children:cloneElement(S(a$2),{onKeyUp:t=>{t.key==="Enter"&&Z();}})}):jsx(Form,{form:a$2}),De=typeof p=="function"?p(a$2,y):p,Ee=P?()=>P(y):void 0;return useEffect(()=>{if(!q.current||M.current)return;let t=a$2.getFieldsValue();g&&!isEqual(t,g)&&(M.current=!0,a$2.setFieldsValue(g),setTimeout(()=>{M.current=!1;},0));},[g,a$2]),useEffect(()=>{if(!T||q.current)return;let t=async()=>{console.log("QueryList init starting");try{a$2.resetFields();let v=await a$2.validateFields({validateOnly:!0});console.log("QueryList init validation success:",v),f.getState().updatePayload(c,{page:1,filters:v}),b(!0),console.log("QueryList init completed, isValid set to true");}catch(v){console.log("QueryList init validation failed:",v),b(!1);}finally{q.current=!0;}},i=requestAnimationFrame(()=>{Promise.resolve().then(t);});return ()=>{i&&cancelAnimationFrame(i);}},[T,c,a$2]),useImperativeHandle(l,()=>({data:y,dataSource:W,form:a$2,refetch:j}),[y,W,a$2,j]),fe?jsx(Spin,{style:Je}):T?jsxs("div",{children:[Te,De,jsx(Table,{...de,dataSource:W,loading:Y,pagination:Ae,footer:Ee})]}):jsx(Result,{status:403,subTitle:r("global.noEntitlement")})},tt=forwardRef(et),rt=tt;export{k as a,f as b,le as c,rt as d};
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-WHOTHZUW.js';import {has,template,get}from'lodash-es';import {useMemo}from'react';function l(){let t=a(e=>e.locale);return {t:useMemo(()=>(e,r)=>has(t,e)?template(get(t,e))(r):e,[t])}}export{l as a};
File without changes
@@ -0,0 +1 @@
1
+ import {b}from'./chunk-OLM4QNJB.js';import {create}from'zustand';import {Modal,Form}from'antd';import {useMemo,useEffect,useState,useCallback}from'react';import {jsx}from'react/jsx-runtime';var P=create((s,o)=>({open:new Map,usedIds:new Set,isOpen:e=>o().open.get(e)??!1,show(e){s({open:new Map(o().open).set(e,!0)});},hide(e){s({open:new Map(o().open).set(e,!1)});},hideAll(){s({open:new Map});},checkUniqueness(e){let{usedIds:r}=o();return !r.has(e)},registerIds(e){let{usedIds:r}=o();return r.has(e)?!1:(s({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),s({open:l,usedIds:n});}}));function v(s){let{content:o,onConfirm:e,afterOpen:r,afterClose:i,...l}=s,n=useMemo(()=>b(),[]),{show:p,hide:u,isOpen:w,cleanup:t}=P();useEffect(()=>()=>{t(n);},[n,t]);let y=w(n),[x,c]=useState(!1),m=typeof o=="function",V=useCallback(async()=>{p(n),await r?.();},[n,p,r]),d=useCallback(()=>{u(n);},[n,u]),a=useCallback(async()=>{d(),await i?.();},[d,i]),f=useCallback(async()=>{try{c(!0),await e?.(),d(),await i?.();}catch(O){throw console.error("Modal confirm error:",O),O}finally{c(!1);}},[e,d,i]),M=jsx(Modal,{...l,open:y,confirmLoading:x,onOk:f,onCancel:a,children:m?o({hide:d}):o});return {id:n,show:V,hide:d,modal:M}}function N(s){let{content:o,form:e,formProps:r,onConfirm:i,onSuccess:l,afterClose:n,...p}=s,[u,w]=useState({}),[t]=Form.useForm();t=e||t;let y=typeof o=="function",{id:x,show:c,hide:m,modal:V}=v({...p,content:a=>jsx(Form,{...r,form:t,children:y?o(u,a):o}),onConfirm:async()=>{try{let a=await t.validateFields();await i?.(a,u),l?.(),m();}catch(a){throw console.error("Form validation or submission error:",a),a}},afterClose:()=>{n?.(t);}}),d=useCallback(a=>{let{initialValues:f,extraValues:M}=a||{};M&&w(M),f&&t.setFieldsValue(f),c();},[t,c]);return {id:x,show:d,hide:m,modal:V}}export{P as a,v as b,N as c};
@@ -0,0 +1 @@
1
+ import {d,e}from'./chunk-WHOTHZUW.js';import {useQueryClient,useMutation}from'@tanstack/react-query';function y(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.create,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,id:0,is_model:!0}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}function l(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.update,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,is_model:!0}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}function c(){let u=d(),t=useQueryClient();return useMutation({mutationKey:e.menus.delete,mutationFn:n=>u.post("/api/usystem/menu/delete",null,{searchParams:{id:n}}),onSuccess:()=>{t.invalidateQueries({queryKey:e.menus.all}),t.invalidateQueries({queryKey:e.menus.navbar()});}})}export{y as a,l as b,c};
@@ -0,0 +1 @@
1
+ import {c,d,j,i}from'./chunk-XQERUQGQ.js';import {c as c$1}from'./chunk-HZHE6R72.js';import {a}from'./chunk-7NM3DK6A.js';import {c as c$2}from'./chunk-X6ZI7RL7.js';import {a as a$1}from'./chunk-WHOTHZUW.js';import {App,Form,Input,Divider,Skeleton,Card,Space,Select,Button,Empty,Typography,Checkbox,Row,Col,Collapse}from'antd';import {useState,useEffect,useTransition,useCallback}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var oe=m=>{let{permissions:i,readonly:n,expand:r,value:l,onChange:g}=m,[c,f]=useState([]),[y,R]=useState({}),[a$1,d]=useState(l??[]),{t:P}=a(),[,v]=useTransition(),V=useCallback(e=>{f(e);},[]),p=(e,s)=>{let o=[];return e?o=[...new Set(a$1.concat(s))]:(o=a$1.slice(),s.forEach(u=>{let b=o.findIndex(X=>X===u);b>-1&&o.splice(b,1);})),o},x=(e,s)=>{let o=p(e.target.checked,s);d(o),g?.(o);};useEffect(()=>{d(l??[]);},[l]),useEffect(()=>{r&&v(()=>{f((i??[]).map(({category:e})=>e));});},[r,i]),useEffect(()=>{let e=(i??[]).reduce((s,o)=>(s[o.category]=o.permissions.every(u=>a$1?.includes(u.value)),s),{});R(e);},[a$1,i]);let I=(i??[]).map(e=>({key:e.category,label:e.category,extra:!n&&jsx(Checkbox,{checked:y[e.category],onChange:s=>{x(s,e.permissions?.map(o=>o.value));},children:P("global.selectAll")}),children:jsx(Checkbox.Group,{style:{width:"100%"},value:a$1,disabled:n,children:jsx(Row,{gutter:[10,10],style:{width:"100%"},children:e.permissions?.map(s=>jsx(Col,{span:6,children:jsx(Checkbox,{value:s.value,onChange:o=>{x(o,[s.value]);},children:s.label})},s.value))})})}));return jsx(Collapse,{style:{width:"100%"},collapsible:"header",activeKey:c,items:I,onChange:V})},k=oe;var{Text:w}=Typography,{Option:le}=Select,pe=m=>{let{expand:i=!0,value:n,readonly:r,onChange:l}=m,{data:g,isLoading:c,error:f}=j(),{data:y,isLoading:R}=c$2(),[a$1,d]=useState([]),P=g?.filter(e=>e.is_common),v=g?.filter(e=>!e.is_common),V=c||R,{t:p}=a();if(useEffect(()=>{let e=[];Object.keys(n??{}).forEach(s=>{s!=="global"&&e.push({gameId:s,permissions:n?.[s]??[]});}),d(e);},[n]),f)return jsx("div",{className:"flex justify-center",children:jsx(w,{type:"danger",children:p("PermissionList.failedDescription")})});let x=()=>{d(e=>[...e,{gameId:"",permissions:[]}]);},I=e=>{d(s=>s.filter((o,u)=>u!==e));};return jsxs("div",{className:"flex flex-col w-full",children:[jsx("div",{className:"mb-12",children:jsx(Divider,{dashed:!0,children:p("PermissionList.baseSectionTitle")})}),jsx(Skeleton,{active:!0,loading:V,children:jsx(k,{value:n?.global,readonly:r,permissions:P,expand:i,onChange:e=>{l?.({...n,global:e});}})}),jsx("div",{className:"my-12",children:jsx(Divider,{dashed:!0,children:p("PermissionList.gameSectionTitle")})}),a$1.map((e,s)=>jsx(Card,{title:jsxs(Space,{children:[jsx(w,{children:p("global.game")}),r?jsx(w,{children:y?.find(o=>String(o.id)===e.gameId)?.name}):jsx(Select,{disabled:r,value:a$1[s].gameId||void 0,style:{width:"160px"},placeholder:p("PermissionList.gameSelectPlaceholder"),onChange:o=>{d(u=>{let b=u.slice();return b[s].gameId=o,b});},children:y?.map(o=>jsx(le,{value:o.id,disabled:a$1.some(({gameId:u})=>u===String(o.id)),children:o.name},o.id))})]}),className:"mb-6",extra:!r&&jsx(Button,{type:"link",onClick:()=>{I(s);},children:p("PermissionList.removeText")}),children:a$1[s].gameId?jsx(Skeleton,{active:!0,loading:V,children:jsx(k,{value:n?.[a$1[s].gameId],readonly:r,expand:i,permissions:v,onChange:o=>{l?.({...n,[a$1[s].gameId]:o});}})}):jsx(Empty,{description:p("PermissionList.gameSectionDescription")})},s)),!r&&jsx(Button,{block:!0,type:"dashed",onClick:x,children:p("PermissionList.addText")})]})},U=pe;var{Text:ue}=Typography,ge=m=>{let{expand:i$1=!0,value:n,readonly:r,onChange:l}=m,{data:g,isLoading:c,error:f}=i(),{t:y}=a();return f?jsx("div",{className:"flex justify-center",children:jsx(ue,{type:"danger",children:y("PermissionList.failedDescription")})}):jsx(Skeleton,{active:!0,loading:c,children:jsx(k,{value:n,permissions:g,readonly:r,expand:i$1,onChange:l})})},$=ge;var fe=m=>{let{value:i}=m;console.log("value",typeof i,i===null,JSON.stringify(i));let{permissionVersion:n}=a$1();return n==="v2"?jsx(U,{...m,value:i}):jsx($,{...m,value:i})},H=fe;var Qe=({mode:m,onSuccess:i})=>{let{message:n}=App.useApp(),{t:r}=a(),l=c(),g=d(),c$2=m==="create",f=r(c$2?"Role.createTitle":"Role.updateTitle"),y=jsxs(Fragment,{children:[jsx(Form.Item,{label:r("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!c$2})}),jsx(Form.Item,{name:"permissions",children:jsx(H,{})})]});return c$1({title:f,width:"1000px",formProps:{layout:"vertical"},content:y,onConfirm:async(a,d)=>{let P=`role_${a.name}`,v=a.permissions;c$2?(await l.mutateAsync({name:P,permissions:v}),n.success(r("Role.createSuccessfully"))):(await g.mutateAsync({id:d?.id,name:P,permissions:v}),n.success(r("Role.updateSuccessfully"))),i?.();}})};export{H as a,Qe as b};
@@ -0,0 +1 @@
1
+ import {Typography}from'antd';import {useState}from'react';import {jsx}from'react/jsx-runtime';import P from'./logo-L6MFCL6M.png';var g=a=>{let{children:r,...p}=a,[o,e]=useState(!1);return jsx(Typography.Paragraph,{...p,className:"mb-0",ellipsis:{rows:2,expandable:"collapsible",expanded:o,onExpand:(f,t)=>{e(t.expanded);}},children:r})},m=g;var n=a=>jsx("img",{src:P,alt:"logo",...a}),i=n;export{m as a,i as b};
@@ -0,0 +1,2 @@
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{c as a,o as b,u as c,t as d,n as e};
@@ -0,0 +1 @@
1
+ import {b}from'./chunk-JTDKSGJR.js';import {a as a$2}from'./chunk-4GULXGNG.js';import {a}from'./chunk-7NM3DK6A.js';import {a as a$1,c}from'./chunk-X6ZI7RL7.js';import {d,a as a$3}from'./chunk-WHOTHZUW.js';import {PlusOutlined,LogoutOutlined,UserOutlined,MenuUnfoldOutlined,MenuFoldOutlined}from'@ant-design/icons';import*as B from'antd';import {Spin,Menu,Form,Result,Table,Button,theme,Space,Input,Tag,Empty,Dropdown,Divider,Select,Typography}from'antd';import {forwardRef,memo,useRef,useMemo,useCallback,useEffect,useState,useImperativeHandle,cloneElement,Fragment as Fragment$1,Suspense}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useInfiniteQuery,useQueryClient}from'@tanstack/react-query';import {isEqual}from'lodash-es';import {create}from'zustand';import {persist,createJSONStorage,devtools,subscribeWithSelector}from'zustand/middleware';import {Link,useLocation,useNavigate}from'react-router-dom';var at=r=>{let{initialTags:a$1,addable:e,removable:t,addCallback:n,removeCallback:o}=r,{t:i}=a(),{token:c}=theme.useToken(),[p,I]=useState([]),[s,v]=useState(!1),[u,L]=useState(""),[m,f]=useState(-1),[h,x]=useState(""),k=useRef(null),P=useRef(null);useEffect(()=>{I(a$1??[]);},[a$1]),useEffect(()=>{s&&k.current?.focus();},[s]),useEffect(()=>{P.current?.focus();},[u]);let d=async y=>{if(await o?.(y)){let M=p.filter(ae=>ae!==y);I(M);}},V=()=>{v(!0);},F=y=>{L(y.target.value);},D=async()=>{u&&p.indexOf(u)===-1&&await n?.(u)&&I([...p,u]),v(!1),L("");},S=y=>{x(y.target.value);},j=()=>{let y=[...p];y[m]=h,I(y),f(-1),L("");},N={width:78,verticalAlign:"top"},re={background:c.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:p.map((y,C)=>m===C?jsx(Input,{ref:P,size:"small",style:N,value:h,onChange:S,onBlur:j,onPressEnter:j},y):jsx(Tag,{closable:t,style:{userSelect:"none"},onClose:async M=>{M.preventDefault(),await d(y);},children:jsx("span",{onDoubleClick:M=>{C!==0&&(f(C),x(y),M.preventDefault());},children:y})},y))}),e&&(s?jsx(Input,{ref:k,type:"text",size:"small",style:N,value:u,onChange:F,onBlur:D,onPressEnter:D}):jsxs(Tag,{style:re,onClick:V,children:[jsx(PlusOutlined,{}),"\xA0",i("global.add")]}))]})},ot=at;var ct=()=>create()(devtools(subscribeWithSelector((r,a)=>({instances:new Map,registerInstance(e,t,n,o,i){r(c=>{let p=c.instances.get(e);if(p){let v={...p,refetch:o,fetchNextPage:i},u=new Map(c.instances);return u.set(e,v),{instances:u}}let I={id:e,url:t,queryKey:n,payload:{page:0,formValue:{}},refetch:o,fetchNextPage:i},s=new Map(c.instances);return s.set(e,I),{instances:s}});},unregisterInstance(e){r(t=>{let n=new Map(t.instances);return n.delete(e)?{instances:n}:t});},updatePayload(e,t){r(n=>{let o=n.instances.get(e);if(!o)return n;let i={...o.payload,...t};if(!isEqual(o.payload,i)){let c={...o,payload:i},p=new Map(n.instances);return p.set(e,c),{instances:p}}return n});},getPayload(e){return a().instances.get(e)?.payload??{page:0,formValue:{}}},async refetch(e,t){let n=a().instances.get(e);if(!n){console.warn(`InfiniteList instance with id "${e}" not found`);return}if(t){let o=n.payload,i={...o,...t};isEqual(o,i)||a().updatePayload(e,t);}try{await n.refetch();}catch(o){throw console.error(`Failed to refetch InfiniteList instance "${e}":`,o),o}},async fetchNextPage(e){let t=a().instances.get(e);if(!t){console.warn(`InfiniteList instance with id "${e}" not found`);return}try{await t.fetchNextPage();}catch(n){throw console.error(`Failed to fetch next page for InfiniteList instance "${e}":`,n),n}},getInstance(e){return a().instances.get(e)},getAllInstances(){return Array.from(a().instances.values())}})),{name:"infinite-list-store"})),pt=ct(),T=pt;var xt=(r,a$3)=>{let t={refreshInterval:0,initialPageParam:0,...r,dataAdapter:{...{items:l=>l?l.flatMap(g=>g?.list||g||[]):[],hasMore:l=>{if(!l)return !1;let g=l;return g?.hasMore||g?.has_more||!1},nextPageParam:(l,g,W)=>(G=>{if(!G)return !1;let H=G;return H?.hasMore||H?.has_more||!1})(l)?g.length:void 0},...r.dataAdapter}},{identifier:n,code:o,buttonsAlign:i,showReset:c,refreshInterval:p,request:I,tableExtra:s,renderForm:v,afterSuccess:u,afterError:L,dataAdapter:m,initialPageParam:f,footer:h,form:x,...k}=t,{t:P}=a(),[d$1]=Form.useForm(x),[V,F]=useState(!1),D=useRef(!1),S=useRef(3),j=d(),{data:N,isLoading:re}=a$1(o),y=useCallback(()=>T.getState().getPayload(n),[n]),C=useMemo(()=>d$1,[d$1]),{url:M,method:ae="GET",body:oe,params:ie,headers:Q,cacheTime:Ue=5*60*1e3,staleTime:Xe=0}=I,se=useMemo(()=>typeof Q=="function"?Q(C):Q,[Q,C]),le=useMemo(()=>{let l=y();return [M,n,N,V,l,se]},[M,n,N,V,y,se]),{data:U,fetchNextPage:ce,hasNextPage:Ie,isFetchingNextPage:be,refetch:X,isFetching:ve}=useInfiniteQuery({queryKey:le,queryFn:async({pageParam:l=f})=>{try{let g=y(),W=typeof ie=="function"?ie(g,l):ie,z=typeof oe=="function"?oe(g,l):oe,G={method:ae,searchParams:W,headers:se};z&&(z instanceof FormData?G.body=z:G.json=z);let H=await j.request({url:M,...G});return D.current=!0,u?.(S.current,C,[H]),H}catch(g){let W=g instanceof Error?g:new Error(String(g));throw L?.(W,S.current,C),W}},initialPageParam:f,getNextPageParam:(l,g)=>m?.nextPageParam?.(l,g,f),enabled:N&&V,retry:(l,g)=>!(l>=3||g?.message?.includes("401")),retryDelay:l=>Math.min(1e3*2**l,3e4),refetchOnWindowFocus:!1,refetchInterval:D.current?p:0,gcTime:Ue,staleTime:Xe});useEffect(()=>(T.getState().registerInstance(n,M,le,X,ce),()=>{T.getState().unregisterInstance(n);}),[n,M,le,X,ce]);let $=m?.items?.(U?.pages,C),pe=be,xe=!Ie,$e=!$||$.length===0,Pe=async()=>{S.current=0;let l=await d$1.getFieldsValue();try{await d$1.validateFields(),F(!0),T.getState().updatePayload(n,{page:0,formValue:l}),X();}catch{F(!1);}},Ye=()=>{S.current=2,ce();},Je=async()=>{S.current=1;try{d$1.resetFields();let l=await d$1.getFieldsValue();T.getState().updatePayload(n,{page:0,formValue:l}),await d$1.validateFields({validateOnly:!0}),X();}catch{}};if(useEffect(()=>{setTimeout(()=>{N&&d$1.validateFields({validateOnly:!0}).then(l=>{F(!0),T.getState().updatePayload(n,{page:0,formValue:l});}).catch(()=>{F(!1);});},300);},[N,d$1,n]),useImperativeHandle(a$3,()=>({data:U?.pages,dataSource:$,form:d$1,refetch:()=>T.getState().refetch(n),fetchNextPage:()=>T.getState().fetchNextPage(n),hasNextPage:!!Ie,isFetchingNextPage:be})),re)return jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:300}});if(!N)return jsx(Result,{status:403,subTitle:P("global.noEntitlement")});let Ze=h&&(()=>h(U?.pages)),et=()=>typeof s=="function"?s(C,U?.pages):s,tt=typeof v=="function"?jsx(a$2,{showReset:c,buttonsAlign:i,isConfirming:ve,onReset:Je,onConfirm:Pe,children:cloneElement(v(d$1),{onKeyUp:l=>{l.key==="Enter"&&Pe();}})}):jsx(Form,{form:d$1});return jsxs(Fragment,{children:[tt,et(),jsx("div",{style:{minHeight:"400px"},children:jsx(Table,{...k,dataSource:$,loading:ve,pagination:!1,footer:Ze})}),!$e&&jsx(Button,{block:!0,loading:pe,type:"link",htmlType:"button",disabled:pe||xe,onClick:Ye,children:P(pe?"InfiniteList.loadingText":xe?"InfiniteList.reachEndText":"InfiniteList.loadMoreText")})]})},Pt=forwardRef(xt),St=Pt;var Ve=create()(persist((r,a)=>({openKeys:[],setOpenKeys:e=>{let t=a();(t.openKeys.length!==e.length||!t.openKeys.every((n,o)=>n===e[o]))&&r({openKeys:e});},selectedKeys:[],setSelectedKeys:e=>{let t=a();(t.selectedKeys.length!==e.length||!t.selectedKeys.every((n,o)=>n===e[o]))&&r({selectedKeys:e});}}),{name:"nav",storage:createJSONStorage(()=>localStorage),partialize:r=>({openKeys:r.openKeys,selectedKeys:r.selectedKeys}),skipHydration:!1,version:1}));var Ke=memo(({to:r,children:a})=>jsx(Link,{to:r,children:a}));Ke.displayName="MemoizedLink";function Z(r){let a=[];if(r)for(let e=0;e<r.length;e++)if(r[e]===null||r[e].type==="divider")a[e]=r[e];else if(r[e].children){let{children:t,...n}=r[e];a[e]={...n,children:Z(t)};}else {let{route:t,label:n,...o}=r[e],i=t?jsx(Ke,{to:t,children:n}):n;a[e]={...o,label:i};}return a}function ee(r,a=[],e=[]){for(let t of r){let n=t?.children;if(Array.isArray(n)){let o=t.type!=="group"&&t.key?[...e,t.key]:e;ee(n,a,o);}else t&&a.push(Object.assign(t,{keypath:e}));}return a}var Ot=memo(function(a){let{items:e=[],theme:t,loading:n}=a,o=useLocation(),i=useRef(),c=useRef(),p=useMemo(()=>i.current===e?i.current?ee(i.current):[]:(i.current=e,ee(e)),[e]),I=useMemo(()=>i.current===e?i.current?Z(i.current):[]:Z(e),[e]),{openKeys:s,selectedKeys:v,setOpenKeys:u,setSelectedKeys:L}=Ve(),m=useCallback(f=>{let h=f.find(x=>!s.includes(x));if(h){let x=p.find(P=>P.key===h),k=x?.keypath?[...x.keypath,h]:[h];u(k);}else u(f);},[p,s,u]);return useEffect(()=>{if(c.current===o.pathname)return;c.current=o.pathname;let f=p.find(h=>o.pathname===h.route);if(f){let h=f.key,x=f.keypath;(v[0]!==h||!s.every((k,P)=>k===x[P]))&&(L([h]),u(x));}},[p,o.pathname,v,s,L,u]),n?jsx("div",{className:"flex justify-center items-center",style:{height:"calc(100vh - 64px)"},children:jsx(Spin,{})}):jsx(Menu,{theme:t,style:{borderRight:"none"},items:I,mode:"inline",openKeys:s,selectedKeys:v,onOpenChange:m})}),de=Ot;var {Spin:qt}=B,Wt=({children:r})=>{let{permissionVersion:a$1,gameId:e,isGlobal:t}=a$3(i=>i),{isLoading:n}=c(),{t:o}=a();return n?jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:400},children:jsx(qt,{})}):a$1==="v1"||t?r:e?jsx(Fragment$1,{children:r},e):jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:o("RequireGame.description")})},ye=Wt;var Qt=()=>{let{t:r}=a(),a$1=useNavigate(),{clearToken:e,getUser:t,signInPath:n}=a$3(s=>s),o=t(),i=()=>{e(),a$1(n);},c=s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),i());},p=s=>{(s.key==="Enter"||s.key===" ")&&s.preventDefault();},I=[{key:"1",icon:jsx(LogoutOutlined,{}),label:jsx("a",{role:"button",tabIndex:0,onClick:i,onKeyDown:c,children:r("UserWidget.signOutText")})}];return jsx("div",{children:jsx(Dropdown,{menu:{selectable:!0,items:I},placement:"bottomRight",children:jsx("a",{role:"button",tabIndex:0,onClick:s=>{s.preventDefault();},onKeyDown:p,children:jsxs(Space,{align:"center",children:[jsx("span",{children:o?.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})})},ge=Qt;var{Text:en}=Typography,tn=r=>{let{filter:a$1,options:e}=r,{t}=a(),{gameApiV2:n,gameId:o,setGameId:i}=a$3(m=>m),{data:c$1,isLoading:p}=c(),I=useQueryClient(),s=c$1?.filter(m=>a$1?.(m)??!0),v=typeof e=="function"?e(s):s?.map(m=>({label:m.name,value:n?m.game_id:m.id})),u=m=>{L(),i(m);},L=()=>{I.removeQueries({predicate:m=>{let f=m.queryKey;return !f.includes("/api/game/list")&&!f.includes("/api/usystem/game/all")}});};return useEffect(()=>{if(c$1&&c$1.length>0){let m=n?c$1[0].game_id:c$1[0].id;c$1.every(f=>String(f.game_id||f.id)!==String(o))&&i(m);}},[c$1]),jsxs(Space,{children:[jsx(en,{children:t("GameSelect.label")}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:o,placeholder:t("GameSelect.placeholder"),loading:p,style:{width:"200px"},options:v,onChange:u})]})},ze=tn;var _e=memo(({title:r,subtitle:a,mainPagePath:e,collapsed:t})=>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 ${t?"justify-center":""}`,children:[jsx(Link,{to:e,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:t?.8:1,transform:"translateX(0)"},children:jsx(b,{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)"}})}),r&&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:t?0:1,width:t?"0px":"auto",marginLeft:t?"0px":"16px",transform:t?"translateX(-8px)":"translateX(0)"},children:jsx(Link,{to:e,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:r,style:{letterSpacing:"0.02em",textShadow:"0 1px 2px rgba(0, 0, 0, 0.05)"},children:r})})]}),jsx("div",{className:"w-full mt-2 overflow-hidden",style:{height:a&&!t?"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:!a||t?1:0,transition:"opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)"}}),a&&jsxs("div",{className:"flex items-center w-full text-sm",style:{opacity:t?0:1,transform:t?"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:a,children:a}),jsx("div",{className:"flex-1 border-t border-gray-200"})]})]})})]}));_e.displayName="LayoutHeader";var Be=_e;var {Spin:pn,theme:mn}=B,{Header:un,Sider:fn,Content:dn}=B.Layout,yn=r=>{let{collapsible:a,isMenuLoading:e,items:t,headerExtra:n,children:o,navWidth:i,filter:c,gameSelectOptions:p,title:I,subtitle:s}=r,{token:{colorBgContainer:v,colorBorder:u}}=mn.useToken(),{permissionVersion:L,navWidth:m,collapsible:f,mainPagePath:h,collapsed:x,setContext:k,isGlobal:P}=a$3(),[d,V]=useState(x),F=async()=>{V(!d),k({collapsed:!d});},D=a??f??!1;return jsxs(B.Layout,{children:[jsxs(fn,{collapsible:D,theme:"light",trigger:null,collapsed:d,width:i??m,style:{height:"100vh",overflowX:"hidden",overflowY:"auto",borderRightWidth:1,borderRightStyle:"solid",borderRightColor:u,transition:"all 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)"},children:[jsx(Be,{title:I,subtitle:s,mainPagePath:h,collapsed:d||!1}),jsx(de,{items:t,loading:e})]}),jsxs(B.Layout,{children:[jsx(un,{style:{padding:"0 24px",background:v},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:[D&&jsx(Button,{type:"text",icon:d?jsx(MenuUnfoldOutlined,{}):jsx(MenuFoldOutlined,{}),style:{fontSize:"16px"},onClick:F}),L!=="v1"&&!P&&jsx(ze,{filter:c,options:p}),n?.left?.map(S=>jsx("span",{children:S.children},S.key))]}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[n?.right?.map(S=>jsx("span",{children:S.children},S.key)),jsx(ge,{})]})]})}),jsx(dn,{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(pn,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"200px"}}),children:jsx(ye,{children:o})})})]})]})},gn=yn;var bn=r=>{let{code:a$2,config:e,children:t}=r,{data:n,isLoading:o}=a$1(a$2,e),{t:i}=a();return o?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):n?jsx(Fragment,{children:t}):jsx(Result,{status:"403",subTitle:i("global.noEntitlement")})},vn=bn;export{ot as a,T as b,St as c,de as d,ye as e,ge as f,gn as g,vn as h};
@@ -0,0 +1 @@
1
+ import {a as a$1,f,g}from'./chunk-XQERUQGQ.js';import {c}from'./chunk-HZHE6R72.js';import {a}from'./chunk-7NM3DK6A.js';import {d,e}from'./chunk-WHOTHZUW.js';import {e as e$1}from'./chunk-LRMME3YZ.js';import {MinusCircleOutlined}from'@ant-design/icons';import {useQuery}from'@tanstack/react-query';import {App,Form,Input,Select,Row,Col,Empty,Button,Typography}from'antd';import {last,first}from'lodash-es';import {Fragment as Fragment$1}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var {Text:q}=Typography,$=u=>{let{onChange:a,...r}=u,o=d(),{data:g,isLoading:d$1}=useQuery({queryKey:e.enums.gameGroups,queryFn:()=>o.get("/api/enum/get?enum=game_group&type=all")}),C=[{label:"\u901A\u7528",value:e$1}].concat(g?.map(s=>({label:s,value:s}))??[]);return jsx(Select,{...r,allowClear:!0,showSearch:!0,mode:"tags",optionFilterProp:"label",loading:d$1,options:C,onChange:s=>{last(s)===e$1?a?.([e$1]):first(s)===e$1?a?.(s.slice(1)):a?.(s);}})},z=u=>{let{groups:a,onChange:r,...o}=u,g=d(),{data:d$1,isLoading:C}=useQuery({queryKey:e.enums.gameIds(a||[]),queryFn:()=>g.get(`/api/enum/game_group/get_game_ids?game_groups=${a?.join(",")}`).then(t=>t?.list),enabled:!!a?.length}),h=d$1?.map(t=>({label:t.name,value:t.id}));return jsx(Select,{...o,allowClear:!0,showSearch:!0,optionFilterProp:"label",mode:"tags",loading:C,options:h,onChange:t=>{last(t)===e$1?r?.([e$1]):first(t)===e$1?r?.(t.slice(1)):r?.(t);}})},le=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.Item,{label:o("global.role"),name:"roles",children:jsx(Select,{allowClear:!0,showSearch:!0,mode:"multiple",loading:d,optionFilterProp:"label",options:g$1?.map(n=>({label:n.name,value:n.name}))})})]});return c({title:t,width:"50vw",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})},ie=({mode:u,onSuccess:a$2})=>{let{message:r}=App.useApp(),{t:o}=a(),{data:g$1,isLoading:d}=a$1(),C=f(),h=g(),s=u==="create",t=o(s?"User.createTitle":"User.updateTitle"),S=jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:!0}],children:jsx(Input,{disabled:!s})}),jsx(Form.List,{name:"permissions",children:(n,{add:f,remove:V})=>jsxs(Row,{gutter:8,children:[jsx(Col,{span:8,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.projectGroup")})}),jsx(Col,{span:10,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.game")})}),jsx(Col,{span:6,className:"text-center mb-4",children:jsx(q,{strong:!0,children:o("global.role")})}),n.map(m=>jsxs(Fragment$1,{children:[jsx(Col,{span:8,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:!0,children:({setFieldValue:l})=>jsx(Form.Item,{name:[m.name,"game_group"],children:jsx($,{onChange:()=>{l(["permissions",m.name,"game_ids"],[]);}})})})}),jsx(Col,{span:10,children:jsx(Form.Item,{noStyle:!0,shouldUpdate:(l,y)=>l.permissions[m.name]?.game_group!==y.permissions[m.name]?.game_group,children:({getFieldValue:l})=>{let y=l(["permissions",m.name,"game_group"]);return jsx(Form.Item,{name:[m.name,"game_ids"],dependencies:[["permissions",m.name,"game_group"]],rules:[{required:y?.length,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(z,{groups:y})})}})}),jsx(Col,{span:6,children:jsxs("div",{className:"flex",children:[jsx("div",{className:"flex-1",children:jsx(Form.Item,{name:[m.name,"role"],rules:[{required:!0,message:"\u8BF7\u9009\u62E9\u89D2\u8272"},({getFieldValue:l})=>({validator(y,K){return l("permissions").filter((I,j)=>!!I&&j!==m.name).some(I=>I.role===K)?Promise.reject(new Error("\u8BF7\u52FF\u91CD\u590D\u9009\u62E9\u89D2\u8272")):Promise.resolve()}})],children:jsx(Select,{allowClear:!0,showSearch:!0,optionFilterProp:"label",loading:d,options:g$1?.map(l=>({label:l.name,value:l.name}))})})}),jsx("div",{className:"w-8 text-center",children:jsx(Form.Item,{children:jsx(MinusCircleOutlined,{onClick:()=>{V(m.name);}})})})]})})]},m.key)),n.length===0&&jsx(Col,{span:24,children:jsx(Empty,{className:"mb-6"})}),jsx(Col,{span:24,children:jsx(Button,{block:!0,type:"dashed",onClick:()=>f(),children:o("global.add")})})]})})]});return c({title:t,width:"50vw",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:S,onConfirm:async(n,f)=>{s?(await C.mutateAsync(n),r.success(o("User.createSuccessfully"))):(await h.mutateAsync({...n,id:f?.id}),r.success(o("User.updateSuccessfully"))),a$2?.();}})};export{le as a,ie as b};
@@ -0,0 +1 @@
1
+ var s={getItem:t=>sessionStorage.getItem(t)||localStorage.getItem(t),setItem:(t,e)=>{sessionStorage.setItem(t,e),localStorage.setItem(t,e);},removeItem(t){sessionStorage.removeItem(t),localStorage.removeItem(t);}},r=0,n=()=>{let t=Date.now(),e=Math.floor(Math.random()*1e3),o=++r%1e3;return t*1e6+e*1e3+o};export{s as a,n as b};
@@ -0,0 +1 @@
1
+ import {useState,useEffect}from'react';import {flushSync}from'react-dom';import {createRoot}from'react-dom/client';import {jsx}from'react/jsx-runtime';var f=r=>{let t=/(<[^>]*>)/;return r.split(t).filter(e=>e!=="")};function a(r){let t=document.createElement("div"),e=createRoot(t);return new Promise(i=>{setTimeout(()=>{flushSync(()=>{e.render(r);}),i(t.innerHTML);});})}var d=r=>{let{texts:t,children:e}=r,[i,l]=useState("");return useEffect(()=>{a(e).then(g=>{let o=f(g);for(let s of t)for(let n=0;n<o.length;n++)o[n]=o[n].replace(String(s),`<span style='color: #DC143C;'>${s}</span>`);l(o.join(""));});},[e,t]),jsx("div",{dangerouslySetInnerHTML:{__html:i}})},u=d;export{u as a};
@@ -0,0 +1 @@
1
+ import {a as a$1}from'./chunk-7NM3DK6A.js';import {a}from'./chunk-X6ZI7RL7.js';import {Button,Tooltip}from'antd';import {jsx}from'react/jsx-runtime';var B=d=>{let{children:n,code:o,showLoading:i,disabled:l,config:m,...r}=d,u=o?Array.isArray(o)?o:[o]:[],{data:s,isLoading:f}=a(u,m),{t:P}=a$1();return f?jsx(Button,{loading:i,disabled:!i,...r,children:n}):typeof s=="boolean"||s&&Object.values(s).some(Boolean)?jsx(Button,{disabled:l,...r,children:n}):jsx(Tooltip,{defaultOpen:!1,title:P("global.noEntitlement"),children:jsx(Button,{disabled:!0,...r,children:n})})},y=B;export{y as a};
@@ -0,0 +1 @@
1
+ import {b as b$1}from'./chunk-LRMME3YZ.js';import {a}from'./chunk-OLM4QNJB.js';import {App}from'antd';import {createContext,useContext,useMemo,useRef}from'react';import {useStore,createStore}from'zustand';import {persist,createJSONStorage}from'zustand/middleware';import {jwtDecode}from'jwt-decode';import {jsx}from'react/jsx-runtime';import $ from'ky';var _={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"}},v=_;var E=e=>({locale:v,gameApiV2:!1,isGlobal:!1,signInPath:"/sign_in",mainPagePath:"/",permissionVersion:"v1",setContext(t){e(r=>({...r,...t}));}});var b=e=>({setGameId:t=>{e({gameId:t});}});var w=(e,t)=>({getUser:()=>{let r=t().token;if(r)try{return jwtDecode(r)}catch{return null}return null},setToken:r=>e({token:r})});var I=e=>createStore()(persist((...t)=>{let[,r,i]=t,a=()=>{r().setToken(""),i.persist.clearStorage();};return {...w(...t),...b(...t),...E(...t),clearToken:a,...e}},{name:"toolkits",storage:createJSONStorage(()=>a),partialize:t=>({token:t.token,gameId:t.gameId,collapsed:t.collapsed})}));var R=createContext(null);function P(e){let t=useContext(R);if(!t)throw new Error("Missing ToolkitsProvider in the tree");return useStore(t,e||(r=>r))}var A=e=>{let{children:t,...r}=e,i=useRef(),a=useContext(R)?.getState();if(i.current||(i.current=I({...a,...r})),!i.current.getState().signInPath)throw new Error('ToolkitsProvider: \u8BF7\u914D\u7F6E "signInPath"');return jsx(R.Provider,{value:i.current,children:jsx(App,{children:t})})},Y=(e,t)=>{let r=i=>jsx(A,{...t,children:jsx(e,{...i})});return r.displayName=`withContext(${e.displayName||e.name||"Component"})`,r},J=A;var k=[0,1,200],g={OK:200,UNAUTHORIZED:401,FORBIDDEN:403,UNREGISTERED:412},Z=3e4;var q=e=>!e||typeof e!="object"?"Unknown error":e.msg||e.message||e.error||"Unknown error",ee=e=>{let{value:t,allowedCodes:r}=e;return t==null||typeof t!="number"?!1:r.includes(t)},te=(e,t)=>{if(t<g.OK||t>=300)return !1;if(!e||typeof e!="object")return !0;let r=[{field:"code",value:e.code,allowedCodes:k},{field:"status",value:e.status,allowedCodes:k},{field:"errno",value:e.errno,allowedCodes:k}];return r.some(a=>a.value!==void 0&&a.value!==null)?r.every(a=>a.value===void 0||a.value===null||ee(a)):!0},oe=async(e,t)=>{switch(t){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()}},se=e=>{let{notification:t}=App.useApp(),r=P(),{token:i,isGlobal:a,gameId:S,permissionVersion:x,signInPath:T,clearToken:C}=r,D=()=>{C(),T&&(window.location.href=T);},G=()=>{if(C(),T){let o=new URL(T,window.location.origin);o.searchParams.set("unregistered","true"),window.location.href=o.toString();}},N=()=>{t.error({message:"\u8BBF\u95EE\u88AB\u7981\u6B62",description:"\u60A8\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6B64\u8D44\u6E90\u3002"});},F=o=>async(s,n,c)=>{if(o==="blob"||o==="arrayBuffer"||o==="text"||o==="formData")return c;let l;try{l=await c.clone().json();}catch{return c}if(te(l,c.status)){let m=l.data!==void 0?l.data:l;return new Response(JSON.stringify(m),{status:c.status,statusText:c.statusText,headers:c.headers})}let u=q(l);t.error({message:"Request failed",description:u});let d=new Error(u);throw d.response=c,d.data=l,d},B=(o,s)=>{switch(o){case g.UNAUTHORIZED:D();break;case g.UNREGISTERED:G();break;case g.FORBIDDEN:N();break;default:{let n=q(s)||`HTTP ${o} Error`;t.error({message:"Request failed",description:n});break}}},h=useMemo(()=>$.create({prefixUrl:e,retry:0,timeout:Z,headers:{Accept:"application/json","Content-Type":"application/json"},hooks:{beforeRequest:[s=>{i&&s.headers.set("Authorization",`Bearer ${i}`),!s.headers.has(b$1)&&x!=="v1"&&(a||!S?s.headers.set(b$1,"global"):s.headers.set(b$1,encodeURIComponent(String(S))));}],beforeError:[async s=>{let{response:n}=s;if(n){let c=n.status,l;try{let u=n.headers.get("content-type")||"";(u.includes("application/json")||u.startsWith("text/"))&&(l=await n.clone().json());}catch{}B(c,l);}else t.error({message:"Network Error",description:s.message||"Network request failed"});return s}]}}),[e,i,a,S,x]),p=async(o,s,n,c)=>{let{responseType:l,...u}=c||{},d={...u,hooks:{...u.hooks,afterResponse:[...u.hooks?.afterResponse||[],F(l)]}},m;return n?m=await h(s,{method:o,json:n,...d}):m=await h(s,{method:o,...d}),oe(m,l)};return {get:(o,s)=>p("GET",o,void 0,s),post:(o,s,n)=>p("POST",o,s,n),put:(o,s,n)=>p("PUT",o,s,n),delete:(o,s)=>p("DELETE",o,void 0,s),patch:(o,s,n)=>p("PATCH",o,s,n),options:(o,s)=>p("OPTIONS",o,void 0,s),head:(o,s)=>p("HEAD",o,void 0,s),request:o=>{let{url:s,...n}=o;return p(n.method||"GET",s,void 0,n)},instance:h}};var Ve={permissions:{check:(e,t)=>["permissions","check",e,t],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,t)=>["roles","detail",e,t],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]}};export{P as a,Y as b,J as c,se as d,Ve as e};
@@ -0,0 +1 @@
1
+ import {d,a,e}from'./chunk-WHOTHZUW.js';import {b}from'./chunk-LRMME3YZ.js';import {useQuery}from'@tanstack/react-query';function K(e$1,s){let t=d(),{permissionVersion:n}=a(),o=n!=="v1"?"/api/usystem/user/checkV2":"/api/usystem/user/check",r=typeof e$1<"u"?typeof e$1=="string"?[e$1]:e$1:[],g=n!=="v1"?"v2":"v1",{data:i,...d$1}=useQuery({queryKey:r.length>0?e.permissions.check(r,g):["permissions","disabled"],queryFn:()=>t.post(o,{json:{permissions:r},...s}),enabled:r.length>0}),p=!0;return typeof e$1=="string"?p=i?.has_all?!0:i?.[e$1]??!1:Array.isArray(e$1)&&e$1.length>0&&(p=r.reduce((f,c)=>(f[c]=i?.has_all?!0:i?.[c]??!1,f),{})),{...d$1,data:p}}function v(){let{signInPath:e$1,gameId:s}=a(),t=d();return useQuery({queryKey:e.menus.navbar(s?String(s):void 0),queryFn:()=>t.get("/api/usystem/menu/navbar",{headers:{[b]:s?encodeURIComponent(String(s)):"global"}}),enabled:window.location.pathname!==e$1})}var w=()=>{let{gameApiV2:e$1,permissionVersion:s}=a(),t=d(),n=s!=="v1"?e$1?"/api/game/list":"/api/usystem/game/all":null;return useQuery({queryKey:e.enums.gameGroups,queryFn:async()=>{if(!n)return [];let o={headers:{[b]:"global"}};return e$1?(await t.get(n,o))?.list??[]:await t.get(n,o)??[]},enabled:!!n,staleTime:1/0})};export{K as a,v as b,w as c};
@@ -0,0 +1 @@
1
+ import {d,e,a}from'./chunk-WHOTHZUW.js';import {useQuery,useQueryClient,useMutation}from'@tanstack/react-query';function q(){let e$1=d();return useQuery({queryKey:e.roles.all,queryFn:()=>e$1.get("/api/usystem/role/all")})}function f(e$1){let t=a(o=>o.permissionVersion),r=d(),n=t==="v2"?"v2":"v1";return useQuery({queryKey:e.roles.detail(e$1,n),queryFn:()=>r.get(`/api/usystem/role/${n==="v2"?"infoV2":"info"}?name=${e$1}`)})}function v(){let{permissionVersion:e$1}=a(o=>o),t=d(),r=useQueryClient(),n=e$1==="v2"?"v2":"v1";return useMutation({mutationKey:e.roles.create(n),mutationFn:({name:o,permissions:y})=>t.post(n==="v2"?"/api/usystem/role/createV2":"/api/usystem/role/create",{name:o,permissions:y}),onSuccess:()=>{r.invalidateQueries({queryKey:e.roles.all});}})}function K(){let{permissionVersion:e$1}=a(o=>o),t=d(),r=useQueryClient(),n=e$1==="v2"?"v2":"v1";return useMutation({mutationKey:e.roles.update(n),mutationFn:({id:o,name:y,permissions:p})=>t.post(n==="v2"?"/api/usystem/role/updateV2":"/api/usystem/role/update",{id:o,name:y,permissions:p}),onSuccess:()=>{r.invalidateQueries({queryKey:e.roles.all});}})}function R(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.roles.delete,mutationFn:({id:r,name:n})=>e$1.post("/api/usystem/role/delete",{id:r,name:n}),onSuccess:()=>{t.invalidateQueries({queryKey:e.roles.all});}})}function k(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.create,mutationFn:r=>e$1.post("/api/usystem/user/create",r),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function x(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.update,mutationFn:r=>e$1.post("/api/usystem/user/update",r),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function F(){let e$1=d(),t=useQueryClient();return useMutation({mutationKey:e.users.delete,mutationFn:({id:r,name:n})=>e$1.post("/api/usystem/user/delete",{id:r,name:n}),onSuccess:()=>{t.invalidateQueries({queryKey:e.users.all});}})}function P(){let e$1=d();return useQuery({queryKey:e.permissions.allPermissions,queryFn:()=>e$1.get("/api/usystem/user/allPermssions"),staleTime:1/0})}function C(){let e$1=d();return useQuery({queryKey:e.permissions.allPermissionsV2,queryFn:()=>e$1.get("/api/usystem/user/allPermssionsV2"),staleTime:1/0})}export{q as a,f as b,v as c,K as d,R as e,k as f,x as g,F as h,P as i,C as j};