react-toolkits 2.25.0 → 2.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +5 -5
- package/lib/chunk-24U2EF5M.js +2 -0
- package/lib/chunk-24U2EF5M.js.map +1 -0
- package/lib/{chunk-GI5OS4VD.js → chunk-5QAEUAZE.js} +2 -2
- package/lib/{chunk-GI5OS4VD.js.map → chunk-5QAEUAZE.js.map} +1 -1
- package/lib/chunk-D5YXBSTI.js +2 -0
- package/lib/chunk-D5YXBSTI.js.map +1 -0
- package/lib/chunk-F2GDEOP4.js +3 -0
- package/lib/chunk-F2GDEOP4.js.map +1 -0
- package/lib/{chunk-742NAY4S.js → chunk-FIT6S4UM.js} +2 -2
- package/lib/{chunk-742NAY4S.js.map → chunk-FIT6S4UM.js.map} +1 -1
- package/lib/chunk-JDCSIJL7.js +2 -0
- package/lib/chunk-JDCSIJL7.js.map +1 -0
- package/lib/chunk-KZHYK554.js +2 -0
- package/lib/chunk-KZHYK554.js.map +1 -0
- package/lib/chunk-MVG7YFPB.js +2 -0
- package/lib/chunk-MVG7YFPB.js.map +1 -0
- package/lib/chunk-P5T74EXP.js +2 -0
- package/lib/{chunk-PLJPZJ7T.js.map → chunk-P5T74EXP.js.map} +1 -1
- package/lib/{createMenuItem-C7HUFDD4.js → createMenuItem-Q5TJGFKZ.js} +2 -2
- package/lib/{createMenuItem-C7HUFDD4.js.map → createMenuItem-Q5TJGFKZ.js.map} +1 -1
- package/lib/index.d.ts +83 -40
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/{menuItemList-2OFNRCPR.js → menuItemList-5QGQYB3N.js} +2 -2
- package/lib/{menuItemList-2OFNRCPR.js.map → menuItemList-5QGQYB3N.js.map} +1 -1
- package/lib/{roleDetail-YBO7TOL5.js → roleDetail-ODJVDVB4.js} +2 -2
- package/lib/{roleDetail-YBO7TOL5.js.map → roleDetail-ODJVDVB4.js.map} +1 -1
- package/lib/roleList-ATJYWJ6Q.js +2 -0
- package/lib/roleList-ATJYWJ6Q.js.map +1 -0
- package/lib/{updateMenuItem-23ZR4X2P.js → updateMenuItem-4HDRJAY7.js} +2 -2
- package/lib/{updateMenuItem-23ZR4X2P.js.map → updateMenuItem-4HDRJAY7.js.map} +1 -1
- package/lib/userDetail-B5H4A4X2.js +2 -0
- package/lib/userDetail-B5H4A4X2.js.map +1 -0
- package/lib/userList-7CQLR3HK.js +2 -0
- package/lib/userList-7CQLR3HK.js.map +1 -0
- package/locale/hooks.js +1 -1
- package/locale/hooks.js.map +1 -1
- package/package.json +12 -12
- package/lib/chunk-EESZYCYA.js +0 -2
- package/lib/chunk-EESZYCYA.js.map +0 -1
- package/lib/chunk-K43HSNXS.js +0 -2
- package/lib/chunk-K43HSNXS.js.map +0 -1
- package/lib/chunk-LEVOCZUQ.js +0 -2
- package/lib/chunk-LEVOCZUQ.js.map +0 -1
- package/lib/chunk-PLJPZJ7T.js +0 -2
- package/lib/chunk-V3YBDED3.js +0 -2
- package/lib/chunk-V3YBDED3.js.map +0 -1
- package/lib/chunk-VFRB44XY.js +0 -2
- package/lib/chunk-VFRB44XY.js.map +0 -1
- package/lib/chunk-W3E3WPLB.js +0 -3
- package/lib/chunk-W3E3WPLB.js.map +0 -1
- package/lib/roleList-UEZPNJ2L.js +0 -2
- package/lib/roleList-UEZPNJ2L.js.map +0 -1
- package/lib/userDetail-QZDRSIYE.js +0 -2
- package/lib/userDetail-QZDRSIYE.js.map +0 -1
- package/lib/userList-IBXB6M6R.js +0 -2
- package/lib/userList-IBXB6M6R.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# react-toolkits
|
|
2
2
|
|
|
3
|
+
## 2.26.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 68f200e: chore: update antd to version 6.0.0 and upgrade React dependencies
|
|
8
|
+
|
|
9
|
+
## 2.26.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 48be1d4: chore: update React and TypeScript dependencies, refactor context usage in components
|
|
14
|
+
- f75446d: refactor: update permission handling and improve component structure
|
|
15
|
+
|
|
3
16
|
## 2.25.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ import 'react-toolkits/style.css'
|
|
|
36
36
|
import { createRoot } from 'react-dom/client'
|
|
37
37
|
import { RouterProvider } from 'react-router-dom'
|
|
38
38
|
import { ToolkitsProvider } from 'react-toolkits/components'
|
|
39
|
-
import {
|
|
39
|
+
import { PermissionMode } from 'react-toolkits/constants'
|
|
40
40
|
|
|
41
41
|
import router from './router'
|
|
42
42
|
|
|
@@ -46,7 +46,7 @@ root.render(
|
|
|
46
46
|
<ToolkitsProvider
|
|
47
47
|
collapsible
|
|
48
48
|
gameApiV2
|
|
49
|
-
|
|
49
|
+
permissionMode={PermissionMode.GROUP_BASED}
|
|
50
50
|
loginPath="/sign_in"
|
|
51
51
|
mainPagePath="/"
|
|
52
52
|
>
|
|
@@ -59,7 +59,7 @@ root.render(
|
|
|
59
59
|
|
|
60
60
|
- **loginPath**: 登录页路径(未鉴权时会跳转)
|
|
61
61
|
- **mainPagePath**: 登录后主页路径(鉴权通过时进入)
|
|
62
|
-
- **
|
|
62
|
+
- **permissionMode**: 权限版本,建议使用 `PermissionMode.GROUP_BASED`
|
|
63
63
|
- **collapsible**: 侧边栏是否可折叠
|
|
64
64
|
- **gameApiV2**: 是否启用游戏相关 V2 接口适配(如不涉及可忽略)
|
|
65
65
|
- 其余高级配置见类型定义 `react-toolkits/components` 内导出的 Provider Props
|
|
@@ -70,7 +70,7 @@ root.render(
|
|
|
70
70
|
- `react-toolkits/hooks`:表单弹层 Hooks(如 `useFormDrawer`、`useFormModal`)
|
|
71
71
|
- `react-toolkits/pages`:内置页面与路由片段(如 `permissionRoutes`、`menuRoutes`、`SignIn`)
|
|
72
72
|
- `react-toolkits/services`:请求相关 Hooks(如 `useAuth`、`useMenuList`、`useGames`)
|
|
73
|
-
- `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`
|
|
73
|
+
- `react-toolkits/constants`:常量与枚举(如 `APP_ID_HEADER`、`PermissionMode`)
|
|
74
74
|
- `react-toolkits/types`:公共类型
|
|
75
75
|
- `react-toolkits/utils`:工具函数
|
|
76
76
|
- `react-toolkits/locale` 与 `react-toolkits/locale/*`:国际化资源与工具
|
|
@@ -325,7 +325,7 @@ import { useAuth } from 'react-toolkits/services'
|
|
|
325
325
|
|
|
326
326
|
### 权限版本兼容
|
|
327
327
|
|
|
328
|
-
- 历史上存在不同权限数据结构,`
|
|
328
|
+
- 历史上存在不同权限数据结构,`PermissionMode` 用于适配后端变体
|
|
329
329
|
- 新项目建议使用 `V3`;旧项目如为 `V2`,只需在 `ToolkitsProvider` 中切换版本
|
|
330
330
|
|
|
331
331
|
## 常见问题(FAQ)
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1,f,g}from'./chunk-KZHYK554.js';import {d}from'./chunk-5QAEUAZE.js';import {a}from'./chunk-D5YXBSTI.js';import {i,k,l}from'./chunk-F2GDEOP4.js';import {MinusCircleOutlined}from'@ant-design/icons';import {useQuery}from'@tanstack/react-query';import {Typography,App,Form,Input,Select,Row,Col,Empty,Button}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:M}=Typography,N=(m,a)=>{last(m)==="*"?a?.(["*"]):first(m)==="*"?a?.(m.slice(1)):a?.(m);},Z=m=>{let{onChange:a,...g}=m,o=k(),{data:u,isLoading:c}=useQuery({queryKey:l.enums.gameGroups,queryFn:()=>o.get("/api/enum/get?enum=game_group&type=all")}),C=[{label:"\u901A\u7528",value:"*"}].concat(u?.map(i=>({label:i,value:i}))??[]);return jsx(Select,{...g,allowClear:true,showSearch:true,mode:"tags",optionFilterProp:"label",loading:c,options:C,onChange:i=>N(i,a)})},E=m=>{let{groups:a,onChange:g,...o}=m,u=k(),{context:{permissionMode:c}}=i(),C=c==="group_based",i$1=c==="direct_game",{data:d,isLoading:G}=useQuery({queryKey:l.enums.gameIds(i$1?[]:a??[]),queryFn:()=>u.get(`/api/enum/game_group/get_game_ids${i$1?"":`?game_groups=${a?.join(",")}`}`).then(s=>s?.list),enabled:i$1||C&&!!a?.length}),y=d?.map(s=>({label:s.name,value:s.id}));return jsx(Select,{...o,allowClear:true,showSearch:true,optionFilterProp:"label",mode:"tags",loading:G,options:y,onChange:s=>N(s,g)})},ue=({mode:m,onSuccess:a$2})=>{let{message:g$1}=App.useApp(),{t:o}=a(),{data:u,isLoading:c}=a$1(),C=f(),i$1=g(),d$1=m==="create",G=o(d$1?"User.createTitle":"User.updateTitle"),{context:{permissionMode:y}}=i(),s=y==="group_based",I=y==="game_scoped",B=I?jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!d$1})}),jsx(Form.Item,{label:o("global.role"),name:"roles",children:jsx(Select,{allowClear:true,showSearch:true,mode:"multiple",loading:c,optionFilterProp:"label",options:u?.map(t=>({label:t.name,value:t.name}))})})]}):jsxs(Fragment,{children:[jsx(Form.Item,{label:o("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!d$1})}),jsx(Form.List,{name:"permissions",children:(t,{add:S,remove:b})=>jsxs(Row,{gutter:8,children:[s&&jsx(Col,{span:8,className:"text-center mb-4",children:jsx(M,{strong:true,children:o("global.projectGroup")})}),jsx(Col,{span:s?10:14,className:"text-center mb-4",children:jsx(M,{strong:true,children:o("global.game")})}),jsx(Col,{span:s?6:10,className:"text-center mb-4",children:jsx(M,{strong:true,children:o("global.role")})}),t.map(r=>jsxs(Fragment$1,{children:[s&&jsx(Col,{span:8,children:jsx(Form.Item,{noStyle:true,shouldUpdate:true,children:({setFieldValue:l})=>jsx(Form.Item,{name:[r.name,"game_group"],children:jsx(Z,{onChange:()=>{l(["permissions",r.name,"game_ids"],[]);}})})})}),jsx(Col,{span:s?10:14,children:s?jsx(Form.Item,{noStyle:true,shouldUpdate:(l,h)=>l.permissions[r.name]?.game_group!==h.permissions[r.name]?.game_group,children:({getFieldValue:l})=>{let h=l(["permissions",r.name,"game_group"]);return jsx(Form.Item,{name:[r.name,"game_ids"],dependencies:[["permissions",r.name,"game_group"]],rules:[{required:!!h?.length,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(E,{groups:h})})}}):jsx(Form.Item,{name:[r.name,"game_ids"],rules:[{required:true,message:"\u8BF7\u9009\u62E9\u6E38\u620F"}],children:jsx(E,{})})}),jsx(Col,{span:s?6:10,children:jsxs("div",{className:"flex",children:[jsx("div",{className:"flex-1",children:jsx(Form.Item,{name:[r.name,"role"],rules:[{required:true,message:"\u8BF7\u9009\u62E9\u89D2\u8272"},({getFieldValue:l})=>({validator(h,K){return (l("permissions")?.filter((U,O)=>!!U&&O!==r.name)??[]).some(U=>U.role===K)?Promise.reject(new Error("\u8BF7\u52FF\u91CD\u590D\u9009\u62E9\u89D2\u8272")):Promise.resolve()}})],children:jsx(Select,{allowClear:true,showSearch:true,optionFilterProp:"label",loading:c,options:u?.map(l=>({label:l.name,value:l.name}))})})}),jsx("div",{className:"w-8 text-center",children:jsx(Form.Item,{children:jsx(MinusCircleOutlined,{onClick:()=>{b(r.name);}})})})]})})]},r.key)),t.length===0&&jsx(Col,{span:24,children:jsx(Empty,{className:"mb-6"})}),jsx(Col,{span:24,children:jsx(Button,{block:true,type:"dashed",onClick:()=>S(),children:o("global.add")})})]})})]});return d({title:G,width:I?"600px":"1000px",formProps:{autoComplete:"off",labelCol:{flex:"80px"}},content:B,onConfirm:async(t,S)=>{if(d$1){let b=I?{name:t.name,roles:t.roles}:{name:t.name,permissions:t.permissions};await C.mutateAsync(b),g$1.success(o("User.createSuccessfully"));}else {let b=I?{id:S.id,name:t.name,roles:t.roles}:{id:S.id,name:t.name,permissions:t.permissions};await i$1.mutateAsync(b),g$1.success(o("User.updateSuccessfully"));}a$2?.();}})};export{ue as a};//# sourceMappingURL=chunk-24U2EF5M.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-24U2EF5M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/permission/hooks/user-hooks.tsx"],"names":["Text","Typography","handleWildcardSelection","value","onChange","last","first","GroupSelect","props","rest","ky","useKy","data","isLoading","useQuery","queryKeys","options","group","jsx","Select","GameSelect","groups","permissionMode","useToolkitsStore","isGroupBased","isDirectGame","response","useUserModal","mode","onSuccess","message","App","t","useTranslation","roles","isRolesLoading","useAllRoles","create","useCreateUser","update","useUpdateUser","isCreateMode","title","isGameScoped","content","jsxs","Fragment","Form","Input","role","fields","add","remove","Row","Col","field","setFieldValue","prevValues","nextValues","getFieldValue","_groups","_rule","item","index","MinusCircleOutlined","Empty","Button","useFormModal","values","extraValues","submitData"],"mappings":"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","file":"chunk-24U2EF5M.js","sourcesContent":["import { MinusCircleOutlined } from '@ant-design/icons'\nimport { useQuery } from '@tanstack/react-query'\nimport { App, Button, Col, Empty, Form, Input, Row, Select, Typography } from 'antd'\nimport { first, last } from 'lodash-es'\nimport { Fragment } from 'react'\nimport { type FC } from 'react'\n\nimport { useToolkitsStore } from '@/components'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { useFormModal } from '@/hooks/modal'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { queryKeys } from '@/queryKeys'\n\nimport { useAllRoles, useCreateUser, useUpdateUser } from '../services'\n\nconst { Text } = Typography\n\n/**\n * 处理通配符选择逻辑\n * - 如果最后选择的是通配符,则只保留通配符\n * - 如果第一个是通配符但又选择了其他项,则移除通配符\n */\nconst handleWildcardSelection = (value: string[], onChange?: (value: string[]) => void) => {\n if (last(value) === WILDCARD) {\n onChange?.([WILDCARD])\n } else if (first(value) === WILDCARD) {\n onChange?.(value.slice(1))\n } else {\n onChange?.(value)\n }\n}\n\ninterface GroupSelectProps {\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst GroupSelect: FC<GroupSelectProps> = props => {\n const { onChange, ...rest } = props\n const ky = useKy()\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameGroups,\n queryFn: () => ky.get<string[]>('/api/enum/get?enum=game_group&type=all'),\n })\n\n const options = [{ label: '通用', value: WILDCARD }].concat(\n data?.map(group => ({ label: group, value: group })) ?? [],\n )\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n mode=\"tags\"\n optionFilterProp=\"label\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface GameSelectProps {\n groups?: string[]\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\n/**\n * 游戏选择组件\n * - GROUP_BASED: 依赖 groups 参数,需要先选择项目组才能加载游戏列表\n * - DIRECT_GAME: 不依赖 groups,直接加载所有游戏列表\n */\nconst GameSelect: FC<GameSelectProps> = props => {\n const { groups, onChange, ...rest } = props\n const ky = useKy()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const isDirectGame = permissionMode === PermissionMode.DIRECT_GAME\n\n const { data, isLoading } = useQuery({\n queryKey: queryKeys.enums.gameIds(isDirectGame ? [] : (groups ?? [])),\n queryFn: () =>\n ky\n .get<{\n list: {\n id: string\n name: string\n }[]\n }>(`/api/enum/game_group/get_game_ids${isDirectGame ? '' : `?game_groups=${groups?.join(',')}`}`)\n .then(response => response?.list),\n enabled: isDirectGame || (isGroupBased && !!groups?.length),\n })\n\n const options = data?.map((group: { id: string; name: string }) => ({ label: group.name, value: group.id }))\n\n return (\n <Select\n {...rest}\n allowClear\n showSearch\n optionFilterProp=\"label\"\n mode=\"tags\"\n loading={isLoading}\n options={options}\n onChange={value => handleWildcardSelection(value, onChange)}\n />\n )\n}\n\ninterface UserModalFormSchema {\n name: string\n roles?: string[]\n permissions?: {\n game_group: string[]\n game_ids: string[]\n role: string\n }[]\n}\n\n/**\n * 用户弹窗(根据权限模式自动选择表单结构)\n * - GAME_SCOPED: 使用简单的 roles 字段\n * - GROUP_BASED: 使用 permissions 数组,显示项目组选择\n * - DIRECT_GAME: 使用 permissions 数组,隐藏项目组选择\n */\nexport const useUserModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const { data: roles, isLoading: isRolesLoading } = useAllRoles()\n const create = useCreateUser()\n const update = useUpdateUser()\n const isCreateMode = mode === 'create'\n const title = isCreateMode ? t('User.createTitle') : t('User.updateTitle')\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n const isGroupBased = permissionMode === PermissionMode.GROUP_BASED\n const isGameScoped = permissionMode === PermissionMode.GAME_SCOPED\n\n const content = isGameScoped ? (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n showSearch\n mode=\"multiple\"\n loading={isRolesLoading}\n optionFilterProp=\"label\"\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </>\n ) : (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.List name=\"permissions\">\n {(fields, { add, remove }) => (\n <Row gutter={8}>\n {isGroupBased && (\n <Col span={8} className=\"text-center mb-4\">\n <Text strong>{t('global.projectGroup')}</Text>\n </Col>\n )}\n <Col span={isGroupBased ? 10 : 14} className=\"text-center mb-4\">\n <Text strong>{t('global.game')}</Text>\n </Col>\n <Col span={isGroupBased ? 6 : 10} className=\"text-center mb-4\">\n <Text strong>{t('global.role')}</Text>\n </Col>\n {fields.map(field => (\n <Fragment key={field.key}>\n {isGroupBased && (\n <Col span={8}>\n <Form.Item noStyle shouldUpdate>\n {({ setFieldValue }) => (\n <Form.Item name={[field.name, 'game_group']}>\n <GroupSelect\n onChange={() => {\n setFieldValue(['permissions', field.name, 'game_ids'], [])\n }}\n />\n </Form.Item>\n )}\n </Form.Item>\n </Col>\n )}\n <Col span={isGroupBased ? 10 : 14}>\n {isGroupBased ? (\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, nextValues) =>\n prevValues.permissions[field.name]?.game_group !==\n nextValues.permissions[field.name]?.game_group\n }\n >\n {({ getFieldValue }) => {\n const _groups = getFieldValue(['permissions', field.name, 'game_group'])\n\n return (\n <Form.Item\n name={[field.name, 'game_ids']}\n dependencies={[['permissions', field.name, 'game_group']]}\n rules={[{ required: !!_groups?.length, message: '请选择游戏' }]}\n >\n <GameSelect groups={_groups} />\n </Form.Item>\n )\n }}\n </Form.Item>\n ) : (\n <Form.Item name={[field.name, 'game_ids']} rules={[{ required: true, message: '请选择游戏' }]}>\n <GameSelect />\n </Form.Item>\n )}\n </Col>\n <Col span={isGroupBased ? 6 : 10}>\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Form.Item\n name={[field.name, 'role']}\n rules={[\n { required: true, message: '请选择角色' },\n ({ getFieldValue }) => ({\n validator(_rule, value) {\n const items = getFieldValue('permissions') as UserModalFormSchema['permissions']\n const otherItems = items?.filter((item, index) => !!item && index !== field.name) ?? []\n if (otherItems.some(item => item.role === value)) {\n return Promise.reject(new Error('请勿重复选择角色'))\n }\n return Promise.resolve()\n },\n }),\n ]}\n >\n <Select\n allowClear\n showSearch\n optionFilterProp=\"label\"\n loading={isRolesLoading}\n options={roles?.map(role => ({ label: role.name, value: role.name }))}\n />\n </Form.Item>\n </div>\n <div className=\"w-8 text-center\">\n <Form.Item>\n <MinusCircleOutlined\n onClick={() => {\n remove(field.name)\n }}\n />\n </Form.Item>\n </div>\n </div>\n </Col>\n </Fragment>\n ))}\n {fields.length === 0 && (\n <Col span={24}>\n <Empty className=\"mb-6\" />\n </Col>\n )}\n <Col span={24}>\n <Button block type=\"dashed\" onClick={() => add()}>\n {t('global.add')}\n </Button>\n </Col>\n </Row>\n )}\n </Form.List>\n </>\n )\n\n const onConfirm = async (values: UserModalFormSchema, extraValues: { id: string }) => {\n if (isCreateMode) {\n // 根据权限模式构造正确的提交数据\n const submitData = isGameScoped\n ? { name: values.name, roles: values.roles! }\n : { name: values.name, permissions: values.permissions! }\n await create.mutateAsync(submitData)\n message.success(t('User.createSuccessfully'))\n } else {\n // 根据权限模式构造正确的提交数据\n const submitData = isGameScoped\n ? { id: extraValues.id, name: values.name, roles: values.roles! }\n : { id: extraValues.id, name: values.name, permissions: values.permissions! }\n await update.mutateAsync(submitData)\n message.success(t('User.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<UserModalFormSchema, { id: string }>({\n title,\n width: isGameScoped ? '600px' : '1000px',\n formProps: {\n autoComplete: 'off',\n labelCol: { flex: '80px' },\n },\n content,\n onConfirm,\n })\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a as a$2}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {a as a$2}from'./chunk-D5YXBSTI.js';import {a as a$1}from'./chunk-JDCSIJL7.js';import {a,b}from'./chunk-F2GDEOP4.js';import {Button,Tooltip,Modal,Form}from'antd';import {jsx,Fragment}from'react/jsx-runtime';import {useMemo,useEffect,useState,useCallback}from'react';var N=h=>{let{children:r,code:n,showLoading:l,disabled:a,config:x,...o}=h,c=n?Array.isArray(n)?n:[n]:[],{data:s,isLoading:d}=a$1(c,x),{t:e}=a$2(),V=s&&(typeof s=="boolean"||Object.values(s).some(Boolean)),p=a||!V||d&&!l,u=d&&l,m=p,f=jsx(Button,{disabled:p,loading:u,...o,children:r});return m?jsx(Tooltip,{defaultOpen:false,title:e("global.noEntitlement"),children:f}):f},j=N;var y=a();function w(h){let{content:r,onConfirm:n,afterOpen:l,afterClose:a,...x}=h,o=useMemo(()=>b(),[]);if(typeof y!="function")throw new Error(`useModalStore is not a function. This is likely a build or initialization issue. useModalStore type: ${typeof y}, value: ${String(y)}`);let{show:c,hide:s,isOpen:d,cleanup:e}=y();useEffect(()=>()=>{e(o);},[o,e]);let V=d(o),[p,u]=useState(false),m=typeof r=="function",f=useCallback(async()=>{c(o),await l?.();},[o,c,l]),i=useCallback(()=>{s(o);},[o,s]),t=useCallback(async()=>{i(),await a?.();},[i,a]),M=useCallback(async()=>{try{u(!0),await n?.(),i(),await a?.();}catch(b){throw console.error("Modal confirm error:",b),b}finally{u(false);}},[n,i,a]),P=jsx(Modal,{...x,open:V,confirmLoading:p,onOk:M,onCancel:t,children:m?jsx(Fragment,{children:r({hide:i})}):jsx(Fragment,{children:r})});return {id:o,show:f,hide:i,modal:P}}function z(h){let{content:r,form:n,formProps:l,onConfirm:a,onSuccess:x,afterClose:o,...c}=h,[s,d]=useState({}),[e]=Form.useForm(n),V=typeof r=="function",{id:p,show:u,hide:m,modal:f}=w({...c,content:t=>jsx(Form,{...l,form:e,children:V?jsx(Fragment,{children:r(s,t)}):jsx(Fragment,{children:r})}),onConfirm:async()=>{try{let t=await e.validateFields();await a?.(t,s),x?.(),m();}catch(t){throw console.error("Form validation or submission error:",t),t}},afterClose:()=>{d({}),o?.(e);}}),i=useCallback(t=>{let{initialValues:M,extraValues:P}=t||{};P!==void 0&&d(P),M&&e.setFieldsValue(M),u();},[e,u]);return {id:p,show:i,hide:m,modal:f}}export{j as a,y as b,w as c,z as d};//# sourceMappingURL=chunk-5QAEUAZE.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-5QAEUAZE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/authButton/AuthButton.tsx","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx"],"names":["AuthButton","props","children","code","showLoading","disabled","config","restProps","codes","data","isLoading","useAuth","t","useTranslation","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","jsx","Button","Tooltip","AuthButton_default","useModalStore","createVisibilityStore","useModal","content","onConfirm","afterOpen","afterClose","modalProps","_id","useMemo","generateId","show","hide","isOpen","cleanup","useEffect","open","confirmLoading","setConfirmLoading","useState","isRenderFunction","_show","useCallback","_hide","onCancel","onOk","error","internalModal","Modal","Fragment","useFormModal","form","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","Form","id","modal","operation","values","showForm","options","initialValues","extraValues"],"mappings":"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","file":"chunk-GI5OS4VD.js","sourcesContent":["import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface AuthButtonProps extends ButtonProps {\n /** 权限码,支持单个或多个 */\n code?: string | string[]\n /** 加载时是否显示 loading 状态 */\n showLoading?: boolean\n /** 请求配置 */\n config?: KyOptions\n}\n\n/**\n * 授权按钮组件\n * 根据权限码自动控制按钮的启用/禁用状态\n * - 有权限:正常显示可点击按钮\n * - 无权限:显示禁用按钮并带有提示\n * - 加载中:显示加载状态\n */\nconst AuthButton: FC<PropsWithChildren<AuthButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = useAuth(codes, config)\n const { t } = useTranslation()\n\n // 判断是否有权限\n const hasPermission = data && (typeof data === 'boolean' || Object.values(data).some(Boolean))\n\n // 计算最终的禁用状态和加载状态\n const isButtonDisabled = disabled || !hasPermission || (isLoading && !showLoading)\n const isButtonLoading = isLoading && showLoading\n\n // 判断是否需要显示 tooltip(任何禁用状态都显示)\n const shouldShowTooltip = isButtonDisabled\n\n const buttonNode = (\n <Button disabled={isButtonDisabled} loading={isButtonLoading} {...restProps}>\n {children}\n </Button>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n {buttonNode}\n </Tooltip>\n )\n }\n\n return buttonNode\n}\n\nexport default AuthButton\n","import { createVisibilityStore } from '@/utils'\n\nexport const useModalStore = createVisibilityStore()\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n\n const _id = useMemo(() => generateId(), [])\n\n // 防御性检查\n if (typeof useModalStore !== 'function') {\n throw new Error(\n 'useModalStore is not a function. This is likely a build or initialization issue. ' +\n `useModalStore type: ${typeof useModalStore}, value: ${String(useModalStore)}`,\n )\n }\n\n const { show, hide, isOpen, cleanup } = useModalStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onCancel: ModalProps['onCancel'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const onOk = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n _hide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm, _hide, afterClose])\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Modal>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n modal,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/authButton/AuthButton.tsx","../src/hooks/modal/stores.ts","../src/hooks/modal/modal.tsx","../src/hooks/modal/formModal.tsx"],"names":["AuthButton","props","children","code","showLoading","disabled","config","restProps","codes","data","isLoading","useAuth","t","useTranslation","hasPermission","isButtonDisabled","isButtonLoading","shouldShowTooltip","buttonNode","jsx","Button","Tooltip","AuthButton_default","useModalStore","createVisibilityStore","useModal","content","onConfirm","afterOpen","afterClose","modalProps","_id","useMemo","generateId","show","hide","isOpen","cleanup","useEffect","open","confirmLoading","setConfirmLoading","useState","isRenderFunction","_show","useCallback","_hide","onCancel","onOk","error","internalModal","Modal","Fragment","useFormModal","form","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","Form","id","modal","operation","values","showForm","options","initialValues","extraValues"],"mappings":"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","file":"chunk-5QAEUAZE.js","sourcesContent":["import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface AuthButtonProps extends ButtonProps {\n /** 权限码,支持单个或多个 */\n code?: string | string[]\n /** 加载时是否显示 loading 状态 */\n showLoading?: boolean\n /** 请求配置 */\n config?: KyOptions\n}\n\n/**\n * 授权按钮组件\n * 根据权限码自动控制按钮的启用/禁用状态\n * - 有权限:正常显示可点击按钮\n * - 无权限:显示禁用按钮并带有提示\n * - 加载中:显示加载状态\n */\nconst AuthButton: FC<PropsWithChildren<AuthButtonProps>> = props => {\n const { children, code, showLoading, disabled, config, ...restProps } = props\n const codes = code ? (Array.isArray(code) ? code : [code]) : []\n const { data, isLoading } = useAuth(codes, config)\n const { t } = useTranslation()\n\n // 判断是否有权限\n const hasPermission = data && (typeof data === 'boolean' || Object.values(data).some(Boolean))\n\n // 计算最终的禁用状态和加载状态\n const isButtonDisabled = disabled || !hasPermission || (isLoading && !showLoading)\n const isButtonLoading = isLoading && showLoading\n\n // 判断是否需要显示 tooltip(任何禁用状态都显示)\n const shouldShowTooltip = isButtonDisabled\n\n const buttonNode = (\n <Button disabled={isButtonDisabled} loading={isButtonLoading} {...restProps}>\n {children}\n </Button>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n {buttonNode}\n </Tooltip>\n )\n }\n\n return buttonNode\n}\n\nexport default AuthButton\n","import { createVisibilityStore } from '@/utils'\n\nexport const useModalStore = createVisibilityStore()\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useModalStore } from './stores'\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n}\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, afterOpen, afterClose, ...modalProps } = props\n\n const _id = useMemo(() => generateId(), [])\n\n // 防御性检查\n if (typeof useModalStore !== 'function') {\n throw new Error(\n 'useModalStore is not a function. This is likely a build or initialization issue. ' +\n `useModalStore type: ${typeof useModalStore}, value: ${String(useModalStore)}`,\n )\n }\n\n const { show, hide, isOpen, cleanup } = useModalStore()\n\n // 组件销毁时清理 ID\n useEffect(() => {\n return () => {\n cleanup(_id)\n }\n }, [_id, cleanup])\n\n const open = isOpen(_id)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const isRenderFunction = typeof content === 'function'\n\n const _show = useCallback(async () => {\n show(_id)\n await afterOpen?.()\n }, [_id, show, afterOpen])\n\n const _hide = useCallback(() => {\n hide(_id)\n }, [_id, hide])\n\n const onCancel: ModalProps['onCancel'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const onOk = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n _hide()\n await afterClose?.()\n } catch (error) {\n console.error('Modal confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm, _hide, afterClose])\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Modal>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { ReactNode } from 'react'\nimport { useCallback, useState } from 'react'\n\nimport type { RecursivePartial } from '@/types'\n\nimport { useModal, type UseModalOperation, type UseModalProps } from './modal'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormModalProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseModalProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormModalReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n modal: ReactNode\n}\n\nexport function useFormModal<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n): UseFormModalReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n const [internalForm] = Form.useForm<Values>(form)\n\n const isRenderFunction = typeof content === 'function'\n\n const { id, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? <>{content(internalExtraValues, operation)}</> : <>{content}</>}\n </Form>\n ),\n onConfirm: async () => {\n try {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues)\n onSuccess?.()\n hide()\n } catch (error) {\n console.error('Form validation or submission error:', error)\n throw error\n }\n },\n afterClose: () => {\n setInternalExtraValues({} as ExtraValues)\n afterClose?.(internalForm)\n },\n })\n\n const showForm = useCallback(\n (options?: ShowFormOptions<Values, ExtraValues>) => {\n const { initialValues, extraValues } = options || {}\n\n if (extraValues !== undefined) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n },\n [internalForm, show],\n )\n\n return {\n id,\n show: showForm,\n hide,\n modal,\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {i}from'./chunk-F2GDEOP4.js';import {template,has,get}from'lodash-es';import {useMemo}from'react';function l(){let{context:{locale:e}}=i();return {t:useMemo(()=>(t,r)=>has(e,t)?template(get(e,t))(r):t,[e])}}export{l as a};//# sourceMappingURL=chunk-D5YXBSTI.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-D5YXBSTI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/locale/hooks.ts"],"names":["useTranslation","locale","useToolkitsStore","useMemo","key","data","has","template","get"],"mappings":"yGAmBO,SAASA,CAAAA,EAAiB,CAC/B,GAAM,CACJ,OAAA,CAAS,CAAE,MAAA,CAAAC,CAAO,CACpB,CAAA,CAAIC,CAAAA,EAAiB,CAQrB,OAAO,CAAE,CAAA,CANCC,QACR,IAAM,CAACC,EAAoBC,CAAAA,GACzBC,GAAAA,CAAIL,CAAAA,CAAQG,CAAG,CAAA,CAAIG,QAAAA,CAASC,IAAIP,CAAAA,CAAQG,CAAa,CAAC,CAAA,CAAEC,CAAI,CAAA,CAAID,EAClE,CAACH,CAAM,CACT,CAEW,CACb","file":"chunk-D5YXBSTI.js","sourcesContent":["import { get, has, template } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport type { Locale } from './index'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const {\n context: { locale },\n } = useToolkitsStore()\n\n const t = useMemo(\n () => (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key,\n [locale],\n )\n\n return { t }\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {create,useStore,createStore}from'zustand';import {App}from'antd';import {createContext,useContext,useRef,useMemo}from'react';import {persist,createJSONStorage}from'zustand/middleware';import {jwtDecode}from'jwt-decode';import {jsx,Fragment}from'react/jsx-runtime';import {useQueryClient}from'@tanstack/react-query';import ce from'ky';import {useNavigate}from'react-router-dom';function B(){return create()((e,t)=>({open:new Map,usedIds:new Set,isOpen(o){return t().open.get(o)??false},show(o){e({open:new Map(t().open).set(o,true)});},hide(o){e({open:new Map(t().open).set(o,false)});},hideAll(){e({open:new Map});},checkUniqueness(o){return !t().usedIds.has(o)},registerIds(o){let{usedIds:n}=t();return n.has(o)?false:(e({usedIds:new Set(n).add(o)}),true)},cleanup(o){let{open:n,usedIds:a}=t(),i=new Map(n),d=new Set(a);i.delete(o),d.delete(o),e({open:i,usedIds:d});}}))}var j=0,z=()=>{let e=Date.now(),t=Math.floor(Math.random()*1e3),o=++j%1e3;return e*1e6+t*1e3+o};var R={getItem(e){return sessionStorage.getItem(e)??localStorage.getItem(e)},setItem(e,t){sessionStorage.setItem(e,t),localStorage.setItem(e,t);},removeItem(e){sessionStorage.removeItem(e),localStorage.removeItem(e);}};var qe="https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1",h="App-ID",Ae="/console/",H=(n=>(n.GAME_SCOPED="game_scoped",n.GROUP_BASED="group_based",n.DIRECT_GAME="direct_game",n))(H||{}),Me="*";var V={global:{noEntitlement:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",name:"\u540D\u79F0",creationTime:"\u521B\u5EFA\u65F6\u95F4",operation:"\u64CD\u4F5C",update:"\u66F4\u65B0",edit:"\u7F16\u8F91",delete:"\u5220\u9664",selectAll:"\u5168\u9009",game:"\u6E38\u620F",user:"\u7528\u6237",role:"\u89D2\u8272",username:"\u7528\u6237\u540D",password:"\u5BC6\u7801",label:"\u6807\u7B7E",method:"\u65B9\u6CD5",route:"\u8DEF\u7531",request:"\u8BF7\u6C42",response:"\u54CD\u5E94",add:"\u6DFB\u52A0",signIn:"\u767B\u5F55",projectGroup:"\u9879\u76EE\u7EC4",view:"\u67E5\u770B",back:"\u8FD4\u56DE"},SignIn:{title:"\u767B\u5F55\u65B9\u5F0F",signInWithIDass:"IDass \u767B\u5F55",unregistered:"\u60A8\u8FD8\u672A\u5728\u5E73\u53F0\u6CE8\u518C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",welcome:"\u6B22\u8FCE"},NotFound:{subTitle:"\u8BBF\u95EE\u7684\u9875\u9762\u4E0D\u5B58\u5728",buttonText:"\u8FD4\u56DE\u9996\u9875"},FilterFormWrapper:{confirmText:"\u67E5\u8BE2",resetText:"\u91CD\u7F6E"},FormModal:{confirmText:"\u786E\u8BA4",cancelText:"\u53D6\u6D88"},GameSelect:{label:"\u5F53\u524D\u6E38\u620F",placeholder:"\u8BF7\u9009\u62E9\u6E38\u620F"},RequireGame:{description:"\u8BF7\u9009\u62E9\u6E38\u620F"},UserDropdown:{signOutText:"\u767B\u51FA"},User:{createTitle:"\u521B\u5EFA\u7528\u6237",createSuccessfully:"\u7528\u6237\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u7528\u6237",updateSuccessfully:"\u7528\u6237\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u7528\u6237",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u7528\u6237 <%= user %> \u5417\uFF1F",deleteSuccessfully:"\u7528\u6237\u5220\u9664\u6210\u529F"},Role:{createTitle:"\u521B\u5EFA\u89D2\u8272",createSuccessfully:"\u89D2\u8272\u521B\u5EFA\u6210\u529F",updateTitle:"\u66F4\u65B0\u89D2\u8272",updateSuccessfully:"\u89D2\u8272\u66F4\u65B0\u6210\u529F",deleteTitle:"\u5220\u9664\u89D2\u8272",deleteContent:"\u786E\u5B9A\u8981\u5220\u9664\u89D2\u8272 <%= role %> \u5417\uFF1F",deleteSuccessfully:"\u89D2\u8272\u5220\u9664\u6210\u529F"},PermissionList:{failedDescription:"\u83B7\u53D6\u6743\u9650\u5217\u8868\u5931\u8D25",baseSectionTitle:"\u5E73\u53F0\u57FA\u7840\u6743\u9650",gameSectionTitle:"\u6E38\u620F\u6743\u9650",gameSectionDescription:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",gameSelectPlaceholder:"\u8BF7\u5148\u9009\u62E9\u6E38\u620F",removeText:"\u79FB\u9664",addText:"\u6DFB\u52A0\u6E38\u620F\u6743\u9650"},RoleDetail:{title:"\u89D2\u8272\u8BE6\u60C5"},InfiniteList:{loadingText:"\u52A0\u8F7D\u4E2D",reachEndText:"\u5DF2\u7ECF\u5230\u5E95\u4E86",loadMoreText:"\u52A0\u8F7D\u66F4\u591A"}},v=V;var W={locale:v,useGameApiV2:false,isGlobalMode:false,gameScoped:false,loginPath:"/sign_in",homePath:"/",permissionMode:"game_scoped",sidebarWidth:250},U=()=>({...W});var D=e=>({setAppId:t=>e(()=>({appId:t}))});var q=e=>({collapsed:false,toggleCollapsed:()=>e(t=>({collapsed:!t.collapsed}))});var $=e=>{if(!e)return null;try{return jwtDecode(e)}catch{return null}},A=e=>({token:void 0,user:null,setToken:t=>e(()=>({token:t,user:$(t)})),clearToken:()=>e(()=>({token:void 0,user:null}))});function Y(e,t,o){return {set:(i,d)=>{if(d){let c=typeof i=="function"?i(t()[o]):i;e({...t(),[o]:c},true);}else e(typeof i=="function"?c=>{let S={...c[o],...i(c[o])};return {[o]:S}}:c=>{let S={...c[o],...i};return {[o]:S}});},get:()=>t()[o]}}var M=e=>createStore()(persist((t,o,n)=>{let a=(y,g)=>{let x=Y(t,o,y),b=n;return g(x.set,x.get,b)},i=a("token",A),d=a("game",D),c=a("layout",q);return {context:{...a("context",U),...e},token:i,game:d,layout:c,clear:()=>{o().token.clearToken(),n.persist.clearStorage();}}},{name:"ToolkitsStore",storage:createJSONStorage(()=>R),partialize:t=>({token:t.token.token,appId:t.game.appId,user:t.token.user,collapsed:t.layout.collapsed}),merge:(t,o)=>{let{token:n,user:a,appId:i,collapsed:d}=t;return {...o,token:{...o.token,token:n,user:a},game:{...o.game,appId:i},layout:{...o.layout,collapsed:d??o.layout.collapsed}}}}));var w=createContext(null);function O(e){let t=useContext(w);if(!t){let n=new Error().stack?.split(`
|
|
2
|
+
`)[2]?.trim()||"Unknown";throw new Error(`Missing ToolkitsProvider in the tree. Component "${n}" must be wrapped with <ToolkitsProvider>. Please ensure ToolkitsProvider is rendered above this component in the component tree.`)}return useStore(t,e??(o=>o))}var re=e=>{let{children:t,...o}=e,n=useRef(void 0),a=useContext(w);if(!n.current){let i=a?.getState().context??{};n.current=M({...i,...o});}if(!n.current.getState().context.loginPath)throw new Error('ToolkitsProvider: \u8BF7\u914D\u7F6E "loginPath"');return jsx(w.Provider,{value:n.current,children:jsx(App,{children:jsx(Fragment,{children:t})})})},ne=re;var E=[0,1,200],P={OK:200,UNAUTHORIZED:401,FORBIDDEN:403,UNREGISTERED:412},de=3e4,K=e=>!e||typeof e!="object"?"Unknown error":e.msg||e.message||e.error||"Unknown error",me=e=>{let{value:t,allowedCodes:o}=e;return t==null||typeof t!="number"?false:o.includes(t)},Se=(e,t)=>{if(t<P.OK||t>=300)return false;if(!e||typeof e!="object")return true;let o=[{field:"code",value:e.code,allowedCodes:E},{field:"status",value:e.status,allowedCodes:E},{field:"errno",value:e.errno,allowedCodes:E}];return o.some(a=>a.value!==void 0&&a.value!==null)?o.every(a=>a.value===void 0||a.value===null||me(a)):true},Te=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()}},fe=e=>{let{baseURL:t}=e||{},{notification:o}=App.useApp(),n=useNavigate(),a=useQueryClient(),{token:{token:i},context:{isGlobalMode:d,loginPath:c,apiBaseUrl:S},game:{appId:y},clear:g}=O(),x=()=>{g(),a.clear(),n(c);},b=()=>{if(g(),a.clear(),c){let s=new URL(c,window.location.origin);s.searchParams.set("unregistered","true"),n(s.toString());}},_=()=>{o.error({message:"\u8BBF\u95EE\u88AB\u7981\u6B62",description:"\u60A8\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6B64\u8D44\u6E90\u3002"});},N=s=>async(r,l,u)=>{if(s==="blob"||s==="arrayBuffer"||s==="text"||s==="formData")return u;let p;try{p=await u.clone().json();}catch{return u}if(Se(p,u.status)){let k=p.data!==void 0?p.data:p;return new Response(JSON.stringify(k),{status:u.status,statusText:u.statusText,headers:u.headers})}let T=K(p);o.error({message:"Request failed",description:T});let f=new Error(T);throw f.response=u,f.data=p,f},L=(s,r)=>{switch(s){case P.UNAUTHORIZED:x();break;case P.UNREGISTERED:b();break;case P.FORBIDDEN:_();break;default:{let l=K(r)||`HTTP ${s} Error`;o.error({message:"Request failed",description:l});break}}},C=useMemo(()=>ce.create({prefixUrl:t??S,retry:0,timeout:de,headers:{Accept:"application/json","Content-Type":"application/json"},hooks:{beforeRequest:[s=>{i&&s.headers.set("Authorization",`Bearer ${i}`),s.headers.has(h)||(d||!y?s.headers.set(h,"global"):s.headers.set(h,encodeURIComponent(String(y))));}],beforeError:[async s=>{let{response:r}=s;if(r){let l=r.status,u;try{let p=r.headers.get("content-type")||"";(p.includes("application/json")||p.startsWith("text/"))&&(u=await r.clone().json());}catch{}L(l,u);}else o.error({message:"Network Error",description:s.message||"Network request failed"});return s}]}}),[t,i,d,y,o,c,g,a,S]),m=async(s,r,l,u)=>{let{responseType:p,...T}=u||{},f={...T,hooks:{...T.hooks,afterResponse:[...T.hooks?.afterResponse||[],N(p)]}},k;return l?k=await C(r,{method:s,json:l,...f}):k=await C(r,{method:s,...f}),Te(k,p)};return {get:(s,r)=>m("GET",s,void 0,r),post:(s,r,l)=>m("POST",s,r,l),put:(s,r,l)=>m("PUT",s,r,l),delete:(s,r)=>m("DELETE",s,void 0,r),patch:(s,r,l)=>m("PATCH",s,r,l),options:(s,r)=>m("OPTIONS",s,void 0,r),head:(s,r)=>m("HEAD",s,void 0,r),request:s=>{let{url:r,...l}=s;return m(l.method||"GET",r,void 0,l)},instance:C}};var ft={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]},games:{all:["games","all"]},auth:{ticketLogin:e=>["auth","ticket-login",e]}};export{B as a,z as b,R as c,qe as d,h as e,Ae as f,H as g,Me as h,O as i,ne as j,fe as k,ft as l};//# sourceMappingURL=chunk-F2GDEOP4.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-F2GDEOP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/createVisibilityStore.ts","../src/utils/generateId.ts","../src/utils/mixedStorage.ts","../src/constants/index.ts","../src/locale/zh_CN.ts","../src/stores/context.ts","../src/stores/game.ts","../src/stores/layout.ts","../src/stores/token.ts","../src/stores/index.ts","../src/components/toolkitsProvider/ToolkitsProvider.tsx","../src/libs/ky.ts","../src/queryKeys.ts"],"names":["createVisibilityStore","create","set","get","uuid","usedIds","open","newOpen","newUsedIds","globalCounter","generateId","timestamp","random","counter","mixedStorage","name","value","SSO_URL","APP_ID_HEADER","FRONTEND_ROUTE_PREFIX","PermissionMode","WILDCARD","locale","zh_CN_default","defaultContextSlice","createContextSlice","createGameSlice","id","createLayoutSlice","s","decodeToken","token","jwtDecode","createTokenSlice","createSliceAdapter","key","partial","replace","update","state","updated","createToolkitsStore","initProps","createStore","persist","store","createSlice","creator","adapter","sliceStore","tokenSlice","gameSlice","layoutSlice","createJSONStorage","persistedState","currentState","user","appId","collapsed","ToolkitsContext","createContext","useToolkitsStore","selector","useContext","componentName","useStore","ToolkitsProvider","props","children","restProps","storeRef","useRef","parentStore","parentContext","jsx","App","Fragment","ToolkitsProvider_default","SUCCESS_RESPONSE_CODES","HTTP_STATUS","REQUEST_TIMEOUT","extractErrorMessage","data","isStatusCodeSuccess","config","allowedCodes","isSuccessResponse","status","statusChecks","processResponseByType","response","responseType","useKy","baseURL","notification","navigate","useNavigate","queryClient","useQueryClient","isGlobalMode","loginPath","apiBaseUrl","clear","handleUnauthorized","handleUnregistered","url","handleForbidden","createResponseHandler","_request","_options","responseData","errorMessage","error","handleHttpStatusError","instance","useMemo","ky","request","contentType","makeRequest","method","requestOptions","kyOptions","finalOptions","options","requestOpts","queryKeys","permissions","mode","gameGroups","ticket"],"mappings":"iYAmBO,SAASA,GAAwB,CACtC,OAAOC,MAAAA,EAAwB,CAAE,CAACC,CAAAA,CAAKC,KAAS,CAC9C,IAAA,CAAM,IAAI,GAAA,CACV,OAAA,CAAS,IAAI,IACb,MAAA,CAAOC,CAAAA,CAAM,CACX,OAAOD,CAAAA,EAAI,CAAE,KAAK,GAAA,CAAIC,CAAI,GAAK,KACjC,CAAA,CACA,KAAKA,CAAAA,CAAM,CACTF,CAAAA,CAAI,CAAE,IAAA,CAAM,IAAI,IAAIC,CAAAA,EAAI,CAAE,IAAI,CAAA,CAAE,GAAA,CAAIC,CAAAA,CAAM,IAAI,CAAE,CAAC,EACnD,CAAA,CACA,IAAA,CAAKA,CAAAA,CAAM,CACTF,CAAAA,CAAI,CAAE,KAAM,IAAI,GAAA,CAAIC,GAAI,CAAE,IAAI,CAAA,CAAE,GAAA,CAAIC,CAAAA,CAAM,KAAK,CAAE,CAAC,EACpD,CAAA,CACA,OAAA,EAAU,CACRF,CAAAA,CAAI,CAAE,IAAA,CAAM,IAAI,GAAM,CAAC,EACzB,CAAA,CACA,gBAAgBE,CAAAA,CAAM,CACpB,OAAO,CAACD,CAAAA,GAAM,OAAA,CAAQ,GAAA,CAAIC,CAAI,CAChC,CAAA,CACA,WAAA,CAAYA,EAAM,CAChB,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAIF,GAAI,CACxB,OAAIE,CAAAA,CAAQ,GAAA,CAAID,CAAI,CAAA,CAAU,OAE9BF,CAAAA,CAAI,CAAE,QAAS,IAAI,GAAA,CAAIG,CAAO,CAAA,CAAE,GAAA,CAAID,CAAI,CAAE,CAAC,CAAA,CACpC,KACT,CAAA,CACA,OAAA,CAAQA,CAAAA,CAAM,CACZ,GAAM,CAAE,KAAAE,CAAAA,CAAM,OAAA,CAAAD,CAAQ,CAAA,CAAIF,CAAAA,EAAI,CACxBI,EAAU,IAAI,GAAA,CAAID,CAAI,CAAA,CACtBE,CAAAA,CAAa,IAAI,GAAA,CAAIH,CAAO,CAAA,CAClCE,CAAAA,CAAQ,MAAA,CAAOH,CAAI,EACnBI,CAAAA,CAAW,MAAA,CAAOJ,CAAI,CAAA,CACtBF,CAAAA,CAAI,CAAE,KAAMK,CAAAA,CAAS,OAAA,CAASC,CAAW,CAAC,EAC5C,CACF,EAAE,CACJ,KClDIC,CAAAA,CAAgB,CAAA,CAEPC,EAAa,IAAc,CACtC,IAAMC,CAAAA,CAAY,IAAA,CAAK,GAAA,GACjBC,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAI,GAAI,CAAA,CACxCC,CAAAA,CAAU,EAAEJ,CAAAA,CAAgB,GAAA,CAIlC,OAAOE,EAAY,GAAA,CAAUC,CAAAA,CAAS,IAAOC,CAC/C,MCNaC,CAAAA,CAA6B,CACxC,OAAA,CAAQC,CAAAA,CAAM,CACZ,OAAO,eAAe,OAAA,CAAQA,CAAI,CAAA,EAAK,YAAA,CAAa,OAAA,CAAQA,CAAI,CAClE,CAAA,CACA,OAAA,CAAQA,CAAAA,CAAMC,CAAAA,CAAO,CACnB,cAAA,CAAe,QAAQD,CAAAA,CAAMC,CAAK,EAClC,YAAA,CAAa,OAAA,CAAQD,EAAMC,CAAK,EAClC,CAAA,CACA,UAAA,CAAWD,CAAAA,CAAM,CACf,eAAe,UAAA,CAAWA,CAAI,CAAA,CAC9B,YAAA,CAAa,UAAA,CAAWA,CAAI,EAC9B,CACF,ECpBO,IAAME,EAAAA,CAAU,yEAAA,CAEVC,CAAAA,CAAgB,SAEhBC,EAAAA,CAAwB,WAAA,CAQzBC,OAEVA,CAAAA,CAAA,WAAA,CAAc,cAEdA,CAAAA,CAAA,WAAA,CAAc,aAAA,CAEdA,CAAAA,CAAA,WAAA,CAAc,aAAA,CANJA,OAAA,EAAA,CAAA,CASCC,EAAAA,CAAW,ICnBxB,IAAMC,CAAAA,CAAiB,CACrB,MAAA,CAAQ,CACN,aAAA,CAAe,8DAAA,CACf,IAAA,CAAM,cAAA,CACN,YAAA,CAAc,0BAAA,CACd,UAAW,cAAA,CACX,MAAA,CAAQ,eACR,IAAA,CAAM,cAAA,CACN,OAAQ,cAAA,CACR,SAAA,CAAW,cAAA,CACX,IAAA,CAAM,cAAA,CACN,IAAA,CAAM,eACN,IAAA,CAAM,cAAA,CACN,QAAA,CAAU,oBAAA,CACV,QAAA,CAAU,cAAA,CACV,MAAO,cAAA,CACP,MAAA,CAAQ,cAAA,CACR,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,eACT,QAAA,CAAU,cAAA,CACV,IAAK,cAAA,CACL,MAAA,CAAQ,eACR,YAAA,CAAc,oBAAA,CACd,IAAA,CAAM,cAAA,CACN,IAAA,CAAM,cACR,EACA,MAAA,CAAQ,CACN,KAAA,CAAO,0BAAA,CACP,eAAA,CAAiB,oBAAA,CACjB,aAAc,4FAAA,CACd,OAAA,CAAS,cACX,CAAA,CACA,QAAA,CAAU,CACR,SAAU,kDAAA,CACV,UAAA,CAAY,0BACd,CAAA,CACA,iBAAA,CAAmB,CACjB,WAAA,CAAa,cAAA,CACb,SAAA,CAAW,cACb,CAAA,CACA,SAAA,CAAW,CACT,WAAA,CAAa,cAAA,CACb,UAAA,CAAY,cACd,CAAA,CACA,UAAA,CAAY,CACV,KAAA,CAAO,0BAAA,CACP,WAAA,CAAa,gCACf,CAAA,CACA,WAAA,CAAa,CACX,WAAA,CAAa,gCACf,EACA,YAAA,CAAc,CACZ,YAAa,cACf,CAAA,CACA,IAAA,CAAM,CACJ,WAAA,CAAa,0BAAA,CACb,mBAAoB,sCAAA,CACpB,WAAA,CAAa,0BAAA,CACb,kBAAA,CAAoB,sCAAA,CACpB,WAAA,CAAa,2BACb,aAAA,CAAe,qEAAA,CACf,kBAAA,CAAoB,sCACtB,CAAA,CACA,IAAA,CAAM,CACJ,WAAA,CAAa,0BAAA,CACb,mBAAoB,sCAAA,CACpB,WAAA,CAAa,2BACb,kBAAA,CAAoB,sCAAA,CACpB,WAAA,CAAa,0BAAA,CACb,aAAA,CAAe,qEAAA,CACf,mBAAoB,sCACtB,CAAA,CACA,cAAA,CAAgB,CACd,iBAAA,CAAmB,kDAAA,CACnB,iBAAkB,sCAAA,CAClB,gBAAA,CAAkB,0BAAA,CAClB,sBAAA,CAAwB,sCAAA,CACxB,qBAAA,CAAuB,uCACvB,UAAA,CAAY,cAAA,CACZ,QAAS,sCACX,CAAA,CACA,WAAY,CACV,KAAA,CAAO,0BACT,CAAA,CACA,YAAA,CAAc,CACZ,YAAa,oBAAA,CACb,YAAA,CAAc,gCAAA,CACd,YAAA,CAAc,0BAChB,CACF,EAEOC,CAAAA,CAAQD,CAAAA,CCzEf,IAAME,CAAAA,CAAsB,CAC1B,MAAA,CAAQD,EACR,YAAA,CAAc,KAAA,CACd,aAAc,KAAA,CACd,UAAA,CAAY,MACZ,SAAA,CAAW,UAAA,CACX,QAAA,CAAU,GAAA,CACV,cAAA,CAAA,aAAA,CACA,YAAA,CAAc,GAChB,CAAA,CAEaE,CAAAA,CAAuE,KAAO,CACzF,GAAGD,CACL,GC1BO,IAAME,CAAAA,CAA8DxB,CAAAA,GAAQ,CACjF,QAAA,CAAUyB,CAAAA,EAAMzB,EAAI,KAAO,CAAE,MAAOyB,CAAG,CAAA,CAAE,CAC3C,CAAA,CAAA,CCFO,IAAMC,CAAAA,CAAoE1B,CAAAA,GAAQ,CACvF,SAAA,CAAW,MACX,eAAA,CAAiB,IAAMA,CAAAA,CAAI2B,CAAAA,GAAM,CAAE,SAAA,CAAW,CAACA,CAAAA,CAAE,SAAU,CAAA,CAAE,CAC/D,CAAA,CAAA,CCSA,IAAMC,CAAAA,CAAeC,CAAAA,EAAoC,CACvD,GAAI,CAACA,CAAAA,CAAO,OAAO,IAAA,CAEnB,GAAI,CACF,OAAOC,SAAAA,CAAoBD,CAAK,CAClC,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAAA,CAEaE,CAAAA,CAAiE/B,CAAAA,GAAQ,CACpF,MAAO,MAAA,CACP,IAAA,CAAM,KACN,QAAA,CAAU6B,CAAAA,EAAS7B,EAAI,KAAO,CAAE,KAAA,CAAA6B,CAAAA,CAAO,IAAA,CAAMD,CAAAA,CAAYC,CAAK,CAAE,CAAA,CAAE,CAAA,CAClE,UAAA,CAAY,IAAM7B,CAAAA,CAAI,KAAO,CAAE,KAAA,CAAO,MAAA,CAAW,IAAA,CAAM,IAAK,CAAA,CAAE,CAChE,CAAA,CAAA,CCGA,SAASgC,EACPhC,CAAAA,CACAC,CAAAA,CACAgC,EACA,CAoCA,OAAO,CAAE,GAAA,CAzBmE,CAACC,CAAAA,CAASC,IAAa,CACjG,GAAIA,CAAAA,CAAS,CAEX,IAAMC,CAAAA,CAAS,OAAOF,CAAAA,EAAY,UAAA,CAAaA,CAAAA,CAAQjC,CAAAA,EAAI,CAAEgC,CAAG,CAAC,CAAA,CAAIC,CAAAA,CACrElC,EAAI,CAAE,GAAGC,GAAI,CAAG,CAACgC,CAAG,EAAGG,CAAO,CAAA,CAAoB,IAAI,EACxD,CAAA,KAEEpC,CAAAA,CAFS,OAAOkC,CAAAA,EAAY,UAAA,CAEvBG,GAAkC,CACrC,IAAMC,CAAAA,CAAU,CAAE,GAAGD,CAAAA,CAAMJ,CAAG,CAAA,CAAG,GAAGC,EAAQG,CAAAA,CAAMJ,CAAG,CAAC,CAAE,CAAA,CACxD,OAAO,CAAE,CAACA,CAAG,EAAGK,CAAQ,CAC1B,CAAA,CAGKD,CAAAA,EAAkC,CACrC,IAAMC,EAAU,CAAE,GAAGD,CAAAA,CAAMJ,CAAG,CAAA,CAAG,GAAGC,CAAQ,CAAA,CAC5C,OAAO,CAAE,CAACD,CAAG,EAAGK,CAAQ,CAC1B,CANC,EAQL,CAAA,CAOwB,GAAA,CAFoD,IAAMrC,CAAAA,EAAI,CAAEgC,CAAG,CAErD,CACxC,CAEO,IAAMM,CAAAA,CAAuBC,CAAAA,EAC3BC,WAAAA,EAA2B,CAChCC,OAAAA,CACE,CAAC1C,EAAKC,CAAAA,CAAK0C,CAAAA,GAAU,CAcnB,IAAMC,CAAAA,CAAc,CAClBX,CAAAA,CACAY,CAAAA,GACG,CACH,IAAMC,CAAAA,CAAUd,CAAAA,CAAmBhC,EAAKC,CAAAA,CAAKgC,CAAG,CAAA,CAE1Cc,CAAAA,CAAaJ,CAAAA,CACnB,OAAOE,EAAQC,CAAAA,CAAQ,GAAA,CAAKA,CAAAA,CAAQ,GAAA,CAAKC,CAAU,CACrD,EAEMC,CAAAA,CAAaJ,CAAAA,CAAY,QAASb,CAAgB,CAAA,CAClDkB,EAAYL,CAAAA,CAAY,MAAA,CAAQpB,CAAe,CAAA,CAC/C0B,CAAAA,CAAcN,CAAAA,CAAY,SAAUlB,CAAiB,CAAA,CAG3D,OAAO,CACL,OAAA,CAAS,CACP,GAJiBkB,CAAAA,CAAY,SAAA,CAAWrB,CAAkB,CAAA,CAK1D,GAAGiB,CACL,EACA,KAAA,CAAOQ,CAAAA,CACP,KAAMC,CAAAA,CACN,MAAA,CAAQC,EACR,KAAA,CAAO,IAAM,CACXjD,CAAAA,EAAI,CAAE,KAAA,CAAM,YAAW,CACvB0C,CAAAA,CAAM,OAAA,CAAQ,YAAA,GAChB,CACF,CACF,CAAA,CACA,CACE,IAAA,CAAM,eAAA,CACN,OAAA,CAASQ,iBAAAA,CAAkB,IAAMvC,CAAY,CAAA,CAC7C,WAAYyB,CAAAA,GAAU,CACpB,MAAOA,CAAAA,CAAM,KAAA,CAAM,KAAA,CACnB,KAAA,CAAOA,CAAAA,CAAM,IAAA,CAAK,MAClB,IAAA,CAAMA,CAAAA,CAAM,KAAA,CAAM,IAAA,CAClB,SAAA,CAAWA,CAAAA,CAAM,OAAO,SAC1B,CAAA,CAAA,CACA,KAAA,CAAO,CAACe,CAAAA,CAAgBC,CAAAA,GAAiB,CACvC,GAAM,CAAE,MAAAxB,CAAAA,CAAO,IAAA,CAAAyB,EAAM,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAIJ,CAAAA,CAM1C,OAAO,CACL,GAAGC,CAAAA,CACH,KAAA,CAAO,CAAE,GAAGA,EAAa,KAAA,CAAO,KAAA,CAAAxB,CAAAA,CAAO,IAAA,CAAAyB,CAAK,CAAA,CAC5C,KAAM,CAAE,GAAGD,EAAa,IAAA,CAAM,KAAA,CAAAE,CAAM,CAAA,CACpC,MAAA,CAAQ,CAAE,GAAGF,CAAAA,CAAa,MAAA,CAAQ,UAAWG,CAAAA,EAAaH,CAAAA,CAAa,MAAA,CAAO,SAAU,CAC1F,CACF,CACF,CACF,CACF,CAAA,CC5IF,IAAMI,CAAAA,CAAkBC,aAAAA,CAAoC,IAAI,CAAA,CAKzD,SAASC,CAAAA,CAAoBC,CAAAA,CAAwC,CAC1E,IAAMjB,CAAAA,CAAQkB,UAAAA,CAAWJ,CAAe,CAAA,CACxC,GAAI,CAACd,CAAAA,CAAO,CAEV,IAAMmB,EADiB,IAAI,KAAA,EAAM,CAAE,KAAA,EACG,KAAA,CAAM;AAAA,CAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,EAAK,SAAA,CAChE,MAAM,IAAI,KAAA,CACR,CAAA,iDAAA,EAAoDA,CAAa,CAAA,iIAAA,CACnE,CACF,CAEA,OAAOC,QAAAA,CAASpB,CAAAA,CAAOiB,CAAAA,GAAavB,CAAAA,EAASA,CAAAA,CAAW,CAC1D,CAIA,IAAM2B,EAAAA,CAA8CC,CAAAA,EAAS,CAC3D,GAAM,CAAE,QAAA,CAAAC,CAAAA,CAAU,GAAGC,CAAU,CAAA,CAAIF,CAAAA,CAC7BG,CAAAA,CAAWC,MAAAA,CAAkC,MAAS,CAAA,CACtDC,CAAAA,CAAcT,UAAAA,CAAWJ,CAAe,CAAA,CAE9C,GAAI,CAACW,CAAAA,CAAS,OAAA,CAAS,CAErB,IAAMG,CAAAA,CAAgBD,CAAAA,EAAa,QAAA,EAAS,CAAE,OAAA,EAAW,EAAC,CAG1DF,CAAAA,CAAS,OAAA,CAAU7B,CAAAA,CAAoB,CAAE,GAAGgC,CAAAA,CAAe,GAAGJ,CAAU,CAAC,EAC3E,CAEA,GAAI,CAACC,CAAAA,CAAS,OAAA,CAAQ,QAAA,EAAS,CAAE,OAAA,CAAQ,SAAA,CACvC,MAAM,IAAI,KAAA,CAAM,kDAAmC,CAAA,CAGrD,OACEI,GAAAA,CAACf,CAAAA,CAAgB,QAAA,CAAhB,CAAyB,KAAA,CAAOW,CAAAA,CAAS,OAAA,CACxC,QAAA,CAAAI,GAAAA,CAACC,GAAAA,CAAA,CACC,QAAA,CAAAD,GAAAA,CAAAE,QAAAA,CAAA,CAAG,QAAA,CAAAR,CAAAA,CAAS,CAAA,CACd,CAAA,CACF,CAEJ,CAAA,CAMOS,EAAAA,CAAQX,GClDf,IAAMY,CAAAA,CAAyB,CAAC,CAAA,CAAG,CAAA,CAAG,GAAG,CAAA,CAGnCC,CAAAA,CAAc,CAClB,EAAA,CAAI,GAAA,CACJ,YAAA,CAAc,GAAA,CACd,SAAA,CAAW,GAAA,CACX,YAAA,CAAc,GAChB,CAAA,CAGMC,EAAAA,CAAkB,GAAA,CAuClBC,CAAAA,CAAuBC,CAAAA,EACvB,CAACA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CACpB,eAAA,CAGFA,CAAAA,CAAK,GAAA,EAAOA,CAAAA,CAAK,OAAA,EAAWA,CAAAA,CAAK,KAAA,EAAS,eAAA,CAQ7CC,EAAAA,CAAuBC,CAAAA,EAAuC,CAClE,GAAM,CAAE,KAAA,CAAApE,CAAAA,CAAO,YAAA,CAAAqE,CAAa,CAAA,CAAID,CAAAA,CAMhC,OAJ2BpE,CAAAA,EAAU,IAAA,EAIjC,OAAOA,CAAAA,EAAU,QAAA,CACZ,KAAA,CAGFqE,CAAAA,CAAa,QAAA,CAASrE,CAAK,CACpC,CAAA,CAQMsE,EAAAA,CAAoB,CAACJ,CAAAA,CAAWK,CAAAA,GAA4B,CAEhE,GAAIA,CAAAA,CAASR,CAAAA,CAAY,EAAA,EAAMQ,CAAAA,EAAU,GAAA,CACvC,OAAO,MAAA,CAIT,GAAI,CAACL,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,OAAO,KAAA,CAIT,IAAMM,CAAAA,CAAoC,CACxC,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAON,CAAAA,CAAK,IAAA,CAAM,YAAA,CAAcJ,CAAuB,CAAA,CACxE,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAOI,CAAAA,CAAK,MAAA,CAAQ,YAAA,CAAcJ,CAAuB,CAAA,CAC5E,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAOI,CAAAA,CAAK,KAAA,CAAO,YAAA,CAAcJ,CAAuB,CAC5E,CAAA,CAMA,OAH8BU,CAAAA,CAAa,IAAA,CAAKJ,CAAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAaA,CAAAA,CAAO,KAAA,GAAU,IAAI,CAAA,CAIpGI,CAAAA,CAAa,KAAA,CAClBJ,CAAAA,EAAUA,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAaA,CAAAA,CAAO,KAAA,GAAU,IAAA,EAAQD,GAAoBC,CAAM,CAC7F,CAAA,CAIK,IACT,CAAA,CAQMK,EAAAA,CAAwB,MAAOC,CAAAA,CAAoBC,CAAAA,GAA8C,CACrG,OAAQA,CAAAA,EACN,KAAK,MAAA,CACH,OAAOD,CAAAA,CAAS,IAAA,EAAK,CACvB,KAAK,MAAA,CACH,OAAOA,CAAAA,CAAS,IAAA,EAAK,CACvB,KAAK,aAAA,CACH,OAAOA,CAAAA,CAAS,WAAA,EAAY,CAC9B,KAAK,UAAA,CACH,OAAOA,CAAAA,CAAS,QAAA,EAAS,CAC3B,KAAK,MAAA,CACL,QACE,OAAOA,CAAAA,CAAS,IAAA,EACpB,CACF,CAAA,CAOaE,EAAAA,CAASR,CAAAA,EAAqC,CACzD,GAAM,CAAE,OAAA,CAAAS,CAAQ,CAAA,CAAIT,CAAAA,EAAU,EAAC,CACzB,CAAE,YAAA,CAAAU,CAAa,CAAA,CAAInB,GAAAA,CAAI,MAAA,EAAO,CAE9BoB,CAAAA,CAAWC,WAAAA,EAAY,CAEvBC,CAAAA,CAAcC,cAAAA,EAAe,CAE7B,CACJ,KAAA,CAAO,CAAE,KAAA,CAAAnE,CAAM,CAAA,CACf,OAAA,CAAS,CAAE,YAAA,CAAAoE,CAAAA,CAAc,SAAA,CAAAC,CAAAA,CAAW,UAAA,CAAAC,CAAW,CAAA,CAC/C,IAAA,CAAM,CAAE,KAAA,CAAA5C,CAAM,CAAA,CACd,KAAA,CAAA6C,CACF,CAAA,CAAIzC,CAAAA,EAAiB,CAGf0C,CAAAA,CAAqB,IAAM,CAC/BD,CAAAA,EAAM,CAENL,CAAAA,CAAY,KAAA,EAAM,CAClBF,CAAAA,CAASK,CAAS,EACpB,CAAA,CAGMI,CAAAA,CAAqB,IAAM,CAI/B,GAHAF,CAAAA,EAAM,CAENL,CAAAA,CAAY,KAAA,EAAM,CACdG,CAAAA,CAAW,CAEb,IAAMK,CAAAA,CAAM,IAAI,GAAA,CAAIL,CAAAA,CAAW,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CACrDK,CAAAA,CAAI,aAAa,GAAA,CAAI,cAAA,CAAgB,MAAM,CAAA,CAC3CV,CAAAA,CAASU,CAAAA,CAAI,QAAA,EAAU,EACzB,CACF,CAAA,CAGMC,CAAAA,CAAkB,IAAM,CAC5BZ,CAAAA,CAAa,KAAA,CAAM,CACjB,OAAA,CAAS,gCAAA,CACT,WAAA,CAAa,oEACf,CAAC,EACH,CAAA,CAGMa,CAAAA,CAAyBhB,CAAAA,EACtB,MAAOiB,CAAAA,CAAeC,CAAAA,CAAenB,CAAAA,GAA0C,CAEpF,GACEC,CAAAA,GAAiB,MAAA,EACjBA,CAAAA,GAAiB,aAAA,EACjBA,CAAAA,GAAiB,MAAA,EACjBA,CAAAA,GAAiB,UAAA,CAEjB,OAAOD,CAAAA,CAIT,IAAIR,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAO,MAAMQ,CAAAA,CAAS,KAAA,EAAM,CAAE,IAAA,GAChC,CAAA,KAAQ,CAEN,OAAOA,CACT,CAEA,GAAIJ,EAAAA,CAAkBJ,CAAAA,CAAMQ,CAAAA,CAAS,MAAM,CAAA,CAAG,CAC5C,IAAMoB,CAAAA,CAAe5B,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAYA,CAAAA,CAAK,IAAA,CAAOA,CAAAA,CAC3D,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU4B,CAAY,CAAA,CAAG,CAChD,MAAA,CAAQpB,CAAAA,CAAS,MAAA,CACjB,UAAA,CAAYA,CAAAA,CAAS,UAAA,CACrB,OAAA,CAASA,CAAAA,CAAS,OACpB,CAAC,CACH,CAEA,IAAMqB,CAAAA,CAAe9B,CAAAA,CAAoBC,CAAI,CAAA,CAE7CY,CAAAA,CAAa,KAAA,CAAM,CACjB,OAAA,CAAS,gBAAA,CACT,WAAA,CAAaiB,CACf,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAQ,IAAI,KAAA,CAAMD,CAAY,CAAA,CACnC,MAACC,CAAAA,CAAc,QAAA,CAAWtB,CAAAA,CACzBsB,CAAAA,CAAc,IAAA,CAAO9B,CAAAA,CACjB8B,CACR,CAAA,CAIIC,CAAAA,CAAwB,CAAC1B,CAAAA,CAAgBL,CAAAA,GAAc,CAC3D,OAAQK,GACN,KAAKR,CAAAA,CAAY,YAAA,CACfwB,CAAAA,EAAmB,CACnB,MAEF,KAAKxB,CAAAA,CAAY,YAAA,CACfyB,CAAAA,EAAmB,CACnB,MAEF,KAAKzB,CAAAA,CAAY,SAAA,CACf2B,CAAAA,EAAgB,CAChB,MAEF,QAAS,CAEP,IAAMK,CAAAA,CAAe9B,CAAAA,CAAoBC,CAAI,CAAA,EAAK,CAAA,KAAA,EAAQK,CAAM,CAAA,MAAA,CAAA,CAChEO,CAAAA,CAAa,KAAA,CAAM,CACjB,OAAA,CAAS,gBAAA,CACT,WAAA,CAAaiB,CACf,CAAC,CAAA,CACD,KACF,CACF,CACF,CAAA,CAGMG,CAAAA,CAAWC,OAAAA,CAAQ,IAChBC,EAAAA,CAAG,MAAA,CAAO,CACf,SAAA,CAAWvB,CAAAA,EAAWQ,CAAAA,CACtB,KAAA,CAAO,CAAA,CACP,OAAA,CAASrB,EAAAA,CACT,OAAA,CAAS,CACP,MAAA,CAAQ,kBAAA,CACR,cAAA,CAAgB,kBAClB,CAAA,CACA,KAAA,CAAO,CACL,aAAA,CAAe,CACbqC,CAAAA,EAAW,CAELtF,CAAAA,EACFsF,CAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAiB,CAAA,OAAA,EAAUtF,CAAK,CAAA,CAAE,CAAA,CAInDsF,CAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAInG,CAAa,CAAA,GAChCiF,CAAAA,EAAgB,CAAC1C,CAAAA,CACnB4D,CAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAInG,CAAAA,CAAe,QAAQ,CAAA,CAG3CmG,CAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAInG,CAAAA,CAAe,kBAAA,CAAmB,MAAA,CAAOuC,CAAK,CAAC,CAAC,CAAA,EAG1E,CACF,CAAA,CACA,WAAA,CAAa,CACX,MAAMuD,CAAAA,EAAS,CACb,GAAM,CAAE,QAAA,CAAAtB,CAAS,CAAA,CAAIsB,CAAAA,CAErB,GAAItB,CAAAA,CAAU,CACZ,IAAMH,CAAAA,CAASG,CAAAA,CAAS,MAAA,CACpBR,CAAAA,CAEJ,GAAI,CACF,IAAMoC,CAAAA,CAAc5B,CAAAA,CAAS,OAAA,CAAQ,IAAI,cAAc,CAAA,EAAK,EAAA,CAAA,CACxD4B,CAAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAKA,CAAAA,CAAY,UAAA,CAAW,OAAO,CAAA,IAC5EpC,CAAAA,CAAO,MAAMQ,CAAAA,CAAS,KAAA,EAAM,CAAE,IAAA,EAAK,EAEvC,CAAA,KAAQ,CAER,CAEAuB,CAAAA,CAAsB1B,CAAAA,CAAQL,CAAI,EACpC,CAAA,KAEEY,CAAAA,CAAa,KAAA,CAAM,CACjB,OAAA,CAAS,eAAA,CACT,WAAA,CAAakB,CAAAA,CAAM,OAAA,EAAW,wBAChC,CAAC,CAAA,CAGH,OAAOA,CACT,CACF,CACF,CACF,CAAC,CAAA,CACA,CAACnB,CAAAA,CAAS9D,CAAAA,CAAOoE,CAAAA,CAAc1C,CAAAA,CAAOqC,CAAAA,CAAcM,CAAAA,CAAWE,CAAAA,CAAOL,CAAAA,CAAaI,CAAU,CAAC,CAAA,CAG3FkB,CAAAA,CAAc,MAClBC,CAAAA,CACAf,CAAAA,CACAvB,CAAAA,CACAuC,CAAAA,GACe,CACf,GAAM,CAAE,YAAA,CAAA9B,CAAAA,CAAc,GAAG+B,CAAU,CAAA,CAAID,CAAAA,EAAkB,EAAC,CAGpDE,CAAAA,CAA0B,CAC9B,GAAGD,CAAAA,CACH,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAU,KAAA,CACb,aAAA,CAAe,CAAC,GAAIA,CAAAA,CAAU,KAAA,EAAO,aAAA,EAAiB,EAAC,CAAIf,CAAAA,CAAsBhB,CAAY,CAAC,CAChG,CACF,CAAA,CAEID,CAAAA,CAEJ,OAAIR,CAAAA,CACFQ,CAAAA,CAAW,MAAMwB,CAAAA,CAAST,CAAAA,CAAK,CAAE,MAAA,CAAAe,CAAAA,CAAQ,IAAA,CAAMtC,CAAAA,CAAM,GAAGyC,CAAa,CAAC,CAAA,CAEtEjC,CAAAA,CAAW,MAAMwB,CAAAA,CAAST,CAAAA,CAAK,CAAE,MAAA,CAAAe,CAAAA,CAAQ,GAAGG,CAAa,CAAC,CAAA,CAIrDlC,EAAAA,CAAsBC,CAAAA,CAAUC,CAAY,CACrD,CAAA,CAoCA,OAAO,CACL,GAAA,CAlCU,CAAUc,CAAAA,CAAamB,CAAAA,GAC1BL,CAAAA,CAAe,KAAA,CAAOd,CAAAA,CAAK,MAAA,CAAWmB,CAAO,CAAA,CAkCpD,IAAA,CA/BW,CAAUnB,CAAAA,CAAavB,CAAAA,CAAY0C,CAAAA,GACvCL,CAAAA,CAAe,MAAA,CAAQd,CAAAA,CAAKvB,CAAAA,CAAM0C,CAAO,CAAA,CA+BhD,GAAA,CA5BU,CAAUnB,CAAAA,CAAavB,CAAAA,CAAY0C,CAAAA,GACtCL,CAAAA,CAAe,KAAA,CAAOd,CAAAA,CAAKvB,CAAAA,CAAM0C,CAAO,CAAA,CA4B/C,MAAA,CAzBU,CAAUnB,CAAAA,CAAamB,CAAAA,GAC1BL,CAAAA,CAAe,QAAA,CAAUd,CAAAA,CAAK,MAAA,CAAWmB,CAAO,CAAA,CAyBvD,KAAA,CAtBY,CAAUnB,CAAAA,CAAavB,CAAAA,CAAY0C,CAAAA,GACxCL,CAAAA,CAAe,OAAA,CAASd,CAAAA,CAAKvB,CAAAA,CAAM0C,CAAO,CAAA,CAsBjD,OAAA,CAnBc,CAAUnB,CAAAA,CAAagB,CAAAA,GAC9BF,CAAAA,CAAe,SAAA,CAAWd,CAAAA,CAAK,MAAA,CAAWgB,CAAc,CAAA,CAmB/D,IAAA,CAhBW,CAAUhB,CAAAA,CAAagB,CAAAA,GAC3BF,CAAAA,CAAe,MAAA,CAAQd,CAAAA,CAAK,MAAA,CAAWgB,CAAc,CAAA,CAgB5D,OAAA,CAbwBA,CAAAA,EAAiE,CACzF,GAAM,CAAE,GAAA,CAAAhB,CAAAA,CAAK,GAAGoB,CAAY,CAAA,CAAIJ,CAAAA,CAChC,OAAOF,CAAAA,CAAeM,CAAAA,CAAY,MAAA,EAAU,KAAA,CAAOpB,CAAAA,CAAK,MAAA,CAAWoB,CAAW,CAChF,CAAA,CAWE,QAAA,CAAAX,CACF,CACF,ECnZO,IAAMY,EAAAA,CAAY,CAEvB,WAAA,CAAa,CACX,KAAA,CAAO,CAACC,CAAAA,CAAuBC,CAAAA,GAAyB,CAAC,aAAA,CAAe,OAAA,CAASD,CAAAA,CAAaC,CAAI,CAAA,CAClG,cAAA,CAAgB,CAAC,aAAA,CAAe,KAAK,CAAA,CACrC,gBAAA,CAAkB,CAAC,aAAA,CAAe,OAAO,CAC3C,CAAA,CAEA,KAAA,CAAO,CACL,GAAA,CAAK,CAAC,OAAO,CAAA,CACb,MAAA,CAASrG,CAAAA,EAAe,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAE,CAAA,CAC9C,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC1B,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC1B,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAC5B,CAAA,CAEA,KAAA,CAAO,CACL,GAAA,CAAK,CAAC,OAAO,CAAA,CACb,MAAA,CAAQ,CAACZ,CAAAA,CAAciH,CAAAA,GAAyB,CAAC,OAAA,CAAS,QAAA,CAAUjH,CAAAA,CAAMiH,CAAI,CAAA,CAC9E,MAAA,CAASA,CAAAA,EAAyB,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAI,CAAA,CAC1D,MAAA,CAASA,CAAAA,EAAyB,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAI,CAAA,CAC1D,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAC5B,CAAA,CAEA,KAAA,CAAO,CACL,GAAA,CAAK,CAAC,OAAO,CAAA,CACb,MAAA,CAASvE,CAAAA,EAAmB,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAK,CAAA,CACrD,MAAA,CAAS9B,CAAAA,EAAe,CAAC,OAAA,CAAS,QAAA,CAAUA,CAAE,CAAA,CAC9C,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC1B,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAAA,CAC1B,MAAA,CAAQ,CAAC,OAAA,CAAS,QAAQ,CAC5B,CAAA,CAEA,KAAA,CAAO,CACL,UAAA,CAAY,CAAC,OAAA,CAAS,YAAY,CAAA,CAClC,OAAA,CAAUsG,CAAAA,EAAyB,CAAC,OAAA,CAAS,SAAA,CAAWA,CAAU,CACpE,CAAA,CAEA,KAAA,CAAO,CACL,GAAA,CAAK,CAAC,OAAA,CAAS,KAAK,CACtB,CAAA,CAEA,IAAA,CAAM,CACJ,WAAA,CAAcC,CAAAA,EAA0B,CAAC,MAAA,CAAQ,cAAA,CAAgBA,CAAM,CACzE,CACF","file":"chunk-F2GDEOP4.js","sourcesContent":["import { create } from 'zustand'\n\nexport interface VisibilityState {\n open: Map<number, boolean>\n usedIds: Set<number>\n isOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n checkUniqueness: (uuid: number) => boolean\n registerIds: (uuid: number) => boolean\n cleanup: (uuid: number) => void\n}\n\n/**\n * 创建一个可见性管理的 Zustand store\n * 用于管理 Modal、Drawer 等组件的显示/隐藏状态\n * 每次调用都会创建一个独立的 store 实例,确保不同组件间的状态隔离\n */\nexport function createVisibilityStore() {\n return create<VisibilityState>()((set, get) => ({\n open: new Map(),\n usedIds: new Set(),\n isOpen(uuid) {\n return get().open.get(uuid) ?? false\n },\n show(uuid) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map() })\n },\n checkUniqueness(uuid) {\n return !get().usedIds.has(uuid)\n },\n registerIds(uuid) {\n const { usedIds } = get()\n if (usedIds.has(uuid)) return false\n\n set({ usedIds: new Set(usedIds).add(uuid) })\n return true\n },\n cleanup(uuid) {\n const { open, usedIds } = get()\n const newOpen = new Map(open)\n const newUsedIds = new Set(usedIds)\n newOpen.delete(uuid)\n newUsedIds.delete(uuid)\n set({ open: newOpen, usedIds: newUsedIds })\n },\n }))\n}\n","/**\n * 生成唯一 ID 的函数\n * 使用时间戳 + 随机数 + 计数器的组合来确保唯一性\n */\nlet globalCounter = 0\n\nexport const generateId = (): number => {\n const timestamp = Date.now()\n const random = Math.floor(Math.random() * 1000)\n const counter = ++globalCounter % 1000\n\n // 组合:时间戳(毫秒) * 1000000 + 随机数 * 1000 + 计数器\n // 这样可以确保即使在同一毫秒内生成多个ID也不会重复\n return timestamp * 1000000 + random * 1000 + counter\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n/**\n * 混合存储策略\n * - 优先从 SessionStorage 读取数据,防止多开页面时的数据冲突\n * - 写入时同时更新 SessionStorage 和 LocalStorage\n * - SessionStorage 不存在时,fallback 到 LocalStorage\n */\nexport const mixedStorage: StateStorage = {\n getItem(name) {\n return sessionStorage.getItem(name) ?? localStorage.getItem(name)\n },\n setItem(name, value) {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem(name) {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n\nexport const APP_ID_HEADER = 'App-ID'\n\nexport const FRONTEND_ROUTE_PREFIX = '/console/'\n\n/**\n * 权限系统模式枚举\n * - GAME_SCOPED: 游戏范围权限(角色权限包含游戏信息)\n * - GROUP_BASED: 基于项目组的权限(需要先选择项目组才能选择游戏)\n * - DIRECT_GAME: 直接游戏权限(不需要项目组,直接选择游戏)\n */\nexport enum PermissionMode {\n /** 游戏范围权限:角色权限包含游戏范围信息 */\n GAME_SCOPED = 'game_scoped',\n /** 基于项目组的权限:权限依赖项目组,需要先选择项目组才能选择游戏 */\n GROUP_BASED = 'group_based',\n /** 直接游戏权限:权限直接选择游戏,不需要项目组作为中间层 */\n DIRECT_GAME = 'direct_game',\n}\n\nexport const WILDCARD = '*'\n","import type { Locale } from '.'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n projectGroup: '项目组',\n view: '查看',\n back: '返回',\n },\n SignIn: {\n title: '登录方式',\n signInWithIDass: 'IDass 登录',\n unregistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserDropdown: {\n signOutText: '登出',\n },\n User: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n Role: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import type { StateCreator } from 'zustand'\n\nimport { PermissionMode } from '@/constants'\nimport type { Locale } from '@/locale'\nimport zhCN from '@/locale/zh_CN'\n\nexport interface ContextSlice {\n locale: Locale\n permissionMode: PermissionMode // 权限模式\n useGameApiV2: boolean // 是否使用游戏 API V2 版本\n loginPath: string // 登录页路径\n isGlobalMode: boolean // 为 true 时,APP-ID header 始终使用 'global',否则为当前游戏 id\n gameScoped?: boolean // 数据是否按游戏划分范围,默认为 false\n sidebarWidth?: number // 侧边栏宽度\n sidebarCollapsible?: boolean // 侧边栏是否可折叠\n homePath: string // 首页地址\n apiBaseUrl?: string // 接口基础路径\n}\n\n/** ContextSlice 的默认值 */\nconst defaultContextSlice = {\n locale: zhCN,\n useGameApiV2: false,\n isGlobalMode: false,\n gameScoped: false,\n loginPath: '/sign_in',\n homePath: '/',\n permissionMode: PermissionMode.GAME_SCOPED,\n sidebarWidth: 250,\n} as const\n\nexport const createContextSlice: StateCreator<ContextSlice, [], [], ContextSlice> = () => ({\n ...defaultContextSlice,\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface GameSlice {\n appId?: string | number\n setAppId: (id?: string | number) => void\n}\n\nexport const createGameSlice: StateCreator<GameSlice, [], [], GameSlice> = set => ({\n setAppId: id => set(() => ({ appId: id })),\n})\n","import type { StateCreator } from 'zustand'\n\nexport interface LayoutSlice {\n collapsed: boolean // 侧边栏是否折叠\n toggleCollapsed: () => void\n}\n\nexport const createLayoutSlice: StateCreator<LayoutSlice, [], [], LayoutSlice> = set => ({\n collapsed: false,\n toggleCollapsed: () => set(s => ({ collapsed: !s.collapsed })),\n})\n","import { jwtDecode } from 'jwt-decode'\nimport type { StateCreator } from 'zustand'\n\n/**\n * JWT Token 解码后的用户信息\n */\nexport interface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenSlice {\n /** JWT Token */\n token?: string\n user: UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nconst decodeToken = (token?: string): UserInfo | null => {\n if (!token) return null\n\n try {\n return jwtDecode<UserInfo>(token)\n } catch {\n return null\n }\n}\n\nexport const createTokenSlice: StateCreator<TokenSlice, [], [], TokenSlice> = set => ({\n token: undefined,\n user: null,\n setToken: token => set(() => ({ token, user: decodeToken(token) })),\n clearToken: () => set(() => ({ token: undefined, user: null })),\n})\n","import type { StateCreator, StoreApi } from 'zustand'\nimport { createStore } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nimport { mixedStorage } from '@/utils'\n\nimport { type ContextSlice, createContextSlice } from './context'\nimport { createGameSlice, type GameSlice } from './game'\nimport { createLayoutSlice, type LayoutSlice } from './layout'\nimport { createTokenSlice, type TokenSlice, type UserInfo } from './token'\n\nexport type ToolkitsState = {\n context: ContextSlice\n token: TokenSlice\n game: GameSlice\n layout: LayoutSlice\n clear: () => void\n}\n\n/**\n * 为嵌套结构的 store 创建 slice 适配器\n *\n * 由于 zustand 的标准做法是扁平组合多个 slice,而我们需要嵌套结构(如 `state.token.setToken()`),\n * 因此需要创建适配器来将全局的 `set/get` 转换为针对特定 slice 的 `set/get`。\n *\n * @template K - ToolkitsState 的 key,用于指定要适配的 slice\n * @param set - Zustand store 的全局 set 函数,用于更新整个 state\n * @param get - Zustand store 的全局 get 函数,用于获取整个 state\n * @param key - 要适配的 slice 的 key(如 'token', 'game', 'layout' 等)\n * @returns 返回适配后的 set 和 get 函数,可以直接用于创建对应的 slice\n *\n * @example\n * ```typescript\n * const adapter = createSliceAdapter(set, get, 'token')\n * const tokenSlice = createTokenSlice(adapter.set, adapter.get, store)\n * ```\n */\nfunction createSliceAdapter<K extends keyof ToolkitsState>(\n set: Parameters<StateCreator<ToolkitsState, [], [], ToolkitsState>>[0],\n get: Parameters<StateCreator<ToolkitsState, [], [], ToolkitsState>>[1],\n key: K,\n) {\n type SliceType = ToolkitsState[K]\n\n /**\n * 适配后的 set 函数,用于更新指定的 slice\n *\n * 该函数将 slice 级别的更新转换为全局 state 的更新:\n * - 当 `replace` 为 true 时,完全替换整个 slice\n * - 当 `partial` 为函数时,使用函数式更新\n * - 当 `partial` 为对象时,进行浅合并更新\n */\n const sliceSet: Parameters<StateCreator<SliceType, [], [], SliceType>>[0] = (partial, replace?) => {\n if (replace) {\n // 完全替换模式:获取更新后的值,然后替换整个 slice\n const update = typeof partial === 'function' ? partial(get()[key]) : partial\n set({ ...get(), [key]: update } as ToolkitsState, true)\n } else if (typeof partial === 'function') {\n // 函数式更新:使用当前 slice 状态计算新状态\n set((state): Partial<ToolkitsState> => {\n const updated = { ...state[key], ...partial(state[key]) }\n return { [key]: updated } as unknown as Partial<ToolkitsState>\n })\n } else {\n // 对象式更新:浅合并到当前 slice 状态\n set((state): Partial<ToolkitsState> => {\n const updated = { ...state[key], ...partial }\n return { [key]: updated } as unknown as Partial<ToolkitsState>\n })\n }\n }\n\n /**\n * 适配后的 get 函数,用于获取指定的 slice\n */\n const sliceGet: Parameters<StateCreator<SliceType, [], [], SliceType>>[1] = () => get()[key]\n\n return { set: sliceSet, get: sliceGet }\n}\n\nexport const createToolkitsStore = (initProps?: Partial<ContextSlice>) => {\n return createStore<ToolkitsState>()(\n persist(\n (set, get, store) => {\n /**\n * 统一创建 slice 的辅助函数\n *\n * 该函数封装了 slice 创建的逻辑,包括:\n * 1. 创建适配器(将全局 set/get 转换为 slice 级别的 set/get)\n * 2. 适配 store 类型(将全局 store 转换为 slice 级别的 store)\n * 3. 调用 slice creator 创建 slice\n *\n * @template K - ToolkitsState 的 key\n * @param key - slice 的 key\n * @param creator - slice 的创建函数(StateCreator)\n * @returns 创建好的 slice 实例\n */\n const createSlice = <K extends keyof ToolkitsState>(\n key: K,\n creator: StateCreator<ToolkitsState[K], [], [], ToolkitsState[K]>,\n ) => {\n const adapter = createSliceAdapter(set, get, key)\n // 将全局 store 适配为对应 slice 的 StoreApi(类型转换是安全的,因为实际运行时结构兼容)\n const sliceStore = store as unknown as StoreApi<ToolkitsState[K]>\n return creator(adapter.set, adapter.get, sliceStore)\n }\n\n const tokenSlice = createSlice('token', createTokenSlice)\n const gameSlice = createSlice('game', createGameSlice)\n const layoutSlice = createSlice('layout', createLayoutSlice)\n const contextSlice = createSlice('context', createContextSlice)\n\n return {\n context: {\n ...contextSlice,\n ...initProps,\n },\n token: tokenSlice,\n game: gameSlice,\n layout: layoutSlice,\n clear: () => {\n get().token.clearToken()\n store.persist.clearStorage()\n },\n }\n },\n {\n name: 'ToolkitsStore',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({\n token: state.token.token,\n appId: state.game.appId,\n user: state.token.user,\n collapsed: state.layout.collapsed,\n }),\n merge: (persistedState, currentState) => {\n const { token, user, appId, collapsed } = persistedState as {\n token: string\n user: UserInfo\n appId: string\n collapsed: boolean\n }\n return {\n ...currentState,\n token: { ...currentState.token, token, user },\n game: { ...currentState.game, appId },\n layout: { ...currentState.layout, collapsed: collapsed ?? currentState.layout.collapsed },\n }\n },\n },\n ),\n )\n}\n","import { App } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { createContext, useContext, useRef } from 'react'\nimport { useStore } from 'zustand'\n\nimport type { ToolkitsState } from '@/stores'\nimport { createToolkitsStore } from '@/stores'\nimport type { ContextSlice } from '@/stores/context'\n\ntype ToolkitsStore = ReturnType<typeof createToolkitsStore>\n\nconst ToolkitsContext = createContext<ToolkitsStore | null>(null)\n\n// 重载函数签名:支持有 selector 和无 selector 两种调用方式\nexport function useToolkitsStore(): ToolkitsState\nexport function useToolkitsStore<T>(selector: (state: ToolkitsState) => T): T\nexport function useToolkitsStore<T>(selector?: (state: ToolkitsState) => T) {\n const store = useContext(ToolkitsContext)\n if (!store) {\n const componentStack = new Error().stack\n const componentName = componentStack?.split('\\n')[2]?.trim() || 'Unknown'\n throw new Error(\n `Missing ToolkitsProvider in the tree. Component \"${componentName}\" must be wrapped with <ToolkitsProvider>. Please ensure ToolkitsProvider is rendered above this component in the component tree.`,\n )\n }\n\n return useStore(store, selector ?? (state => state as T))\n}\n\nexport type ToolkitsProviderProps = PropsWithChildren<Partial<ContextSlice>>\n\nconst ToolkitsProvider: FC<ToolkitsProviderProps> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ToolkitsStore | undefined>(undefined)\n const parentStore = useContext(ToolkitsContext)\n\n if (!storeRef.current) {\n // 从父级 store 中提取 ContextSlice 相关的属性\n const parentContext = parentStore?.getState().context ?? {}\n\n // restProps 会覆盖父级的对应属性\n storeRef.current = createToolkitsStore({ ...parentContext, ...restProps })\n }\n\n if (!storeRef.current.getState().context.loginPath) {\n throw new Error('ToolkitsProvider: 请配置 \"loginPath\"')\n }\n\n return (\n <ToolkitsContext.Provider value={storeRef.current}>\n <App>\n <>{children}</>\n </App>\n </ToolkitsContext.Provider>\n )\n}\n\nif (process.env.NODE_ENV !== 'production') {\n ToolkitsProvider.displayName = 'ToolkitsProvider'\n}\n\nexport default ToolkitsProvider\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useQueryClient } from '@tanstack/react-query'\nimport { App } from 'antd'\nimport ky, { type KyInstance, type Options as KyOptions } from 'ky'\nimport { useMemo } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER } from '@/constants'\n\n// 响应成功状态码常量\nconst SUCCESS_RESPONSE_CODES = [0, 1, 200] as const\n\n// HTTP 状态码常量\nconst HTTP_STATUS = {\n OK: 200,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n UNREGISTERED: 412,\n} as const\n\n// 请求超时时间(毫秒)\nconst REQUEST_TIMEOUT = 30000\n\n// 成功响应状态码字段类型\ntype StatusField = 'code' | 'status' | 'errno'\n\n// 状态码检查配置\ninterface StatusCheckConfig {\n field: StatusField\n value: unknown\n allowedCodes: readonly number[]\n}\n\n// 响应类型\nexport type ResponseType = 'json' | 'blob' | 'text' | 'arrayBuffer' | 'formData'\n\n// 通用请求选项接口\ninterface RequestOptions extends KyOptions {\n responseType?: ResponseType\n}\n\n// useKy Hook 配置选项\nexport interface UseKyOptions {\n baseURL?: string\n}\n\n// HTTP客户端方法接口 - 支持泛型响应类型\ninterface KyMethods {\n get: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n post: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n put: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n delete: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n patch: <T = any>(url: string, data?: any, options?: RequestOptions) => Promise<T>\n options: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n head: <T = any>(url: string, options?: RequestOptions) => Promise<T>\n request: <T = any>(options: RequestOptions & { url: string }) => Promise<T>\n instance: KyInstance\n}\n\n// 错误消息提取工具函数\nconst extractErrorMessage = (data: any): string => {\n if (!data || typeof data !== 'object') {\n return 'Unknown error'\n }\n\n return data.msg || data.message || data.error || 'Unknown error'\n}\n\n/**\n * 检查单个状态码字段是否成功\n * @param config 状态码检查配置\n * @returns 是否成功\n */\nconst isStatusCodeSuccess = (config: StatusCheckConfig): boolean => {\n const { value, allowedCodes } = config\n\n if (value === undefined || value === null) {\n return false\n }\n\n if (typeof value !== 'number') {\n return false\n }\n\n return allowedCodes.includes(value)\n}\n\n/**\n * 判断响应是否成功\n * @param data 响应数据\n * @param status HTTP状态码\n * @returns 是否成功\n */\nconst isSuccessResponse = (data: any, status: number): boolean => {\n // 如果HTTP状态码不在2xx范围,直接返回失败\n if (status < HTTP_STATUS.OK || status >= 300) {\n return false\n }\n\n // 如果没有响应数据或不是对象,认为成功(可能是空响应)\n if (!data || typeof data !== 'object') {\n return true\n }\n\n // 定义状态码检查配置\n const statusChecks: StatusCheckConfig[] = [\n { field: 'code', value: data.code, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'status', value: data.status, allowedCodes: SUCCESS_RESPONSE_CODES },\n { field: 'errno', value: data.errno, allowedCodes: SUCCESS_RESPONSE_CODES },\n ]\n\n // 检查是否有任何业务状态码字段存在且表示成功\n const hasBusinessStatusCode = statusChecks.some(config => config.value !== undefined && config.value !== null)\n\n // 如果存在业务状态码字段,则必须检查它们是否都表示成功\n if (hasBusinessStatusCode) {\n return statusChecks.every(\n config => config.value === undefined || config.value === null || isStatusCodeSuccess(config),\n )\n }\n\n // 如果没有业务状态码字段,HTTP 2xx 就认为成功\n return true\n}\n\n/**\n * 根据响应类型处理响应数据\n * @param response 响应对象\n * @param responseType 响应类型\n * @returns 处理后的响应数据\n */\nconst processResponseByType = async (response: Response, responseType?: ResponseType): Promise<any> => {\n switch (responseType) {\n case 'blob':\n return response.blob()\n case 'text':\n return response.text()\n case 'arrayBuffer':\n return response.arrayBuffer()\n case 'formData':\n return response.formData()\n case 'json':\n default:\n return response.json()\n }\n}\n\n/**\n * HTTP客户端Hook (基于 Ky) - 内部使用版本\n * @param config 配置选项\n * @returns HTTP客户端方法集合\n */\nexport const useKy = (config?: UseKyOptions): KyMethods => {\n const { baseURL } = config || {}\n const { notification } = App.useApp()\n\n const navigate = useNavigate()\n\n const queryClient = useQueryClient()\n\n const {\n token: { token },\n context: { isGlobalMode, loginPath, apiBaseUrl },\n game: { appId },\n clear,\n } = useToolkitsStore()\n\n // 处理未授权错误\n const handleUnauthorized = () => {\n clear()\n // 清除 React Query 缓存\n queryClient.clear()\n navigate(loginPath)\n }\n\n // 处理未注册错误\n const handleUnregistered = () => {\n clear()\n // 清除 React Query 缓存\n queryClient.clear()\n if (loginPath) {\n // 添加未注册参数到登录页 URL\n const url = new URL(loginPath, window.location.origin)\n url.searchParams.set('unregistered', 'true')\n navigate(url.toString())\n }\n }\n\n // 处理禁止访问错误\n const handleForbidden = () => {\n notification.error({\n message: '访问被禁止',\n description: '您没有权限访问此资源。',\n })\n }\n\n // 创建响应处理函数\n const createResponseHandler = (responseType?: ResponseType) => {\n return async (_request: any, _options: any, response: Response): Promise<Response> => {\n // 非 JSON 类型直接交由调用方按响应类型读取\n if (\n responseType === 'blob' ||\n responseType === 'arrayBuffer' ||\n responseType === 'text' ||\n responseType === 'formData'\n ) {\n return response\n }\n\n // 默认 JSON\n let data: any\n try {\n data = await response.clone().json()\n } catch {\n // 非 JSON 或空响应体,直接返回原响应\n return response\n }\n\n if (isSuccessResponse(data, response.status)) {\n const responseData = data.data !== undefined ? data.data : data\n return new Response(JSON.stringify(responseData), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n })\n }\n\n const errorMessage = extractErrorMessage(data)\n\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n\n const error = new Error(errorMessage)\n ;(error as any).response = response\n ;(error as any).data = data\n throw error\n }\n }\n\n // 处理HTTP状态码错误\n const handleHttpStatusError = (status: number, data: any) => {\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n handleUnauthorized()\n break\n\n case HTTP_STATUS.UNREGISTERED:\n handleUnregistered()\n break\n\n case HTTP_STATUS.FORBIDDEN:\n handleForbidden()\n break\n\n default: {\n // 安全地提取错误消息\n const errorMessage = extractErrorMessage(data) || `HTTP ${status} Error`\n notification.error({\n message: 'Request failed',\n description: errorMessage,\n })\n break\n }\n }\n }\n\n // 创建ky实例\n const instance = useMemo(() => {\n return ky.create({\n prefixUrl: baseURL ?? apiBaseUrl,\n retry: 0,\n timeout: REQUEST_TIMEOUT,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n hooks: {\n beforeRequest: [\n request => {\n // 设置认证 headers\n if (token) {\n request.headers.set('Authorization', `Bearer ${token}`)\n }\n\n // 设置应用 ID headers\n if (!request.headers.has(APP_ID_HEADER)) {\n if (isGlobalMode || !appId) {\n request.headers.set(APP_ID_HEADER, 'global')\n } else {\n // 对 appId 进行 URL 编码以避免非 ASCII 字符导致的 XMLHttpRequest 错误\n request.headers.set(APP_ID_HEADER, encodeURIComponent(String(appId)))\n }\n }\n },\n ],\n beforeError: [\n async error => {\n const { response } = error\n\n if (response) {\n const status = response.status\n let data: any\n\n try {\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json') || contentType.startsWith('text/')) {\n data = await response.clone().json()\n }\n } catch {\n // 忽略 JSON 解析错误\n }\n\n handleHttpStatusError(status, data)\n } else {\n // 网络错误或请求超时等情况\n notification.error({\n message: 'Network Error',\n description: error.message || 'Network request failed',\n })\n }\n\n return error\n },\n ],\n },\n })\n }, [baseURL, token, isGlobalMode, appId, notification, loginPath, clear, queryClient, apiBaseUrl])\n\n // 通用请求处理函数\n const makeRequest = async <T = any>(\n method: string,\n url: string,\n data?: any,\n requestOptions?: RequestOptions,\n ): Promise<T> => {\n const { responseType, ...kyOptions } = requestOptions || {}\n\n // 创建带有响应类型处理器的请求选项\n const finalOptions: KyOptions = {\n ...kyOptions,\n hooks: {\n ...kyOptions.hooks,\n afterResponse: [...(kyOptions.hooks?.afterResponse || []), createResponseHandler(responseType)],\n },\n }\n\n let response: Response\n\n if (data) {\n response = await instance(url, { method, json: data, ...finalOptions })\n } else {\n response = await instance(url, { method, ...finalOptions })\n }\n\n // 根据响应类型返回相应数据\n return processResponseByType(response, responseType)\n }\n\n // HTTP方法\n const get = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('GET', url, undefined, options)\n }\n\n const post = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('POST', url, data, options)\n }\n\n const put = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PUT', url, data, options)\n }\n\n const del = <T = any>(url: string, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('DELETE', url, undefined, options)\n }\n\n const patch = <T = any>(url: string, data?: any, options?: RequestOptions): Promise<T> => {\n return makeRequest<T>('PATCH', url, data, options)\n }\n\n const options = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('OPTIONS', url, undefined, requestOptions)\n }\n\n const head = <T = any>(url: string, requestOptions?: RequestOptions): Promise<T> => {\n return makeRequest<T>('HEAD', url, undefined, requestOptions)\n }\n\n const request = <T = any>(requestOptions: RequestOptions & { url: string }): Promise<T> => {\n const { url, ...requestOpts } = requestOptions\n return makeRequest<T>(requestOpts.method || 'GET', url, undefined, requestOpts)\n }\n\n return {\n get,\n post,\n put,\n delete: del,\n patch,\n options,\n head,\n request,\n instance,\n }\n}\n","import type { PermissionMode } from './constants'\n\n// 查询键工厂 - 使用简单的对象和函数来生成查询键\nexport const queryKeys = {\n // 权限相关\n permissions: {\n check: (permissions: string[], mode: PermissionMode) => ['permissions', 'check', permissions, mode] as const,\n allPermissions: ['permissions', 'all'] as const,\n allPermissionsV2: ['permissions', 'allV2'] as const,\n },\n // 用户相关\n users: {\n all: ['users'] as const,\n detail: (id: string) => ['users', 'detail', id] as const,\n create: ['users', 'create'] as const,\n update: ['users', 'update'] as const,\n delete: ['users', 'delete'] as const,\n },\n // 角色相关\n roles: {\n all: ['roles'] as const,\n detail: (name: string, mode: PermissionMode) => ['roles', 'detail', name, mode] as const,\n create: (mode: PermissionMode) => ['roles', 'create', mode] as const,\n update: (mode: PermissionMode) => ['roles', 'update', mode] as const,\n delete: ['roles', 'delete'] as const,\n },\n // 菜单相关\n menus: {\n all: ['menus'] as const,\n navbar: (appId?: string) => ['menus', 'navbar', appId] as const,\n detail: (id: number) => ['menus', 'detail', id] as const,\n create: ['menus', 'create'] as const,\n update: ['menus', 'update'] as const,\n delete: ['menus', 'delete'] as const,\n },\n // 枚举相关\n enums: {\n gameGroups: ['enums', 'gameGroups'] as const,\n gameIds: (gameGroups: string[]) => ['enums', 'gameIds', gameGroups] as const,\n },\n // 游戏相关\n games: {\n all: ['games', 'all'] as const,\n },\n // 认证相关\n auth: {\n ticketLogin: (ticket: string | null) => ['auth', 'ticket-login', ticket] as const,\n },\n}\n\nexport type QueryKeys = typeof queryKeys\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {k,l as l$1}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {k,l as l$1}from'./chunk-F2GDEOP4.js';import {useQueryClient,useMutation}from'@tanstack/react-query';function y(){let u=k(),t=useQueryClient();return useMutation({mutationKey:l$1.menus.create,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,id:0,is_model:true}),onSuccess:()=>{t.invalidateQueries({queryKey:l$1.menus.all}),t.invalidateQueries({queryKey:l$1.menus.navbar()});}})}function l(){let u=k(),t=useQueryClient();return useMutation({mutationKey:l$1.menus.update,mutationFn:n=>u.post("/api/usystem/menu/set",{...n,is_model:true}),onSuccess:()=>{t.invalidateQueries({queryKey:l$1.menus.all}),t.invalidateQueries({queryKey:l$1.menus.navbar()});}})}function c(){let u=k(),t=useQueryClient();return useMutation({mutationKey:l$1.menus.delete,mutationFn:n=>u.post("/api/usystem/menu/delete",null,{searchParams:{id:n}}),onSuccess:()=>{t.invalidateQueries({queryKey:l$1.menus.all}),t.invalidateQueries({queryKey:l$1.menus.navbar()});}})}export{y as a,l as b,c};//# sourceMappingURL=chunk-FIT6S4UM.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-FIT6S4UM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/menu/services/index.ts"],"names":["useCreateMenu","ky","useKy","queryClient","useQueryClient","useMutation","queryKeys","arg","useUpdateMenu","useRemoveMenu","id"],"mappings":"4GAMO,SAASA,GAAgB,CAC9B,IAAMC,CAAAA,CAAKC,CAAAA,GACLC,CAAAA,CAAcC,cAAAA,GAEpB,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,KAAA,CAAM,MAAA,CAC7B,WAAaC,CAAAA,EAAkCN,CAAAA,CAAG,KAAK,uBAAA,CAAyB,CAAE,GAAGM,CAAAA,CAAK,EAAA,CAAI,CAAA,CAAG,QAAA,CAAU,IAAK,CAAC,CAAA,CACjH,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASE,CAAAA,EAAgB,CAC9B,IAAMP,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaC,GAAsBN,CAAAA,CAAG,IAAA,CAAK,wBAAyB,CAAE,GAAGM,CAAAA,CAAK,QAAA,CAAU,IAAK,CAAC,CAAA,CAC9F,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASG,CAAAA,EAAgB,CAC9B,IAAMR,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaI,GAAeT,CAAAA,CAAG,IAAA,CAAK,2BAA4B,IAAA,CAAM,CAAE,YAAA,CAAc,CAAE,GAAAS,CAAG,CAAE,CAAC,CAAA,CAC9F,SAAA,CAAW,IAAM,CACfP,CAAAA,CAAY,iBAAA,CAAkB,CAAE,SAAUG,GAAAA,CAAU,KAAA,CAAM,GAAI,CAAC,CAAA,CAC/DH,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/modules/menu/services/index.ts"],"names":["useCreateMenu","ky","useKy","queryClient","useQueryClient","useMutation","queryKeys","arg","useUpdateMenu","useRemoveMenu","id"],"mappings":"4GAMO,SAASA,GAAgB,CAC9B,IAAMC,CAAAA,CAAKC,CAAAA,GACLC,CAAAA,CAAcC,cAAAA,GAEpB,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,KAAA,CAAM,MAAA,CAC7B,WAAaC,CAAAA,EAAkCN,CAAAA,CAAG,KAAK,uBAAA,CAAyB,CAAE,GAAGM,CAAAA,CAAK,EAAA,CAAI,CAAA,CAAG,QAAA,CAAU,IAAK,CAAC,CAAA,CACjH,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASE,CAAAA,EAAgB,CAC9B,IAAMP,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaC,GAAsBN,CAAAA,CAAG,IAAA,CAAK,wBAAyB,CAAE,GAAGM,CAAAA,CAAK,QAAA,CAAU,IAAK,CAAC,CAAA,CAC9F,UAAW,IAAM,CACfJ,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,GAAI,CAAC,EAC/DH,CAAAA,CAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,KAAA,CAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH,CAEO,SAASG,CAAAA,EAAgB,CAC9B,IAAMR,EAAKC,CAAAA,EAAM,CACXC,EAAcC,cAAAA,EAAe,CAEnC,OAAOC,WAAAA,CAAY,CACjB,WAAA,CAAaC,GAAAA,CAAU,MAAM,MAAA,CAC7B,UAAA,CAAaI,GAAeT,CAAAA,CAAG,IAAA,CAAK,2BAA4B,IAAA,CAAM,CAAE,YAAA,CAAc,CAAE,GAAAS,CAAG,CAAE,CAAC,CAAA,CAC9F,SAAA,CAAW,IAAM,CACfP,CAAAA,CAAY,iBAAA,CAAkB,CAAE,SAAUG,GAAAA,CAAU,KAAA,CAAM,GAAI,CAAC,CAAA,CAC/DH,EAAY,iBAAA,CAAkB,CAAE,QAAA,CAAUG,GAAAA,CAAU,MAAM,MAAA,EAAS,CAAC,EACtE,CACF,CAAC,CACH","file":"chunk-FIT6S4UM.js","sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query'\n\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useCreateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.create,\n mutationFn: (arg: Omit<MenuListItem, 'id'>) => ky.post('/api/usystem/menu/set', { ...arg, id: 0, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useUpdateMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.update,\n mutationFn: (arg: MenuListItem) => ky.post('/api/usystem/menu/set', { ...arg, is_model: true }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n\nexport function useRemoveMenu() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.menus.delete,\n mutationFn: (id: number) => ky.post('/api/usystem/menu/delete', null, { searchParams: { id } }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.all })\n queryClient.invalidateQueries({ queryKey: queryKeys.menus.navbar() })\n },\n })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {k as k$1,l,i,e}from'./chunk-F2GDEOP4.js';import {useQuery}from'@tanstack/react-query';function k(e,t){let s=k$1(),n=typeof e<"u"?typeof e=="string"?[e]:e:[],{data:r,...f}=useQuery({queryKey:l.permissions.check(n,"game_scoped"),queryFn:()=>s.post("/api/usystem/user/checkV2",{permissions:n},t),enabled:n.length>0,retry:false}),i=true;return typeof e=="string"?i=r?.has_all?true:r?.[e]??false:Array.isArray(e)&&e.length>0&&(i=n.reduce((l,y)=>(l[y]=r?.has_all?true:r?.[y]??false,l),{})),{...f,data:i}}function A(){let{context:{loginPath:e$1},game:{appId:t}}=i(),s=k$1();return useQuery({queryKey:l.menus.navbar(t?String(t):void 0),queryFn:()=>s.get("/api/usystem/menu/navbar",{headers:{[e]:t?encodeURIComponent(String(t)):"global"}}),enabled:window.location.pathname!==e$1})}var K=()=>{let{context:{useGameApiV2:e$1}}=i(),t=k$1();return useQuery({queryKey:l.games.all,queryFn:async()=>{let s={headers:{[e]:"global"}};return e$1?(await t.get("/api/game/list",s))?.list??[]:await t.get("/api/usystem/game/all",s)??[]},retry:false})};export{k as a,A as b,K as c};//# sourceMappingURL=chunk-JDCSIJL7.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-JDCSIJL7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/index.ts"],"names":["useAuth","code","config","ky","useKy","permissionCodes","data","rest","useQuery","queryKeys","newData","acc","curr","useMenuList","loginPath","appId","useToolkitsStore","APP_ID_HEADER","useGames","useGameApiV2","requestConfig"],"mappings":"8FAUO,SAASA,CAAAA,CAAQC,EAA0BC,CAAAA,CAAoB,CACpE,IAAMC,CAAAA,CAAKC,GAAAA,EAAM,CACXC,EAA4B,OAAOJ,CAAAA,CAAS,GAAA,CAAe,OAAOA,CAAAA,EAAS,QAAA,CAAW,CAACA,CAAI,CAAA,CAAIA,CAAAA,CAAQ,EAAC,CAExG,CAAE,IAAA,CAAAK,EAAM,GAAGC,CAAK,CAAA,CAAIC,QAAAA,CAAS,CACjC,QAAA,CAAUC,EAAU,WAAA,CAAY,KAAA,CAAMJ,CAAAA,CAAAA,aAA2C,CAAA,CACjF,OAAA,CAAS,IACPF,EAAG,IAAA,CACD,2BAAA,CACA,CACE,WAAA,CAAaE,CACf,CAAA,CACAH,CACF,CAAA,CACF,OAAA,CAASG,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAClC,KAAA,CAAO,KACT,CAAC,CAAA,CAEGK,CAAAA,CAA6C,IAAA,CAEjD,OAAI,OAAOT,CAAAA,EAAS,SAClBS,CAAAA,CAAUJ,CAAAA,EAAM,OAAA,CAAU,IAAA,CAAQA,CAAAA,GAAOL,CAAI,GAAK,KAAA,CACzC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,CAAS,CAAA,GAC9CS,CAAAA,CAAUL,CAAAA,CAAgB,MAAA,CAAgC,CAACM,CAAAA,CAAKC,CAAAA,IAC9DD,EAAIC,CAAI,CAAA,CAAIN,CAAAA,EAAM,OAAA,CAAU,IAAA,CAAQA,CAAAA,GAAOM,CAAI,CAAA,EAAK,KAAA,CAC7CD,CAAAA,CAAAA,CACN,EAAE,CAAA,CAAA,CAGA,CACL,GAAGJ,CAAAA,CACH,IAAA,CAAMG,CACR,CACF,CAEO,SAASG,CAAAA,EAAc,CAC5B,GAAM,CACJ,OAAA,CAAS,CAAE,SAAA,CAAAC,GAAU,EACrB,IAAA,CAAM,CAAE,KAAA,CAAAC,CAAM,CAChB,CAAA,CAAIC,GAAiB,CACfb,CAAAA,CAAKC,GAAAA,EAAM,CAEjB,OAAOI,QAAAA,CAAS,CACd,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,MAAA,CAAOM,CAAAA,CAAQ,MAAA,CAAOA,CAAK,CAAA,CAAI,MAAS,CAAA,CAClE,OAAA,CAAS,IACPZ,CAAAA,CAAG,GAAA,CAAoB,2BAA4B,CACjD,OAAA,CAAS,CAAE,CAACc,CAAa,EAAGF,EAAQ,kBAAA,CAAmB,MAAA,CAAOA,CAAK,CAAC,CAAA,CAAI,QAAS,CACnF,CAAC,CAAA,CACH,OAAA,CAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GAAaD,GACxC,CAAC,CACH,CAEO,IAAMI,CAAAA,CAAW,IAAM,CAC5B,GAAM,CACJ,OAAA,CAAS,CAAE,YAAA,CAAAC,GAAa,CAC1B,EAAIH,CAAAA,EAAiB,CACfb,CAAAA,CAAKC,GAAAA,EAAM,CAEjB,OAAOI,SAAS,CACd,QAAA,CAAUC,CAAAA,CAAU,KAAA,CAAM,GAAA,CAC1B,OAAA,CAAS,SAAY,CACnB,IAAMW,CAAAA,CAAgB,CACpB,OAAA,CAAS,CACP,CAACH,CAAa,EAAG,QACnB,CACF,CAAA,CAEA,OAAIE,GAAAA,CAAAA,CACe,MAAMhB,CAAAA,CAAG,GAAA,CAAsB,gBAAA,CAAkBiB,CAAa,CAAA,GAC9D,IAAA,EAAQ,GAGV,MAAMjB,CAAAA,CAAG,GAAA,CAAY,uBAAA,CAAyBiB,CAAa,CAAA,EACzD,EACrB,CAAA,CACA,KAAA,CAAO,KACT,CAAC,CACH","file":"chunk-JDCSIJL7.js","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport type { Options as KyOptions } from 'ky'\n\nimport type { Game } from '@/components/layout/types'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { APP_ID_HEADER, PermissionMode } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\nimport type { MenuListItem } from '@/types'\n\nexport function useAuth(code?: string | string[], config?: KyOptions) {\n const ky = useKy()\n const permissionCodes: string[] = typeof code !== 'undefined' ? (typeof code === 'string' ? [code] : code) : []\n\n const { data, ...rest } = useQuery({\n queryKey: queryKeys.permissions.check(permissionCodes, PermissionMode.GAME_SCOPED),\n queryFn: () =>\n ky.post<Record<string, boolean> & { has_all?: boolean }>(\n '/api/usystem/user/checkV2',\n {\n permissions: permissionCodes,\n },\n config,\n ),\n enabled: permissionCodes.length > 0,\n retry: false,\n })\n\n let newData: boolean | Record<string, boolean> = true\n\n if (typeof code === 'string') {\n newData = data?.has_all ? true : (data?.[code] ?? false)\n } else if (Array.isArray(code) && code.length > 0) {\n newData = permissionCodes.reduce<Record<string, boolean>>((acc, curr) => {\n acc[curr] = data?.has_all ? true : (data?.[curr] ?? false)\n return acc\n }, {})\n }\n\n return {\n ...rest,\n data: newData,\n }\n}\n\nexport function useMenuList() {\n const {\n context: { loginPath },\n game: { appId },\n } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.menus.navbar(appId ? String(appId) : undefined),\n queryFn: () =>\n ky.get<MenuListItem[]>('/api/usystem/menu/navbar', {\n headers: { [APP_ID_HEADER]: appId ? encodeURIComponent(String(appId)) : 'global' },\n }),\n enabled: window.location.pathname !== loginPath,\n })\n}\n\nexport const useGames = () => {\n const {\n context: { useGameApiV2 },\n } = useToolkitsStore()\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.games.all,\n queryFn: async () => {\n const requestConfig = {\n headers: {\n [APP_ID_HEADER]: 'global',\n },\n }\n\n if (useGameApiV2) {\n const response = await ky.get<{ list: Game[] }>('/api/game/list', requestConfig)\n return response?.list ?? []\n }\n\n const response = await ky.get<Game[]>('/api/usystem/game/all', requestConfig)\n return response ?? []\n },\n retry: false,\n })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {k,l,i}from'./chunk-F2GDEOP4.js';import {useQuery,useQueryClient,useMutation}from'@tanstack/react-query';function f(){let e=k();return useQuery({queryKey:l.roles.all,queryFn:()=>e.get("/api/usystem/role/all")})}function C(e){let i$1=k(),{context:{permissionMode:r}}=i();return useQuery({queryKey:l.roles.detail(e,r),queryFn:()=>i$1.get(`/api/usystem/role/${r==="game_scoped"?"info":"infoV2"}?name=${e}`)})}function q(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.roles.create(r),mutationFn:({name:s,permissions:n})=>e.post(`/api/usystem/role/${r==="game_scoped"?"create":"createV2"}`,{name:s,permissions:n}),onSuccess:()=>{i$1.invalidateQueries({queryKey:l.roles.all});}})}function K(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.roles.update(r),mutationFn:({id:s,name:n,permissions:u})=>e.post(`/api/usystem/role/${r==="game_scoped"?"update":"updateV2"}`,{id:s,name:n,permissions:u}),onSuccess:()=>{i$1.invalidateQueries({queryKey:l.roles.all});}})}function h(){let e=k(),i=useQueryClient();return useMutation({mutationKey:l.roles.delete,mutationFn:({id:r,name:s})=>e.post("/api/usystem/role/delete",{id:r,name:s}),onSuccess:()=>{i.invalidateQueries({queryKey:l.roles.all});}})}function x(){let e=k(),i$1=useQueryClient(),{context:{permissionMode:r}}=i();return useMutation({mutationKey:l.users.create,mutationFn:s=>{let n=m=>"permissions"in m,u=s;if(n(s)&&r==="direct_game"){let m=s.permissions?.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...s,permissions:m};}return e.post("/api/usystem/user/create",u)},onSuccess:()=>{i$1.invalidateQueries({queryKey:l.users.all});}})}function E(){let e=k(),i$1=useQueryClient(),r=i(s=>s.context.permissionMode);return useMutation({mutationKey:l.users.update,mutationFn:s=>{let n=m=>"permissions"in m,u=s;if(n(s)&&r==="direct_game"){let m=s.permissions?.map(y=>({game_group:["*"],game_ids:y.game_ids,role:y.role}));u={...s,permissions:m};}return e.post("/api/usystem/user/update",u)},onSuccess:()=>{i$1.invalidateQueries({queryKey:l.users.all});}})}function W(){let e=k(),i=useQueryClient();return useMutation({mutationKey:l.users.delete,mutationFn:({id:r,name:s})=>e.post("/api/usystem/user/delete",{id:r,name:s}),onSuccess:()=>{i.invalidateQueries({queryKey:l.users.all});}})}function _(){let e=k();return useQuery({queryKey:l.permissions.allPermissions,queryFn:()=>e.get("/api/usystem/user/allPermssions")})}function V(){let e=k();return useQuery({queryKey:l.permissions.allPermissionsV2,queryFn:()=>e.get("/api/usystem/user/allPermssionsV2")})}export{f as a,C as b,q as c,K as d,h as e,x as f,E as g,W as h,_ as i,V as j};//# sourceMappingURL=chunk-KZHYK554.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-KZHYK554.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/permission/services/index.ts"],"names":["useAllRoles","ky","useKy","useQuery","queryKeys","useRole","name","permissionMode","useToolkitsStore","useCreateRole","queryClient","useQueryClient","useMutation","permissions","useUpdateRole","id","useRemoveRole","useCreateUser","arg","hasPermissions","obj","requestData","transformedPermissions","item","useUpdateUser","state","useRemoveUser","useAllPermissions","useAllPermissionsV2"],"mappings":"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","file":"chunk-KZHYK554.js","sourcesContent":["import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode, WILDCARD } from '@/constants'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllRoles() {\n const ky = useKy()\n return useQuery({\n queryKey: queryKeys.roles.all,\n queryFn: () => ky.get<RoleEnumItem[]>('/api/usystem/role/all'),\n })\n}\n\nexport function useRole(name: string) {\n const ky = useKy()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useQuery({\n queryKey: queryKeys.roles.detail(name, permissionMode),\n queryFn: () =>\n ky.get<RoleV1 | RoleV2>(\n `/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'info' : 'infoV2'}?name=${name}`,\n ),\n })\n}\n\nexport function useCreateRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.create(permissionMode),\n mutationFn: ({ name, permissions }: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) =>\n ky.post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'create' : 'createV2'}`, {\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useUpdateRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.roles.update(permissionMode),\n mutationFn: ({\n id,\n name,\n permissions,\n }: {\n id: number\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }) =>\n ky.post(`/api/usystem/role/${permissionMode === PermissionMode.GAME_SCOPED ? 'update' : 'updateV2'}`, {\n id,\n name,\n permissions,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\nexport function useRemoveRole() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.roles.delete,\n mutationFn: ({ id, name }: { id: number; name: string }) => ky.post('/api/usystem/role/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.roles.all })\n },\n })\n}\n\ntype CreateUserWithRoles = { name: string; roles: string[] }\n\ntype CreateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype CreateUserWithPermissions = {\n name: string\n permissions: CreateUserPermission[]\n}\n\nexport function useCreateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n return useMutation({\n mutationKey: queryKeys.users.create,\n mutationFn: (arg: CreateUserWithRoles | CreateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is CreateUserWithPermissions => 'permissions' in obj\n\n let requestData: CreateUserWithRoles | CreateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/create', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\ntype UpdateUserWithRoles = { id: string; name: string; roles: string[] }\n\ntype UpdateUserPermission = {\n game_group?: string[]\n game_ids: string[]\n role: string\n}\n\ntype UpdateUserWithPermissions = {\n id: string\n name: string\n permissions: UpdateUserPermission[]\n}\n\nexport function useUpdateUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n const permissionMode = useToolkitsStore(state => state.context.permissionMode)\n\n return useMutation({\n mutationKey: queryKeys.users.update,\n mutationFn: (arg: UpdateUserWithRoles | UpdateUserWithPermissions) => {\n // 使用类型守卫判断是否包含 permissions\n const hasPermissions = (obj: typeof arg): obj is UpdateUserWithPermissions => 'permissions' in obj\n\n let requestData: UpdateUserWithRoles | UpdateUserWithPermissions = arg\n\n if (hasPermissions(arg) && permissionMode === PermissionMode.DIRECT_GAME) {\n const transformedPermissions = arg.permissions?.map(item => ({\n game_group: [WILDCARD],\n game_ids: item.game_ids,\n role: item.role,\n }))\n requestData = { ...arg, permissions: transformedPermissions }\n }\n\n return ky.post('/api/usystem/user/update', requestData)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useRemoveUser() {\n const ky = useKy()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationKey: queryKeys.users.delete,\n mutationFn: ({ id, name }: { id: string; name: string }) => ky.post('/api/usystem/user/delete', { id, name }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all })\n },\n })\n}\n\nexport function useAllPermissions() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissions,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssions'),\n })\n}\n\nexport function useAllPermissionsV2() {\n const ky = useKy()\n\n return useQuery({\n queryKey: queryKeys.permissions.allPermissionsV2,\n queryFn: () => ky.get<PermissionEnumItem[]>('/api/usystem/user/allPermssionsV2'),\n })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d,i as i$1,j}from'./chunk-KZHYK554.js';import {d as d$1}from'./chunk-5QAEUAZE.js';import {a}from'./chunk-D5YXBSTI.js';import {c as c$1}from'./chunk-JDCSIJL7.js';import {i}from'./chunk-F2GDEOP4.js';import {Typography,Select,App,Form,Input,Skeleton,Divider,Card,Empty,Button,Space,Checkbox,Row,Col,Collapse}from'antd';import {useState,useEffect,useTransition,useCallback}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var oe=m=>{let{permissions:r,readonly:t,expand:n,value:l,onChange:f}=m,[c,g]=useState([]),[P,R]=useState({}),[a$1,d]=useState(l??[]),{t:y}=a(),[,C]=useTransition(),x=useCallback(e=>{g(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},L=(e,s)=>{let o=p(e.target.checked,s);d(o),f?.(o);};useEffect(()=>{d(l??[]);},[l]),useEffect(()=>{n&&C(()=>{g((r??[]).map(({category:e})=>e));});},[n,r]),useEffect(()=>{let e=(r??[]).reduce((s,o)=>(s[o.category]=o.permissions.every(u=>a$1?.includes(u.value)),s),{});R(e);},[a$1,r]);let I=(r??[]).map(e=>({key:e.category,label:e.category,extra:!t&&jsx(Checkbox,{checked:P[e.category],onChange:s=>{L(s,e.permissions?.map(o=>o.value));},children:y("global.selectAll")}),children:jsx(Checkbox.Group,{className:"w-full",value:a$1,disabled:t,children:jsx(Row,{gutter:[10,10],className:"w-full",children:e.permissions?.map(s=>jsx(Col,{span:6,children:jsx(Checkbox,{value:s.value,onChange:o=>{L(o,[s.value]);},children:s.label})},s.value))})})}));return jsx(Collapse,{className:"w-full",collapsible:"header",activeKey:c,items:I,onChange:x})},k=oe;var{Text:w}=Typography,{Option:le}=Select,pe=m=>{let{expand:r=true,value:t,readonly:n,onChange:l}=m,{data:f,isLoading:c,error:g}=j(),{data:P,isLoading:R}=c$1(),[a$1,d]=useState([]),y=f?.filter(e=>e.is_common),C=f?.filter(e=>!e.is_common),x=c||R,{t:p}=a();if(useEffect(()=>{let e=[];Object.keys(t??{}).forEach(s=>{s!=="global"&&e.push({gameId:s,permissions:t?.[s]??[]});}),d(e);},[t]),g)return jsx("div",{className:"flex justify-center",children:jsx(w,{type:"danger",children:p("PermissionList.failedDescription")})});let L=()=>{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:true,children:p("PermissionList.baseSectionTitle")})}),jsx(Skeleton,{active:true,loading:x,children:jsx(k,{value:t?.global,readonly:n,permissions:y,expand:r,onChange:e=>{l?.({...t,global:e});}})}),jsx("div",{className:"my-12",children:jsx(Divider,{dashed:true,children:p("PermissionList.gameSectionTitle")})}),a$1.map((e,s)=>jsx(Card,{title:jsxs(Space,{children:[jsx(w,{children:p("global.game")}),n?jsx(w,{children:P?.find(o=>String(o.id)===e.gameId)?.name}):jsx(Select,{disabled:n,value:a$1[s].gameId||void 0,className:"w-40",placeholder:p("PermissionList.gameSelectPlaceholder"),onChange:o=>{d(u=>{let b=u.slice();return b[s].gameId=o,b});},children:P?.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:!n&&jsx(Button,{type:"link",onClick:()=>{I(s);},children:p("PermissionList.removeText")}),children:a$1[s].gameId?jsx(Skeleton,{active:true,loading:x,children:jsx(k,{value:t?.[a$1[s].gameId],readonly:n,expand:r,permissions:C,onChange:o=>{l?.({...t,[a$1[s].gameId]:o});}})}):jsx(Empty,{description:p("PermissionList.gameSectionDescription")})},s)),!n&&jsx(Button,{block:true,type:"dashed",onClick:L,children:p("PermissionList.addText")})]})},$=pe;var{Text:ue}=Typography,fe=m=>{let{expand:r=true,value:t,readonly:n,onChange:l}=m,{data:f,isLoading:c,error:g}=i$1(),{t:P}=a();return g?jsx("div",{className:"flex justify-center",children:jsx(ue,{type:"danger",children:P("PermissionList.failedDescription")})}):jsx(Skeleton,{active:true,loading:c,children:jsx(k,{value:t,permissions:f,readonly:n,expand:r,onChange:l})})},z=fe;var ge=m=>{let{value:r}=m,{context:{permissionMode:t}}=i();return t==="game_scoped"?jsx(z,{...m,value:r}):jsx($,{...m,value:r})},J=ge;var Qe=({mode:m,onSuccess:r})=>{let{message:t}=App.useApp(),{t:n}=a(),l=c(),f=d(),c$1=m==="create",g=n(c$1?"Role.createTitle":"Role.updateTitle"),P=jsxs(Fragment,{children:[jsx(Form.Item,{label:n("global.name"),name:"name",rules:[{required:true}],children:jsx(Input,{disabled:!c$1})}),jsx(Form.Item,{name:"permissions",children:jsx(J,{})})]});return d$1({title:g,width:"1000px",formProps:{layout:"vertical"},content:P,onConfirm:async(a,d)=>{let y=`role_${a.name}`,C=a.permissions;c$1?(await l.mutateAsync({name:y,permissions:C}),t.success(n("Role.createSuccessfully"))):(await f.mutateAsync({id:d?.id,name:y,permissions:C}),t.success(n("Role.updateSuccessfully"))),r?.();}})};export{J as a,Qe as b};//# sourceMappingURL=chunk-MVG7YFPB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MVG7YFPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/permission/components/permissionCollapse/index.tsx","../src/modules/permission/components/permissionList/PermissionWithGame.tsx","../src/modules/permission/components/permissionList/PermissionWithoutGame.tsx","../src/modules/permission/components/permissionList/index.tsx","../src/modules/permission/hooks/role-hooks.tsx"],"names":["PermissionCollapse","props","permissions","readonly","expand","value","onChange","activeKey","setActiveKey","useState","checkedMap","setCheckedMap","internalValue","setInternalValue","t","useTranslation","startTransition","useTransition","onCollapseChange","useCallback","key","getCheckedValue","checkedValue","codes","tempValue","code","index","item","onCheckChange","useEffect","category","acc","curr","items","jsx","Checkbox","e","permission","Row","Col","Collapse","permissionCollapse_default","Text","Typography","Option","Select","PermissionWithGame","isPermissionLoading","error","useAllPermissionsV2","games","isGamesLoading","useGames","gameList","setGameList","globalPermissions","gamePermissions","isLoading","list","addGame","prev","removeGame","_","i","jsxs","Divider","Skeleton","newValue","Card","Space","game","selectedValue","pev","temp","gameId","Button","Empty","PermissionWithGame_default","PermissionWithoutGame","useAllPermissions","PermissionWithoutGame_default","PermissionList","permissionMode","useToolkitsStore","permissionList_default","useRoleModal","mode","onSuccess","message","App","create","useCreateRole","update","useUpdateRole","isCreateMode","title","content","Fragment","Form","Input","useFormModal","values","extraValues","name"],"mappings":"ybAiBA,IAAMA,EAAAA,CAAkDC,GAAS,CAC/D,GAAM,CAAE,WAAA,CAAAC,CAAAA,CAAa,QAAA,CAAAC,CAAAA,CAAU,MAAA,CAAAC,EAAQ,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAC,CAAS,CAAA,CAAIL,CAAAA,CACrD,CAACM,CAAAA,CAAWC,CAAY,CAAA,CAAIC,QAAAA,CAAmB,EAAE,CAAA,CACjD,CAACC,CAAAA,CAAYC,CAAa,EAAIF,QAAAA,CAAkC,EAAE,CAAA,CAClE,CAACG,GAAAA,CAAeC,CAAgB,CAAA,CAAIJ,SAAmBJ,CAAAA,EAAS,EAAE,CAAA,CAClE,CAAE,CAAA,CAAAS,CAAE,CAAA,CAAIC,GAAe,CACvB,EAAGC,CAAe,CAAA,CAAIC,aAAAA,EAAc,CAEpCC,CAAAA,CAAmBC,YAAaC,CAAAA,EAA2B,CAC/DZ,CAAAA,CAAaY,CAAe,EAC9B,CAAA,CAAG,EAAE,EAECC,CAAAA,CAAkB,CAACC,CAAAA,CAAuBC,CAAAA,GAAoB,CAClE,IAAIC,CAAAA,CAAsB,GAE1B,OAAIF,CAAAA,CACFE,CAAAA,CAAY,CAAC,GAAG,IAAI,GAAA,CAAIZ,GAAAA,CAAc,OAAOW,CAAK,CAAC,CAAC,CAAA,EAEpDC,CAAAA,CAAYZ,GAAAA,CAAc,KAAA,EAAM,CAEhCW,EAAM,OAAA,CAAQE,CAAAA,EAAQ,CACpB,IAAMC,CAAAA,CAAQF,CAAAA,CAAU,SAAA,CAAUG,CAAAA,EAAQA,IAASF,CAAI,CAAA,CACnDC,CAAAA,CAAQ,EAAA,EACVF,CAAAA,CAAU,MAAA,CAAOE,CAAAA,CAAO,CAAC,EAE7B,CAAC,CAAA,CAAA,CAGIF,CACT,CAAA,CAEMI,CAAAA,CAAgB,CAAC,CAAA,CAAwBL,CAAAA,GAAoB,CACjE,IAAMD,CAAAA,CAAeD,CAAAA,CAAgB,CAAA,CAAE,MAAA,CAAO,OAAA,CAASE,CAAK,CAAA,CAC5DV,EAAiBS,CAAY,CAAA,CAC7BhB,CAAAA,GAAWgB,CAAY,EACzB,CAAA,CAEAO,SAAAA,CAAU,IAAM,CACdhB,CAAAA,CAAiBR,CAAAA,EAAS,EAAE,EAC9B,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEVwB,SAAAA,CAAU,IAAM,CACVzB,CAAAA,EACFY,CAAAA,CAAgB,IAAM,CAEpBR,GAAcN,CAAAA,EAAe,EAAC,EAAG,GAAA,CAAI,CAAC,CAAE,QAAA,CAAA4B,CAAS,IAAMA,CAAQ,CAAC,EAClE,CAAC,EAEL,CAAA,CAAG,CAAC1B,CAAAA,CAAQF,CAAW,CAAC,CAAA,CAExB2B,SAAAA,CAAU,IAAM,CACd,IAAMP,CAAAA,CAAAA,CAAgBpB,CAAAA,EAAe,EAAC,EAAG,MAAA,CACvC,CAAC6B,CAAAA,CAAKC,CAAAA,IACJD,CAAAA,CAAIC,CAAAA,CAAK,QAAQ,EAAIA,CAAAA,CAAK,WAAA,CAAY,KAAA,CAAML,CAAAA,EAAQf,GAAAA,EAAe,QAAA,CAASe,CAAAA,CAAK,KAAK,CAAC,CAAA,CAChFI,CAAAA,CAAAA,CAET,EACF,CAAA,CAEApB,CAAAA,CAAcW,CAAY,EAC5B,EAAG,CAACV,GAAAA,CAAeV,CAAW,CAAC,CAAA,CAE/B,IAAM+B,CAAAA,CAAAA,CAAS/B,CAAAA,EAAe,EAAC,EAAG,GAAA,CAAIyB,CAAAA,GAAS,CAC7C,GAAA,CAAKA,CAAAA,CAAK,QAAA,CACV,KAAA,CAAOA,EAAK,QAAA,CACZ,KAAA,CAAO,CAACxB,CAAAA,EACN+B,GAAAA,CAACC,QAAAA,CAAA,CACC,OAAA,CAASzB,EAAWiB,CAAAA,CAAK,QAAQ,CAAA,CACjC,QAAA,CAAUS,CAAAA,EAAK,CACbR,CAAAA,CACEQ,CAAAA,CACAT,CAAAA,CAAK,WAAA,EAAa,GAAA,CAAIU,CAAAA,EAAcA,CAAAA,CAAW,KAAK,CACtD,EACF,EAEC,QAAA,CAAAvB,CAAAA,CAAE,kBAAkB,CAAA,CACvB,CAAA,CAEF,QAAA,CACEoB,GAAAA,CAACC,QAAAA,CAAS,MAAT,CAAe,SAAA,CAAU,QAAA,CAAS,KAAA,CAAOvB,GAAAA,CAAe,QAAA,CAAUT,CAAAA,CACjE,QAAA,CAAA+B,IAACI,GAAAA,CAAA,CAAI,MAAA,CAAQ,CAAC,EAAA,CAAI,EAAE,CAAA,CAAG,SAAA,CAAU,SAC9B,QAAA,CAAAX,CAAAA,CAAK,WAAA,EAAa,GAAA,CAAIU,CAAAA,EACrBH,GAAAA,CAACK,GAAAA,CAAA,CAA2B,KAAM,CAAA,CAChC,QAAA,CAAAL,GAAAA,CAACC,QAAAA,CAAA,CACC,KAAA,CAAOE,CAAAA,CAAW,KAAA,CAClB,SAAUD,CAAAA,EAAK,CACbR,CAAAA,CAAcQ,CAAAA,CAAG,CAACC,CAAAA,CAAW,KAAK,CAAC,EACrC,CAAA,CAEC,QAAA,CAAAA,CAAAA,CAAW,KAAA,CACd,CAAA,CAAA,CARQA,CAAAA,CAAW,KASrB,CACD,EACH,CAAA,CACF,CAEJ,CAAA,CAAE,CAAA,CAEF,OACEH,GAAAA,CAACM,QAAAA,CAAA,CAAS,UAAU,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,SAAA,CAAWjC,CAAAA,CAAW,KAAA,CAAO0B,CAAAA,CAAO,QAAA,CAAUf,EAAkB,CAEtH,CAAA,CAEOuB,CAAAA,CAAQzC,EAAAA,CC5Gf,GAAM,CAAE,IAAA,CAAA0C,CAAK,CAAA,CAAIC,UAAAA,CACX,CAAE,MAAA,CAAAC,EAAO,CAAA,CAAIC,MAAAA,CAObC,EAAAA,CAAkD7C,CAAAA,EAAS,CAC/D,GAAM,CAAE,MAAA,CAAAG,EAAS,IAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAF,CAAAA,CAAU,QAAA,CAAAG,CAAS,CAAA,CAAIL,EAC/C,CAAE,IAAA,CAAMoC,CAAAA,CAAY,SAAA,CAAWU,CAAAA,CAAqB,KAAA,CAAAC,CAAM,CAAA,CAAIC,GAAoB,CAClF,CAAE,IAAA,CAAMC,CAAAA,CAAO,SAAA,CAAWC,CAAe,CAAA,CAAIC,GAAAA,GAC7C,CAACC,GAAAA,CAAUC,CAAW,CAAA,CAAI7C,QAAAA,CAAsD,EAAE,CAAA,CAClF8C,EAAoBlB,CAAAA,EAAY,MAAA,CAAOV,CAAAA,EAAQA,CAAAA,CAAK,SAAS,CAAA,CAC7D6B,CAAAA,CAAkBnB,CAAAA,EAAY,OAAOV,CAAAA,EAAQ,CAACA,CAAAA,CAAK,SAAS,CAAA,CAC5D8B,CAAAA,CAAYV,CAAAA,EAAuBI,CAAAA,CACnC,CAAE,CAAA,CAAArC,CAAE,CAAA,CAAIC,CAAAA,EAAe,CAc7B,GAZAc,SAAAA,CAAU,IAAM,CACd,IAAM6B,CAAAA,CAAoD,EAAC,CAE3D,MAAA,CAAO,IAAA,CAAKrD,CAAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQe,CAAAA,EAAO,CAClCA,CAAAA,GAAQ,QAAA,EACVsC,CAAAA,CAAK,IAAA,CAAK,CAAE,MAAA,CAAQtC,CAAAA,CAAK,WAAA,CAAaf,CAAAA,GAAQe,CAAG,CAAA,EAAK,EAAG,CAAC,EAE9D,CAAC,CAAA,CAEDkC,CAAAA,CAAYI,CAAI,EAClB,CAAA,CAAG,CAACrD,CAAK,CAAC,CAAA,CAEN2C,CAAAA,CACF,OACEd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,SAAAA,GAAAA,CAACQ,CAAAA,CAAA,CAAK,IAAA,CAAK,QAAA,CAAU,QAAA,CAAA5B,CAAAA,CAAE,kCAAkC,EAAE,CAAA,CAC7D,CAAA,CAIJ,IAAM6C,CAAAA,CAAU,IAAM,CACpBL,CAAAA,CAAYM,CAAAA,EAAQ,CAAC,GAAGA,CAAAA,CAAM,CAAE,MAAA,CAAQ,EAAA,CAAI,WAAA,CAAa,EAAG,CAAC,CAAC,EAChE,CAAA,CAEMC,CAAAA,CAAcnC,CAAAA,EAAkB,CACpC4B,CAAAA,CAAYM,CAAAA,EAAQA,EAAK,MAAA,CAAO,CAACE,CAAAA,CAAGC,CAAAA,GAAMA,CAAAA,GAAMrC,CAAK,CAAC,EACxD,EAEA,OACEsC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACb,QAAA,CAAA,CAAA9B,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,OAAA,CACb,QAAA,CAAAA,GAAAA,CAAC+B,OAAAA,CAAA,CAAQ,MAAA,CAAM,IAAA,CAAE,QAAA,CAAAnD,CAAAA,CAAE,iCAAiC,CAAA,CAAE,CAAA,CACxD,CAAA,CACAoB,GAAAA,CAACgC,QAAAA,CAAA,CAAS,OAAM,IAAA,CAAC,OAAA,CAAST,CAAAA,CACxB,QAAA,CAAAvB,GAAAA,CAACO,CAAAA,CAAA,CACC,KAAA,CAAOpC,GAAO,MAAA,CACd,QAAA,CAAUF,CAAAA,CACV,WAAA,CAAaoD,CAAAA,CACb,MAAA,CAAQnD,CAAAA,CACR,QAAA,CAAU+D,GAAY,CACpB7D,CAAAA,GAAW,CACT,GAAGD,CAAAA,CACH,MAAA,CAAQ8D,CACV,CAAC,EACH,CAAA,CACF,CAAA,CACF,CAAA,CACAjC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,OAAA,CACb,QAAA,CAAAA,IAAC+B,OAAAA,CAAA,CAAQ,MAAA,CAAM,IAAA,CAAE,QAAA,CAAAnD,CAAAA,CAAE,iCAAiC,CAAA,CAAE,EACxD,CAAA,CACCuC,GAAAA,CAAS,GAAA,CAAI,CAAC1B,CAAAA,CAAMD,CAAAA,GACnBQ,GAAAA,CAACkC,IAAAA,CAAA,CACC,KAAA,CACEJ,IAAAA,CAACK,KAAAA,CAAA,CACC,QAAA,CAAA,CAAAnC,GAAAA,CAACQ,CAAAA,CAAA,CAAM,SAAA5B,CAAAA,CAAE,aAAa,CAAA,CAAE,CAAA,CACvBX,CAAAA,CACC+B,GAAAA,CAACQ,CAAAA,CAAA,CAAM,SAAAQ,CAAAA,EAAO,IAAA,CAAKoB,CAAAA,EAAQ,MAAA,CAAOA,CAAAA,CAAK,EAAE,CAAA,GAAM3C,CAAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,CAAA,CAElEO,GAAAA,CAACW,MAAAA,CAAA,CACC,QAAA,CAAU1C,CAAAA,CACV,MAAOkD,GAAAA,CAAS3B,CAAK,CAAA,CAAE,MAAA,EAAU,MAAA,CACjC,SAAA,CAAU,MAAA,CACV,WAAA,CAAaZ,EAAE,sCAAsC,CAAA,CACrD,QAAA,CAAUyD,CAAAA,EAAiB,CACzBjB,CAAAA,CAAYkB,CAAAA,EAAO,CACjB,IAAMC,CAAAA,CAAOD,CAAAA,CAAI,KAAA,EAAM,CACvB,OAAAC,CAAAA,CAAK/C,CAAK,CAAA,CAAE,OAAS6C,CAAAA,CACdE,CACT,CAAC,EACH,CAAA,CAEC,QAAA,CAAAvB,CAAAA,EAAO,GAAA,CAAIoB,GACVpC,GAAAA,CAACU,EAAAA,CAAA,CAEC,KAAA,CAAO0B,CAAAA,CAAK,EAAA,CACZ,QAAA,CAAUjB,GAAAA,CAAS,KAAK,CAAC,CAAE,MAAA,CAAAqB,CAAO,CAAA,GAAMA,CAAAA,GAAW,MAAA,CAAOJ,CAAAA,CAAK,EAAE,CAAC,CAAA,CAEjE,QAAA,CAAAA,CAAAA,CAAK,IAAA,CAAA,CAJDA,CAAAA,CAAK,EAKZ,CACD,EACH,CAAA,CAAA,CAEJ,CAAA,CAGF,SAAA,CAAU,MAAA,CACV,KAAA,CACE,CAACnE,CAAAA,EACC+B,GAAAA,CAACyC,OAAA,CACC,IAAA,CAAK,MAAA,CACL,OAAA,CAAS,IAAM,CACbd,CAAAA,CAAWnC,CAAK,EAClB,CAAA,CAEC,QAAA,CAAAZ,CAAAA,CAAE,2BAA2B,CAAA,CAChC,CAAA,CAIH,QAAA,CAAAuC,GAAAA,CAAS3B,CAAK,CAAA,CAAE,MAAA,CACfQ,GAAAA,CAACgC,QAAAA,CAAA,CAAS,MAAA,CAAM,IAAA,CAAC,OAAA,CAAST,EACxB,QAAA,CAAAvB,GAAAA,CAACO,CAAAA,CAAA,CACC,KAAA,CAAOpC,CAAAA,GAAQgD,GAAAA,CAAS3B,CAAK,EAAE,MAAM,CAAA,CACrC,QAAA,CAAUvB,CAAAA,CACV,MAAA,CAAQC,CAAAA,CACR,WAAA,CAAaoD,CAAAA,CACb,SAAUW,CAAAA,EAAY,CACpB7D,CAAAA,GAAW,CACT,GAAGD,CAAAA,CACH,CAACgD,GAAAA,CAAS3B,CAAK,CAAA,CAAE,MAAM,EAAGyC,CAC5B,CAAC,EACH,CAAA,CACF,CAAA,CACF,EAEAjC,GAAAA,CAAC0C,KAAAA,CAAA,CAAM,WAAA,CAAa9D,CAAAA,CAAE,uCAAuC,CAAA,CAAG,CAAA,CAAA,CA/B7DY,CAiCP,CACD,CAAA,CACA,CAACvB,CAAAA,EACA+B,GAAAA,CAACyC,MAAAA,CAAA,CAAO,KAAA,CAAK,KAAC,IAAA,CAAK,QAAA,CAAS,OAAA,CAAShB,CAAAA,CAClC,QAAA,CAAA7C,CAAAA,CAAE,wBAAwB,CAAA,CAC7B,GAEJ,CAEJ,CAAA,CAEO+D,CAAAA,CAAQ/B,EAAAA,CCpJf,GAAM,CAAE,IAAA,CAAAJ,EAAK,EAAIC,UAAAA,CAOXmC,EAAAA,CAAwD7E,CAAAA,EAAS,CACrE,GAAM,CAAE,MAAA,CAAAG,CAAAA,CAAS,IAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAF,CAAAA,CAAU,QAAA,CAAAG,CAAS,CAAA,CAAIL,EAC/C,CAAE,IAAA,CAAMC,CAAAA,CAAa,SAAA,CAAAuD,CAAAA,CAAW,KAAA,CAAAT,CAAM,CAAA,CAAI+B,KAAkB,CAC5D,CAAE,CAAA,CAAAjE,CAAE,CAAA,CAAIC,CAAAA,EAAe,CAE7B,OAAIiC,EAEAd,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAACQ,EAAAA,CAAA,CAAK,KAAK,QAAA,CAAU,QAAA,CAAA5B,CAAAA,CAAE,kCAAkC,CAAA,CAAE,CAAA,CAC7D,CAAA,CAKFoB,GAAAA,CAACgC,SAAA,CAAS,MAAA,CAAM,IAAA,CAAC,OAAA,CAAST,CAAAA,CACxB,QAAA,CAAAvB,GAAAA,CAACO,CAAAA,CAAA,CACC,KAAA,CAAOpC,CAAAA,CACP,WAAA,CAAaH,CAAAA,CACb,QAAA,CAAUC,CAAAA,CACV,MAAA,CAAQC,CAAAA,CACR,SAAUE,CAAAA,CACZ,CAAA,CACF,CAEJ,CAAA,CAEO0E,CAAAA,CAAQF,EAAAA,CC5Bf,IAAMG,EAAAA,CAA2ChF,CAAAA,EAA+B,CAC9E,GAAM,CAAE,KAAA,CAAAI,CAAM,EAAIJ,CAAAA,CACZ,CACJ,OAAA,CAAS,CAAE,cAAA,CAAAiF,CAAe,CAC5B,CAAA,CAAIC,GAAiB,CAErB,OAAID,CAAAA,GAAmB,aAAA,CACdhD,GAAAA,CAAC8C,CAAAA,CAAA,CAAuB,GAAG/E,EAAO,KAAA,CAAOI,CAAAA,CAAgC,CAAA,CAG3E6B,GAAAA,CAAC2C,CAAAA,CAAA,CAAoB,GAAG5E,CAAAA,CAAO,MAAOI,CAAAA,CAAgC,CAC/E,CAAA,CAEO+E,CAAAA,CAAQH,GCnBR,IAAMI,EAAAA,CAAe,CAAC,CAAE,IAAA,CAAAC,CAAAA,CAAM,UAAAC,CAAU,CAAA,GAA6D,CAC1G,GAAM,CAAE,OAAA,CAAAC,CAAQ,CAAA,CAAIC,IAAI,MAAA,EAAO,CACzB,CAAE,CAAA,CAAA3E,CAAE,CAAA,CAAIC,CAAAA,EAAe,CACvB2E,EAASC,CAAAA,EAAc,CACvBC,CAAAA,CAASC,CAAAA,EAAc,CAEvBC,GAAAA,CAAeR,CAAAA,GAAS,QAAA,CAExBS,EAAuBjF,CAAAA,CAAfgF,GAAAA,CAAiB,kBAAA,CAAwB,kBAAN,CAAA,CAE3CE,CAAAA,CACJhC,IAAAA,CAAAiC,QAAAA,CAAA,CACE,QAAA,CAAA,CAAA/D,GAAAA,CAACgE,IAAAA,CAAK,IAAA,CAAL,CAAU,KAAA,CAAOpF,CAAAA,CAAE,aAAa,EAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAO,CAAC,CAAE,QAAA,CAAU,IAAK,CAAC,EACxE,QAAA,CAAAoB,GAAAA,CAACiE,KAAAA,CAAA,CAAM,QAAA,CAAU,CAACL,GAAAA,CAAc,CAAA,CAClC,EACA5D,GAAAA,CAACgE,IAAAA,CAAK,IAAA,CAAL,CAAU,IAAA,CAAK,aAAA,CACd,QAAA,CAAAhE,GAAAA,CAACkD,EAAA,EAAe,CAAA,CAClB,CAAA,CAAA,CACF,CAAA,CAoBF,OAAOgB,GAAAA,CAML,CACA,KAAA,CAAAL,EACA,KAAA,CAAO,QAAA,CACP,SAAA,CAAW,CACT,MAAA,CAAQ,UACV,CAAA,CACA,OAAA,CAAAC,EACA,SAAA,CA9BgB,MAChBK,CAAAA,CACAC,CAAAA,GACG,CACH,IAAMC,CAAAA,CAAO,CAAA,KAAA,EAAQF,EAAO,IAAI,CAAA,CAAA,CAC1BnG,CAAAA,CAAcmG,CAAAA,CAAO,WAAA,CAEvBP,GAAAA,EACF,MAAMJ,CAAAA,CAAO,YAAY,CAAE,IAAA,CAAAa,CAAAA,CAAM,WAAA,CAAArG,CAAY,CAAC,CAAA,CAC9CsF,CAAAA,CAAQ,QAAQ1E,CAAAA,CAAE,yBAAyB,CAAC,CAAA,GAE5C,MAAM8E,CAAAA,CAAO,WAAA,CAAY,CAAE,GAAIU,CAAAA,EAAa,EAAA,CAAI,IAAA,CAAAC,CAAAA,CAAM,WAAA,CAAArG,CAAY,CAAC,CAAA,CACnEsF,EAAQ,OAAA,CAAQ1E,CAAAA,CAAE,yBAAyB,CAAC,CAAA,CAAA,CAE9CyE,CAAAA,KACF,CAgBA,CAAC,CACH","file":"chunk-MVG7YFPB.js","sourcesContent":["import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useCallback, useEffect, useState, useTransition } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nimport type { PermissionEnumItem } from '../../types'\n\ninterface PermissionCollapseProps {\n expand?: boolean\n permissions?: PermissionEnumItem[]\n readonly?: boolean\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst PermissionCollapse: FC<PermissionCollapseProps> = props => {\n const { permissions, readonly, expand, value, onChange } = props\n const [activeKey, setActiveKey] = useState<string[]>([])\n const [checkedMap, setCheckedMap] = useState<Record<string, boolean>>({})\n const [internalValue, setInternalValue] = useState<string[]>(value ?? [])\n const { t } = useTranslation()\n const [, startTransition] = useTransition()\n\n const onCollapseChange = useCallback((key: string | string[]) => {\n setActiveKey(key as string[])\n }, [])\n\n const getCheckedValue = (checkedValue: boolean, codes: string[]) => {\n let tempValue: string[] = []\n\n if (checkedValue) {\n tempValue = [...new Set(internalValue.concat(codes))]\n } else {\n tempValue = internalValue.slice()\n\n codes.forEach(code => {\n const index = tempValue.findIndex(item => item === code)\n if (index > -1) {\n tempValue.splice(index, 1)\n }\n })\n }\n\n return tempValue\n }\n\n const onCheckChange = (e: CheckboxChangeEvent, codes: string[]) => {\n const checkedValue = getCheckedValue(e.target.checked, codes)\n setInternalValue(checkedValue)\n onChange?.(checkedValue)\n }\n\n useEffect(() => {\n setInternalValue(value ?? [])\n }, [value])\n\n useEffect(() => {\n if (expand) {\n startTransition(() => {\n // 改变展开状态\n setActiveKey((permissions ?? []).map(({ category }) => category))\n })\n }\n }, [expand, permissions])\n\n useEffect(() => {\n const checkedValue = (permissions ?? []).reduce(\n (acc, curr) => {\n acc[curr.category] = curr.permissions.every(item => internalValue?.includes(item.value))\n return acc\n },\n {} as Record<string, boolean>,\n )\n\n setCheckedMap(checkedValue)\n }, [internalValue, permissions])\n\n const items = (permissions ?? []).map(item => ({\n key: item.category,\n label: item.category,\n extra: !readonly && (\n <Checkbox\n checked={checkedMap[item.category]}\n onChange={e => {\n onCheckChange(\n e,\n item.permissions?.map(permission => permission.value),\n )\n }}\n >\n {t('global.selectAll')}\n </Checkbox>\n ),\n children: (\n <Checkbox.Group className=\"w-full\" value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} className=\"w-full\">\n {item.permissions?.map(permission => (\n <Col key={permission.value} span={6}>\n <Checkbox\n value={permission.value}\n onChange={e => {\n onCheckChange(e, [permission.value])\n }}\n >\n {permission.label}\n </Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n ),\n }))\n\n return (\n <Collapse className=\"w-full\" collapsible=\"header\" activeKey={activeKey} items={items} onChange={onCollapseChange} />\n )\n}\n\nexport default PermissionCollapse\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport { useAllPermissionsV2 } from '../../services'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionWithGameProps extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionWithGame: FC<PermissionWithGameProps> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permission, isLoading: isPermissionLoading, error } = useAllPermissionsV2()\n const { data: games, isLoading: isGamesLoading } = useGames()\n const [gameList, setGameList] = useState<{ gameId: string; permissions: string[] }[]>([])\n const globalPermissions = permission?.filter(item => item.is_common)\n const gamePermissions = permission?.filter(item => !item.is_common)\n const isLoading = isPermissionLoading || isGamesLoading\n const { t } = useTranslation()\n\n useEffect(() => {\n const list: { gameId: string; permissions: string[] }[] = []\n\n Object.keys(value ?? {}).forEach(key => {\n if (key !== 'global') {\n list.push({ gameId: key, permissions: value?.[key] ?? [] })\n }\n })\n\n setGameList(list)\n }, [value])\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n const addGame = () => {\n setGameList(prev => [...prev, { gameId: '', permissions: [] }])\n }\n\n const removeGame = (index: number) => {\n setGameList(prev => prev.filter((_, i) => i !== index))\n }\n\n return (\n <div className=\"flex flex-col w-full\">\n <div className=\"mb-12\">\n <Divider dashed>{t('PermissionList.baseSectionTitle')}</Divider>\n </div>\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.global}\n readonly={readonly}\n permissions={globalPermissions}\n expand={expand}\n onChange={newValue => {\n onChange?.({\n ...value,\n global: newValue,\n })\n }}\n />\n </Skeleton>\n <div className=\"my-12\">\n <Divider dashed>{t('PermissionList.gameSectionTitle')}</Divider>\n </div>\n {gameList.map((item, index) => (\n <Card\n title={\n <Space>\n <Text>{t('global.game')}</Text>\n {readonly ? (\n <Text>{games?.find(game => String(game.id) === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n className=\"w-40\"\n placeholder={t('PermissionList.gameSelectPlaceholder')}\n onChange={selectedValue => {\n setGameList(pev => {\n const temp = pev.slice()\n temp[index].gameId = selectedValue\n return temp\n })\n }}\n >\n {games?.map(game => (\n <Option\n key={game.id}\n value={game.id}\n disabled={gameList.some(({ gameId }) => gameId === String(game.id))}\n >\n {game.name}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n }\n key={index}\n className=\"mb-6\"\n extra={\n !readonly && (\n <Button\n type=\"link\"\n onClick={() => {\n removeGame(index)\n }}\n >\n {t('PermissionList.removeText')}\n </Button>\n )\n }\n >\n {gameList[index].gameId ? (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.[gameList[index].gameId]}\n readonly={readonly}\n expand={expand}\n permissions={gamePermissions}\n onChange={newValue => {\n onChange?.({\n ...value,\n [gameList[index].gameId]: newValue,\n })\n }}\n />\n </Skeleton>\n ) : (\n <Empty description={t('PermissionList.gameSectionDescription')} />\n )}\n </Card>\n ))}\n {!readonly && (\n <Button block type=\"dashed\" onClick={addGame}>\n {t('PermissionList.addText')}\n </Button>\n )}\n </div>\n )\n}\n\nexport default PermissionWithGame\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nimport { useAllPermissions } from '../../services'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../permissionCollapse'\nimport type { PermissionListPropsBase } from './types'\n\nconst { Text } = Typography\n\ninterface PermissionWithoutGameProps extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionWithoutGame: FC<PermissionWithoutGameProps> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permissions, isLoading, error } = useAllPermissions()\n const { t } = useTranslation()\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n return (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value}\n permissions={permissions}\n readonly={readonly}\n expand={expand}\n onChange={onChange}\n />\n </Skeleton>\n )\n}\n\nexport default PermissionWithoutGame\n","import type { FC } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { PermissionMode } from '@/constants'\n\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionWithGame from './PermissionWithGame'\nimport PermissionWithoutGame from './PermissionWithoutGame'\nimport type { PermissionListPropsBase } from './types'\n\ninterface PermissionListProps extends PermissionListPropsBase {\n value?: RoleV1['permissions'] | RoleV2['permissions']\n onChange?: (checkedValue: RoleV1['permissions'] | RoleV2['permissions']) => void\n}\n\nconst PermissionList: FC<PermissionListProps> = (props: PermissionListProps) => {\n const { value } = props\n const {\n context: { permissionMode },\n } = useToolkitsStore()\n\n if (permissionMode === PermissionMode.GAME_SCOPED) {\n return <PermissionWithoutGame {...props} value={value as RoleV1['permissions']} />\n }\n\n return <PermissionWithGame {...props} value={value as RoleV2['permissions']} />\n}\n\nexport default PermissionList\n","import { App, Form, Input } from 'antd'\n\nimport { useFormModal } from '@/hooks/modal'\nimport { useTranslation } from '@/locale'\n\nimport PermissionList from '../components/permissionList'\nimport { useCreateRole, useUpdateRole } from '../services'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../types'\n\nexport const useRoleModal = ({ mode, onSuccess }: { mode: 'create' | 'update'; onSuccess?: () => void }) => {\n const { message } = App.useApp()\n const { t } = useTranslation()\n const create = useCreateRole()\n const update = useUpdateRole()\n\n const isCreateMode = mode === 'create'\n\n const title = isCreateMode ? t('Role.createTitle') : t('Role.updateTitle')\n\n const content = (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input disabled={!isCreateMode} />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n )\n\n const onConfirm = async (\n values: { name: string; permissions: RoleListItem['permissions'] },\n extraValues: { id: number },\n ) => {\n const name = `role_${values.name}`\n const permissions = values.permissions\n\n if (isCreateMode) {\n await create.mutateAsync({ name, permissions })\n message.success(t('Role.createSuccessfully'))\n } else {\n await update.mutateAsync({ id: extraValues?.id, name, permissions })\n message.success(t('Role.updateSuccessfully'))\n }\n onSuccess?.()\n }\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n { id: number }\n >({\n title,\n width: '1000px',\n formProps: {\n layout: 'vertical',\n },\n content,\n onConfirm,\n })\n}\n"]}
|