react-toolkits 2.26.0 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/lib/chunk-56C2GQCB.js +2 -0
  3. package/lib/chunk-56C2GQCB.js.map +1 -0
  4. package/lib/chunk-6SMI25Y3.js +19 -0
  5. package/lib/chunk-6SMI25Y3.js.map +1 -0
  6. package/lib/{chunk-D5YXBSTI.js → chunk-7XR7V6IS.js} +2 -2
  7. package/lib/{chunk-D5YXBSTI.js.map → chunk-7XR7V6IS.js.map} +1 -1
  8. package/lib/chunk-AFURMXX2.js +2 -0
  9. package/lib/chunk-AFURMXX2.js.map +1 -0
  10. package/lib/{chunk-MVG7YFPB.js → chunk-COONHXCY.js} +2 -2
  11. package/lib/{chunk-MVG7YFPB.js.map → chunk-COONHXCY.js.map} +1 -1
  12. package/lib/chunk-DBYHBFI6.js +206 -0
  13. package/lib/chunk-DBYHBFI6.js.map +1 -0
  14. package/lib/chunk-JJR5NJTU.js +75 -0
  15. package/lib/chunk-JJR5NJTU.js.map +1 -0
  16. package/lib/chunk-LUVKLLW7.js +2 -0
  17. package/lib/chunk-LUVKLLW7.js.map +1 -0
  18. package/lib/chunk-M2C4DTSM.js +46 -0
  19. package/lib/chunk-M2C4DTSM.js.map +1 -0
  20. package/lib/{chunk-5QAEUAZE.js → chunk-NEOHLVWG.js} +2 -2
  21. package/lib/{chunk-5QAEUAZE.js.map → chunk-NEOHLVWG.js.map} +1 -1
  22. package/lib/chunk-O7INKFFW.js +161 -0
  23. package/lib/chunk-O7INKFFW.js.map +1 -0
  24. package/lib/chunk-Q6MAXVON.js +2 -0
  25. package/lib/chunk-Q6MAXVON.js.map +1 -0
  26. package/lib/chunk-QEUTBIBK.js +125 -0
  27. package/lib/chunk-QEUTBIBK.js.map +1 -0
  28. package/lib/chunk-R72QFX5M.js +495 -0
  29. package/lib/chunk-R72QFX5M.js.map +1 -0
  30. package/lib/chunk-TYMPX257.js +268 -0
  31. package/lib/chunk-TYMPX257.js.map +1 -0
  32. package/lib/chunk-UICHZXQP.js +3 -0
  33. package/lib/chunk-UICHZXQP.js.map +1 -0
  34. package/lib/chunk-WFRMJYD3.js +2 -0
  35. package/lib/chunk-WFRMJYD3.js.map +1 -0
  36. package/lib/chunk-Z7GW3RVV.js +658 -0
  37. package/lib/chunk-Z7GW3RVV.js.map +1 -0
  38. package/lib/createMenuItem-7R7QR4R6.js +83 -0
  39. package/lib/createMenuItem-7R7QR4R6.js.map +1 -0
  40. package/lib/{createMenuItem-Q5TJGFKZ.js → createMenuItem-A3ES4CDV.js} +2 -2
  41. package/lib/{createMenuItem-Q5TJGFKZ.js.map → createMenuItem-A3ES4CDV.js.map} +1 -1
  42. package/lib/index.css +1 -1
  43. package/lib/index.d.ts +26 -11
  44. package/lib/index.js +1446 -2
  45. package/lib/index.js.map +1 -1
  46. package/lib/menuItemList-BUUJMOU7.js +129 -0
  47. package/lib/menuItemList-BUUJMOU7.js.map +1 -0
  48. package/lib/{menuItemList-2QZXJVWZ.js → menuItemList-YFQB4BCS.js} +2 -2
  49. package/lib/{menuItemList-2QZXJVWZ.js.map → menuItemList-YFQB4BCS.js.map} +1 -1
  50. package/lib/{roleDetail-ODJVDVB4.js → roleDetail-H2X34J57.js} +2 -2
  51. package/lib/{roleDetail-ODJVDVB4.js.map → roleDetail-H2X34J57.js.map} +1 -1
  52. package/lib/roleDetail-IP654MAU.js +72 -0
  53. package/lib/roleDetail-IP654MAU.js.map +1 -0
  54. package/lib/roleList-QMAYO4MG.js +161 -0
  55. package/lib/roleList-QMAYO4MG.js.map +1 -0
  56. package/lib/roleList-UCMHN5NJ.js +2 -0
  57. package/lib/roleList-UCMHN5NJ.js.map +1 -0
  58. package/lib/updateMenuItem-NUYWRAV5.js +2 -0
  59. package/lib/updateMenuItem-NUYWRAV5.js.map +1 -0
  60. package/lib/updateMenuItem-SZVEK3TL.js +106 -0
  61. package/lib/updateMenuItem-SZVEK3TL.js.map +1 -0
  62. package/lib/userDetail-6XMOY3I4.js +2 -0
  63. package/lib/userDetail-6XMOY3I4.js.map +1 -0
  64. package/lib/userDetail-MPTJGRMY.js +118 -0
  65. package/lib/userDetail-MPTJGRMY.js.map +1 -0
  66. package/lib/{userList-QHQHRPSV.js → userList-3WABI7V4.js} +2 -2
  67. package/lib/{userList-QHQHRPSV.js.map → userList-3WABI7V4.js.map} +1 -1
  68. package/lib/userList-KXYDP7V5.js +166 -0
  69. package/lib/userList-KXYDP7V5.js.map +1 -0
  70. package/locale/context.js +7 -1
  71. package/locale/context.js.map +1 -1
  72. package/locale/en_GB.js +94 -1
  73. package/locale/en_GB.js.map +1 -1
  74. package/locale/hooks.js +20 -1
  75. package/locale/hooks.js.map +1 -1
  76. package/locale/index.js +2 -1
  77. package/locale/ja_JP.js +94 -1
  78. package/locale/ja_JP.js.map +1 -1
  79. package/locale/ko_KR.js +94 -1
  80. package/locale/ko_KR.js.map +1 -1
  81. package/locale/zh_CN.js +94 -1
  82. package/locale/zh_CN.js.map +1 -1
  83. package/package.json +22 -22
  84. package/lib/chunk-24U2EF5M.js +0 -2
  85. package/lib/chunk-24U2EF5M.js.map +0 -1
  86. package/lib/chunk-F2GDEOP4.js +0 -3
  87. package/lib/chunk-F2GDEOP4.js.map +0 -1
  88. package/lib/chunk-FIT6S4UM.js +0 -2
  89. package/lib/chunk-FIT6S4UM.js.map +0 -1
  90. package/lib/chunk-IKGXKB6T.js +0 -2
  91. package/lib/chunk-IKGXKB6T.js.map +0 -1
  92. package/lib/chunk-JDCSIJL7.js +0 -2
  93. package/lib/chunk-JDCSIJL7.js.map +0 -1
  94. package/lib/chunk-KZHYK554.js +0 -2
  95. package/lib/chunk-KZHYK554.js.map +0 -1
  96. package/lib/roleList-MQOFJ3LH.js +0 -2
  97. package/lib/roleList-MQOFJ3LH.js.map +0 -1
  98. package/lib/updateMenuItem-4HDRJAY7.js +0 -2
  99. package/lib/updateMenuItem-4HDRJAY7.js.map +0 -1
  100. package/lib/userDetail-B5H4A4X2.js +0 -2
  101. package/lib/userDetail-B5H4A4X2.js.map +0 -1
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/infiniteList/stores.ts","../src/components/infiniteList/InfiniteList.tsx","../src/components/layout/GameSelect.tsx","../src/components/nav/stores.ts","../src/components/nav/utils.tsx","../src/components/nav/Nav.tsx","../src/components/requireGame/RequireGame.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/logo/Logo.tsx","../src/components/layout/LayoutHeader.tsx","../src/components/layout/Layout.tsx","../src/components/requireAuth/RequireAuth.tsx","../src/hooks/drawer/stores.ts","../src/hooks/drawer/drawer.tsx","../src/hooks/drawer/formDrawer.tsx","../src/modules/menu/index.tsx","../src/modules/permission/index.tsx","../src/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/hooks.ts","../src/pages/signIn/index.tsx"],"names":["DynamicTags","props","initialTags","addable","removable","addCallback","removeCallback","t","useTranslation","token","theme","tags","setTags","useState","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","useRef","editInputRef","useEffect","handleClose","removedTag","newTags","tag","showInput","handleInputChange","e","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","jsxs","Space","jsx","index","Input","Tag","PlusOutlined","DynamicTags_default","ExpandableParagraph","children","restProps","expanded","setExpanded","Typography","_","info","ExpandableParagraph_default","DEFAULT_PAYLOAD","createStore","create","devtools","subscribeWithSelector","set","get","id","url","queryKey","refetch","fetchNextPage","state","existingInstance","updatedInstance","newInstances","instance","payload","newPayload","isEqual","payloadChanged","currentPayload","error","store","useInfiniteListStore","DEFAULT_CACHE_TIME","DEFAULT_STALE_TIME","identifierCounter","generateUniqueIdentifier","InternalInfiniteList","ref","internalProps","data","page","lastPage","allPages","_pageParam","pageData","identifier","code","buttonsAlign","showReset","refreshInterval","request","tableExtra","renderForm","afterSuccess","afterError","dataAdapter","initialPageParam","footer","form","tableProps","_form","Form","isValid","setIsValid","shouldPoll","action","ky","useKy","accessible","isChecking","useAuth","finalIdentifier","useMemo","subscribedPayload","s","formInstance","method","body","params","headers","cacheTime","staleTime","requestHeaders","hasNextPage","isFetchingNextPage","isFetching","useInfiniteQuery","pageParam","requestParams","requestBody","kyOptions","response","err","errorObj","failureCount","retryError","attemptIndex","dataSource","isLoadingMore","isReachingEnd","isEmpty","onConfirm","values","loadMore","onReset","useImperativeHandle","Spin","Result","renderFooter","Fragment","renderTableExtra","formRenderer","FilterFormWrapper_default","cloneElement","Table","Button","InfiniteList","forwardRef","InfiniteList_default","Text","GameSelect","filter","options","useGameApiV2","appId","setAppId","useToolkitsStore","isLoading","useGames","queryClient","useQueryClient","filteredData","item","selectOptions","handleChange","value","query","Select","GameSelect_default","useNavStore","persist","keys","current","key","createJSONStorage","NavLink","Link","convertToAntdMenuItems","items","result","i","rest","route","label","labelNode","flattenNavItems","keypath","newKeypath","Nav","loading","location","useLocation","collapsed","flattenedItems","antdMenuItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","match","currentSelectedKeys","currentOpenKeys","missingKeys","k","Menu","Nav_default","RequireGame","isGlobalMode","gameScoped","Empty","RequireGame_default","memo","UserDropdown","navigate","useNavigate","user","loginPath","clear","handleSignOut","handleKeyDown","handleDropdownKeyDown","LogoutOutlined","Dropdown","UserOutlined","UserDropdown_default","Logo","logo_default","Logo_default","TRANSITION_EASING","LayoutHeader","title","subtitle","homePath","colorPrimary","LayoutHeader_default","Header","Sider","Content","AntdLayout","HEADER_HEIGHT","matchRoute","pathname","rule","prefix","Layout","navigation","gameSelect","headerExtra","colorBgContainer","colorBorder","sidebarWidth","sidebarCollapsible","toggleCollapsed","showGameSelect","Divider","MenuUnfoldOutlined","MenuFoldOutlined","extra","Suspense","Layout_default","RequireAuth","config","redirectPath","RequireAuth_default","useDrawerStore","createVisibilityStore","useDrawer","content","afterOpen","afterClose","confirmText","cancelText","confirmButtonProps","cancelButtonProps","drawerProps","_id","generateId","show","hide","isOpen","cleanup","open","confirmLoading","setConfirmLoading","isRenderFunction","_show","useCallback","_hide","onClose","handleConfirm","drawerFooter","internalDrawer","Drawer","useFormDrawer","formProps","onSuccess","internalExtraValues","setInternalExtraValues","internalForm","drawer","operation","showForm","initialValues","extraValues","MenuItemList","lazy","CreateMenuItem","UpdateMenuItem","menu_default","ToolkitsProvider_default","Routes","Route","UserList","UserDetail","RoleList","RoleDetail","permission_default","Navigate","NotFound","redirectUrl","notFound_default","Option","OperationLogList","columns","dayjs","Card","QueryList_default","operationLogList_default","clearUrlParams","param","useTicketLogin","setToken","queryParams","ticket","unregisteredFromUrl","isUnregistered","setIsUnregistered","useQuery","queryKeys","SignIn","dismissUnregistered","ssoLoginUrl","SSO_URL","background_default","Alert","LoginOutlined","signIn_default"],"mappings":"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","file":"index.js","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const { t } = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n className=\"select-none\"\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag className=\"border-dashed\" style={{ background: token.colorBgContainer }} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { InfiniteListPayload } from './InfiniteList'\n\n// Infinite Query 更新函数类型\ntype InfiniteQueryRefetchFunction = () => void | Promise<unknown>\ntype InfiniteQueryFetchNextPageFunction = () => void | Promise<unknown>\n\n// InfiniteList 实例信息\ninterface InfiniteListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: InfiniteListPayload\n refetch: InfiniteQueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n// 简化的状态接口\ninterface InfiniteListState {\n // 实例管理\n instances: Map<string, InfiniteListInstance>\n\n // 核心方法\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: InfiniteQueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n ): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: InfiniteListPayload): void\n getPayload(id: string): InfiniteListPayload\n refetch(id: string, payload?: InfiniteListPayload): Promise<void>\n fetchNextPage(id: string): Promise<void>\n\n // 工具方法\n getInstance(id: string): InfiniteListInstance | undefined\n getAllInstances(): InfiniteListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<InfiniteListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch, fetchNextPage) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新函数\n if (existingInstance) {\n // 仅当引用发生变化时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch || existingInstance.fetchNextPage !== fetchNextPage) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n fetchNextPage,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: InfiniteListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n fetchNextPage,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n async fetchNextPage(id) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n // 调用 fetchNextPage 函数\n try {\n await instance.fetchNextPage()\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'infinite-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useInfiniteListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useInfiniteQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useInfiniteListStore } from './stores'\n\nexport interface InfiniteListPayload<Values = any> {\n page?: number\n filters?: Values\n}\n\nexport interface InfiniteListRequestConfig<Values = any> {\n url: string\n method?: 'GET' | 'POST'\n body?:\n | FormData\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => FormData | Record<string | number, any>)\n params?:\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => Record<string | number, any>)\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n // 缓存配置\n cacheTime?: number // 缓存时间(毫秒)\n staleTime?: number // 数据新鲜时间(毫秒)\n}\n\nexport enum InfiniteListAction {\n Confirm,\n Reset,\n LoadMore,\n Init,\n}\n\nexport interface InfiniteListDataAdapter<Item = any, Values = any, Data = any> {\n items?: (data: Data[] | undefined, form: FormInstance<Values>) => Item[] | undefined\n hasMore?: (lastPage: Data | undefined, allPages: Data[]) => boolean\n nextPageParam?: (lastPage: Data | undefined, allPages: Data[], pageParam: any) => any\n}\n\nexport interface InfiniteListRef<Item = any, Values = any, Data = any> {\n data: Data[] | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n refetch: () => void\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n}\n\nexport interface InfiniteListProps<Item, Values, Data>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string // 可选标识符,未提供时自动生成\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n request: InfiniteListRequestConfig<Values> // 必需的请求配置\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data[]) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: InfiniteListAction, form: FormInstance<Values>, data?: Data[]) => void\n afterError?: (error: Error, action: InfiniteListAction, form: FormInstance<Values>) => void\n dataAdapter?: InfiniteListDataAdapter<Item, Values, Data>\n initialPageParam?: any\n footer?: (data: Data[] | undefined) => ReactNode\n}\n\n// 常量定义(对齐 QueryList 行为)\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\nconst DEFAULT_STALE_TIME = 30 * 1000\n\n// 生成唯一 identifier 的计数器\nlet identifierCounter = 0\nconst generateUniqueIdentifier = (): string => `infiniteList_${Date.now()}_${++identifierCounter}`\n\nconst InternalInfiniteList = <Item extends AnyObject, Values extends object | undefined = undefined, Data = any>(\n props: InfiniteListProps<Item, Values, Data>,\n ref: Ref<InfiniteListRef<Item, Values, Data>>,\n) => {\n const defaultDataAdapter: InfiniteListDataAdapter<Item, Values, Data> = {\n items: (data: Data[] | undefined) => {\n if (!data) return []\n return data.flatMap((page: any) => page?.list || page || [])\n },\n hasMore: (lastPage: Data | undefined): boolean => {\n if (!lastPage) return false\n const page = lastPage as any\n return page?.hasMore || page?.has_more || false\n },\n nextPageParam: (lastPage: Data | undefined, allPages: Data[], _pageParam: any): any => {\n const hasMore = (page: Data | undefined): boolean => {\n if (!page) return false\n const pageData = page as any\n return pageData?.hasMore || pageData?.has_more || false\n }\n return hasMore(lastPage) ? allPages.length : undefined\n },\n }\n\n const internalProps: InfiniteListProps<Item, Values, Data> & {\n refreshInterval: number\n initialPageParam: any\n } = {\n refreshInterval: 0,\n initialPageParam: 0,\n ...props,\n dataAdapter: {\n ...defaultDataAdapter,\n ...props.dataAdapter,\n },\n }\n\n const {\n identifier,\n code,\n buttonsAlign,\n showReset,\n refreshInterval,\n request,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n dataAdapter,\n initialPageParam,\n footer,\n form,\n ...tableProps\n } = internalProps\n const { t } = useTranslation()\n const [_form] = Form.useForm<Values>(form)\n const [isValid, setIsValid] = useState(false)\n const shouldPoll = useRef(false)\n const action = useRef(InfiniteListAction.Init)\n const ky = useKy()\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n // 生成或使用提供的 identifier\n const finalIdentifier = useMemo(() => identifier || generateUniqueIdentifier(), [identifier])\n\n // 订阅当前 identifier 的 payload,驱动 queryKey 与渲染\n const subscribedPayload = useInfiniteListStore(s => s.getPayload(finalIdentifier))\n\n // 获取当前表单值\n const formInstance = useMemo(() => _form, [_form])\n\n // 构建请求参数\n const {\n url,\n method = 'GET',\n body,\n params,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = request\n const requestHeaders = useMemo(\n () => (typeof headers === 'function' ? headers(formInstance) : headers),\n [headers, formInstance],\n )\n // 请求参数和 body 将在 queryFn 中动态构建,因为它们依赖于 pageParam\n\n // 构建查询键\n const queryKey = useMemo(() => {\n return ['infiniteList', url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders]\n }, [url, finalIdentifier, accessible, isValid, subscribedPayload, requestHeaders])\n\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, refetch, isFetching } = useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = initialPageParam }) => {\n try {\n const payload = subscribedPayload\n\n // 动态构建请求参数,包含 pageParam\n const requestParams = typeof params === 'function' ? params(payload, pageParam) : params\n const requestBody = typeof body === 'function' ? body(payload, pageParam) : body\n\n const kyOptions: KyOptions = {\n method: method as any,\n searchParams: requestParams,\n headers: requestHeaders,\n }\n\n if (requestBody) {\n if (requestBody instanceof FormData) {\n kyOptions.body = requestBody\n } else {\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, [response])\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n initialPageParam,\n getNextPageParam: (lastPage: Data, allPages: Data[]) => {\n return dataAdapter?.nextPageParam?.(lastPage, allPages, initialPageParam)\n },\n enabled: accessible && isValid,\n retry: (failureCount, retryError) => {\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n gcTime: cacheTime,\n staleTime,\n })\n\n // 在组件挂载时注册实例\n useEffect(() => {\n useInfiniteListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch, fetchNextPage)\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url, queryKey, refetch, fetchNextPage])\n\n const dataSource = dataAdapter?.items?.(data?.pages, formInstance)\n const isLoadingMore = isFetchingNextPage\n const isReachingEnd = !hasNextPage\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n action.current = InfiniteListAction.Confirm\n const values = await _form.getFieldsValue()\n\n try {\n await _form.validateFields()\n setIsValid(true)\n\n // 更新 store 中的 payload\n useInfiniteListStore.getState().refetch(finalIdentifier, { page: 0, filters: values })\n } catch {\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n action.current = InfiniteListAction.LoadMore\n fetchNextPage()\n }\n\n const onReset = async () => {\n action.current = InfiniteListAction.Reset\n try {\n _form.resetFields()\n const values = await _form.getFieldsValue()\n\n // 重置 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n\n await _form.validateFields({ validateOnly: true })\n useInfiniteListStore.getState().refetch(finalIdentifier)\n } catch {\n // Handle validation error\n }\n }\n\n useEffect(() => {\n setTimeout(() => {\n if (accessible) {\n _form\n .validateFields({ validateOnly: true })\n .then(values => {\n setIsValid(true)\n\n // 初始化 store 中的 payload\n useInfiniteListStore.getState().updatePayload(finalIdentifier, { page: 0, filters: values })\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, 300)\n }, [accessible, _form, finalIdentifier])\n\n useImperativeHandle(ref, () => ({\n data: data?.pages,\n dataSource,\n form: _form,\n refetch: () => useInfiniteListStore.getState().refetch(finalIdentifier),\n fetchNextPage: () => useInfiniteListStore.getState().fetchNextPage(finalIdentifier),\n hasNextPage: !!hasNextPage,\n isFetchingNextPage,\n }))\n\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data?.pages)}</> : undefined\n\n const renderTableExtra = () => {\n if (typeof tableExtra === 'function') {\n return tableExtra(formInstance, data?.pages)\n }\n return tableExtra\n }\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isFetching}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(_form) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n // 屏蔽 Form 组件的警告(Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?)\n <Form form={_form} />\n )\n\n return (\n <>\n {formRenderer}\n {renderTableExtra()}\n <div className=\"min-h-[400px]\">\n <Table {...tableProps} dataSource={dataSource} loading={isFetching} pagination={false} footer={renderFooter} />\n </div>\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nconst InfiniteList = forwardRef(InternalInfiniteList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: InfiniteListProps<Item, Values, Data> & { ref?: Ref<InfiniteListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default InfiniteList\n","import { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect, useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nconst { Text } = Typography\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options } = props\n const { t } = useTranslation()\n const {\n context: { useGameApiV2 },\n game: { appId, setAppId },\n } = useToolkitsStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n\n const filteredData = useMemo(\n () => data?.filter((item: Game) => filter?.(item as T) ?? true) as T[] | undefined,\n [data, filter],\n )\n\n const selectOptions = useMemo(\n () =>\n typeof options === 'function'\n ? options(filteredData)\n : filteredData?.map((item: T) => ({\n label: item.name,\n value: useGameApiV2 ? item.game_id : item.id,\n })),\n [options, filteredData, useGameApiV2],\n )\n\n // 切换游戏时清空 TanStack Query 缓存触发重新请求以更新视图。\n const handleChange = (value: string | number) => {\n // 标记除游戏列表外的所有缓存为过期,保留现有数据直到新数据加载完成\n queryClient.invalidateQueries({\n predicate: query => {\n const queryKey = query.queryKey\n return !queryKey.includes('/api/game/list') && !queryKey.includes('/api/usystem/game/all')\n },\n })\n setAppId(value)\n }\n\n useEffect(() => {\n // 数据还在加载中时,不要修改 appId\n if (isLoading) return\n\n if (selectOptions && selectOptions.length > 0) {\n const hasValidAppId = appId && selectOptions.some(item => String(item.value) === String(appId))\n\n // 只有当 appId 无效时才设置为第一个选项\n if (!hasValidAppId) {\n setAppId(selectOptions[0]?.value ?? undefined)\n }\n } else if (selectOptions === undefined || selectOptions.length === 0) {\n // 如果没有选项,则清空当前游戏 ID\n setAppId(undefined)\n }\n }, [selectOptions, isLoading])\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={appId as string | number | undefined}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n className=\"w-[250px]\"\n options={selectOptions}\n onChange={handleChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n (set, get) => ({\n openKeys: [],\n setOpenKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (current.openKeys.length !== keys.length || !current.openKeys.every((key, index) => key === keys[index])) {\n set({ openKeys: keys })\n }\n },\n selectedKeys: [],\n setSelectedKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (\n current.selectedKeys.length !== keys.length ||\n !current.selectedKeys.every((key, index) => key === keys[index])\n ) {\n set({ selectedKeys: keys })\n }\n },\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n // 减少持久化频率,提升性能\n skipHydration: false,\n version: 1,\n },\n ),\n)\n","import type { ItemType, MenuDividerType } from 'antd/es/menu/interface'\nimport { Link } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\n\nimport type { NavItem, NavMenuItemGroupType, NavMenuItemType, NavSubMenuType } from './types'\n\n/** 导航菜单项接口(扁平化后,包含完整路径) */\nexport type FlatNavMenuItem = Merge<NavMenuItemType, { keypath?: string[] }>\n\n/**\n * 带记忆化的路由链接组件\n * 避免在菜单重渲染时重复创建 Link 组件\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NavLink = (props: { to: string; children?: any }) => <Link to={props.to}>{props.children}</Link>\n\n/**\n * 将自定义导航配置转换为 Ant Design Menu 配置\n * - 为带路由的菜单项包装 Link 组件\n * - 递归处理子菜单和菜单组\n * - 保留分割线等特殊项\n */\nexport function convertToAntdMenuItems(items?: NavItem[]): ItemType[] {\n const result: ItemType[] = []\n\n if (!items) return result\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n\n // 处理 null 或分割线\n if (item === null || (item as MenuDividerType).type === 'divider') {\n result[i] = item as null | MenuDividerType\n continue\n }\n\n // 处理子菜单或菜单组\n if ((item as NavSubMenuType | NavMenuItemGroupType).children) {\n const { children, ...rest } = item as NavSubMenuType | NavMenuItemGroupType\n result[i] = {\n ...rest,\n children: convertToAntdMenuItems(children),\n }\n continue\n }\n\n // 处理普通菜单项\n const { route, label, ...rest } = item as NavMenuItemType\n const labelNode = route ? <NavLink to={route}>{label}</NavLink> : label\n\n result[i] = {\n ...rest,\n label: labelNode,\n }\n }\n\n return result\n}\n\n/**\n * 扁平化导航配置,提取所有叶子节点菜单项\n * - 递归遍历所有嵌套菜单\n * - 为每个菜单项注入完整的 key 路径(用于展开父菜单)\n * - 跳过菜单组(不计入路径)\n *\n * @param items 导航配置项\n * @param result 结果数组(递归累积)\n * @param keypath 当前路径(递归累积)\n * @returns 扁平化后的菜单项数组\n */\nexport function flattenNavItems(\n items: NavItem[],\n result: FlatNavMenuItem[] = [],\n keypath: string[] = [],\n): FlatNavMenuItem[] {\n for (const item of items) {\n if (!item) continue\n\n const children = (item as NavSubMenuType | NavMenuItemGroupType)?.children as NavItem[]\n\n if (Array.isArray(children)) {\n // 计算新路径:菜单组不计入路径,只有子菜单计入\n const newKeypath =\n (item as NavMenuItemGroupType).type !== 'group' && item.key ? [...keypath, item.key as string] : keypath\n\n flattenNavItems(children, result, newKeypath)\n } else {\n // 叶子节点:添加到结果中\n result.push({ ...(item as NavMenuItemType), keypath })\n }\n }\n\n return result\n}\n","import type { MenuProps } from 'antd'\nimport { Menu, Spin } from 'antd'\nimport { useEffect } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\n\nimport { useNavStore } from './stores'\nimport type { NavItem } from './types'\nimport { convertToAntdMenuItems, flattenNavItems } from './utils'\n\nexport interface NavProps {\n items?: NavItem[]\n theme?: MenuProps['theme']\n loading?: boolean\n}\n\nconst Nav = (props: NavProps) => {\n const { items = [], theme, loading } = props\n const location = useLocation()\n const {\n layout: { collapsed },\n } = useToolkitsStore()\n\n const flattenedItems = flattenNavItems(items)\n const antdMenuItems = convertToAntdMenuItems(items)\n\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n useEffect(() => {\n const match = flattenedItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n\n // 使用 getState() 获取最新状态,避免将状态值作为 useEffect 依赖项,\n // 从而防止不必要的 Effect 执行循环\n const { selectedKeys: currentSelectedKeys, openKeys: currentOpenKeys } = useNavStore.getState()\n\n if (currentSelectedKeys[0] !== key) {\n setSelectedKeys([key])\n }\n\n // 只在 keypath 不在 openKeys 中时才添加,保留其他已展开的菜单\n const missingKeys = keypath.filter(k => !currentOpenKeys.includes(k))\n if (missingKeys.length > 0) {\n setOpenKeys([...currentOpenKeys, ...missingKeys])\n }\n }\n }, [flattenedItems, location.pathname, setOpenKeys, setSelectedKeys])\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center h-[calc(100vh-64px)]\">\n <Spin />\n </div>\n )\n }\n\n return (\n <Menu\n theme={theme}\n className=\"border-r-0\"\n items={antdMenuItems}\n mode=\"inline\"\n defaultOpenKeys={openKeys}\n defaultSelectedKeys={selectedKeys}\n inlineCollapsed={collapsed}\n onOpenChange={setOpenKeys}\n />\n )\n}\n\nexport default Nav\n","import { Empty, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Fragment, memo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const {\n context: { isGlobalMode, gameScoped },\n game: { appId },\n } = useToolkitsStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 如果数据不按游戏划分范围,直接返回内容\n if (!gameScoped || isGlobalMode) {\n return <>{children}</>\n }\n\n // 加载状态\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[400px]\">\n <Spin />\n </div>\n )\n }\n\n // 未选择游戏时显示空状态\n if (!appId) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n }\n\n // 正常情况:使用 Fragment 包裹 children,key 用于在切换游戏时重置组件状态\n return <Fragment key={appId}>{children}</Fragment>\n}\n\nexport default memo(RequireGame)\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC, KeyboardEvent } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nconst UserDropdown: FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const {\n token: { user },\n context: { loginPath },\n clear,\n } = useToolkitsStore()\n\n const handleSignOut = () => {\n clear()\n navigate(loginPath)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSignOut()\n }\n }\n\n const handleDropdownKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n icon: <LogoutOutlined />,\n label: (\n <a role=\"button\" tabIndex={0} onClick={handleSignOut} onKeyDown={handleKeyDown}>\n {t('UserDropdown.signOutText')}\n </a>\n ),\n },\n ]\n\n return (\n <div>\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n <a\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.preventDefault()\n }}\n onKeyDown={handleDropdownKeyDown}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined className=\"text-base\" />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserDropdown\n","import type { DetailedHTMLProps, FC, ImgHTMLAttributes } from 'react'\n\nimport logoUrl from './logo.png'\n\nexport type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>\n\nconst Logo: FC<LogoProps> = props => {\n return <img src={logoUrl} alt=\"logo\" {...props} />\n}\n\nexport default Logo\n","import { theme } from 'antd'\nimport { memo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitsStore } from '../toolkitsProvider'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n}\n\nconst TRANSITION_EASING = 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\n\nconst LayoutHeader = memo<LayoutHeaderProps>(({ title, subtitle }) => {\n const {\n context: { homePath },\n layout: { collapsed },\n } = useToolkitsStore()\n const {\n token: { colorPrimary },\n } = theme.useToken()\n\n return (\n <div className=\"px-6 py-2 font-bold relative bg-linear-to-r from-white to-gray-50/30 h-auto flex flex-col justify-center backdrop-blur-sm\">\n <div className={`flex items-center w-full ${collapsed ? 'justify-center' : ''}`}>\n <Link\n to={homePath}\n className=\"transition-all duration-300 ease-out block rounded-lg p-1\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0.8 : 1,\n }}\n >\n <Logo\n width={36}\n className=\"object-contain block\"\n style={{\n transition: TRANSITION_EASING,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml-4 overflow-hidden min-w-0\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0 : 1,\n width: collapsed ? '0px' : 'auto',\n marginLeft: collapsed ? '0px' : '16px',\n transform: collapsed ? 'translateX(-8px)' : 'translateX(0)',\n }}\n >\n <Link\n to={homePath}\n className=\"text-xl leading-tight transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block\"\n title={title}\n style={{\n color: colorPrimary,\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {title}\n </Link>\n </div>\n )}\n </div>\n <div\n className=\"w-full mt-2 overflow-hidden\"\n style={{\n height: subtitle && !collapsed ? '20px' : '1px',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex items-center justify-center h-full w-full\">\n <div\n className=\"w-full border-t border-gray-200 absolute\"\n style={{\n opacity: !subtitle || collapsed ? 1 : 0,\n transition: TRANSITION_EASING,\n }}\n />\n {subtitle && (\n <div\n className=\"flex items-center w-full text-sm\"\n style={{\n opacity: collapsed ? 0 : 1,\n transform: collapsed ? 'translateY(-3px)' : 'translateY(0)',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex-1 border-t border-gray-200\"></div>\n <span className=\"px-3 text-gray-500 font-medium whitespace-nowrap\" title={subtitle}>\n {subtitle}\n </span>\n <div className=\"flex-1 border-t border-gray-200\"></div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n})\n\nLayoutHeader.displayName = 'LayoutHeader'\n\nexport default LayoutHeader\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'\nimport { Button, Divider, Layout as AntdLayout, Space, Spin, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport type { NavItem } from '@/components/nav'\nimport { Nav } from '@/components/nav'\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { UserDropdown } from '@/components/userDropdown'\n\nimport type { GameSelectProps } from './GameSelect'\nimport GameSelect from './GameSelect'\nimport LayoutHeader from './LayoutHeader'\nimport type { Game } from './types'\n\nconst { Header, Sider, Content } = AntdLayout\n\nconst HEADER_HEIGHT = 64\n\n/** Header 扩展项配置 */\nexport type HeaderExtra = { key: Key; children: ReactNode }\n\n/** Header 扩展区域配置 */\nexport interface HeaderExtraConfig {\n /** 左侧扩展项 */\n left?: HeaderExtra[]\n /** 右侧扩展项 */\n right?: HeaderExtra[]\n}\n\n/** 导航配置 */\nexport interface NavigationConfig {\n /** 导航菜单项 */\n items?: NavItem[]\n /** 菜单加载状态 */\n loading?: boolean\n}\n\n/** 路由匹配规则类型 */\nexport type RouteMatchRule = string | RegExp\n\n/** 游戏选择器配置 */\nexport interface GameSelectConfig<T extends Game = Game> {\n /** 游戏过滤函数 */\n filter?: GameSelectProps<T>['filter']\n /** 选项自定义函数 */\n options?: GameSelectProps<T>['options']\n /** 在这些路由路径下隐藏游戏选择器(支持字符串路径或正则表达式) */\n hideOnRoutes?: RouteMatchRule[]\n}\n\n/** Layout 组件属性 */\nexport interface LayoutProps<T extends Game = Game> {\n /** 应用标题(显示在侧边栏顶部) */\n title?: string\n /** 应用副标题(显示在标题下方) */\n subtitle?: string\n /** 导航配置 */\n navigation?: NavigationConfig\n /** 游戏选择器配置 */\n gameSelect?: GameSelectConfig<T>\n /** Header 扩展区域配置 */\n headerExtra?: HeaderExtraConfig\n}\n\n/**\n * 检查路径是否匹配路由规则\n */\nconst matchRoute = (pathname: string, rule: RouteMatchRule): boolean => {\n if (typeof rule === 'string') {\n // 支持前缀匹配(以 * 结尾)或精确匹配\n if (rule.endsWith('*')) {\n const prefix = rule.slice(0, -1)\n return pathname.startsWith(prefix)\n }\n return pathname === rule\n }\n // 正则表达式匹配\n if (rule instanceof RegExp) {\n return rule.test(pathname)\n }\n return false\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const { title, subtitle, navigation, gameSelect, headerExtra, children } = props\n const location = useLocation()\n\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n\n const {\n context: { sidebarWidth, sidebarCollapsible, gameScoped, isGlobalMode },\n layout: { collapsed, toggleCollapsed },\n } = useToolkitsStore()\n\n // 检查当前路由是否在隐藏列表中\n const shouldHideOnCurrentRoute =\n gameSelect?.hideOnRoutes && gameSelect.hideOnRoutes.length > 0\n ? gameSelect.hideOnRoutes.some(rule => matchRoute(location.pathname, rule))\n : false\n\n // 计算是否显示游戏选择器\n const showGameSelect = !shouldHideOnCurrentRoute && gameScoped && !isGlobalMode\n\n return (\n <AntdLayout>\n <Sider\n collapsible={sidebarCollapsible}\n theme=\"light\"\n trigger={null}\n collapsed={collapsed}\n width={sidebarWidth}\n className=\"h-screen overflow-x-hidden overflow-y-auto border-r\"\n style={{ borderColor: colorBorder }}\n >\n <LayoutHeader title={title} subtitle={subtitle} />\n <Nav items={navigation?.items} loading={navigation?.loading} />\n </Sider>\n <AntdLayout>\n <Header className=\"px-6\" style={{ background: colorBgContainer }}>\n <div className=\"flex justify-between items-center h-full\">\n <Space size=\"small\" split={<Divider type=\"vertical\" />} className=\"mr-6\">\n {sidebarCollapsible && (\n <Button\n type=\"text\"\n icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n className=\"text-base\"\n onClick={toggleCollapsed}\n />\n )}\n {showGameSelect && <GameSelect<T> filter={gameSelect?.filter} options={gameSelect?.options} />}\n {headerExtra?.left?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n </Space>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {headerExtra?.right?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n <UserDropdown />\n </Space>\n </div>\n </Header>\n <Content className=\"overflow-auto px-4 py-6\" style={{ maxHeight: `calc(100vh - ${HEADER_HEIGHT}px)` }}>\n <Suspense\n fallback={\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n }\n >\n <RequireGame>{children}</RequireGame>\n </Suspense>\n </Content>\n </AntdLayout>\n </AntdLayout>\n )\n}\n\nexport default Layout\n","import { Button, Result, Spin } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: KyOptions\n /** 无权限时点击返回按钮跳转的路径,默认为首页 '/' */\n redirectPath?: string\n}\n\n/**\n * 授权保护组件\n * 根据权限码控制子组件的访问权限\n * - 有权限:渲染子组件\n * - 无权限:显示 403 无权限页面,可点击按钮返回指定路径\n * - 加载中:显示加载动画\n */\nconst RequireAuth: FC<PropsWithChildren<RequireAuthProps>> = props => {\n const { code, config, redirectPath = '/', children } = props\n const { data: accessible, isLoading } = useAuth(code, config)\n const { t } = useTranslation()\n const navigate = useNavigate()\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return (\n <Result\n status=\"403\"\n subTitle={t('global.noEntitlement')}\n extra={\n <Button type=\"primary\" onClick={() => navigate(redirectPath)}>\n {t('global.back')}\n </Button>\n }\n />\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import { createVisibilityStore } from '@/utils'\n\nexport const useDrawerStore = createVisibilityStore()\n","import type { DrawerProps } from 'antd'\nimport { Button, Drawer } from 'antd'\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useDrawerStore } from './stores'\n\nexport interface UseDrawerOperation {\n hide: () => void\n}\n\nexport interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {\n content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n footer?: ReactNode | null\n confirmText?: string\n cancelText?: string\n confirmButtonProps?: ComponentProps<typeof Button>\n cancelButtonProps?: ComponentProps<typeof Button>\n}\n\nexport function useDrawer(props: UseDrawerProps) {\n const {\n content,\n onConfirm,\n afterOpen,\n afterClose,\n footer,\n confirmText = '确认',\n cancelText = '取消',\n confirmButtonProps,\n cancelButtonProps,\n ...drawerProps\n } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useDrawerStore()\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 onClose: DrawerProps['onClose'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const handleConfirm = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } catch (error) {\n console.error('Drawer confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm])\n\n const drawerFooter: DrawerProps['footer'] =\n footer !== undefined ? (\n <>{footer}</>\n ) : (\n <div className=\"flex gap-4 mx-4\">\n <Button type=\"primary\" loading={confirmLoading} {...confirmButtonProps} onClick={handleConfirm}>\n {confirmText}\n </Button>\n <Button {...cancelButtonProps} onClick={onClose}>\n {cancelText}\n </Button>\n </div>\n )\n\n const internalDrawer = (\n <Drawer {...drawerProps} open={open} footer={drawerFooter} onClose={onClose}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Drawer>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n confirmLoading,\n drawer: internalDrawer,\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 { useDrawer, type UseDrawerOperation, type UseDrawerProps } from './drawer'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n drawer: ReactNode\n}\n\nexport function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormDrawerProps<Values, ExtraValues>,\n): UseFormDrawerReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...drawerProps } = 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, drawer } = useDrawer({\n ...drawerProps,\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 drawer,\n }\n}\n","import { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components'\n\nconst UserList = lazy(() => import('./pages/userList'))\nconst UserDetail = lazy(() => import('./pages/userDetail'))\nconst RoleList = lazy(() => import('./pages/roleList'))\nconst RoleDetail = lazy(() => import('./pages/roleDetail'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"user/:id\" element={<UserDetail />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { useTranslation } from '@/locale'\n\nimport type { OperationLogListItem } from './types'\n\nconst { Option } = Select\n\nconst OperationLogList: FC = () => {\n const { t } = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n width: 200,\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n { List: OperationLogListItem[]; Total: number }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.Total,\n items: data?.List,\n })}\n renderForm={form => (\n <Form form={form} layout=\"inline\">\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear className=\"w-[100px]\">\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","import { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useKy } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\n/**\n * 清除 URL 中的查询参数\n */\nfunction clearUrlParams(params: string[]) {\n const url = new URL(window.location.href)\n params.forEach(param => url.searchParams.delete(param))\n window.history.replaceState({}, '', url.toString())\n}\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n */\nexport function useTicketLogin() {\n const ky = useKy()\n const {\n token: { setToken },\n } = useToolkitsStore()\n\n const queryParams = new URLSearchParams(window.location.search)\n const ticket = queryParams.get('ticket')\n const unregisteredFromUrl = queryParams.get('unregistered') === 'true'\n\n // 初始化未注册状态\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n const { data, isLoading, error } = useQuery({\n queryKey: queryKeys.auth.ticketLogin(ticket),\n queryFn: () => ky.get<{ token: string }>('/api/usystem/user/login', { searchParams: { ticket: ticket! } }),\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n useEffect(() => {\n if (data?.token) {\n setToken(data.token)\n // 登录成功后清除 ticket 和 unregistered 参数\n clearUrlParams(['ticket', 'unregistered'])\n }\n }, [data, setToken])\n\n const dismissUnregistered = () => {\n setIsUnregistered(false)\n if (unregisteredFromUrl) {\n clearUrlParams(['unregistered'])\n }\n }\n\n return {\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n","import { LoginOutlined } from '@ant-design/icons'\nimport { Alert, Button, Card, Divider, Space, Spin, Typography } from 'antd'\nimport type { FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const {\n token: { token },\n context: { homePath },\n } = useToolkitsStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const ssoLoginUrl = `${SSO_URL}/login?service=${encodeURIComponent(window.location.href)}`\n\n if (isLoading) {\n return (\n <div className=\"w-screen h-screen flex justify-center items-center\">\n <Spin />\n </div>\n )\n }\n\n if (token) {\n return <Navigate replace to={homePath} />\n }\n\n return (\n <div className=\"w-screen h-screen relative overflow-hidden bg-linear-to-br from-blue-50 via-indigo-50/50 to-purple-50\">\n {/* 顶部额外内容 */}\n {extra && <div className=\"absolute top-6 right-6 z-20 md:top-16 md:right-16\">{extra}</div>}\n\n {/* Logo 和标题 */}\n <div className=\"absolute left-6 top-6 z-20 md:left-14 md:top-10\">\n <Space align=\"center\" size=\"large\">\n <Logo width={48} />\n {title && (\n <span className=\"text-xl md:text-2xl font-bold bg-linear-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent\">\n {title}\n </span>\n )}\n </Space>\n </div>\n\n {/* 主要内容区域 */}\n <div className=\"w-full h-full flex items-center justify-center relative px-4 md:px-0\">\n {/* 背景插图 - 桌面端显示 */}\n <div className=\"hidden lg:flex absolute top-0 left-0 bottom-0 right-[550px] justify-center items-center\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-5/6 max-w-full h-auto object-contain\" />\n </div>\n\n {/* 登录卡片 */}\n <div className=\"relative z-10 w-full max-w-[450px] lg:absolute lg:right-[10%] lg:top-1/2 lg:-translate-y-3/4 lg:w-[450px]\">\n <Card\n className=\"shadow-2xl rounded-2xl overflow-hidden backdrop-blur-sm border-0 transition-all duration-300 hover:shadow-[0_20px_60px_-15px_rgba(0,0,0,0.3)]\"\n style={{\n background: 'rgba(255, 255, 255, 0.98)',\n border: '1px solid rgba(0, 0, 0, 0.06)',\n }}\n variant=\"outlined\"\n >\n <div className=\"px-2 py-1\">\n {isUnregistered && (\n <Alert\n banner\n closable\n message={t('SignIn.unregistered')}\n type=\"error\"\n className=\"mb-6 rounded-lg border-0\"\n onClose={dismissUnregistered}\n />\n )}\n\n {/* 欢迎标题 */}\n <div className=\"mb-8 text-center\">\n <div className=\"mt-4 mb-2\">\n <Typography.Title\n level={2}\n className=\"mb-0! text-3xl! font-semibold bg-linear-to-r from-gray-800 via-gray-700 to-gray-600 bg-clip-text text-transparent\"\n >\n {t('SignIn.welcome')}\n </Typography.Title>\n </div>\n </div>\n\n <Divider className=\"my-6\" />\n\n {/* 登录按钮 */}\n <Button\n block\n type=\"primary\"\n size=\"large\"\n icon={<LoginOutlined />}\n href={ssoLoginUrl}\n target=\"_self\"\n className=\"h-12 text-base font-medium shadow-md hover:shadow-lg transition-all duration-200 hover:scale-[1.02]\"\n >\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </Card>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n"]}
1
+ {"version":3,"sources":["../src/components/dynamicTags/DynamicTags.tsx","../src/components/expandableParagraph/ExpandableParagraph.tsx","../src/components/infiniteList/stores.ts","../src/components/infiniteList/InfiniteList.tsx","../src/components/layout/GameSelect.tsx","../src/components/nav/stores.ts","../src/components/nav/utils.tsx","../src/components/nav/Nav.tsx","../src/components/requireGame/RequireGame.tsx","../src/components/userDropdown/UserDropdown.tsx","../src/components/logo/Logo.tsx","../src/components/layout/LayoutHeader.tsx","../src/components/layout/Layout.tsx","../src/components/requireAuth/RequireAuth.tsx","../src/hooks/drawer/stores.ts","../src/hooks/drawer/drawer.tsx","../src/hooks/drawer/formDrawer.tsx","../src/modules/menu/index.tsx","../src/modules/permission/index.tsx","../src/pages/notFound/index.tsx","../src/pages/operationLogList/index.tsx","../src/pages/signIn/hooks.ts","../src/pages/signIn/index.tsx"],"names":["useState","jsx","newInstances","page","useRef","useEffect","isEqual","jsxs","Typography","useMemo","Space","create","rest","theme","Spin","Fragment","memo","Link","AntdLayout","useLocation","Button","useNavigate","Result","useCallback","Form","lazy","Routes","Route","Select","Input","Navigate","Card","Divider"],"mappings":"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","file":"index.js","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useTranslation } from '@/locale'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const { t } = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n className=\"select-none\"\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n className=\"w-[78px] align-top\"\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag className=\"border-dashed\" style={{ background: token.colorBgContainer }} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import { Typography } from 'antd'\nimport type { ParagraphProps } from 'antd/es/typography/Paragraph'\nimport type { FC } from 'react'\nimport { useState } from 'react'\n\nexport type ExpandableParagraphProps = Omit<ParagraphProps, 'ellipsis' | 'className'>\n\nconst ExpandableParagraph: FC<ExpandableParagraphProps> = props => {\n const { children, ...restProps } = props\n const [expanded, setExpanded] = useState(false)\n\n return (\n <Typography.Paragraph\n {...restProps}\n className=\"mb-0\"\n ellipsis={{\n rows: 2,\n expandable: 'collapsible',\n expanded,\n onExpand: (_, info) => {\n setExpanded(info.expanded)\n },\n }}\n >\n {children}\n </Typography.Paragraph>\n )\n}\n\nexport default ExpandableParagraph\n","import { isEqual } from 'lodash-es'\nimport { create } from 'zustand'\nimport { devtools, subscribeWithSelector } from 'zustand/middleware'\n\nimport type { InfiniteListPayload } from './InfiniteList'\n\n// Infinite Query 更新函数类型\ntype InfiniteQueryRefetchFunction = () => void | Promise<unknown>\ntype InfiniteQueryFetchNextPageFunction = () => void | Promise<unknown>\n\n// InfiniteList 实例信息\ninterface InfiniteListInstance {\n id: string\n url: string\n queryKey: readonly unknown[]\n payload: InfiniteListPayload\n refetch: InfiniteQueryRefetchFunction\n fetchNextPage: InfiniteQueryFetchNextPageFunction\n}\n\n// 简化的状态接口\ninterface InfiniteListState {\n // 实例管理\n instances: Map<string, InfiniteListInstance>\n\n // 核心方法\n registerInstance(\n id: string,\n url: string,\n queryKey: readonly unknown[],\n refetch: InfiniteQueryRefetchFunction,\n fetchNextPage: InfiniteQueryFetchNextPageFunction,\n ): void\n unregisterInstance(id: string): void\n updatePayload(id: string, payload: InfiniteListPayload): void\n getPayload(id: string): InfiniteListPayload\n refetch(id: string, payload?: InfiniteListPayload): Promise<void>\n fetchNextPage(id: string): Promise<void>\n\n // 工具方法\n getInstance(id: string): InfiniteListInstance | undefined\n getAllInstances(): InfiniteListInstance[]\n}\n\n// 稳定的默认 payload 引用,避免未注册时每次返回新对象导致 getSnapshot 无限循环\nconst DEFAULT_PAYLOAD: InfiniteListPayload = Object.freeze({\n page: 0,\n // 这里使用冻结的空对象,确保引用稳定\n filters: Object.freeze({}) as Record<string, never>,\n})\n\n// 创建简化的 store\nconst createStore = () =>\n create<InfiniteListState>()(\n devtools(\n subscribeWithSelector((set, get) => ({\n instances: new Map(),\n\n registerInstance(id, url, queryKey, refetch, fetchNextPage) {\n set(state => {\n const existingInstance = state.instances.get(id)\n\n // 如果实例已存在,只更新函数\n if (existingInstance) {\n // 仅当引用发生变化时才更新,避免无意义 setState\n if (existingInstance.refetch !== refetch || existingInstance.fetchNextPage !== fetchNextPage) {\n const updatedInstance = {\n ...existingInstance,\n refetch,\n fetchNextPage,\n }\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n return { instances: newInstances }\n }\n return state\n }\n\n // 创建新实例\n const instance: InfiniteListInstance = {\n id,\n url,\n queryKey,\n payload: DEFAULT_PAYLOAD,\n refetch,\n fetchNextPage,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, instance)\n\n return { instances: newInstances }\n })\n },\n\n unregisterInstance(id) {\n set(state => {\n const newInstances = new Map(state.instances)\n const existed = newInstances.delete(id)\n\n if (existed) {\n return { instances: newInstances }\n }\n return state\n })\n },\n\n updatePayload(id, payload) {\n set(state => {\n const instance = state.instances.get(id)\n if (!instance) return state\n\n const newPayload = { ...instance.payload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(instance.payload, newPayload)) {\n const updatedInstance = {\n ...instance,\n payload: newPayload,\n }\n\n const newInstances = new Map(state.instances)\n newInstances.set(id, updatedInstance)\n\n return { instances: newInstances }\n }\n\n return state\n })\n },\n\n getPayload(id) {\n const instance = get().instances.get(id)\n return instance?.payload ?? DEFAULT_PAYLOAD\n },\n\n async refetch(id, payload) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n let payloadChanged = false\n\n // 更新 payload 如果提供且确实有变化\n if (payload) {\n const currentPayload = instance.payload\n const newPayload = { ...currentPayload, ...payload }\n\n // 只有当 payload 真正改变时才更新\n if (!isEqual(currentPayload, newPayload)) {\n get().updatePayload(id, payload)\n payloadChanged = true\n }\n }\n\n // 若 payload 发生变化,queryKey 会变化,React Query 会自动触发请求,此处不再手动 refetch,避免重复请求\n if (payloadChanged) {\n return\n }\n\n // 否则手动触发一次请求\n try {\n await instance.refetch()\n } catch (error) {\n console.error(`Failed to refetch InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n async fetchNextPage(id) {\n const instance = get().instances.get(id)\n if (!instance) {\n console.warn(`InfiniteList instance with id \"${id}\" not found`)\n return\n }\n\n // 调用 fetchNextPage 函数\n try {\n await instance.fetchNextPage()\n } catch (error) {\n console.error(`Failed to fetch next page for InfiniteList instance \"${id}\":`, error)\n throw error\n }\n },\n\n getInstance(id) {\n return get().instances.get(id)\n },\n\n getAllInstances() {\n return Array.from(get().instances.values())\n },\n })),\n {\n name: 'infinite-list-store',\n },\n ),\n )\n\n// 创建 store 实例\nconst store = createStore()\n\nexport const useInfiniteListStore = store\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useInfiniteQuery } from '@tanstack/react-query'\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { AnyObject } from 'antd/es/_util/type'\nimport type { TableProps } from 'antd/es/table'\nimport type { Options as KyOptions } from 'ky'\nimport { isEqual } from 'lodash-es'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { cloneElement, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport type { FilterFormWrapperProps } from '@/components/filterFormWrapper'\nimport { FilterFormWrapper } from '@/components/filterFormWrapper'\nimport { useKy } from '@/libs'\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nimport { useInfiniteListStore } from './stores'\n\nexport interface InfiniteListPayload<Values = any> {\n page?: number\n filters?: Values\n}\n\nexport interface CacheConfig {\n cacheTime?: number\n staleTime?: number\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS'\n\ntype RequestBodyResolver<Values = any> =\n | FormData\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => FormData | Record<string | number, any>)\n\ntype RequestParamsResolver<Values = any> =\n | Record<string | number, any>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => Record<string | number, any>)\n\nexport interface InfiniteListRequestConfig<Values = any> extends CacheConfig {\n url: string\n method?: HttpMethod\n body?: RequestBodyResolver<Values>\n searchParams?: RequestParamsResolver<Values>\n params?: RequestParamsResolver<Values>\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n}\n\nexport type InfiniteListRequestConfigType<Values = any> =\n | InfiniteListRequestConfig<Values>\n | ((payload: InfiniteListPayload<Values>, pageParam: any) => InfiniteListRequestConfig<Values>)\n\nexport enum InfiniteListAction {\n Confirm,\n Reset,\n LoadMore,\n Init,\n}\n\nexport interface InfiniteListDataAdapter<Item = any, Values = any, Data = any> {\n items?: (data: Data[] | undefined, form: FormInstance<Values>) => Item[] | undefined\n hasMore?: (lastPage: Data | undefined, allPages: Data[]) => boolean\n nextPageParam?: (lastPage: Data | undefined, allPages: Data[], pageParam: any) => any\n}\n\nexport interface InfiniteListRef<Item = any, Values = any, Data = any> {\n data: Data[] | undefined\n dataSource: Item[] | undefined\n form: FormInstance<Values>\n refetch: () => void\n fetchNextPage: () => void\n hasNextPage: boolean\n isFetchingNextPage: boolean\n}\n\nexport interface InfiniteListProps<Item, Values, Data>\n extends Omit<TableProps<Item>, 'pagination' | 'dataSource' | 'loading' | 'footer'>,\n Pick<FilterFormWrapperProps, 'buttonsAlign' | 'showReset'> {\n identifier?: string\n code?: string\n form?: FormInstance<Values>\n refreshInterval?: number\n request: InfiniteListRequestConfigType<Values>\n tableExtra?: ReactNode | ((form: FormInstance<Values>, data?: Data[]) => ReactNode)\n renderForm?: (form: FormInstance<Values>) => ReactElement\n afterSuccess?: (action: InfiniteListAction, form: FormInstance<Values>, data?: Data[]) => void\n afterError?: (error: Error, action: InfiniteListAction, form: FormInstance<Values>) => void\n dataAdapter?: InfiniteListDataAdapter<Item, Values, Data>\n initialPageParam?: any\n footer?: (data: Data[] | undefined) => ReactNode\n}\n\nconst DEFAULT_CACHE_TIME = 5 * 60 * 1000\nconst DEFAULT_STALE_TIME = 30 * 1000\n\nconst BODYLESS_METHODS: HttpMethod[] = ['GET', 'HEAD', 'OPTIONS']\nconst BODY_SUPPORTED_METHODS: HttpMethod[] = ['POST', 'PUT', 'PATCH', 'DELETE']\n\nlet identifierCounter = 0\nconst generateUniqueIdentifier = (): string => `infiniteList_${Date.now()}_${++identifierCounter}`\n\nconst InternalInfiniteList = <Item extends AnyObject, Values extends object | undefined = undefined, Data = any>(\n props: InfiniteListProps<Item, Values, Data>,\n ref: Ref<InfiniteListRef<Item, Values, Data>>,\n) => {\n const defaultDataAdapter: InfiniteListDataAdapter<Item, Values, Data> = {\n items: (pages: Data[] | undefined) => {\n if (!pages) return []\n return pages.flatMap((page: any) => page?.data?.list || [])\n },\n hasMore: (lastPage: Data | undefined): boolean => {\n if (!lastPage) return false\n const page = lastPage as any\n return page?.hasMore || page?.has_more || false\n },\n nextPageParam: (_lastPage: Data | undefined, allPages: Data[], lastPageParam: any): any => {\n const latest = allPages.at(-1)\n if (!latest) return undefined\n\n const pageMeta = latest as any\n const hasNext = pageMeta?.hasMore || pageMeta?.has_more || false\n if (!hasNext) {\n return undefined\n }\n\n if (typeof lastPageParam === 'number') {\n return lastPageParam + 1\n }\n\n return allPages.length\n },\n }\n\n const {\n identifier,\n code,\n buttonsAlign,\n showReset,\n refreshInterval = 0,\n request,\n tableExtra,\n renderForm,\n afterSuccess,\n afterError,\n dataAdapter,\n initialPageParam = 0,\n footer,\n form,\n ...tableProps\n } = props\n\n const { t } = useTranslation()\n const [formInstance] = Form.useForm<Values>(form)\n const [isValid, setIsValid] = useState(false)\n const isInitialized = useRef(false)\n const isUpdatingFromPayload = useRef(false)\n const shouldPoll = useRef(false)\n const action = useRef(InfiniteListAction.Init)\n const ky = useKy()\n\n const { data: accessible, isLoading: isChecking } = useAuth(code)\n\n const finalIdentifier = useMemo(() => identifier || generateUniqueIdentifier(), [identifier])\n const subscribedPayload = useInfiniteListStore(s => s.getPayload(finalIdentifier))\n const { page = initialPageParam, filters } = subscribedPayload\n const payload = { page, filters }\n\n const mergedDataAdapter = useMemo<InfiniteListDataAdapter<Item, Values, Data>>(\n () => ({\n ...defaultDataAdapter,\n ...(dataAdapter ?? {}),\n }),\n [dataAdapter],\n )\n\n const baseRequest = useMemo(\n () => (typeof request === 'function' ? request(payload, initialPageParam) : request),\n [request, payload, initialPageParam],\n )\n\n const {\n url,\n method = 'GET',\n body,\n searchParams,\n params,\n headers,\n cacheTime = DEFAULT_CACHE_TIME,\n staleTime = DEFAULT_STALE_TIME,\n } = baseRequest\n\n const normalizedMethod = (method || 'GET').toUpperCase() as HttpMethod\n const supportedMethods: HttpMethod[] = [...BODYLESS_METHODS, ...BODY_SUPPORTED_METHODS]\n if (!supportedMethods.includes(normalizedMethod)) {\n console.warn(`InfiniteList: 不支持的 HTTP 请求方法 \"${method}\",已回退到 GET 方法`)\n }\n\n const requestHeaders = typeof headers === 'function' ? headers(formInstance) : headers\n const baseSearchParams = searchParams ?? params\n const evaluatedBaseBody = typeof body === 'function' ? body(payload, initialPageParam) : body\n const evaluatedBaseSearchParams =\n typeof baseSearchParams === 'function' ? baseSearchParams(payload, initialPageParam) : baseSearchParams\n\n const queryKey = useMemo(\n () =>\n [\n 'infiniteList',\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n filters,\n evaluatedBaseSearchParams,\n evaluatedBaseBody,\n requestHeaders,\n ] as const,\n [\n url,\n finalIdentifier,\n normalizedMethod,\n page,\n filters,\n evaluatedBaseSearchParams,\n evaluatedBaseBody,\n requestHeaders,\n ],\n )\n\n const { data, fetchNextPage, hasNextPage, isFetchingNextPage, refetch, isFetching } = useInfiniteQuery({\n queryKey,\n queryFn: async ({ pageParam = initialPageParam }) => {\n try {\n const currentPayload: InfiniteListPayload = {\n ...payload,\n page: pageParam,\n }\n\n const resolvedRequest =\n typeof request === 'function' ? request(currentPayload, pageParam) : request || baseRequest\n\n const {\n url: resolvedUrl = url,\n method: resolvedMethod = normalizedMethod,\n body: resolvedBody,\n searchParams: resolvedSearchParams,\n params: resolvedParams,\n headers: resolvedHeaders = headers,\n } = resolvedRequest\n\n const currentMethod = (resolvedMethod || normalizedMethod).toUpperCase() as HttpMethod\n const isBodyless = BODYLESS_METHODS.includes(currentMethod)\n\n const defaultRequestData = {\n ...(filters ?? {}),\n page: pageParam,\n }\n\n const resolvedBodyValue =\n typeof resolvedBody === 'function' ? resolvedBody(currentPayload, pageParam) : resolvedBody\n const resolvedSearchParamsValue =\n typeof resolvedSearchParams === 'function'\n ? resolvedSearchParams(currentPayload, pageParam)\n : resolvedSearchParams\n const resolvedParamsValue =\n typeof resolvedParams === 'function' ? resolvedParams(currentPayload, pageParam) : resolvedParams\n\n const mergedSearchParams = resolvedSearchParamsValue ?? resolvedParamsValue\n\n let requestBody: any\n let requestSearchParams: any\n\n if (resolvedBodyValue !== undefined) {\n requestBody = resolvedBodyValue\n requestSearchParams = mergedSearchParams\n } else if (mergedSearchParams !== undefined) {\n requestSearchParams = mergedSearchParams\n } else if (isBodyless) {\n requestSearchParams = defaultRequestData\n } else {\n requestBody = defaultRequestData\n }\n\n const finalHeaders =\n typeof resolvedHeaders === 'function' ? resolvedHeaders(formInstance) : (resolvedHeaders ?? requestHeaders)\n\n const kyOptions: KyOptions = {\n method: currentMethod,\n headers: finalHeaders,\n }\n\n if (requestSearchParams !== undefined) {\n kyOptions.searchParams = requestSearchParams\n }\n\n if (requestBody && !isBodyless) {\n if (requestBody instanceof FormData) {\n kyOptions.body = requestBody\n } else if (typeof requestBody === 'string') {\n kyOptions.body = requestBody\n } else {\n kyOptions.json = requestBody\n }\n }\n\n const response = await ky.request<Data>({ url: resolvedUrl, ...kyOptions })\n shouldPoll.current = true\n afterSuccess?.(action.current, formInstance, [response])\n return response\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err))\n afterError?.(errorObj, action.current, formInstance)\n throw errorObj\n }\n },\n initialPageParam,\n getNextPageParam: (lastPage: Data, allPages: Data[], lastPageParam: any) => {\n if (mergedDataAdapter.nextPageParam) {\n return mergedDataAdapter.nextPageParam(lastPage, allPages, lastPageParam)\n }\n\n if (mergedDataAdapter.hasMore?.(lastPage, allPages)) {\n if (typeof lastPageParam === 'number') {\n return lastPageParam + 1\n }\n return allPages.length\n }\n\n return undefined\n },\n enabled: Boolean(accessible && isValid),\n retry: (failureCount, retryError) => {\n if (failureCount >= 3) return false\n if (retryError?.message?.includes('401')) return false\n return true\n },\n retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),\n refetchOnWindowFocus: false,\n refetchInterval: shouldPoll.current ? refreshInterval : 0,\n gcTime: cacheTime,\n staleTime,\n })\n\n useEffect(() => {\n useInfiniteListStore.getState().registerInstance(finalIdentifier, url, queryKey, refetch, fetchNextPage)\n return () => {\n useInfiniteListStore.getState().unregisterInstance(finalIdentifier)\n }\n }, [finalIdentifier, url])\n\n const dataSource = mergedDataAdapter.items?.(data?.pages, formInstance)\n const isEmpty = !dataSource || dataSource.length === 0\n const isLoadingMore = isFetchingNextPage\n const isReachingEnd = !hasNextPage\n\n const onConfirm = useCallback(async () => {\n action.current = InfiniteListAction.Confirm\n try {\n await formInstance.validateFields()\n setIsValid(true)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPageParam,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [finalIdentifier, formInstance, initialPageParam])\n\n const onReset = useCallback(async () => {\n action.current = InfiniteListAction.Reset\n try {\n formInstance.resetFields()\n await formInstance.validateFields({ validateOnly: true })\n setIsValid(true)\n useInfiniteListStore.getState().refetch(finalIdentifier, {\n page: initialPageParam,\n filters: formInstance.getFieldsValue(),\n })\n } catch {\n setIsValid(false)\n }\n }, [finalIdentifier, formInstance, initialPageParam])\n\n const loadMore = useCallback(() => {\n if (!hasNextPage || isFetchingNextPage) return\n action.current = InfiniteListAction.LoadMore\n useInfiniteListStore.getState().fetchNextPage(finalIdentifier)\n }, [finalIdentifier, hasNextPage, isFetchingNextPage])\n\n useEffect(() => {\n if (!isInitialized.current || isUpdatingFromPayload.current) {\n return\n }\n\n const currentValues = formInstance.getFieldsValue()\n if (filters && !isEqual(currentValues, filters)) {\n isUpdatingFromPayload.current = true\n formInstance.setFieldsValue(filters)\n setTimeout(() => {\n isUpdatingFromPayload.current = false\n }, 0)\n }\n }, [filters, formInstance])\n\n useEffect(() => {\n if (!accessible || isInitialized.current) {\n return\n }\n\n const init = async () => {\n try {\n formInstance.resetFields()\n const value = await formInstance.validateFields({ validateOnly: true })\n useInfiniteListStore.getState().updatePayload(finalIdentifier, {\n page: initialPageParam,\n filters: value,\n })\n setIsValid(true)\n } catch {\n setIsValid(false)\n } finally {\n isInitialized.current = true\n }\n }\n\n const rafId = requestAnimationFrame(() => {\n Promise.resolve().then(init)\n })\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [accessible, finalIdentifier, formInstance, initialPageParam])\n\n useImperativeHandle(\n ref,\n () => ({\n data: data?.pages,\n dataSource,\n form: formInstance,\n refetch,\n fetchNextPage,\n hasNextPage: !!hasNextPage,\n isFetchingNextPage,\n }),\n [data?.pages, dataSource, formInstance, refetch, fetchNextPage, hasNextPage, isFetchingNextPage],\n )\n\n if (isChecking) {\n return (\n <div className=\"flex justify-center items-center h-[300px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const renderFooter: TableProps<Item>['footer'] = footer ? () => <>{footer(data?.pages)}</> : undefined\n\n const renderTableExtra = () => {\n if (typeof tableExtra === 'function') {\n return tableExtra(formInstance, data?.pages)\n }\n return tableExtra\n }\n\n const formRenderer =\n typeof renderForm === 'function' ? (\n <FilterFormWrapper\n showReset={showReset}\n buttonsAlign={buttonsAlign}\n isConfirming={isFetching && !isFetchingNextPage}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {cloneElement(renderForm(formInstance) as ReactElement<{ onKeyUp?: React.KeyboardEventHandler }>, {\n onKeyUp: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n onConfirm()\n }\n },\n })}\n </FilterFormWrapper>\n ) : (\n <Form form={formInstance} />\n )\n\n return (\n <>\n {formRenderer}\n {renderTableExtra()}\n <Table\n {...tableProps}\n dataSource={dataSource}\n loading={isFetching && !isFetchingNextPage}\n pagination={false}\n footer={renderFooter}\n />\n {!isEmpty && (\n <div className=\"mt-4\">\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n </div>\n )}\n </>\n )\n}\n\nconst InfiniteList = forwardRef(InternalInfiniteList) as <\n Item extends AnyObject = AnyObject,\n Values extends object | undefined = undefined,\n Data = any,\n>(\n props: InfiniteListProps<Item, Values, Data> & { ref?: Ref<InfiniteListRef<Item, Values, Data>> },\n) => ReactElement\n\nexport default InfiniteList\n","import { useQueryClient } from '@tanstack/react-query'\nimport type { SelectProps } from 'antd'\nimport { Select, Space, Typography } from 'antd'\nimport { useEffect, useMemo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nimport type { Game } from './types'\n\nconst { Text } = Typography\n\nexport interface GameSelectProps<T extends Game = Game> {\n filter?: (game: T) => boolean\n options?: (data?: T[]) => SelectProps['options']\n}\n\nconst GameSelect = <T extends Game = Game>(props: GameSelectProps<T>) => {\n const { filter, options } = props\n const { t } = useTranslation()\n const {\n context: { useGameApiV2 },\n game: { appId, setAppId },\n } = useToolkitsStore()\n const { data, isLoading } = useGames()\n const queryClient = useQueryClient()\n\n const filteredData = useMemo(\n () => data?.filter((item: Game) => filter?.(item as T) ?? true) as T[] | undefined,\n [data, filter],\n )\n\n const selectOptions = useMemo(\n () =>\n typeof options === 'function'\n ? options(filteredData)\n : filteredData?.map((item: T) => ({\n label: item.name,\n value: useGameApiV2 ? item.game_id : item.id,\n })),\n [options, filteredData, useGameApiV2],\n )\n\n // 切换游戏时清空 TanStack Query 缓存触发重新请求以更新视图。\n const handleChange = (value: string | number) => {\n // 标记除游戏列表外的所有缓存为过期,保留现有数据直到新数据加载完成\n queryClient.invalidateQueries({\n predicate: query => {\n const queryKey = query.queryKey\n return !queryKey.includes('/api/game/list') && !queryKey.includes('/api/usystem/game/all')\n },\n })\n setAppId(value)\n }\n\n useEffect(() => {\n // 数据还在加载中时,不要修改 appId\n if (isLoading) return\n\n if (selectOptions && selectOptions.length > 0) {\n const hasValidAppId = appId && selectOptions.some(item => String(item.value) === String(appId))\n\n // 只有当 appId 无效时才设置为第一个选项\n if (!hasValidAppId) {\n setAppId(selectOptions[0]?.value ?? undefined)\n }\n } else if (selectOptions === undefined || selectOptions.length === 0) {\n // 如果没有选项,则清空当前游戏 ID\n setAppId(undefined)\n }\n }, [selectOptions, isLoading])\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={appId as string | number | undefined}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n className=\"w-[250px]\"\n options={selectOptions}\n onChange={handleChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n (set, get) => ({\n openKeys: [],\n setOpenKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (current.openKeys.length !== keys.length || !current.openKeys.every((key, index) => key === keys[index])) {\n set({ openKeys: keys })\n }\n },\n selectedKeys: [],\n setSelectedKeys: keys => {\n const current = get()\n // 避免不必要的状态更新 - 使用更高效的比较方式\n if (\n current.selectedKeys.length !== keys.length ||\n !current.selectedKeys.every((key, index) => key === keys[index])\n ) {\n set({ selectedKeys: keys })\n }\n },\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n // 减少持久化频率,提升性能\n skipHydration: false,\n version: 1,\n },\n ),\n)\n","import type { ItemType, MenuDividerType } from 'antd/es/menu/interface'\nimport { Link } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\n\nimport type { NavItem, NavMenuItemGroupType, NavMenuItemType, NavSubMenuType } from './types'\n\n/** 导航菜单项接口(扁平化后,包含完整路径) */\nexport type FlatNavMenuItem = Merge<NavMenuItemType, { keypath?: string[] }>\n\n/**\n * 带记忆化的路由链接组件\n * 避免在菜单重渲染时重复创建 Link 组件\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NavLink = (props: { to: string; children?: any }) => <Link to={props.to}>{props.children}</Link>\n\n/**\n * 将自定义导航配置转换为 Ant Design Menu 配置\n * - 为带路由的菜单项包装 Link 组件\n * - 递归处理子菜单和菜单组\n * - 保留分割线等特殊项\n */\nexport function convertToAntdMenuItems(items?: NavItem[]): ItemType[] {\n const result: ItemType[] = []\n\n if (!items) return result\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n\n // 处理 null 或分割线\n if (item === null || (item as MenuDividerType).type === 'divider') {\n result[i] = item as null | MenuDividerType\n continue\n }\n\n // 处理子菜单或菜单组\n if ((item as NavSubMenuType | NavMenuItemGroupType).children) {\n const { children, ...rest } = item as NavSubMenuType | NavMenuItemGroupType\n result[i] = {\n ...rest,\n children: convertToAntdMenuItems(children),\n }\n continue\n }\n\n // 处理普通菜单项\n const { route, label, ...rest } = item as NavMenuItemType\n const labelNode = route ? <NavLink to={route}>{label}</NavLink> : label\n\n result[i] = {\n ...rest,\n label: labelNode,\n }\n }\n\n return result\n}\n\n/**\n * 扁平化导航配置,提取所有叶子节点菜单项\n * - 递归遍历所有嵌套菜单\n * - 为每个菜单项注入完整的 key 路径(用于展开父菜单)\n * - 跳过菜单组(不计入路径)\n *\n * @param items 导航配置项\n * @param result 结果数组(递归累积)\n * @param keypath 当前路径(递归累积)\n * @returns 扁平化后的菜单项数组\n */\nexport function flattenNavItems(\n items: NavItem[],\n result: FlatNavMenuItem[] = [],\n keypath: string[] = [],\n): FlatNavMenuItem[] {\n for (const item of items) {\n if (!item) continue\n\n const children = (item as NavSubMenuType | NavMenuItemGroupType)?.children as NavItem[]\n\n if (Array.isArray(children)) {\n // 计算新路径:菜单组不计入路径,只有子菜单计入\n const newKeypath =\n (item as NavMenuItemGroupType).type !== 'group' && item.key ? [...keypath, item.key as string] : keypath\n\n flattenNavItems(children, result, newKeypath)\n } else {\n // 叶子节点:添加到结果中\n result.push({ ...(item as NavMenuItemType), keypath })\n }\n }\n\n return result\n}\n","import type { MenuProps } from 'antd'\nimport { Menu, Spin } from 'antd'\nimport { useEffect } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\n\nimport { useNavStore } from './stores'\nimport type { NavItem } from './types'\nimport { convertToAntdMenuItems, flattenNavItems } from './utils'\n\nexport interface NavProps {\n items?: NavItem[]\n theme?: MenuProps['theme']\n loading?: boolean\n}\n\nconst Nav = (props: NavProps) => {\n const { items = [], theme, loading } = props\n const location = useLocation()\n const {\n layout: { collapsed },\n } = useToolkitsStore()\n\n const flattenedItems = flattenNavItems(items)\n const antdMenuItems = convertToAntdMenuItems(items)\n\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n useEffect(() => {\n const match = flattenedItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n\n // 使用 getState() 获取最新状态,避免将状态值作为 useEffect 依赖项,\n // 从而防止不必要的 Effect 执行循环\n const { selectedKeys: currentSelectedKeys, openKeys: currentOpenKeys } = useNavStore.getState()\n\n if (currentSelectedKeys[0] !== key) {\n setSelectedKeys([key])\n }\n\n // 只在 keypath 不在 openKeys 中时才添加,保留其他已展开的菜单\n const missingKeys = keypath.filter(k => !currentOpenKeys.includes(k))\n if (missingKeys.length > 0) {\n setOpenKeys([...currentOpenKeys, ...missingKeys])\n }\n }\n }, [flattenedItems, location.pathname, setOpenKeys, setSelectedKeys])\n\n if (loading) {\n return (\n <div className=\"flex justify-center items-center h-[calc(100vh-64px)]\">\n <Spin />\n </div>\n )\n }\n\n return (\n <Menu\n theme={theme}\n className=\"border-r-0\"\n items={antdMenuItems}\n mode=\"inline\"\n defaultOpenKeys={openKeys}\n defaultSelectedKeys={selectedKeys}\n inlineCollapsed={collapsed}\n onOpenChange={setOpenKeys}\n />\n )\n}\n\nexport default Nav\n","import { Empty, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Fragment, memo } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\nimport { useGames } from '@/services'\n\nconst RequireGame: FC<PropsWithChildren> = ({ children }) => {\n const {\n context: { isGlobalMode, gameScoped },\n game: { appId },\n } = useToolkitsStore()\n const { isLoading } = useGames()\n const { t } = useTranslation()\n\n // 如果数据不按游戏划分范围,直接返回内容\n if (!gameScoped || isGlobalMode) {\n return <>{children}</>\n }\n\n // 加载状态\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[400px]\">\n <Spin />\n </div>\n )\n }\n\n // 未选择游戏时显示空状态\n if (!appId) {\n return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n }\n\n // 正常情况:使用 Fragment 包裹 children,key 用于在切换游戏时重置组件状态\n return <Fragment key={appId}>{children}</Fragment>\n}\n\nexport default memo(RequireGame)\n","/* eslint-disable jsx-a11y/anchor-is-valid */\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC, KeyboardEvent } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useTranslation } from '@/locale'\n\nconst UserDropdown: FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const {\n token: { user },\n context: { loginPath },\n clear,\n } = useToolkitsStore()\n\n const handleSignOut = () => {\n clear()\n navigate(loginPath)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSignOut()\n }\n }\n\n const handleDropdownKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n }\n }\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n icon: <LogoutOutlined />,\n label: (\n <a role=\"button\" tabIndex={0} onClick={handleSignOut} onKeyDown={handleKeyDown}>\n {t('UserDropdown.signOutText')}\n </a>\n ),\n },\n ]\n\n return (\n <div>\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n <a\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.preventDefault()\n }}\n onKeyDown={handleDropdownKeyDown}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined className=\"text-base\" />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserDropdown\n","import type { DetailedHTMLProps, FC, ImgHTMLAttributes } from 'react'\n\nimport logoUrl from './logo.png'\n\nexport type LogoProps = Omit<DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, 'src' | 'alt'>\n\nconst Logo: FC<LogoProps> = props => {\n return <img src={logoUrl} alt=\"logo\" {...props} />\n}\n\nexport default Logo\n","import { theme } from 'antd'\nimport { memo } from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\n\nimport { useToolkitsStore } from '../toolkitsProvider'\n\ninterface LayoutHeaderProps {\n title?: string\n subtitle?: string\n}\n\nconst TRANSITION_EASING = 'all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\n\nconst LayoutHeader = memo<LayoutHeaderProps>(({ title, subtitle }) => {\n const {\n context: { homePath },\n layout: { collapsed },\n } = useToolkitsStore()\n const {\n token: { colorPrimary },\n } = theme.useToken()\n\n return (\n <div className=\"px-6 py-2 font-bold relative bg-linear-to-r from-white to-gray-50/30 h-auto flex flex-col justify-center backdrop-blur-sm\">\n <div className={`flex items-center w-full ${collapsed ? 'justify-center' : ''}`}>\n <Link\n to={homePath}\n className=\"transition-all duration-300 ease-out block rounded-lg p-1\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0.8 : 1,\n }}\n >\n <Logo\n width={36}\n className=\"object-contain block\"\n style={{\n transition: TRANSITION_EASING,\n }}\n />\n </Link>\n {title && (\n <div\n className=\"ml-4 overflow-hidden min-w-0\"\n style={{\n transition: TRANSITION_EASING,\n opacity: collapsed ? 0 : 1,\n width: collapsed ? '0px' : 'auto',\n marginLeft: collapsed ? '0px' : '16px',\n transform: collapsed ? 'translateX(-8px)' : 'translateX(0)',\n }}\n >\n <Link\n to={homePath}\n className=\"text-xl leading-tight transition-all duration-300 font-bold text-ellipsis overflow-hidden whitespace-nowrap block\"\n title={title}\n style={{\n color: colorPrimary,\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {title}\n </Link>\n </div>\n )}\n </div>\n <div\n className=\"w-full mt-2 overflow-hidden\"\n style={{\n height: subtitle && !collapsed ? '20px' : '1px',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex items-center justify-center h-full w-full\">\n <div\n className=\"w-full border-t border-gray-200 absolute\"\n style={{\n opacity: !subtitle || collapsed ? 1 : 0,\n transition: TRANSITION_EASING,\n }}\n />\n {subtitle && (\n <div\n className=\"flex items-center w-full text-sm\"\n style={{\n opacity: collapsed ? 0 : 1,\n transform: collapsed ? 'translateY(-3px)' : 'translateY(0)',\n transition: TRANSITION_EASING,\n }}\n >\n <div className=\"flex-1 border-t border-gray-200\"></div>\n <span className=\"px-3 text-gray-500 font-medium whitespace-nowrap\" title={subtitle}>\n {subtitle}\n </span>\n <div className=\"flex-1 border-t border-gray-200\"></div>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n})\n\nLayoutHeader.displayName = 'LayoutHeader'\n\nexport default LayoutHeader\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'\nimport { Button, Divider, Layout as AntdLayout, Space, Spin, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { Suspense } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport type { NavItem } from '@/components/nav'\nimport { Nav } from '@/components/nav'\nimport { RequireGame } from '@/components/requireGame'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { UserDropdown } from '@/components/userDropdown'\n\nimport type { GameSelectProps } from './GameSelect'\nimport GameSelect from './GameSelect'\nimport LayoutHeader from './LayoutHeader'\nimport type { Game } from './types'\n\nconst { Header, Sider, Content } = AntdLayout\n\nconst HEADER_HEIGHT = 64\n\n/** Header 扩展项配置 */\nexport type HeaderExtra = { key: Key; children: ReactNode }\n\n/** Header 扩展区域配置 */\nexport interface HeaderExtraConfig {\n /** 左侧扩展项 */\n left?: HeaderExtra[]\n /** 右侧扩展项 */\n right?: HeaderExtra[]\n}\n\n/** 导航配置 */\nexport interface NavigationConfig {\n /** 导航菜单项 */\n items?: NavItem[]\n /** 菜单加载状态 */\n loading?: boolean\n}\n\n/** 路由匹配规则类型 */\nexport type RouteMatchRule = string | RegExp\n\n/** 游戏选择器配置 */\nexport interface GameSelectConfig<T extends Game = Game> {\n /** 游戏过滤函数 */\n filter?: GameSelectProps<T>['filter']\n /** 选项自定义函数 */\n options?: GameSelectProps<T>['options']\n /** 在这些路由路径下隐藏游戏选择器(支持字符串路径或正则表达式) */\n hideOnRoutes?: RouteMatchRule[]\n}\n\n/** Layout 组件属性 */\nexport interface LayoutProps<T extends Game = Game> {\n /** 应用标题(显示在侧边栏顶部) */\n title?: string\n /** 应用副标题(显示在标题下方) */\n subtitle?: string\n /** 导航配置 */\n navigation?: NavigationConfig\n /** 游戏选择器配置 */\n gameSelect?: GameSelectConfig<T>\n /** Header 扩展区域配置 */\n headerExtra?: HeaderExtraConfig\n}\n\n/**\n * 检查路径是否匹配路由规则\n */\nconst matchRoute = (pathname: string, rule: RouteMatchRule): boolean => {\n if (typeof rule === 'string') {\n // 支持前缀匹配(以 * 结尾)或精确匹配\n if (rule.endsWith('*')) {\n const prefix = rule.slice(0, -1)\n return pathname.startsWith(prefix)\n }\n return pathname === rule\n }\n // 正则表达式匹配\n if (rule instanceof RegExp) {\n return rule.test(pathname)\n }\n return false\n}\n\nconst Layout = <T extends Game = Game>(props: PropsWithChildren<LayoutProps<T>>) => {\n const { title, subtitle, navigation, gameSelect, headerExtra, children } = props\n const location = useLocation()\n\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n\n const {\n context: { sidebarWidth, sidebarCollapsible, gameScoped, isGlobalMode },\n layout: { collapsed, toggleCollapsed },\n } = useToolkitsStore()\n\n // 检查当前路由是否在隐藏列表中\n const shouldHideOnCurrentRoute =\n gameSelect?.hideOnRoutes && gameSelect.hideOnRoutes.length > 0\n ? gameSelect.hideOnRoutes.some(rule => matchRoute(location.pathname, rule))\n : false\n\n // 计算是否显示游戏选择器\n const showGameSelect = !shouldHideOnCurrentRoute && gameScoped && !isGlobalMode\n\n return (\n <AntdLayout>\n <Sider\n collapsible={sidebarCollapsible}\n theme=\"light\"\n trigger={null}\n collapsed={collapsed}\n width={sidebarWidth}\n className=\"h-screen overflow-x-hidden overflow-y-auto border-r\"\n style={{ borderColor: colorBorder }}\n >\n <LayoutHeader title={title} subtitle={subtitle} />\n <Nav items={navigation?.items} loading={navigation?.loading} />\n </Sider>\n <AntdLayout>\n <Header style={{ background: colorBgContainer, paddingLeft: 16 }}>\n <div className=\"flex justify-between items-center h-full\">\n <Space size=\"small\" split={<Divider type=\"vertical\" />} className=\"mr-6\">\n {sidebarCollapsible && (\n <Button\n type=\"text\"\n icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n className=\"text-base\"\n onClick={toggleCollapsed}\n />\n )}\n {showGameSelect && <GameSelect<T> filter={gameSelect?.filter} options={gameSelect?.options} />}\n {headerExtra?.left?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n </Space>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {headerExtra?.right?.map(extra => (\n <span key={extra.key}>{extra.children}</span>\n ))}\n <UserDropdown />\n </Space>\n </div>\n </Header>\n <Content className=\"overflow-auto px-4 py-6\" style={{ maxHeight: `calc(100vh - ${HEADER_HEIGHT}px)` }}>\n <Suspense\n fallback={\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n }\n >\n <RequireGame>{children}</RequireGame>\n </Suspense>\n </Content>\n </AntdLayout>\n </AntdLayout>\n )\n}\n\nexport default Layout\n","import { Button, Result, Spin } from 'antd'\nimport type { Options as KyOptions } from 'ky'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\nimport { useAuth } from '@/services'\n\nexport interface RequireAuthProps {\n /** 权限码 */\n code: string\n /** 请求配置 */\n config?: KyOptions\n /** 无权限时点击返回按钮跳转的路径,默认为首页 '/' */\n redirectPath?: string\n}\n\n/**\n * 授权保护组件\n * 根据权限码控制子组件的访问权限\n * - 有权限:渲染子组件\n * - 无权限:显示 403 无权限页面,可点击按钮返回指定路径\n * - 加载中:显示加载动画\n */\nconst RequireAuth: FC<PropsWithChildren<RequireAuthProps>> = props => {\n const { code, config, redirectPath = '/', children } = props\n const { data: accessible, isLoading } = useAuth(code, config)\n const { t } = useTranslation()\n const navigate = useNavigate()\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center h-[200px]\">\n <Spin />\n </div>\n )\n }\n\n if (!accessible) {\n return (\n <Result\n status=\"403\"\n subTitle={t('global.noEntitlement')}\n extra={\n <Button type=\"primary\" onClick={() => navigate(redirectPath)}>\n {t('global.back')}\n </Button>\n }\n />\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import { createVisibilityStore } from '@/utils'\n\nexport const useDrawerStore = createVisibilityStore()\n","import type { DrawerProps } from 'antd'\nimport { Button, Drawer } from 'antd'\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { generateId } from '@/utils'\n\nimport { useDrawerStore } from './stores'\n\nexport interface UseDrawerOperation {\n hide: () => void\n}\n\nexport interface UseDrawerProps extends Omit<DrawerProps, 'open' | 'confirmLoading' | 'onClose' | 'footer'> {\n content?: ReactNode | ((operation: UseDrawerOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n afterOpen?: () => void | Promise<void>\n afterClose?: () => void | Promise<void>\n footer?: ReactNode | null\n confirmText?: string\n cancelText?: string\n confirmButtonProps?: ComponentProps<typeof Button>\n cancelButtonProps?: ComponentProps<typeof Button>\n}\n\nexport function useDrawer(props: UseDrawerProps) {\n const {\n content,\n onConfirm,\n afterOpen,\n afterClose,\n footer,\n confirmText = '确认',\n cancelText = '取消',\n confirmButtonProps,\n cancelButtonProps,\n ...drawerProps\n } = props\n\n const _id = useMemo(() => generateId(), [])\n const { show, hide, isOpen, cleanup } = useDrawerStore()\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 onClose: DrawerProps['onClose'] = useCallback(async () => {\n _hide()\n await afterClose?.()\n }, [_hide, afterClose])\n\n const handleConfirm = useCallback(async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } catch (error) {\n console.error('Drawer confirm error:', error)\n throw error\n } finally {\n setConfirmLoading(false)\n }\n }, [onConfirm])\n\n const drawerFooter: DrawerProps['footer'] =\n footer !== undefined ? (\n <>{footer}</>\n ) : (\n <div className=\"flex gap-4 mx-4\">\n <Button type=\"primary\" loading={confirmLoading} {...confirmButtonProps} onClick={handleConfirm}>\n {confirmText}\n </Button>\n <Button {...cancelButtonProps} onClick={onClose}>\n {cancelText}\n </Button>\n </div>\n )\n\n const internalDrawer = (\n <Drawer {...drawerProps} open={open} footer={drawerFooter} onClose={onClose}>\n {isRenderFunction ? <>{content({ hide: _hide })}</> : <>{content}</>}\n </Drawer>\n )\n\n return {\n id: _id,\n show: _show,\n hide: _hide,\n confirmLoading,\n drawer: internalDrawer,\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 { useDrawer, type UseDrawerOperation, type UseDrawerProps } from './drawer'\n\nexport interface ShowFormOptions<Values extends AnyObject, ExtraValues> {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n}\n\nexport interface UseFormDrawerProps<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>\n extends Omit<UseDrawerProps, 'onConfirm' | 'content' | 'onShow' | 'afterClose'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseDrawerOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n onSuccess?: () => void\n afterClose?: (form: FormInstance<Values>) => void\n}\n\nexport interface UseFormDrawerReturn<Values extends AnyObject, ExtraValues> {\n id: number\n show: (options?: ShowFormOptions<Values, ExtraValues>) => void\n hide: () => void\n drawer: ReactNode\n}\n\nexport function useFormDrawer<Values extends AnyObject = AnyObject, ExtraValues = Record<string, unknown>>(\n props: UseFormDrawerProps<Values, ExtraValues>,\n): UseFormDrawerReturn<Values, ExtraValues> {\n const { content, form, formProps, onConfirm, onSuccess, afterClose, ...drawerProps } = 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, drawer } = useDrawer({\n ...drawerProps,\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 drawer,\n }\n}\n","import { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components'\n\nconst MenuItemList = lazy(() => import('./pages/menuItemList'))\nconst CreateMenuItem = lazy(() => import('./pages/createMenuItem'))\nconst UpdateMenuItem = lazy(() => import('./pages/updateMenuItem'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<MenuItemList />} />\n <Route path=\"create\" element={<CreateMenuItem />} />\n <Route path=\"update/:id\" element={<UpdateMenuItem />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nimport { ToolkitsProvider } from '@/components'\n\nconst UserList = lazy(() => import('./pages/userList'))\nconst UserDetail = lazy(() => import('./pages/userDetail'))\nconst RoleList = lazy(() => import('./pages/roleList'))\nconst RoleDetail = lazy(() => import('./pages/roleDetail'))\n\nexport default (\n <ToolkitsProvider isGlobalMode>\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"user/:id\" element={<UserDetail />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n </ToolkitsProvider>\n)\n","import { Button, Result } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport { useTranslation } from '@/locale'\n\ninterface NotFoundProps {\n redirectUrl?: string\n}\n\nconst NotFound: FC<NotFoundProps> = props => {\n const { redirectUrl } = props\n const navigate = useNavigate()\n const { t } = useTranslation()\n\n return (\n <div className=\"text-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n redirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(redirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Form, Input, Select } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\n\nimport { ExpandableParagraph } from '@/components/expandableParagraph'\nimport { QueryList } from '@/components/queryList'\nimport { useTranslation } from '@/locale'\n\nimport type { OperationLogListItem } from './types'\n\nconst { Option } = Select\n\nconst OperationLogList: FC = () => {\n const { t } = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n width: 200,\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return <ExpandableParagraph>{value}</ExpandableParagraph>\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n { List: OperationLogListItem[]; Total: number }\n >\n identifier=\"operation-log-list\"\n rowKey=\"id\"\n code=\"300001\"\n columns={columns}\n tableLayout=\"fixed\"\n request={{\n url: '/api/usystem/log/list',\n method: 'GET',\n }}\n dataAdapter={data => ({\n total: data?.Total,\n items: data?.List,\n })}\n renderForm={form => (\n <Form form={form} layout=\"inline\">\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear className=\"w-[100px]\">\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","import { useQuery } from '@tanstack/react-query'\nimport { useEffect, useState } from 'react'\n\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { useHttpGet } from '@/libs'\nimport { queryKeys } from '@/queryKeys'\n\n/**\n * 清除 URL 中的查询参数\n */\nfunction clearUrlParams(params: string[]) {\n const url = new URL(window.location.href)\n params.forEach(param => url.searchParams.delete(param))\n window.history.replaceState({}, '', url.toString())\n}\n\n/**\n * 处理登录页面的票据逻辑和未注册用户提示\n */\nexport function useTicketLogin() {\n const get = useHttpGet()\n const {\n token: { setToken },\n } = useToolkitsStore()\n\n const queryParams = new URLSearchParams(window.location.search)\n const ticket = queryParams.get('ticket')\n const unregisteredFromUrl = queryParams.get('unregistered') === 'true'\n\n // 初始化未注册状态\n const [isUnregistered, setIsUnregistered] = useState(unregisteredFromUrl)\n\n const { data, isLoading, error } = useQuery({\n queryKey: queryKeys.auth.ticketLogin(ticket),\n queryFn: () => get<{ token: string }>('/api/usystem/user/login', { searchParams: { ticket: ticket! } }),\n enabled: !!ticket,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n })\n\n useEffect(() => {\n if (data?.token) {\n setToken(data.token)\n // 登录成功后清除 ticket 和 unregistered 参数\n clearUrlParams(['ticket', 'unregistered'])\n }\n }, [data, setToken])\n\n const dismissUnregistered = () => {\n setIsUnregistered(false)\n if (unregisteredFromUrl) {\n clearUrlParams(['unregistered'])\n }\n }\n\n return {\n isLoading,\n error,\n isUnregistered,\n dismissUnregistered,\n }\n}\n","import { LoginOutlined } from '@ant-design/icons'\nimport { Alert, Button, Card, Divider, Space, Spin, Typography } from 'antd'\nimport type { FC, ReactNode } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nimport { Logo } from '@/components/logo'\nimport { useToolkitsStore } from '@/components/toolkitsProvider'\nimport { SSO_URL } from '@/constants'\nimport { useTranslation } from '@/locale'\n\nimport backgroundUrl from './background.svg'\nimport { useTicketLogin } from './hooks'\n\ninterface SignInProps {\n extra?: ReactNode\n title?: string\n}\n\nconst SignIn: FC<SignInProps> = ({ extra, title }) => {\n const {\n token: { token },\n context: { homePath },\n } = useToolkitsStore()\n const { t } = useTranslation()\n const { isLoading, isUnregistered, dismissUnregistered } = useTicketLogin()\n\n // 构建 SSO 登录 URL\n const ssoLoginUrl = `${SSO_URL}/login?service=${encodeURIComponent(window.location.href)}`\n\n if (isLoading) {\n return (\n <div className=\"w-screen h-screen flex justify-center items-center\">\n <Spin />\n </div>\n )\n }\n\n if (token) {\n return <Navigate replace to={homePath} />\n }\n\n return (\n <div className=\"w-screen h-screen relative overflow-hidden bg-linear-to-br from-blue-50 via-indigo-50/50 to-purple-50\">\n {/* 顶部额外内容 */}\n {extra && <div className=\"absolute top-6 right-6 z-20 md:top-16 md:right-16\">{extra}</div>}\n\n {/* Logo 和标题 */}\n <div className=\"absolute left-6 top-6 z-20 md:left-14 md:top-10\">\n <Space align=\"center\" size=\"large\">\n <Logo width={48} />\n {title && (\n <span className=\"text-xl md:text-2xl font-bold bg-linear-to-r from-gray-800 to-gray-600 bg-clip-text text-transparent\">\n {title}\n </span>\n )}\n </Space>\n </div>\n\n {/* 主要内容区域 */}\n <div className=\"w-full h-full flex items-center justify-center relative px-4 md:px-0\">\n {/* 背景插图 - 桌面端显示 */}\n <div className=\"hidden lg:flex absolute top-0 left-0 bottom-0 right-[550px] justify-center items-center\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-5/6 max-w-full h-auto object-contain\" />\n </div>\n\n {/* 登录卡片 */}\n <div className=\"absolute z-10 right-[10%] top-1/2 -translate-y-3/4 w-[450px]\">\n <Card\n className=\"shadow-2xl rounded-2xl overflow-hidden backdrop-blur-sm border-0 transition-all duration-300 hover:shadow-[0_20px_60px_-15px_rgba(0,0,0,0.3)]\"\n style={{\n background: 'rgba(255, 255, 255, 0.98)',\n border: '1px solid rgba(0, 0, 0, 0.06)',\n }}\n variant=\"outlined\"\n >\n <div className=\"px-2 py-1\">\n {isUnregistered && (\n <Alert\n banner\n closable={{ onClose: dismissUnregistered }}\n title={t('SignIn.unregistered')}\n type=\"error\"\n className=\"mb-6 rounded-lg border-0\"\n />\n )}\n\n {/* 欢迎标题 */}\n <div className=\"mb-8 text-center\">\n <div className=\"mt-4 mb-2\">\n <Typography.Title\n level={2}\n className=\"mb-0! text-3xl! font-semibold bg-linear-to-r from-gray-800 via-gray-700 to-gray-600 bg-clip-text text-transparent\"\n >\n {t('SignIn.welcome')}\n </Typography.Title>\n </div>\n </div>\n\n <Divider className=\"my-6\" />\n\n {/* 登录按钮 */}\n <Button\n block\n type=\"primary\"\n size=\"large\"\n icon={<LoginOutlined />}\n href={ssoLoginUrl}\n target=\"_self\"\n className=\"h-12 text-base font-medium shadow-md hover:shadow-lg transition-all duration-200 hover:scale-[1.02]\"\n >\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </Card>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n"]}