react-toolkits 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/components/index.d.mts +6 -1
- package/dist/components/index.esm.js +10 -10
- package/dist/components/index.esm.js.map +1 -1
- package/dist/index.d.mts +6 -1
- package/dist/index.esm.js +11 -11
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -80,6 +80,10 @@ type PaginationParams = {
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
type QueryListKey = Omit<AxiosRequestConfig, 'data' | 'params'>;
|
|
83
|
+
declare enum QueryListAction {
|
|
84
|
+
Submit = "submit",
|
|
85
|
+
Reset = "reset"
|
|
86
|
+
}
|
|
83
87
|
interface QueryListProps<Item, Values, Response> extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'>, Pick<FormProps<Values>, 'initialValues' | 'labelCol'> {
|
|
84
88
|
swrKey: QueryListKey;
|
|
85
89
|
confirmText?: ReactNode;
|
|
@@ -87,6 +91,7 @@ interface QueryListProps<Item, Values, Response> extends Pick<TableProps<Item>,
|
|
|
87
91
|
renderForm?: (form: FormInstance<Values>) => ReactNode;
|
|
88
92
|
transformArg?: (arg: Merge<Values, PaginationParams>) => unknown;
|
|
89
93
|
transformResponse?: (response: Response) => ListResponse<Item>;
|
|
94
|
+
afterQuerySuccess?: (response: ListResponse<Item>, action?: QueryListAction) => void;
|
|
90
95
|
}
|
|
91
96
|
declare const QueryList: <Item extends object, Values = {}, Response_1 = ListResponse<Item>>(props: QueryListProps<Item, Values, Response_1>) => react_jsx_runtime.JSX.Element;
|
|
92
97
|
|
|
@@ -140,4 +145,4 @@ interface PermissionGuardProps {
|
|
|
140
145
|
}
|
|
141
146
|
declare const PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>>;
|
|
142
147
|
|
|
143
|
-
export { DynamicTags, DynamicTagsProps, FilterForm, FilterFormProps, FormModal, FormModalProps, FormModalRef, GameSelect, Highlight, HighlightTextsProps, ItemType2, Layout, LayoutProps, NavMenu, PermissionButton, PermissionButtonProps, PermissionGuard, PermissionGuardProps, QueryList, QueryListKey, QueryListProps, ReactToolkitsProvider, UseFormModalProps, UserWidget, useFormModal, useReactToolkitsContext };
|
|
148
|
+
export { DynamicTags, DynamicTagsProps, FilterForm, FilterFormProps, FormModal, FormModalProps, FormModalRef, GameSelect, Highlight, HighlightTextsProps, ItemType2, Layout, LayoutProps, NavMenu, PermissionButton, PermissionButtonProps, PermissionGuard, PermissionGuardProps, QueryList, QueryListAction, QueryListKey, QueryListProps, ReactToolkitsProvider, UseFormModalProps, UserWidget, useFormModal, useReactToolkitsContext };
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { PlusOutlined, LogoutOutlined, UserOutlined } from '@ant-design/icons';
|
|
2
|
-
import * as
|
|
2
|
+
import * as q from 'antd';
|
|
3
3
|
import { Form, Modal, Button, theme, Space, Input, Tag, Row, Col, Tooltip, Table, Result, Select, Dropdown, Menu, Divider, Spin, Typography, Card, Empty } from 'antd';
|
|
4
|
-
import * as
|
|
4
|
+
import * as Oe from 'react';
|
|
5
5
|
import { forwardRef, createContext, useId, useRef, useState, useImperativeHandle, useCallback, useMemo, useContext, useEffect, Suspense } from 'react';
|
|
6
6
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
import { createPortal, flushSync } from 'react-dom';
|
|
8
8
|
import { createRoot } from 'react-dom/client';
|
|
9
9
|
import { create, useStore } from 'zustand';
|
|
10
10
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
11
|
+
import Mt from 'jwt-decode';
|
|
12
|
+
import vt from 'axios';
|
|
13
|
+
import Lt from 'swr/immutable';
|
|
14
|
+
import Et from 'swr/mutation';
|
|
15
15
|
import { useNavigate, useLocation, Link } from 'react-router-dom';
|
|
16
|
-
import
|
|
16
|
+
import Ne from 'antd/es/typography/Link';
|
|
17
17
|
import { SWRConfig } from 'swr';
|
|
18
|
-
import
|
|
18
|
+
import Ko from './logo-L6MFCL6M.png';
|
|
19
19
|
|
|
20
|
-
var ze=Object.defineProperty,Oe=Object.defineProperties;var qe=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var he=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable;var ge=(t,e,o)=>e in t?ze(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,y=(t,e)=>{for(var o in e||(e={}))he.call(e,o)&&ge(t,o,e[o]);if(J)for(var o of J(e))Pe.call(e,o)&&ge(t,o,e[o]);return t},T=(t,e)=>Oe(t,qe(e));var x=(t,e)=>{var o={};for(var r in t)he.call(t,r)&&e.indexOf(r)<0&&(o[r]=t[r]);if(t!=null&&J)for(var r of J(t))e.indexOf(r)<0&&Pe.call(t,r)&&(o[r]=t[r]);return o};var R=(t,e,o)=>new Promise((r,n)=>{var i=l=>{try{a(o.next(l));}catch(p){n(p);}},s=l=>{try{a(o.throw(l));}catch(p){n(p);}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(i,s);a((o=o.apply(t,e)).next());});var _e=t=>{let{initialTags:e,addable:o,removable:r,addCallback:n,removeCallback:i}=t,{token:s}=theme.useToken(),[a,l]=useState([]),[p,c]=useState(!1),[m,u]=useState(""),[d,k]=useState(-1),[P,v]=useState(""),I=useRef(null),A=useRef(null);useEffect(()=>{l(e!=null?e:[]);},[e]),useEffect(()=>{var f;p&&((f=I.current)==null||f.focus());},[p]),useEffect(()=>{var f;(f=A.current)==null||f.focus();},[m]);let S=f=>R(void 0,null,function*(){if(yield i==null?void 0:i(f)){let G=a.filter(_=>_!==f);l(G);}}),K=()=>{c(!0);},D=f=>{u(f.target.value);},V=()=>R(void 0,null,function*(){m&&a.indexOf(m)===-1&&(yield n==null?void 0:n(m))&&l([...a,m]),c(!1),u("");}),U=f=>{v(f.target.value);},C=()=>{let f=[...a];f[d]=P,l(f),k(-1),u("");},M={width:78,verticalAlign:"top"},Qe={background:s.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:a.map((f,N)=>d===N?jsx(Input,{ref:A,size:"small",style:M,value:P,onChange:U,onBlur:C,onPressEnter:C},f):jsx(Tag,{closable:r,style:{userSelect:"none"},onClose:G=>R(void 0,null,function*(){G.preventDefault(),yield S(f);}),children:jsx("span",{onDoubleClick:G=>{N!==0&&(k(N),v(f),G.preventDefault());},children:f})},f))}),o&&(p?jsx(Input,{ref:I,type:"text",size:"small",style:M,value:m,onChange:D,onBlur:V,onPressEnter:V}):jsxs(Tag,{style:Qe,onClick:K,children:[jsx(PlusOutlined,{}),"\xA0\u6DFB\u52A0"]}))]})},Je=_e;var Ze=t=>{let l=t,{children:e,confirmText:o,form:r,onReset:n}=l,i=x(l,["children","confirmText","form","onReset"]),{token:s}=theme.useToken(),a={maxWidth:"none",background:s.colorFillAlter,borderWidth:s.lineWidth,borderStyle:s.lineType,borderColor:s.colorBorder,borderRadius:s.borderRadiusLG,padding:24,marginBottom:24};return jsx(Form,T(y({},i),{form:r,autoComplete:"off",children:e&&jsx("div",{style:a,children:jsxs(Row,{gutter:18,children:[e,jsx(Col,{flex:"auto"}),jsx(Col,{flex:"auto",span:24,style:{textAlign:"right"},children:jsxs(Space,{children:[jsx(Button,{type:"primary",htmlType:"submit",children:o||"\u67E5\u8BE2"}),jsx(Button,{htmlType:"reset",onClick:n,children:"\u91CD\u7F6E"})]})})]})})}))},Z=Ze;var it=(t,e)=>{let{width:o,children:r,title:n,open:i,footer:s,layout:a,labelCol:l,bodyStyle:p,initialValues:c,maskClosable:m,closeFn:u,afterClose:d,onConfirm:k}=t,P=useId(),[v]=Form.useForm(),I=useRef(null),A=typeof r=="function",[S,K]=useState(!1);return useImperativeHandle(e,()=>({setFieldsValue(D){var V;(V=I.current)==null||V.setFieldsValue(D);}})),jsx(Modal,{destroyOnClose:!0,bodyStyle:p,style:{textAlign:"start"},width:o,open:i,title:n,forceRender:!0,getContainer:!1,maskClosable:m,footer:typeof s=="object"?s:[jsx(Button,{onClick:()=>{u==null||u();},children:"\u53D6\u6D88"},"cancel"),jsx(Button,{form:P,type:"primary",htmlType:"submit",loading:S,children:"\u786E\u5B9A"},"submit")],afterClose:()=>{d==null||d(),v.resetFields();},onCancel:u,children:jsx(Form,{form:v,ref:I,id:P,autoComplete:"off",labelAlign:"right",labelWrap:!0,layout:a,initialValues:c,labelCol:l||{flex:!a||a==="horizontal"?"120px":"0"},onFinish:D=>R(void 0,null,function*(){try{K(!0),yield k==null?void 0:k(D),u==null||u(),v.resetFields();}finally{K(!1);}}),children:A?r({form:v,open:i,closeFn:u}):r})})},at=forwardRef(it),ee=at;function ct(t){let u=t,{content:e,onConfirm:o}=u,r=x(u,["content","onConfirm"]),[n,i]=useState(!1),[s,a]=useState(),l=useRef(null),p=d=>{var k,P;a((k=d==null?void 0:d.title)!=null?k:r.title),d!=null&&d.initialValues&&((P=l.current)==null||P.setFieldsValue(d==null?void 0:d.initialValues)),i(!0);},c=useCallback(()=>{i(!1);},[]),m=useMemo(()=>jsx(ee,T(y({ref:l},r),{open:n,closeFn:c,title:s,onConfirm:o,children:e})),[s,e,r,n,c,o]);return {Modal:createPortal(m,document.body),showModal:p,closeModal:c}}var Pt=t=>{let e=/(<[^>]*>)/;return t.split(e).filter(o=>o!=="")};function Tt(t){let e=document.createElement("div"),o=createRoot(e);return new Promise(r=>{setTimeout(()=>{flushSync(()=>{o.render(t);}),r(e.innerHTML);});})}var Rt=t=>{let{texts:e,children:o}=t,[r,n]=useState("");return useEffect(()=>{Tt(o).then(i=>{let s=Pt(i);for(let a of e)for(let l=0;l<s.length;l++)s[l]=s[l].replace(String(a),`<span style='color: #DC143C;'>${a}</span>`);n(s.join(""));});},[o,e]),jsx("p",{dangerouslySetInnerHTML:{__html:r}})},Ct=Rt;var L=create()(persist((t,e)=>({token:"",getUser:()=>{try{return xt(e().token)}catch(o){return null}},setToken:o=>t({token:o}),clearToken:()=>{t({token:""}),L.persist.clearStorage();}}),{name:"token",partialize:t=>({token:t.token})}));var $=create((t,e)=>({data:new Map,getPaginationData:o=>{var n,i,s;let r=(n=e().data.get(o))==null?void 0:n.pagination;return {page:(i=r==null?void 0:r.page)!=null?i:1,size:(s=r==null?void 0:r.size)!=null?s:10}},setPaginationData:(o,r)=>{var n,i;t({data:new Map(e().data).set(o,T(y({},e().data.get(o)),{pagination:{page:(n=r==null?void 0:r.page)!=null?n:e().getPaginationData(o).page,size:(i=r==null?void 0:r.size)!=null?i:e().getPaginationData(o).size}}))});},refresh:(o,r)=>{var i,s,a;let n=(i=e().data.get(o))==null?void 0:i.refresh;n&&n({page:(s=r==null?void 0:r.page)!=null?s:e().getPaginationData(o).page,size:(a=r==null?void 0:r.size)!=null?a:e().getPaginationData(o).size});},setRefresh:(o,r)=>{let n=e().data;t({data:new Map(n).set(o,T(y({},n.get(o)),{refresh:r}))});}}));var w=class extends Error{constructor(o,r,n=!1){super(o);this.code=r,this.skip=n;}};function W(){let t=L(s=>s.token),{game:e,isGlobalNS:o,isPermissionV2:r}=b(s=>s),n={withCredentials:!0},i=It.create(n);return i.interceptors.request.use(s=>{let a=s.headers;return a.set("Authorization",`Bearer ${t}`),r&&(a.has("App-ID")||a.set("App-ID",o?"global":e==null?void 0:e.id)),s}),i.interceptors.response.use(s=>{if(s.headers["content-type"].includes("application/octet-stream"))return s;if(s.data.code===0||s.data.status===0)return s.data.data;throw new w(s.data.msg,0)},s=>{throw s.response?s.response.status===401?new w("\u672A\u767B\u5F55\u6216\u767B\u5F55\u5DF2\u8FC7\u671F",s.response.status):s.response.status===403?new w("\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",s.response.status):[404,405].includes(s.response.status)?new w("Not Found or Method not Allowed",s.response.status,!0):s.response.status===412?new w("\u672A\u6CE8\u518C\u7528\u6237",s.response.status):s.response.status===504?new w("\u8BF7\u6C42\u8D85\u65F6",s.response.status):new w(s.response.message,s.response.status):new w("\u65E0\u54CD\u5E94")}),i}function te(t,e=!1){let o=W(),n=b(a=>a.isPermissionV2)?"/api/usystem/user/checkV2":"/api/usystem/user/check",{data:i,isLoading:s}=Mt(t.length>0?{method:"POST",url:n,data:{permissions:t},headers:e?{"App-ID":"global"}:{}}:null,a=>o.request(a).then(l=>l.has_all?t.reduce((p,c)=>(p[c]=!0,p),{}):t.reduce((p,c)=>(p[c]=l[c],p),{})),{suspense:!0,shouldRetryOnError:!1});return {data:i,isLoading:s}}function Q(t){var r;let{data:e,isLoading:o}=te(t?[t]:[]);return t?{accessible:(r=e==null?void 0:e[t])!=null?r:!1,isValidating:o}:{accessible:!0,isValidating:!1}}var vt=t=>{let a=t,{children:e,code:o,showLoading:r}=a,n=x(a,["children","code","showLoading"]),{accessible:i,isValidating:s}=Q(o);return s?jsx(Button,T(y({loading:r,disabled:!r},n),{children:e})):i?jsx(Button,T(y({},n),{children:e})):jsx(Tooltip,{defaultOpen:!1,title:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",children:jsx(Button,T(y({disabled:!0},n),{children:e}))})},Lt=vt;var Kt=t=>{let U=t,{code:e,confirmText:o,labelCol:r,swrKey:n,initialValues:i,renderForm:s,transformArg:a,transformResponse:l}=U,p=x(U,["code","confirmText","labelCol","swrKey","initialValues","renderForm","transformArg","transformResponse"]),{accessible:c}=Q(e!=null?e:""),[m]=Form.useForm(),u=$(C=>C.setRefresh),d=$(C=>C.getPaginationData),k=$(C=>C.setPaginationData),P=d(n),v=W(),{data:I,isMutating:A,trigger:S}=At(n,(Qe,f)=>R(void 0,[Qe,f],function*(C,{arg:M}){var ue,ce,de;let N={page:(ue=M==null?void 0:M.page)!=null?ue:P.page,size:(ce=M==null?void 0:M.size)!=null?ce:P.size};k(n,M);let G=m.getFieldsValue(),_=y(y({},G),N);return v.request(T(y({},C),{[C.method==="POST"?"data":"params"]:(de=a==null?void 0:a(_))!=null?de:_})).then(fe=>{var ye;return (ye=l==null?void 0:l(fe))!=null?ye:fe})})),K=()=>R(void 0,null,function*(){yield S({page:1});}),D=useCallback(()=>R(void 0,null,function*(){try{m.resetFields(),yield m.validateFields(),yield S({page:1});}catch(C){console.log("\u8868\u5355\u6821\u9A8C\u5931\u8D25");}}),[m,S]),V=useCallback((C,M)=>R(void 0,null,function*(){yield S({page:C,size:M});}),[S]);return useEffect(()=>{u(n,S);},[n,S,u]),useEffect(()=>{R(void 0,null,function*(){try{yield m.validateFields(),yield S();}catch(C){m.resetFields();}});},[m,S]),c?jsxs(Fragment,{children:[jsx(Z,{initialValues:i,form:m,labelCol:r,confirmText:o,onFinish:K,onReset:D,children:s==null?void 0:s(m)}),jsx(Table,T(y({},p),{dataSource:I==null?void 0:I.List,loading:A,pagination:{showSizeChanger:!0,showQuickJumper:!0,current:P.page,pageSize:P.size,total:I==null?void 0:I.Total,onChange:V}}))]}):jsx(Result,{status:403,subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},Nt=Kt;var Ut={getItem:t=>sessionStorage.getItem(t)||localStorage.getItem(t),setItem:(t,e)=>{localStorage.setItem(t,e),sessionStorage.setItem(t,e);},removeItem:t=>R(void 0,null,function*(){localStorage.removeItem(t),sessionStorage.removeItem(t);})},De=()=>create()(persist(t=>({title:"",isPermissionV2:!1,isGlobalNS:!1,game:null,setGame:e=>t({game:e}),openKeys:[],setOpenKeys:e=>t({openKeys:e}),selectedKeys:[],setSelectedKeys:e=>t({selectedKeys:e}),menuItems:[],onlyDomesticGames:!1}),{name:"ReactToolkits",storage:createJSONStorage(()=>Ut),partialize:t=>({title:t.title,game:t.game,openKeys:t.openKeys,selectedKeys:t.selectedKeys})})),se=createContext(null);function b(t,e){let o=useContext(se);if(!o)throw new Error("Missing ReactToolkitsContext.Provider in the tree");return useStore(o,t,e)}var Xt=t=>{let n=t,{children:e}=n,o=x(n,["children"]),r=useRef();return r.current||(r.current=De()),useEffect(()=>{var i;(i=r.current)==null||i.setState(o);},[o]),jsx(se.Provider,{value:r.current,children:e})},$t=Xt;var{Text:so}=Typography;function no(){let{isPermissionV2:t,isGlobalNS:e}=b(s=>s),o=L(s=>s.getUser()),r=W(),{data:n,isLoading:i}=Mt(t&&!e&&o?`/api/usystem/game/all?user=${o.authorityId}`:null,s=>r.get(s,{headers:{"App-ID":"global"}}));return {games:n,isLoading:i}}var io=()=>{let{game:t,setGame:e,isGlobalNS:o,isPermissionV2:r,onlyDomesticGames:n}=b(p=>p),{games:i,isLoading:s}=no(),a=useMemo(()=>{var p;return (p=(i!=null?i:[]).filter(c=>!n||c.area==="cn"))==null?void 0:p.map(c=>({label:c.name,value:c.id}))},[i,n]),l=useCallback(p=>R(void 0,null,function*(){var m;let c=(m=(i!=null?i:[]).find(u=>u.id===p))!=null?m:null;e(c);}),[i,e]);return !r||o?null:jsxs(Space,{children:[jsx(so,{children:"\u5F53\u524D\u6E38\u620F"}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:t==null?void 0:t.id,placeholder:"\u8BF7\u9009\u62E9\u6E38\u620F",loading:s,style:{width:"200px"},options:a,onChange:l})]})},ne=io;var fo=t=>{let e=useNavigate(),o=L(n=>n.clearToken),r=L(n=>n.getUser());return jsx(Dropdown,{menu:{selectable:!0,items:[{key:"1",label:jsx(Ge,{onClick:()=>{o(),e("/login");},children:"\u767B\u51FA"}),icon:jsx(LogoutOutlined,{})}]},placement:"bottomRight",children:jsx(Ge,{children:jsxs(Space,{align:"center",children:[jsx("span",{children:r==null?void 0:r.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})},ie=fo;var Co=(t,e)=>t?e?jsx(Link,{to:e,children:t}):t:jsx(Fragment,{});function Ke(t,e){let o=[];for(let i=0;i<t.length;i++)if(t[i]===null)o[i]=null;else if(t[i].type==="divider")o[i]=y({},t[i]);else if(t[i].children){let r=t[i],{children:s}=r,a=x(r,["children"]);o[i]=T(y({},a),{children:Ke(s!=null?s:[],e)});}else {let n=t[i],{route:s,label:a,code:l}=n,p=x(n,["route","label","code"]),c=!l||!e||e[l];o[i]=c?T(y({},p),{label:Co(a,s)}):null;}return o}function Ne(t,e=[],o=[]){for(let r of t){let n=r.children;if(Array.isArray(n)){let i=r.type!=="group"&&r.key?[...o,r.key]:o;Ne(n,e,i);}else e.push(Object.assign(r,{keypath:o}));}return e}var bo=()=>{let t=useLocation(),e=b(m=>m.menuItems),o=useMemo(()=>Ne(e!=null?e:[]),[e]),r=o.map(m=>m.code).filter(Boolean),{data:n}=te(r,!0),i=useMemo(()=>Ke(e!=null?e:[],n),[e,n]),{openKeys:s,selectedKeys:a,setOpenKeys:l,setSelectedKeys:p}=b(m=>m),c=useCallback(m=>{var k;let u=m==null?void 0:m.find(P=>(s==null?void 0:s.indexOf(P))===-1),d=o.find(P=>u===P.key);l((k=d==null?void 0:d.keypath)!=null?k:[u]);},[o,s,l]);return useEffect(()=>{let m=o.find(u=>t.pathname===u.route);if(m){let u=m.key,d=m.keypath;p([u]),l(d);}},[o,t,l,p]),jsx(Menu,{style:{borderRight:"none"},items:i,mode:"inline",openKeys:s,selectedKeys:a,onOpenChange:c})},le=bo;var xo=t=>{let{children:e}=t,{game:o,isPermissionV2:r,isGlobalNS:n}=b(i=>i);return r&&!n&&!o?jsx(Card,{children:jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:"\u8BF7\u9009\u62E9\u6E38\u620F"})}):jsx(Fragment,{children:e})},Ee=xo;var {Spin:Vo,theme:Go}=H,{Header:Ao,Sider:Ko,Content:No}=H.Layout,Bo=t=>{let{children:e,extra:o}=t,{token:{colorBgContainer:r,colorBorder:n}}=Go.useToken(),{title:i,game:s}=b(a=>a);return jsxs(H.Layout,{hasSider:!0,className:"h-screen",children:[jsxs(Ko,{width:256,style:{overflow:"auto",height:"100vh",position:"fixed",left:0,top:0,bottom:0,borderRightWidth:1,borderRightStyle:"solid",borderRightColor:n},theme:"light",children:[jsxs("div",{className:"flex items-end px-6 py-4",children:[jsx("img",{src:Do,alt:"logo",className:"w-8 h-8"}),jsx(Link,{className:"font-bold text-lg ml-2",to:"/",children:i})]}),jsx(le,{})]}),jsxs(H.Layout,{className:"ml-64",children:[jsx(Ao,{style:{padding:"0 24px",background:r,borderBottomWidth:1,borderBottomStyle:"solid",borderBottomColor:n},children:jsxs("div",{className:"flex justify-between items-center h-full",children:[jsx("div",{children:jsx(ne,{})}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[o,jsx(ie,{})]})]})}),jsx(No,{className:"p-6 bg-gray-50",style:{overflow:"overlay"},children:jsx(Suspense,{fallback:jsx(Vo,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"50vh"}}),children:jsx(SWRConfig,{value:{revalidateOnMount:!0},children:jsx(Ee,{children:We.createElement("div",{key:s==null?void 0:s.id},e)})})})})]})]})},Eo=Bo;var zo=t=>{let{code:e,children:o}=t,{accessible:r,isValidating:n}=Q(e);return n?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):r?jsx(Fragment,{children:o}):jsx(Result,{status:"403",subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},Oo=zo;
|
|
20
|
+
var He=Object.defineProperty,Ue=Object.defineProperties;var _e=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var Re=Object.prototype.hasOwnProperty,Ce=Object.prototype.propertyIsEnumerable;var Te=(t,e,o)=>e in t?He(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,y=(t,e)=>{for(var o in e||(e={}))Re.call(e,o)&&Te(t,o,e[o]);if(_)for(var o of _(e))Ce.call(e,o)&&Te(t,o,e[o]);return t},P=(t,e)=>Ue(t,_e(e));var x=(t,e)=>{var o={};for(var r in t)Re.call(t,r)&&e.indexOf(r)<0&&(o[r]=t[r]);if(t!=null&&_)for(var r of _(t))e.indexOf(r)<0&&Ce.call(t,r)&&(o[r]=t[r]);return o};var T=(t,e,o)=>new Promise((r,n)=>{var i=l=>{try{a(o.next(l));}catch(p){n(p);}},s=l=>{try{a(o.throw(l));}catch(p){n(p);}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(i,s);a((o=o.apply(t,e)).next());});var $e=t=>{let{initialTags:e,addable:o,removable:r,addCallback:n,removeCallback:i}=t,{token:s}=theme.useToken(),[a,l]=useState([]),[p,d]=useState(!1),[c,m]=useState(""),[f,b]=useState(-1),[k,I]=useState(""),M=useRef(null),V=useRef(null);useEffect(()=>{l(e!=null?e:[]);},[e]),useEffect(()=>{var u;p&&((u=M.current)==null||u.focus());},[p]),useEffect(()=>{var u;(u=V.current)==null||u.focus();},[c]);let w=u=>T(void 0,null,function*(){if(yield i==null?void 0:i(u)){let z=a.filter(Y=>Y!==u);l(z);}}),G=()=>{d(!0);},R=u=>{m(u.target.value);},D=()=>T(void 0,null,function*(){c&&a.indexOf(c)===-1&&(yield n==null?void 0:n(c))&&l([...a,c]),d(!1),m("");}),j=u=>{I(u.target.value);},H=()=>{let u=[...a];u[f]=k,l(u),b(-1),m("");},W={width:78,verticalAlign:"top"},S={background:s.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:a.map((u,U)=>f===U?jsx(Input,{ref:V,size:"small",style:W,value:k,onChange:j,onBlur:H,onPressEnter:H},u):jsx(Tag,{closable:r,style:{userSelect:"none"},onClose:z=>T(void 0,null,function*(){z.preventDefault(),yield w(u);}),children:jsx("span",{onDoubleClick:z=>{U!==0&&(b(U),I(u),z.preventDefault());},children:u})},u))}),o&&(p?jsx(Input,{ref:M,type:"text",size:"small",style:W,value:c,onChange:R,onBlur:D,onPressEnter:D}):jsxs(Tag,{style:S,onClick:G,children:[jsx(PlusOutlined,{}),"\xA0\u6DFB\u52A0"]}))]})},je=$e;var ot=t=>{let l=t,{children:e,confirmText:o,form:r,onReset:n}=l,i=x(l,["children","confirmText","form","onReset"]),{token:s}=theme.useToken(),a={maxWidth:"none",background:s.colorFillAlter,borderWidth:s.lineWidth,borderStyle:s.lineType,borderColor:s.colorBorder,borderRadius:s.borderRadiusLG,padding:24,marginBottom:24};return jsx(Form,P(y({},i),{form:r,autoComplete:"off",children:e&&jsx("div",{style:a,children:jsxs(Row,{gutter:18,children:[e,jsx(Col,{flex:"auto"}),jsx(Col,{flex:"auto",span:24,style:{textAlign:"right"},children:jsxs(Space,{children:[jsx(Button,{type:"primary",htmlType:"submit",children:o||"\u67E5\u8BE2"}),jsx(Button,{htmlType:"reset",onClick:n,children:"\u91CD\u7F6E"})]})})]})})}))},ee=ot;var mt=(t,e)=>{let{width:o,children:r,title:n,open:i,footer:s,layout:a,labelCol:l,bodyStyle:p,initialValues:d,maskClosable:c,closeFn:m,afterClose:f,onConfirm:b}=t,k=useId(),[I]=Form.useForm(),M=useRef(null),V=typeof r=="function",[w,G]=useState(!1);return useImperativeHandle(e,()=>({setFieldsValue(R){var D;(D=M.current)==null||D.setFieldsValue(R);}})),jsx(Modal,{destroyOnClose:!0,bodyStyle:p,style:{textAlign:"start"},width:o,open:i,title:n,forceRender:!0,getContainer:!1,maskClosable:c,footer:typeof s=="object"?s:[jsx(Button,{onClick:()=>{m==null||m();},children:"\u53D6\u6D88"},"cancel"),jsx(Button,{form:k,type:"primary",htmlType:"submit",loading:w,children:"\u786E\u5B9A"},"submit")],afterClose:()=>{f==null||f(),I.resetFields();},onCancel:m,children:jsx(Form,{form:I,ref:M,id:k,autoComplete:"off",labelAlign:"right",labelWrap:!0,layout:a,initialValues:d,labelCol:l||{flex:!a||a==="horizontal"?"120px":"0"},onFinish:R=>T(void 0,null,function*(){try{G(!0),yield b==null?void 0:b(R),m==null||m(),I.resetFields();}finally{G(!1);}}),children:V?r({form:I,open:i,closeFn:m}):r})})},pt=forwardRef(mt),te=pt;function yt(t){let m=t,{content:e,onConfirm:o}=m,r=x(m,["content","onConfirm"]),[n,i]=useState(!1),[s,a]=useState(),l=useRef(null),p=f=>{var b,k;a((b=f==null?void 0:f.title)!=null?b:r.title),f!=null&&f.initialValues&&((k=l.current)==null||k.setFieldsValue(f==null?void 0:f.initialValues)),i(!0);},d=useCallback(()=>{i(!1);},[]),c=useMemo(()=>jsx(te,P(y({ref:l},r),{open:n,closeFn:d,title:s,onConfirm:o,children:e})),[s,e,r,n,d,o]);return {Modal:createPortal(c,document.body),showModal:p,closeModal:d}}var Ct=t=>{let e=/(<[^>]*>)/;return t.split(e).filter(o=>o!=="")};function bt(t){let e=document.createElement("div"),o=createRoot(e);return new Promise(r=>{setTimeout(()=>{flushSync(()=>{o.render(t);}),r(e.innerHTML);});})}var kt=t=>{let{texts:e,children:o}=t,[r,n]=useState("");return useEffect(()=>{bt(o).then(i=>{let s=Ct(i);for(let a of e)for(let l=0;l<s.length;l++)s[l]=s[l].replace(String(a),`<span style='color: #DC143C;'>${a}</span>`);n(s.join(""));});},[o,e]),jsx("p",{dangerouslySetInnerHTML:{__html:r}})},St=kt;var L=create()(persist((t,e)=>({token:"",getUser:()=>{try{return Mt(e().token)}catch(o){return null}},setToken:o=>t({token:o}),clearToken:()=>{t({token:""}),L.persist.clearStorage();}}),{name:"token",partialize:t=>({token:t.token})}));var X=create((t,e)=>({data:new Map,getPaginationData:o=>{var n,i,s;let r=(n=e().data.get(o))==null?void 0:n.pagination;return {page:(i=r==null?void 0:r.page)!=null?i:1,size:(s=r==null?void 0:r.size)!=null?s:10}},setPaginationData:(o,r)=>{var n,i;t({data:new Map(e().data).set(o,P(y({},e().data.get(o)),{pagination:{page:(n=r==null?void 0:r.page)!=null?n:e().getPaginationData(o).page,size:(i=r==null?void 0:r.size)!=null?i:e().getPaginationData(o).size}}))});},refresh:(o,r)=>{var i,s,a;let n=(i=e().data.get(o))==null?void 0:i.refresh;n&&n({page:(s=r==null?void 0:r.page)!=null?s:e().getPaginationData(o).page,size:(a=r==null?void 0:r.size)!=null?a:e().getPaginationData(o).size});},setRefresh:(o,r)=>{let n=e().data;t({data:new Map(n).set(o,P(y({},n.get(o)),{refresh:r}))});}}));var v=class extends Error{constructor(o,r,n=!1){super(o);this.code=r,this.skip=n;}};function N(){let t=L(s=>s.token),{game:e,isGlobalNS:o,isPermissionV2:r}=C(s=>s),n={withCredentials:!0},i=vt.create(n);return i.interceptors.request.use(s=>{let a=s.headers;return a.set("Authorization",`Bearer ${t}`),r&&(a.has("App-ID")||a.set("App-ID",o?"global":e==null?void 0:e.id)),s}),i.interceptors.response.use(s=>{if(s.headers["content-type"].includes("application/octet-stream"))return s;if(s.data.code===0||s.data.status===0)return s.data.data;throw new v(s.data.msg,0)},s=>{throw s.response?s.response.status===401?new v("\u672A\u767B\u5F55\u6216\u767B\u5F55\u5DF2\u8FC7\u671F",s.response.status):s.response.status===403?new v("\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",s.response.status):[404,405].includes(s.response.status)?new v("Not Found or Method not Allowed",s.response.status,!0):s.response.status===412?new v("\u672A\u6CE8\u518C\u7528\u6237",s.response.status):s.response.status===504?new v("\u8BF7\u6C42\u8D85\u65F6",s.response.status):new v(s.response.message,s.response.status):new v("\u65E0\u54CD\u5E94")}),i}function oe(t,e=!1){let o=N(),n=C(a=>a.isPermissionV2)?"/api/usystem/user/checkV2":"/api/usystem/user/check",{data:i,isLoading:s}=Lt(t.length>0?{method:"POST",url:n,data:{permissions:t},headers:e?{"App-ID":"global"}:{}}:null,a=>o.request(a).then(l=>l.has_all?t.reduce((p,d)=>(p[d]=!0,p),{}):t.reduce((p,d)=>(p[d]=l[d],p),{})),{suspense:!0,shouldRetryOnError:!1});return {data:i,isLoading:s}}function B(t){var r;let{data:e,isLoading:o}=oe(t?[t]:[]);return t?{accessible:(r=e==null?void 0:e[t])!=null?r:!1,isValidating:o}:{accessible:!0,isValidating:!1}}var Vt=t=>{let a=t,{children:e,code:o,showLoading:r}=a,n=x(a,["children","code","showLoading"]),{accessible:i,isValidating:s}=B(o);return s?jsx(Button,P(y({loading:r,disabled:!r},n),{children:e})):i?jsx(Button,P(y({},n),{children:e})):jsx(Tooltip,{defaultOpen:!1,title:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",children:jsx(Button,P(y({disabled:!0},n),{children:e}))})},Gt=Vt;var Qt=t=>{let W=t,{code:e,confirmText:o,labelCol:r,swrKey:n,initialValues:i,renderForm:s,transformArg:a,transformResponse:l,afterQuerySuccess:p}=W,d=x(W,["code","confirmText","labelCol","swrKey","initialValues","renderForm","transformArg","transformResponse","afterQuerySuccess"]),{accessible:c}=B(e!=null?e:""),[m]=Form.useForm(),f=X(S=>S.setRefresh),b=X(S=>S.getPaginationData),k=X(S=>S.setPaginationData),I=b(n),M=useRef(),V=N(),{data:w,isMutating:G,trigger:R}=Et(n,(U,z)=>T(void 0,[U,z],function*(S,{arg:u}){var de,fe,ye;let Y={page:(de=u==null?void 0:u.page)!=null?de:I.page,size:(fe=u==null?void 0:u.size)!=null?fe:I.size};k(n,u);let qe=m.getFieldsValue(),ce=y(y({},qe),Y);return V.request(P(y({},S),{[S.method==="POST"?"data":"params"]:(ye=a==null?void 0:a(ce))!=null?ye:ce})).then(ge=>{var Pe;let he=(Pe=l==null?void 0:l(ge))!=null?Pe:ge;return p==null||p(he,M.current),he}).finally(()=>{M.current=void 0;})})),D=()=>T(void 0,null,function*(){M.current="submit",yield R({page:1});}),j=useCallback(()=>T(void 0,null,function*(){M.current="reset";try{m.resetFields(),yield m.validateFields(),yield R({page:1});}catch(S){console.log("\u8868\u5355\u6821\u9A8C\u5931\u8D25");}}),[m,R]),H=useCallback((S,u)=>T(void 0,null,function*(){yield R({page:S,size:u});}),[R]);return useEffect(()=>{f(n,R);},[n,R,f]),useEffect(()=>{T(void 0,null,function*(){try{yield m.validateFields(),yield R();}catch(S){m.resetFields();}});},[m,R]),c?jsxs(Fragment,{children:[jsx(ee,{initialValues:i,form:m,labelCol:r,confirmText:o,onFinish:D,onReset:j,children:s==null?void 0:s(m)}),jsx(Table,P(y({},d),{dataSource:w==null?void 0:w.List,loading:G,pagination:{showSizeChanger:!0,showQuickJumper:!0,current:I.page,pageSize:I.size,total:w==null?void 0:w.Total,onChange:H}}))]}):jsx(Result,{status:403,subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},Wt=Qt;var $t={getItem:t=>sessionStorage.getItem(t)||localStorage.getItem(t),setItem:(t,e)=>{localStorage.setItem(t,e),sessionStorage.setItem(t,e);},removeItem:t=>T(void 0,null,function*(){localStorage.removeItem(t),sessionStorage.removeItem(t);})},Ae=()=>create()(persist(t=>({title:"",isPermissionV2:!1,isGlobalNS:!1,game:null,setGame:e=>t({game:e}),openKeys:[],setOpenKeys:e=>t({openKeys:e}),selectedKeys:[],setSelectedKeys:e=>t({selectedKeys:e}),menuItems:[],onlyDomesticGames:!1}),{name:"ReactToolkits",storage:createJSONStorage(()=>$t),partialize:t=>({title:t.title,game:t.game,openKeys:t.openKeys,selectedKeys:t.selectedKeys})})),ne=createContext(null);function C(t,e){let o=useContext(ne);if(!o)throw new Error("Missing ReactToolkitsContext.Provider in the tree");return useStore(o,t,e)}var Zt=t=>{let n=t,{children:e}=n,o=x(n,["children"]),r=useRef();return r.current||(r.current=Ae()),useEffect(()=>{var i;(i=r.current)==null||i.setState(o);},[o]),jsx(ne.Provider,{value:r.current,children:e})},eo=Zt;var{Text:lo}=Typography;function mo(){let{isPermissionV2:t,isGlobalNS:e}=C(s=>s),o=L(s=>s.getUser()),r=N(),{data:n,isLoading:i}=Lt(t&&!e&&o?`/api/usystem/game/all?user=${o.authorityId}`:null,s=>r.get(s,{headers:{"App-ID":"global"}}));return {games:n,isLoading:i}}var po=()=>{let{game:t,setGame:e,isGlobalNS:o,isPermissionV2:r,onlyDomesticGames:n}=C(p=>p),{games:i,isLoading:s}=mo(),a=useMemo(()=>{var p;return (p=(i!=null?i:[]).filter(d=>!n||d.area==="cn"))==null?void 0:p.map(d=>({label:d.name,value:d.id}))},[i,n]),l=useCallback(p=>T(void 0,null,function*(){var c;let d=(c=(i!=null?i:[]).find(m=>m.id===p))!=null?c:null;e(d);}),[i,e]);return !r||o?null:jsxs(Space,{children:[jsx(lo,{children:"\u5F53\u524D\u6E38\u620F"}),jsx(Select,{showSearch:!0,optionFilterProp:"label",value:t==null?void 0:t.id,placeholder:"\u8BF7\u9009\u62E9\u6E38\u620F",loading:s,style:{width:"200px"},options:a,onChange:l})]})},ie=po;var Po=t=>{let e=useNavigate(),o=L(n=>n.clearToken),r=L(n=>n.getUser());return jsx(Dropdown,{menu:{selectable:!0,items:[{key:"1",label:jsx(Ne,{onClick:()=>{o(),e("/login");},children:"\u767B\u51FA"}),icon:jsx(LogoutOutlined,{})}]},placement:"bottomRight",children:jsx(Ne,{children:jsxs(Space,{align:"center",children:[jsx("span",{children:r==null?void 0:r.authorityId}),jsx(UserOutlined,{style:{fontSize:"16px"}})]})})})},ae=Po;var xo=(t,e)=>t?e?jsx(Link,{to:e,children:t}):t:jsx(Fragment,{});function Ee(t,e){let o=[];for(let i=0;i<t.length;i++)if(t[i]===null)o[i]=null;else if(t[i].type==="divider")o[i]=y({},t[i]);else if(t[i].children){let r=t[i],{children:s}=r,a=x(r,["children"]);o[i]=P(y({},a),{children:Ee(s!=null?s:[],e)});}else {let n=t[i],{route:s,label:a,code:l}=n,p=x(n,["route","label","code"]),d=!l||!e||e[l];o[i]=d?P(y({},p),{label:xo(a,s)}):null;}return o}function Qe(t,e=[],o=[]){for(let r of t){let n=r.children;if(Array.isArray(n)){let i=r.type!=="group"&&r.key?[...o,r.key]:o;Qe(n,e,i);}else e.push(Object.assign(r,{keypath:o}));}return e}var Fo=()=>{let t=useLocation(),e=C(c=>c.menuItems),o=useMemo(()=>Qe(e!=null?e:[]),[e]),r=o.map(c=>c.code).filter(Boolean),{data:n}=oe(r,!0),i=useMemo(()=>Ee(e!=null?e:[],n),[e,n]),{openKeys:s,selectedKeys:a,setOpenKeys:l,setSelectedKeys:p}=C(c=>c),d=useCallback(c=>{var b;let m=c==null?void 0:c.find(k=>(s==null?void 0:s.indexOf(k))===-1),f=o.find(k=>m===k.key);l((b=f==null?void 0:f.keypath)!=null?b:[m]);},[o,s,l]);return useEffect(()=>{let c=o.find(m=>t.pathname===m.route);if(c){let m=c.key,f=c.keypath;p([m]),l(f);}},[o,t,l,p]),jsx(Menu,{style:{borderRight:"none"},items:i,mode:"inline",openKeys:s,selectedKeys:a,onOpenChange:d})},me=Fo;var wo=t=>{let{children:e}=t,{game:o,isPermissionV2:r,isGlobalNS:n}=C(i=>i);return r&&!n&&!o?jsx(Card,{children:jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:"\u8BF7\u9009\u62E9\u6E38\u620F"})}):jsx(Fragment,{children:e})},ze=wo;var {Spin:No,theme:Bo}=q,{Header:Eo,Sider:Qo,Content:Wo}=q.Layout,zo=t=>{let{children:e,extra:o}=t,{token:{colorBgContainer:r,colorBorder:n}}=Bo.useToken(),{title:i,game:s}=C(a=>a);return jsxs(q.Layout,{hasSider:!0,className:"h-screen",children:[jsxs(Qo,{width:256,style:{overflow:"auto",height:"100vh",position:"fixed",left:0,top:0,bottom:0,borderRightWidth:1,borderRightStyle:"solid",borderRightColor:n},theme:"light",children:[jsxs("div",{className:"flex items-end px-6 py-4",children:[jsx("img",{src:Ko,alt:"logo",className:"w-8 h-8"}),jsx(Link,{className:"font-bold text-lg ml-2",to:"/",children:i})]}),jsx(me,{})]}),jsxs(q.Layout,{className:"ml-64",children:[jsx(Eo,{style:{padding:"0 24px",background:r,borderBottomWidth:1,borderBottomStyle:"solid",borderBottomColor:n},children:jsxs("div",{className:"flex justify-between items-center h-full",children:[jsx("div",{children:jsx(ie,{})}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[o,jsx(ae,{})]})]})}),jsx(Wo,{className:"p-6 bg-gray-50",style:{overflow:"overlay"},children:jsx(Suspense,{fallback:jsx(No,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"50vh"}}),children:jsx(SWRConfig,{value:{revalidateOnMount:!0},children:jsx(ze,{children:Oe.createElement("div",{key:s==null?void 0:s.id},e)})})})})]})]})},Oo=zo;var Uo=t=>{let{code:e,children:o}=t,{accessible:r,isValidating:n}=B(e);return n?jsx(Spin,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:200}}):r?jsx(Fragment,{children:o}):jsx(Result,{status:"403",subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},_o=Uo;
|
|
21
21
|
|
|
22
|
-
export {
|
|
22
|
+
export { je as DynamicTags, ee as FilterForm, te as FormModal, ie as GameSelect, St as Highlight, Oo as Layout, me as NavMenu, Gt as PermissionButton, _o as PermissionGuard, Wt as QueryList, eo as ReactToolkitsProvider, ae as UserWidget, yt as useFormModal, C as useReactToolkitsContext };
|
|
23
23
|
//# sourceMappingURL=out.js.map
|
|
24
24
|
//# sourceMappingURL=index.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DynamicTags/index.tsx","../../src/components/FilterForm/index.tsx","../../src/components/FormModal/index.tsx","../../src/components/FormModal/hooks.tsx","../../src/components/Highlight/index.tsx","../../src/stores/token.ts","../../src/stores/query-list.ts","../../src/hooks/use-http-client.ts","../../src/hooks/use-permission.ts","../../src/components/PermissionButton/index.tsx","../../src/components/QueryList/index.tsx","../../src/components/ReactToolkitsProvider/context.ts","../../src/components/ReactToolkitsProvider/index.tsx","../../src/components/GameSelect/index.tsx","../../src/components/UserWidget/index.tsx","../../src/components/NavMenu/index.tsx","../../src/components/Layout/index.tsx","../../src/components/RequireGame/index.tsx","../../src/components/PermissionGuard/index.tsx"],"names":["PlusOutlined","Input","Space","Tag","theme","useEffect","useRef","useState","jsx","jsxs","DynamicTags","props","initialTags","addable","removable","addCallback","removeCallback","token","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","_a","handleClose","removedTag","__async","newTags","tag","showInput","handleInputChange","e","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","index","DynamicTags_default","Button","Col","Form","Row","FilterForm","children","confirmText","form","onReset","restProps","__objRest","formStyle","__spreadProps","__spreadValues","FilterForm_default","Modal","forwardRef","useId","useImperativeHandle","InternalFormModal","ref","width","title","open","footer","layout","labelCol","bodyStyle","initialValues","maskClosable","closeFn","afterClose","onConfirm","id","formRef","isRenderProps","confirmLoading","setConfirmLoading","values","FormModal","FormModal_default","useCallback","useMemo","createPortal","useFormModal","content","setOpen","setTitle","showModal","options","_b","closeModal","flushSync","createRoot","splitByTags","str","regex","part","renderToString","node","container","root","resolve","Highlight","texts","htmlString","setHtmlString","result","text","Highlight_default","create","persist","jwtDecode","useTokenStore","set","get","_","state","useQueryListStore","key","_c","pagination","refresh","data","axios","HttpClientError","message","code","skip","useHttpClient","game","isGlobalNS","isPermissionV2","useReactToolkitsContext","defaultOptions","instance","config","headers","response","error","useSWRImmutable","usePermissions","codes","httpClient","url","isLoading","res","acc","curr","usePermission","Tooltip","PermissionButton","showLoading","accessible","isValidating","PermissionButton_default","Result","Table","useSWRMutation","Fragment","QueryList","swrKey","renderForm","transformArg","transformResponse","tableProps","setRefresh","getPaginationData","setPaginationData","paginationData","isMutating","trigger","_0","_1","arg","newPaginationData","_arg","onFinish","onPaginationChange","currentPage","currentSize","QueryList_default","useStore","createContext","useContext","createJSONStorage","mixedStorage","name","value","createReactToolkitsStore","keys","ReactToolkitsContext","selector","equalityFn","store","ReactToolkitsProvider","storeRef","ReactToolkitsProvider_default","Select","Typography","Text","useGames","user","GameSelect","setGame","onlyDomesticGames","games","item","onGameChange","matchGame","GameSelect_default","useNavigate","Dropdown","Link","LogoutOutlined","UserOutlined","UserWidget","navigate","clearToken","UserWidget_default","Menu","useLocation","withLink","label","route","transformItems","items","permissions","isPass","flatItems","keypath","_keys","NavMenu","location","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","onOpenChange","latestOpenKey","match","NavMenu_default","Antd","Divider","React","Suspense","SWRConfig","logo","Card","Empty","RequireGame","RequireGame_default","Spin","Header","Sider","Content","Layout","extra","colorBgContainer","colorBorder","Layout_default","PermissionGuard","PermissionGuard_default"],"mappings":"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","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\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 { 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: React.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: React.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 const tagInputStyle: React.CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: React.CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\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 style={tagInputStyle}\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 style={{ userSelect: '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 style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n 添加\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import type { FormInstance, FormProps } from 'antd'\nimport { Button, Col, Form, Row, Space, theme } from 'antd'\nimport type { PropsWithChildren } from 'react'\nimport * as React from 'react'\n\nexport interface FilterFormProps<Values>\n extends Pick<\n FormProps<Values>,\n | 'initialValues'\n | 'requiredMark'\n | 'onError'\n | 'onChange'\n | 'onValuesChange'\n | 'onFinish'\n | 'onFinishFailed'\n | 'layout'\n | 'labelCol'\n > {\n form?: FormInstance<Values>\n onReset?: () => void\n confirmText?: React.ReactNode\n}\n\nconst FilterForm = <Values = unknown,>(props: PropsWithChildren<FilterFormProps<Values>>) => {\n const { children, confirmText, form, onReset, ...restProps } = props\n const { token } = theme.useToken()\n\n const formStyle = {\n maxWidth: 'none',\n background: token.colorFillAlter,\n borderWidth: token.lineWidth,\n borderStyle: token.lineType,\n borderColor: token.colorBorder,\n borderRadius: token.borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <Form {...restProps} form={form} autoComplete=\"off\">\n {children && (\n <div style={formStyle}>\n <Row gutter={18}>\n {children}\n <Col flex=\"auto\" />\n <Col flex=\"auto\" span={24} style={{ textAlign: 'right' }}>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\">\n {confirmText || '查询'}\n </Button>\n <Button htmlType=\"reset\" onClick={onReset}>\n 重置\n </Button>\n </Space>\n </Col>\n </Row>\n </div>\n )}\n </Form>\n )\n}\n\nexport default FilterForm\n","import type { FormInstance, FormProps, ModalProps } from 'antd'\nimport { Button, Form, Modal } from 'antd'\nimport type { ForwardedRef, ReactElement } from 'react'\nimport { forwardRef, useId, useImperativeHandle, useRef, useState } from 'react'\n\ntype RenderChildren<T> = (props: {\n form: FormInstance<T>\n open?: boolean\n closeFn?: VoidFunction\n}) => JSX.Element | JSX.Element[]\n\ntype ChildrenType<T> = RenderChildren<T> | JSX.Element | JSX.Element[]\n\nexport type RecursivePartial<T> = T extends object\n ? {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P]\n }\n : unknown\n\nexport interface FormModalProps<T>\n extends Pick<ModalProps, 'width' | 'title' | 'open' | 'afterClose' | 'bodyStyle' | 'maskClosable'>,\n Pick<FormProps, 'labelCol' | 'layout' | 'colon'> {\n children?: ChildrenType<T>\n footer?: ModalProps['footer']\n closeFn?: VoidFunction\n initialValues?: RecursivePartial<T>\n onConfirm?: (values: T) => Promise<void>\n}\n\nexport interface FormModalRef<T = object> {\n setFieldsValue: (values: RecursivePartial<T>) => void\n}\n\nconst InternalFormModal = <T extends object>(props: FormModalProps<T>, ref: ForwardedRef<FormModalRef<T>>) => {\n const {\n width,\n children,\n title,\n open,\n footer,\n layout,\n labelCol,\n bodyStyle,\n initialValues,\n maskClosable,\n closeFn,\n afterClose,\n onConfirm,\n } = props\n const id = useId()\n const [form] = Form.useForm<T>()\n const formRef = useRef<FormInstance<T>>(null)\n const isRenderProps = typeof children === 'function'\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n useImperativeHandle(ref, () => {\n return {\n setFieldsValue(values) {\n formRef.current?.setFieldsValue(values)\n },\n }\n })\n\n return (\n <Modal\n destroyOnClose\n bodyStyle={bodyStyle}\n style={{ textAlign: 'start' }}\n width={width}\n open={open}\n title={title}\n forceRender={true}\n getContainer={false}\n maskClosable={maskClosable}\n footer={\n typeof footer === 'object'\n ? footer\n : [\n <Button\n key=\"cancel\"\n onClick={() => {\n closeFn?.()\n }}\n >\n 取消\n </Button>,\n <Button form={id} key=\"submit\" type=\"primary\" htmlType=\"submit\" loading={confirmLoading}>\n 确定\n </Button>,\n ]\n }\n afterClose={() => {\n afterClose?.()\n form.resetFields()\n }}\n onCancel={closeFn}\n >\n <Form\n form={form}\n ref={formRef}\n id={id}\n autoComplete=\"off\"\n labelAlign=\"right\"\n labelWrap={true}\n layout={layout}\n initialValues={initialValues}\n labelCol={\n labelCol || {\n flex: !layout || layout === 'horizontal' ? '120px' : '0',\n }\n }\n onFinish={async values => {\n try {\n setConfirmLoading(true)\n await onConfirm?.(values)\n closeFn?.()\n form.resetFields()\n } finally {\n setConfirmLoading(false)\n }\n }}\n >\n {isRenderProps ? children({ form, open, closeFn }) : children}\n </Form>\n </Modal>\n )\n}\n\nconst FormModal = forwardRef(InternalFormModal) as <T extends object>(\n props: FormModalProps<T> & { ref?: ForwardedRef<FormModalRef<T>> },\n) => ReactElement\n\nexport default FormModal\n","import type { FormModalProps, FormModalRef, RecursivePartial } from './index'\nimport FormModal from './index'\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport type { Merge } from 'ts-essentials'\nimport { createPortal } from 'react-dom'\n\nexport type UseFormModalProps<T> = Merge<\n Omit<FormModalProps<T>, 'open' | 'onCancel' | 'closeFn' | 'children'>,\n {\n content: FormModalProps<T>['children']\n }\n>\n\nexport function useFormModal<T extends object>(props: UseFormModalProps<T>) {\n const { content, onConfirm, ...restProps } = props\n const [open, setOpen] = useState(false)\n const [title, setTitle] = useState<FormModalProps<T>['title']>()\n const formRef = useRef<FormModalRef>(null)\n\n const showModal = (options?: { initialValues?: RecursivePartial<T>; title?: FormModalProps<T>['title'] }) => {\n setTitle(options?.title ?? restProps.title)\n\n if (options?.initialValues) {\n formRef.current?.setFieldsValue(options?.initialValues)\n }\n\n setOpen(true)\n }\n\n const closeModal = useCallback(() => {\n setOpen(false)\n }, [])\n\n const Modal = useMemo(() => {\n return (\n <FormModal ref={formRef} {...restProps} open={open} closeFn={closeModal} title={title} onConfirm={onConfirm}>\n {content}\n </FormModal>\n )\n }, [title, content, restProps, open, closeModal, onConfirm])\n\n return {\n Modal: createPortal(Modal, document.body),\n showModal,\n closeModal,\n }\n}\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightTextsProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightTextsProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <p dangerouslySetInnerHTML={{ __html: htmlString }}></p>\n}\n\nexport default Highlight\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport jwtDecode from 'jwt-decode'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenState {\n token: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nexport const useTokenStore = create<TokenState>()(\n persist(\n (set, get) => ({\n token: '',\n getUser: () => {\n try {\n return jwtDecode(get().token) as UserInfo\n } catch (_) {\n return null\n }\n },\n setToken: token => set({ token }),\n clearToken: () => {\n set({ token: '' })\n useTokenStore.persist.clearStorage()\n },\n }),\n {\n name: 'token',\n partialize: state => ({ token: state.token }),\n },\n ),\n)\n","import type { QueryListKey } from '@/components/QueryList'\nimport type { PaginationParams } from '@/types'\nimport { create } from 'zustand'\n\ntype RefreshFunction = (arg?: Partial<PaginationParams>) => void\n\nexport interface QueryListState {\n data: Map<\n QueryListKey,\n {\n pagination?: PaginationParams\n refresh?: RefreshFunction\n }\n >\n getPaginationData: (key: QueryListKey) => PaginationParams\n setPaginationData: (key: QueryListKey, pagination?: Partial<PaginationParams>) => void\n refresh: (key: QueryListKey, arg?: Partial<PaginationParams>) => void\n setRefresh: (key: QueryListKey, trigger: RefreshFunction) => void\n}\n\nexport const useQueryListStore = create<QueryListState>((set, get) => ({\n data: new Map(),\n getPaginationData: (key: QueryListKey) => {\n const pagination = get().data.get(key)?.pagination\n return {\n page: pagination?.page ?? 1,\n size: pagination?.size ?? 10,\n }\n },\n setPaginationData: (key: QueryListKey, pagination?: Partial<PaginationParams>) => {\n set({\n data: new Map(get().data).set(key, {\n ...get().data.get(key),\n pagination: {\n page: pagination?.page ?? get().getPaginationData(key).page,\n size: pagination?.size ?? get().getPaginationData(key).size,\n },\n }),\n })\n },\n refresh: (key: QueryListKey, pagination?: Partial<PaginationParams>) => {\n const refresh = get().data.get(key)?.refresh\n\n if (refresh) {\n refresh({\n page: pagination?.page ?? get().getPaginationData(key).page,\n size: pagination?.size ?? get().getPaginationData(key).size,\n })\n }\n },\n setRefresh: (key: QueryListKey, refresh: RefreshFunction) => {\n const data = get().data\n\n set({\n data: new Map(data).set(key, {\n ...data.get(key),\n refresh,\n }),\n })\n },\n}))\n","import { useTokenStore } from '@/stores'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport axios from 'axios'\nimport type { Merge } from 'ts-essentials'\nimport { useReactToolkitsContext } from '@/components' // 覆盖 AxiosInstance 各种请求方法的返回值,为了方便我们在 interceptors.response 里把 AxiosResponse 直接打平成后端返回的数据,去掉了 axios 的封装。\n\n// 覆盖 AxiosInstance 各种请求方法的返回值,为了方便我们在 interceptors.response 里把 AxiosResponse 直接打平成后端返回的数据,去掉了 axios 的封装。\ntype ShimmedAxiosInstance = Merge<\n AxiosInstance,\n {\n request<T = unknown, D = unknown>(config: AxiosRequestConfig<D>): Promise<T>\n get<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n delete<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n head<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n post<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n put<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n patch<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n }\n>\n\nexport class HttpClientError extends Error {\n code?: number\n // 跳过错误提示\n skip: boolean\n\n constructor(message: string, code?: number, skip = false) {\n super(message)\n this.code = code\n this.skip = skip\n }\n}\n\nexport function useHttpClient() {\n const token = useTokenStore(state => state.token)\n const { game, isGlobalNS, isPermissionV2 } = useReactToolkitsContext(state => state)\n\n const defaultOptions: AxiosRequestConfig = {\n withCredentials: true,\n }\n\n const instance = axios.create(defaultOptions) as ShimmedAxiosInstance\n\n instance.interceptors.request.use(config => {\n const headers = config.headers\n headers.set('Authorization', `Bearer ${token}`)\n\n if (isPermissionV2) {\n if (!headers.has('App-ID')) {\n headers.set('App-ID', isGlobalNS ? 'global' : game?.id)\n }\n }\n\n return config\n })\n\n instance.interceptors.response.use(\n response => {\n const contentType = response.headers['content-type']\n if (contentType.includes('application/octet-stream')) {\n return response\n } else {\n if (response.data.code === 0 || response.data.status === 0) {\n return response.data.data\n }\n\n throw new HttpClientError(response.data.msg, 0)\n }\n },\n error => {\n if (error.response) {\n // 请求成功发出且服务器也响应了状态码,但状态码超出了 2xx 的范围\n if (error.response.status === 401) {\n throw new HttpClientError('未登录或登录已过期', error.response.status)\n } else if (error.response.status === 403) {\n throw new HttpClientError('无权限,请联系管理员进行授权', error.response.status)\n } else if ([404, 405].includes(error.response.status)) {\n throw new HttpClientError('Not Found or Method not Allowed', error.response.status, true)\n } else if (error.response.status === 412) {\n throw new HttpClientError('未注册用户', error.response.status)\n } else if (error.response.status === 504) {\n throw new HttpClientError('请求超时', error.response.status)\n } else {\n throw new HttpClientError(error.response.message, error.response.status)\n }\n }\n\n throw new HttpClientError('无响应')\n },\n )\n\n return instance\n}\n","import useSWRImmutable from 'swr/immutable'\nimport { useHttpClient } from './use-http-client'\nimport { useReactToolkitsContext } from '@/components'\n\nexport interface PermissionCheckResult {\n [k: string]: boolean\n}\n\nexport function usePermissions(codes: string[], isGlobalNS = false) {\n const httpClient = useHttpClient()\n const isPermissionV2 = useReactToolkitsContext(state => state.isPermissionV2)\n const url = isPermissionV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check'\n\n const { data, isLoading } = useSWRImmutable(\n codes.length > 0\n ? {\n method: 'POST',\n url,\n data: { permissions: codes },\n headers: isGlobalNS\n ? {\n 'App-ID': 'global',\n }\n : {},\n }\n : null,\n config =>\n httpClient.request<PermissionCheckResult>(config).then(res => {\n if (res.has_all) {\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = true\n return acc\n },\n {} as Record<string, boolean>,\n )\n }\n\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = (res as Record<string, boolean>)[curr]\n return acc\n },\n {} as Record<string, boolean>,\n )\n }),\n {\n suspense: true,\n shouldRetryOnError: false,\n },\n )\n\n return { data, isLoading }\n}\n\nexport function usePermission(code: string) {\n const { data, isLoading } = usePermissions(code ? [code] : [])\n\n if (!code) {\n return {\n accessible: true,\n isValidating: false,\n }\n }\n\n return {\n accessible: data?.[code] ?? false,\n isValidating: isLoading,\n }\n}\n","import { usePermission } from '@/hooks'\nimport type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\n\nexport interface PermissionButtonProps extends Omit<ButtonProps, 'disabled'> {\n code: string\n showLoading?: boolean\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, ...restProps } = props\n const { accessible, isValidating } = usePermission(code)\n\n if (isValidating) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n if (!accessible) {\n return (\n <Tooltip defaultOpen={false} title=\"无权限,请联系管理员进行授权\">\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n }\n\n return <Button {...restProps}>{children}</Button>\n}\n\nexport default PermissionButton\n","import { useHttpClient, usePermission } from '@/hooks'\nimport { useQueryListStore } from '@/stores'\nimport type { ListResponse, PaginationParams } from '@/types'\nimport type { FormInstance, FormProps } from 'antd'\nimport { Form, Result, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport type { AxiosRequestConfig } from 'axios'\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect } from 'react'\nimport useSWRMutation from 'swr/mutation'\nimport FilterForm from '../FilterForm'\nimport type { Merge } from 'ts-essentials'\n\nexport type QueryListKey = Omit<AxiosRequestConfig, 'data' | 'params'>\n\nexport interface QueryListProps<Item, Values, Response>\n extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'>,\n Pick<FormProps<Values>, 'initialValues' | 'labelCol'> {\n // 由于表单的值和分页数据是封装在组件内部的,不便于在组件外部构造 swr key,\n // 所以组件内部的 useSWRMutation hook 使用的 key 是不包含表单值和分页参数的。\n // 因此 swr 并未按照分页缓存数据。\n swrKey: QueryListKey\n confirmText?: ReactNode\n code?: string\n renderForm?: (form: FormInstance<Values>) => ReactNode\n // 把表单的值和分页数据转换成请求参数\n transformArg?: (arg: Merge<Values, PaginationParams>) => unknown\n // 当请求的返回值不满足时进行转换\n transformResponse?: (response: Response) => ListResponse<Item>\n}\n\nconst QueryList = <Item extends object, Values = NonNullable<unknown>, Response = ListResponse<Item>>(\n props: QueryListProps<Item, Values, Response>,\n) => {\n const {\n code,\n confirmText,\n labelCol,\n swrKey,\n initialValues,\n renderForm,\n transformArg,\n transformResponse,\n ...tableProps\n } = props\n const { accessible } = usePermission(code ?? '')\n const [form] = Form.useForm<Values>()\n const setRefresh = useQueryListStore(state => state.setRefresh)\n const getPaginationData = useQueryListStore(state => state.getPaginationData)\n const setPaginationData = useQueryListStore(state => state.setPaginationData)\n const paginationData = getPaginationData(swrKey)\n\n const httpClient = useHttpClient()\n\n const { data, isMutating, trigger } = useSWRMutation(\n swrKey,\n async (key, { arg }: { arg?: Partial<PaginationParams> }) => {\n const newPaginationData = {\n page: arg?.page ?? paginationData.page,\n size: arg?.size ?? paginationData.size,\n }\n\n setPaginationData(swrKey, arg)\n\n const values = form.getFieldsValue()\n\n const _arg = {\n ...values,\n ...newPaginationData,\n }\n\n return httpClient\n .request<Response>({\n ...key,\n [key.method === 'POST' ? 'data' : 'params']: transformArg?.(_arg) ?? _arg,\n })\n .then(response => transformResponse?.(response) ?? (response as ListResponse<Item>))\n },\n )\n\n const onFinish = async () => {\n await trigger({ page: 1 })\n }\n\n const onReset = useCallback(async () => {\n try {\n form.resetFields()\n await form.validateFields()\n await trigger({ page: 1 })\n } catch (_) {\n console.log('表单校验失败')\n }\n }, [form, trigger])\n\n const onPaginationChange = useCallback(\n async (currentPage: number, currentSize: number) => {\n await trigger({\n page: currentPage,\n size: currentSize,\n })\n },\n [trigger],\n )\n\n useEffect(() => {\n setRefresh(swrKey, trigger)\n }, [swrKey, trigger, setRefresh])\n\n useEffect(() => {\n ;(async () => {\n try {\n await form.validateFields()\n await trigger()\n } catch (_) {\n form.resetFields()\n }\n })()\n }, [form, trigger])\n\n if (!accessible) {\n return <Result status={403} subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return (\n <>\n <FilterForm<Values>\n initialValues={initialValues}\n form={form}\n labelCol={labelCol}\n confirmText={confirmText}\n onFinish={onFinish}\n onReset={onReset}\n >\n {renderForm?.(form)}\n </FilterForm>\n <Table\n {...tableProps}\n dataSource={data?.List}\n loading={isMutating}\n pagination={{\n showSizeChanger: true,\n showQuickJumper: true,\n current: paginationData.page,\n pageSize: paginationData.size,\n total: data?.Total,\n onChange: onPaginationChange,\n }}\n />\n </>\n )\n}\n\nexport default QueryList\n","import { create, useStore } from 'zustand'\nimport { createContext, useContext } from 'react'\nimport type { StateStorage } from 'zustand/middleware'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport type { GameType } from '../GameSelect'\nimport type { ItemType2 } from '../NavMenu'\n\n// SessionStorage 在同一域下的不同页面间是隔离的,用于防止多开页面时的数据冲突\nconst mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n localStorage.setItem(name, value)\n sessionStorage.setItem(name, value)\n },\n removeItem: async (name: string) => {\n localStorage.removeItem(name)\n sessionStorage.removeItem(name)\n },\n}\n\nexport interface ReactToolkitsState {\n title: string\n isPermissionV2: boolean\n isGlobalNS: boolean\n game: GameType | null\n setGame: (game: GameType | null) => void\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n menuItems: ItemType2[]\n onlyDomesticGames: boolean\n}\n\nexport type ReactToolkitsStore = ReturnType<typeof createReactToolkitsStore>\n\nexport const createReactToolkitsStore = () => {\n return create<ReactToolkitsState>()(\n persist(\n set => ({\n title: '',\n isPermissionV2: false,\n isGlobalNS: false,\n game: null,\n setGame: game => set({ game }),\n openKeys: [],\n setOpenKeys: keys => set({ openKeys: keys }),\n selectedKeys: [],\n setSelectedKeys: keys => set({ selectedKeys: keys }),\n menuItems: [],\n onlyDomesticGames: false,\n }),\n {\n name: 'ReactToolkits',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({\n title: state.title,\n game: state.game,\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n },\n ),\n )\n}\n\nexport const ReactToolkitsContext = createContext<ReactToolkitsStore | null>(null)\n\nexport function useReactToolkitsContext<T>(\n selector: (state: ReactToolkitsState) => T,\n equalityFn?: (left: T, right: T) => boolean,\n): T {\n const store = useContext(ReactToolkitsContext)\n if (!store) throw new Error('Missing ReactToolkitsContext.Provider in the tree')\n return useStore(store, selector, equalityFn)\n}\n","import type { FC, PropsWithChildren } from 'react'\nimport { useEffect, useRef } from 'react'\nimport type { ReactToolkitsState, ReactToolkitsStore } from './context'\nimport { createReactToolkitsStore, ReactToolkitsContext } from './context'\n\nconst ReactToolkitsProvider: FC<\n PropsWithChildren<\n Partial<Pick<ReactToolkitsState, 'isPermissionV2' | 'isGlobalNS' | 'menuItems' | 'title' | 'onlyDomesticGames'>>\n >\n> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ReactToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createReactToolkitsStore()\n }\n\n useEffect(() => {\n storeRef.current?.setState(restProps)\n }, [restProps])\n\n return <ReactToolkitsContext.Provider value={storeRef.current}>{children}</ReactToolkitsContext.Provider>\n}\n\nexport default ReactToolkitsProvider\n","import { Select, Space, Typography } from 'antd'\nimport { useCallback, useMemo } from 'react'\nimport { useTokenStore } from '@/stores'\nimport useSWRImmutable from 'swr/immutable'\nimport { useReactToolkitsContext } from '@/components'\nimport { useHttpClient } from '@/hooks'\n\nconst { Text } = Typography\n\nexport interface GameType {\n id: string\n name: string\n area: 'cn' | 'global'\n Ctime: string\n}\n\nfunction useGames() {\n const { isPermissionV2, isGlobalNS } = useReactToolkitsContext(state => state)\n const user = useTokenStore(state => state.getUser())\n const httpClient = useHttpClient()\n\n const { data, isLoading } = useSWRImmutable<GameType[]>(\n isPermissionV2 && !isGlobalNS && user ? `/api/usystem/game/all?user=${user.authorityId}` : null,\n url =>\n httpClient.get(url, {\n headers: {\n 'App-ID': 'global',\n },\n }),\n )\n\n return {\n games: data,\n isLoading,\n }\n}\n\nconst GameSelect = () => {\n const { game, setGame, isGlobalNS, isPermissionV2, onlyDomesticGames } = useReactToolkitsContext(state => state)\n const { games, isLoading } = useGames()\n\n const options = useMemo(\n () =>\n (games ?? [])\n .filter(item => !onlyDomesticGames || item.area === 'cn')\n ?.map(item => ({\n label: item.name,\n value: item.id,\n })),\n [games, onlyDomesticGames],\n )\n\n const onGameChange = useCallback(\n async (id: string) => {\n const matchGame = (games ?? []).find(item => item.id === id) ?? null\n setGame(matchGame)\n },\n [games, setGame],\n )\n\n if (!isPermissionV2 || isGlobalNS) {\n return null\n }\n\n return (\n <Space>\n <Text>当前游戏</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={game?.id}\n placeholder=\"请选择游戏\"\n loading={isLoading}\n style={{ width: '200px' }}\n options={options}\n onChange={onGameChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { Dropdown, Space } from 'antd'\nimport Link from 'antd/es/typography/Link'\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport { useTokenStore } from '@/stores'\n\nconst UserWidget: FC = props => {\n const navigate = useNavigate()\n const clearToken = useTokenStore(state => state.clearToken)\n const user = useTokenStore(state => state.getUser())\n\n return (\n <Dropdown\n menu={{\n selectable: true,\n items: [\n {\n key: '1',\n label: (\n <Link\n onClick={() => {\n clearToken()\n navigate('/login')\n }}\n >\n 登出\n </Link>\n ),\n icon: <LogoutOutlined />,\n },\n ],\n }}\n placement=\"bottomRight\"\n >\n <Link>\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </Link>\n </Dropdown>\n )\n}\n\nexport default UserWidget\n","import {usePermissions} from '@/hooks'\nimport {Menu} from 'antd'\nimport type {\n ItemType,\n MenuDividerType,\n MenuItemGroupType,\n MenuItemType,\n SubMenuType,\n} from 'antd/es/menu/hooks/useItems'\nimport type {ReactNode} from 'react'\nimport {useCallback, useEffect, useMemo} from 'react'\nimport {Link, useLocation} from 'react-router-dom'\nimport type {Merge} from 'ts-essentials'\nimport {useReactToolkitsContext} from '@/components'\n\n// 扩展 antd Menu 的类型,使其支持一些我们想要的自定义字段。\ntype MenuItemType2 = Merge<\n MenuItemType,\n {\n code /** 权限编号 **/?: string\n route /** 前端路由地址 **/?: string\n }\n>\n\ntype SubMenuType2 = Merge<\n SubMenuType,\n {\n children?: ItemType2[]\n }\n>\n\ntype MenuItemGroupType2 = Merge<MenuItemGroupType, { children?: ItemType2[] }>\n\nexport type ItemType2 = MenuItemType2 | SubMenuType2 | MenuItemGroupType2 | MenuDividerType | null\n\nconst withLink = (label?: ReactNode, route?: string): ReactNode => {\n if (!label) {\n return <></>\n }\n\n if (route) {\n return <Link to={route}>{label}</Link>\n }\n\n return label\n}\n\nfunction transformItems(items: ItemType2[], permissions?: Record<string, boolean>) {\n const result: ItemType[] = []\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null) {\n result[i] = null\n } else if ((items[i] as MenuDividerType).type === 'divider') {\n result[i] = { ...items[i] } as MenuDividerType\n } else {\n if ((items[i] as SubMenuType2 | MenuItemGroupType2).children) {\n const { children, ...restProps } = items[i] as SubMenuType2 | MenuItemGroupType2\n result[i] = {\n ...restProps,\n children: transformItems(children ?? [], permissions),\n } as SubMenuType | MenuItemGroupType\n } else {\n const { route, label, code, ...restProps } = items[i] as MenuItemType2\n const isPass = !code || !permissions || permissions[code]\n\n result[i] = isPass\n ? ({\n ...restProps,\n label: withLink(label, route),\n } as MenuItemType)\n : null\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nfunction flatItems(\n items: ItemType2[],\n result: Merge<MenuItemType2, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n) {\n for (const item of items) {\n const children = (item as SubMenuType2 | MenuItemGroupType2)!.children as ItemType2[]\n\n if (Array.isArray(children)) {\n const _keys =\n (item as MenuItemGroupType2)!.type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, _keys)\n } else {\n result.push(Object.assign(item as MenuItemType2, { keypath }))\n }\n }\n\n return result\n}\n\nconst NavMenu = () => {\n const location = useLocation()\n const items = useReactToolkitsContext(state => state.menuItems)\n const flattenItems = useMemo(() => flatItems(items ?? []), [items])\n const codes = flattenItems.map(item => item.code).filter(Boolean) as string[]\n const { data: permissions } = usePermissions(codes, true)\n const internalItems = useMemo(() => transformItems(items ?? [], permissions), [items, permissions])\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useReactToolkitsContext(state => state)\n\n const onOpenChange = useCallback(\n (keys: string[]) => {\n const latestOpenKey = keys?.find(key => openKeys?.indexOf(key) === -1)\n const match = flattenItems.find(item => latestOpenKey === item.key)\n setOpenKeys((match?.keypath ?? [latestOpenKey]) as string[])\n },\n [flattenItems, openKeys, setOpenKeys],\n )\n\n useEffect(() => {\n const match = flattenItems.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 setSelectedKeys([key])\n setOpenKeys(keypath)\n }\n }, [flattenItems, location, setOpenKeys, setSelectedKeys])\n\n return (\n <Menu\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={onOpenChange}\n />\n )\n}\n\nexport default NavMenu\n","import * as Antd from 'antd'\nimport { Divider, Space } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport * as React from 'react'\nimport { Suspense } from 'react'\nimport { Link } from 'react-router-dom'\nimport { GameSelect, NavMenu, useReactToolkitsContext, UserWidget } from '@/components'\nimport { SWRConfig } from 'swr'\nimport logo from './logo.png'\nimport RequireGame from '@/components/RequireGame'\n\nconst { Spin, theme } = Antd\nconst { Header, Sider, Content } = Antd.Layout\n\nexport interface LayoutProps extends PropsWithChildren {\n extra?: React.ReactNode[]\n}\n\nconst Layout: FC<LayoutProps> = props => {\n const { children, extra } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { title, game } = useReactToolkitsContext(state => state)\n\n return (\n <Antd.Layout hasSider className=\"h-screen\">\n <Sider\n width={256}\n style={{\n overflow: 'auto',\n height: '100vh',\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n theme=\"light\"\n >\n <div className=\"flex items-end px-6 py-4\">\n <img src={logo} alt=\"logo\" className=\"w-8 h-8\" />\n <Link className=\"font-bold text-lg ml-2\" to=\"/\">\n {title}\n </Link>\n </div>\n <NavMenu />\n </Sider>\n <Antd.Layout className=\"ml-64\">\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: colorBorder,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <div>\n <GameSelect />\n </div>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {extra}\n <UserWidget />\n </Space>\n </div>\n </Header>\n <Content className=\"p-6 bg-gray-50\" style={{ overflow: 'overlay' }}>\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '50vh',\n }}\n />\n }\n >\n <SWRConfig\n value={{\n // GameSelect 组件内的 game 变化时,会触发 children 的重新渲染\n // 为了避免 SWR 使用缓存导致数据不更新,需要设置 revalidateOnMount 为 true\n revalidateOnMount: true,\n }}\n >\n <RequireGame>{React.createElement('div', { key: game?.id }, children)}</RequireGame>\n </SWRConfig>\n </Suspense>\n </Content>\n </Antd.Layout>\n </Antd.Layout>\n )\n}\n\nexport default Layout\n","import { Card, Empty } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useReactToolkitsContext } from '@/components'\n\nconst RequireGame: FC<PropsWithChildren> = props => {\n const { children } = props\n const { game, isPermissionV2, isGlobalNS } = useReactToolkitsContext(state => state)\n\n if (isPermissionV2 && !isGlobalNS && !game) {\n return (\n <Card>\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"请选择游戏\" />\n </Card>\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireGame\n","import { Result, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { usePermission } from '@/hooks'\n\nexport interface PermissionGuardProps {\n code: string\n}\n\nconst PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>> = props => {\n const { code, children } = props\n const { accessible, isValidating } = usePermission(code)\n\n if (isValidating) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status=\"403\" subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return <>{children}</>\n}\n\nexport default PermissionGuard\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/DynamicTags/index.tsx","../../src/components/FilterForm/index.tsx","../../src/components/FormModal/index.tsx","../../src/components/FormModal/hooks.tsx","../../src/components/Highlight/index.tsx","../../src/stores/token.ts","../../src/stores/query-list.ts","../../src/hooks/use-http-client.ts","../../src/hooks/use-permission.ts","../../src/components/PermissionButton/index.tsx","../../src/components/QueryList/index.tsx","../../src/components/ReactToolkitsProvider/context.ts","../../src/components/ReactToolkitsProvider/index.tsx","../../src/components/GameSelect/index.tsx","../../src/components/UserWidget/index.tsx","../../src/components/NavMenu/index.tsx","../../src/components/Layout/index.tsx","../../src/components/RequireGame/index.tsx","../../src/components/PermissionGuard/index.tsx"],"names":["PlusOutlined","Input","Space","Tag","theme","useEffect","useRef","useState","jsx","jsxs","DynamicTags","props","initialTags","addable","removable","addCallback","removeCallback","token","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","_a","handleClose","removedTag","__async","newTags","tag","showInput","handleInputChange","e","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","index","DynamicTags_default","Button","Col","Form","Row","FilterForm","children","confirmText","form","onReset","restProps","__objRest","formStyle","__spreadProps","__spreadValues","FilterForm_default","Modal","forwardRef","useId","useImperativeHandle","InternalFormModal","ref","width","title","open","footer","layout","labelCol","bodyStyle","initialValues","maskClosable","closeFn","afterClose","onConfirm","id","formRef","isRenderProps","confirmLoading","setConfirmLoading","values","FormModal","FormModal_default","useCallback","useMemo","createPortal","useFormModal","content","setOpen","setTitle","showModal","options","_b","closeModal","flushSync","createRoot","splitByTags","str","regex","part","renderToString","node","container","root","resolve","Highlight","texts","htmlString","setHtmlString","result","text","Highlight_default","create","persist","jwtDecode","useTokenStore","set","get","_","state","useQueryListStore","key","_c","pagination","refresh","data","axios","HttpClientError","message","code","skip","useHttpClient","game","isGlobalNS","isPermissionV2","useReactToolkitsContext","defaultOptions","instance","config","headers","response","error","useSWRImmutable","usePermissions","codes","httpClient","url","isLoading","res","acc","curr","usePermission","Tooltip","PermissionButton","showLoading","accessible","isValidating","PermissionButton_default","Result","Table","useSWRMutation","Fragment","QueryList","swrKey","renderForm","transformArg","transformResponse","afterQuerySuccess","tableProps","setRefresh","getPaginationData","setPaginationData","paginationData","actionRef","isMutating","trigger","_0","_1","arg","newPaginationData","_arg","list","onFinish","onPaginationChange","currentPage","currentSize","QueryList_default","useStore","createContext","useContext","createJSONStorage","mixedStorage","name","value","createReactToolkitsStore","keys","ReactToolkitsContext","selector","equalityFn","store","ReactToolkitsProvider","storeRef","ReactToolkitsProvider_default","Select","Typography","Text","useGames","user","GameSelect","setGame","onlyDomesticGames","games","item","onGameChange","matchGame","GameSelect_default","useNavigate","Dropdown","Link","LogoutOutlined","UserOutlined","UserWidget","navigate","clearToken","UserWidget_default","Menu","useLocation","withLink","label","route","transformItems","items","permissions","isPass","flatItems","keypath","_keys","NavMenu","location","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","onOpenChange","latestOpenKey","match","NavMenu_default","Antd","Divider","React","Suspense","SWRConfig","logo","Card","Empty","RequireGame","RequireGame_default","Spin","Header","Sider","Content","Layout","extra","colorBgContainer","colorBorder","Layout_default","PermissionGuard","PermissionGuard_default"],"mappings":"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","sourcesContent":["import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\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 { 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: React.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: React.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 const tagInputStyle: React.CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: React.CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\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 style={tagInputStyle}\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 style={{ userSelect: '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 style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n 添加\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","import type { FormInstance, FormProps } from 'antd'\nimport { Button, Col, Form, Row, Space, theme } from 'antd'\nimport type { PropsWithChildren } from 'react'\nimport * as React from 'react'\n\nexport interface FilterFormProps<Values>\n extends Pick<\n FormProps<Values>,\n | 'initialValues'\n | 'requiredMark'\n | 'onError'\n | 'onChange'\n | 'onValuesChange'\n | 'onFinish'\n | 'onFinishFailed'\n | 'layout'\n | 'labelCol'\n > {\n form?: FormInstance<Values>\n onReset?: () => void\n confirmText?: React.ReactNode\n}\n\nconst FilterForm = <Values = unknown,>(props: PropsWithChildren<FilterFormProps<Values>>) => {\n const { children, confirmText, form, onReset, ...restProps } = props\n const { token } = theme.useToken()\n\n const formStyle = {\n maxWidth: 'none',\n background: token.colorFillAlter,\n borderWidth: token.lineWidth,\n borderStyle: token.lineType,\n borderColor: token.colorBorder,\n borderRadius: token.borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <Form {...restProps} form={form} autoComplete=\"off\">\n {children && (\n <div style={formStyle}>\n <Row gutter={18}>\n {children}\n <Col flex=\"auto\" />\n <Col flex=\"auto\" span={24} style={{ textAlign: 'right' }}>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\">\n {confirmText || '查询'}\n </Button>\n <Button htmlType=\"reset\" onClick={onReset}>\n 重置\n </Button>\n </Space>\n </Col>\n </Row>\n </div>\n )}\n </Form>\n )\n}\n\nexport default FilterForm\n","import type { FormInstance, FormProps, ModalProps } from 'antd'\nimport { Button, Form, Modal } from 'antd'\nimport type { ForwardedRef, ReactElement } from 'react'\nimport { forwardRef, useId, useImperativeHandle, useRef, useState } from 'react'\n\ntype RenderChildren<T> = (props: {\n form: FormInstance<T>\n open?: boolean\n closeFn?: VoidFunction\n}) => JSX.Element | JSX.Element[]\n\ntype ChildrenType<T> = RenderChildren<T> | JSX.Element | JSX.Element[]\n\nexport type RecursivePartial<T> = T extends object\n ? {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P]\n }\n : unknown\n\nexport interface FormModalProps<T>\n extends Pick<ModalProps, 'width' | 'title' | 'open' | 'afterClose' | 'bodyStyle' | 'maskClosable'>,\n Pick<FormProps, 'labelCol' | 'layout' | 'colon'> {\n children?: ChildrenType<T>\n footer?: ModalProps['footer']\n closeFn?: VoidFunction\n initialValues?: RecursivePartial<T>\n onConfirm?: (values: T) => Promise<void>\n}\n\nexport interface FormModalRef<T = object> {\n setFieldsValue: (values: RecursivePartial<T>) => void\n}\n\nconst InternalFormModal = <T extends object>(props: FormModalProps<T>, ref: ForwardedRef<FormModalRef<T>>) => {\n const {\n width,\n children,\n title,\n open,\n footer,\n layout,\n labelCol,\n bodyStyle,\n initialValues,\n maskClosable,\n closeFn,\n afterClose,\n onConfirm,\n } = props\n const id = useId()\n const [form] = Form.useForm<T>()\n const formRef = useRef<FormInstance<T>>(null)\n const isRenderProps = typeof children === 'function'\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n useImperativeHandle(ref, () => {\n return {\n setFieldsValue(values) {\n formRef.current?.setFieldsValue(values)\n },\n }\n })\n\n return (\n <Modal\n destroyOnClose\n bodyStyle={bodyStyle}\n style={{ textAlign: 'start' }}\n width={width}\n open={open}\n title={title}\n forceRender={true}\n getContainer={false}\n maskClosable={maskClosable}\n footer={\n typeof footer === 'object'\n ? footer\n : [\n <Button\n key=\"cancel\"\n onClick={() => {\n closeFn?.()\n }}\n >\n 取消\n </Button>,\n <Button form={id} key=\"submit\" type=\"primary\" htmlType=\"submit\" loading={confirmLoading}>\n 确定\n </Button>,\n ]\n }\n afterClose={() => {\n afterClose?.()\n form.resetFields()\n }}\n onCancel={closeFn}\n >\n <Form\n form={form}\n ref={formRef}\n id={id}\n autoComplete=\"off\"\n labelAlign=\"right\"\n labelWrap={true}\n layout={layout}\n initialValues={initialValues}\n labelCol={\n labelCol || {\n flex: !layout || layout === 'horizontal' ? '120px' : '0',\n }\n }\n onFinish={async values => {\n try {\n setConfirmLoading(true)\n await onConfirm?.(values)\n closeFn?.()\n form.resetFields()\n } finally {\n setConfirmLoading(false)\n }\n }}\n >\n {isRenderProps ? children({ form, open, closeFn }) : children}\n </Form>\n </Modal>\n )\n}\n\nconst FormModal = forwardRef(InternalFormModal) as <T extends object>(\n props: FormModalProps<T> & { ref?: ForwardedRef<FormModalRef<T>> },\n) => ReactElement\n\nexport default FormModal\n","import type { FormModalProps, FormModalRef, RecursivePartial } from './index'\nimport FormModal from './index'\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport type { Merge } from 'ts-essentials'\nimport { createPortal } from 'react-dom'\n\nexport type UseFormModalProps<T> = Merge<\n Omit<FormModalProps<T>, 'open' | 'onCancel' | 'closeFn' | 'children'>,\n {\n content: FormModalProps<T>['children']\n }\n>\n\nexport function useFormModal<T extends object>(props: UseFormModalProps<T>) {\n const { content, onConfirm, ...restProps } = props\n const [open, setOpen] = useState(false)\n const [title, setTitle] = useState<FormModalProps<T>['title']>()\n const formRef = useRef<FormModalRef>(null)\n\n const showModal = (options?: { initialValues?: RecursivePartial<T>; title?: FormModalProps<T>['title'] }) => {\n setTitle(options?.title ?? restProps.title)\n\n if (options?.initialValues) {\n formRef.current?.setFieldsValue(options?.initialValues)\n }\n\n setOpen(true)\n }\n\n const closeModal = useCallback(() => {\n setOpen(false)\n }, [])\n\n const Modal = useMemo(() => {\n return (\n <FormModal ref={formRef} {...restProps} open={open} closeFn={closeModal} title={title} onConfirm={onConfirm}>\n {content}\n </FormModal>\n )\n }, [title, content, restProps, open, closeModal, onConfirm])\n\n return {\n Modal: createPortal(Modal, document.body),\n showModal,\n closeModal,\n }\n}\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightTextsProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightTextsProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <p dangerouslySetInnerHTML={{ __html: htmlString }}></p>\n}\n\nexport default Highlight\n","import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport jwtDecode from 'jwt-decode'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenState {\n token: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nexport const useTokenStore = create<TokenState>()(\n persist(\n (set, get) => ({\n token: '',\n getUser: () => {\n try {\n return jwtDecode(get().token) as UserInfo\n } catch (_) {\n return null\n }\n },\n setToken: token => set({ token }),\n clearToken: () => {\n set({ token: '' })\n useTokenStore.persist.clearStorage()\n },\n }),\n {\n name: 'token',\n partialize: state => ({ token: state.token }),\n },\n ),\n)\n","import type { QueryListKey } from '@/components/QueryList'\nimport type { PaginationParams } from '@/types'\nimport { create } from 'zustand'\n\ntype RefreshFunction = (arg?: Partial<PaginationParams>) => void\n\nexport interface QueryListState {\n data: Map<\n QueryListKey,\n {\n pagination?: PaginationParams\n refresh?: RefreshFunction\n }\n >\n getPaginationData: (key: QueryListKey) => PaginationParams\n setPaginationData: (key: QueryListKey, pagination?: Partial<PaginationParams>) => void\n refresh: (key: QueryListKey, arg?: Partial<PaginationParams>) => void\n setRefresh: (key: QueryListKey, trigger: RefreshFunction) => void\n}\n\nexport const useQueryListStore = create<QueryListState>((set, get) => ({\n data: new Map(),\n getPaginationData: (key: QueryListKey) => {\n const pagination = get().data.get(key)?.pagination\n return {\n page: pagination?.page ?? 1,\n size: pagination?.size ?? 10,\n }\n },\n setPaginationData: (key: QueryListKey, pagination?: Partial<PaginationParams>) => {\n set({\n data: new Map(get().data).set(key, {\n ...get().data.get(key),\n pagination: {\n page: pagination?.page ?? get().getPaginationData(key).page,\n size: pagination?.size ?? get().getPaginationData(key).size,\n },\n }),\n })\n },\n refresh: (key: QueryListKey, pagination?: Partial<PaginationParams>) => {\n const refresh = get().data.get(key)?.refresh\n\n if (refresh) {\n refresh({\n page: pagination?.page ?? get().getPaginationData(key).page,\n size: pagination?.size ?? get().getPaginationData(key).size,\n })\n }\n },\n setRefresh: (key: QueryListKey, refresh: RefreshFunction) => {\n const data = get().data\n\n set({\n data: new Map(data).set(key, {\n ...data.get(key),\n refresh,\n }),\n })\n },\n}))\n","import { useTokenStore } from '@/stores'\nimport type { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport axios from 'axios'\nimport type { Merge } from 'ts-essentials'\nimport { useReactToolkitsContext } from '@/components' // 覆盖 AxiosInstance 各种请求方法的返回值,为了方便我们在 interceptors.response 里把 AxiosResponse 直接打平成后端返回的数据,去掉了 axios 的封装。\n\n// 覆盖 AxiosInstance 各种请求方法的返回值,为了方便我们在 interceptors.response 里把 AxiosResponse 直接打平成后端返回的数据,去掉了 axios 的封装。\ntype ShimmedAxiosInstance = Merge<\n AxiosInstance,\n {\n request<T = unknown, D = unknown>(config: AxiosRequestConfig<D>): Promise<T>\n get<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n delete<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n head<T = unknown, D = unknown>(url: string, config?: AxiosRequestConfig<D>): Promise<T>\n post<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n put<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n patch<T = unknown, D = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig<D>): Promise<T>\n }\n>\n\nexport class HttpClientError extends Error {\n code?: number\n // 跳过错误提示\n skip: boolean\n\n constructor(message: string, code?: number, skip = false) {\n super(message)\n this.code = code\n this.skip = skip\n }\n}\n\nexport function useHttpClient() {\n const token = useTokenStore(state => state.token)\n const { game, isGlobalNS, isPermissionV2 } = useReactToolkitsContext(state => state)\n\n const defaultOptions: AxiosRequestConfig = {\n withCredentials: true,\n }\n\n const instance = axios.create(defaultOptions) as ShimmedAxiosInstance\n\n instance.interceptors.request.use(config => {\n const headers = config.headers\n headers.set('Authorization', `Bearer ${token}`)\n\n if (isPermissionV2) {\n if (!headers.has('App-ID')) {\n headers.set('App-ID', isGlobalNS ? 'global' : game?.id)\n }\n }\n\n return config\n })\n\n instance.interceptors.response.use(\n response => {\n const contentType = response.headers['content-type']\n if (contentType.includes('application/octet-stream')) {\n return response\n } else {\n if (response.data.code === 0 || response.data.status === 0) {\n return response.data.data\n }\n\n throw new HttpClientError(response.data.msg, 0)\n }\n },\n error => {\n if (error.response) {\n // 请求成功发出且服务器也响应了状态码,但状态码超出了 2xx 的范围\n if (error.response.status === 401) {\n throw new HttpClientError('未登录或登录已过期', error.response.status)\n } else if (error.response.status === 403) {\n throw new HttpClientError('无权限,请联系管理员进行授权', error.response.status)\n } else if ([404, 405].includes(error.response.status)) {\n throw new HttpClientError('Not Found or Method not Allowed', error.response.status, true)\n } else if (error.response.status === 412) {\n throw new HttpClientError('未注册用户', error.response.status)\n } else if (error.response.status === 504) {\n throw new HttpClientError('请求超时', error.response.status)\n } else {\n throw new HttpClientError(error.response.message, error.response.status)\n }\n }\n\n throw new HttpClientError('无响应')\n },\n )\n\n return instance\n}\n","import useSWRImmutable from 'swr/immutable'\nimport { useHttpClient } from './use-http-client'\nimport { useReactToolkitsContext } from '@/components'\n\nexport interface PermissionCheckResult {\n [k: string]: boolean\n}\n\nexport function usePermissions(codes: string[], isGlobalNS = false) {\n const httpClient = useHttpClient()\n const isPermissionV2 = useReactToolkitsContext(state => state.isPermissionV2)\n const url = isPermissionV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check'\n\n const { data, isLoading } = useSWRImmutable(\n codes.length > 0\n ? {\n method: 'POST',\n url,\n data: { permissions: codes },\n headers: isGlobalNS\n ? {\n 'App-ID': 'global',\n }\n : {},\n }\n : null,\n config =>\n httpClient.request<PermissionCheckResult>(config).then(res => {\n if (res.has_all) {\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = true\n return acc\n },\n {} as Record<string, boolean>,\n )\n }\n\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = (res as Record<string, boolean>)[curr]\n return acc\n },\n {} as Record<string, boolean>,\n )\n }),\n {\n suspense: true,\n shouldRetryOnError: false,\n },\n )\n\n return { data, isLoading }\n}\n\nexport function usePermission(code: string) {\n const { data, isLoading } = usePermissions(code ? [code] : [])\n\n if (!code) {\n return {\n accessible: true,\n isValidating: false,\n }\n }\n\n return {\n accessible: data?.[code] ?? false,\n isValidating: isLoading,\n }\n}\n","import { usePermission } from '@/hooks'\nimport type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\n\nexport interface PermissionButtonProps extends Omit<ButtonProps, 'disabled'> {\n code: string\n showLoading?: boolean\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, ...restProps } = props\n const { accessible, isValidating } = usePermission(code)\n\n if (isValidating) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n if (!accessible) {\n return (\n <Tooltip defaultOpen={false} title=\"无权限,请联系管理员进行授权\">\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n }\n\n return <Button {...restProps}>{children}</Button>\n}\n\nexport default PermissionButton\n","import { useHttpClient, usePermission } from '@/hooks'\nimport { useQueryListStore } from '@/stores'\nimport type { ListResponse, PaginationParams } from '@/types'\nimport type { FormInstance, FormProps } from 'antd'\nimport { Form, Result, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport type { AxiosRequestConfig } from 'axios'\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useRef } from 'react'\nimport useSWRMutation from 'swr/mutation'\nimport FilterForm from '../FilterForm'\nimport type { Merge } from 'ts-essentials'\n\nexport type QueryListKey = Omit<AxiosRequestConfig, 'data' | 'params'>\n\nexport enum QueryListAction {\n Submit = 'submit',\n Reset = 'reset',\n}\n\nexport interface QueryListProps<Item, Values, Response>\n extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'>,\n Pick<FormProps<Values>, 'initialValues' | 'labelCol'> {\n // 由于表单的值和分页数据是封装在组件内部的,不便于在组件外部构造 swr key,\n // 所以组件内部的 useSWRMutation hook 使用的 key 是不包含表单值和分页参数的。\n // 因此 swr 并未按照分页缓存数据。\n swrKey: QueryListKey\n confirmText?: ReactNode\n code?: string\n renderForm?: (form: FormInstance<Values>) => ReactNode\n // 把表单的值和分页数据转换成请求参数\n transformArg?: (arg: Merge<Values, PaginationParams>) => unknown\n // 当请求的返回值不满足时进行转换\n transformResponse?: (response: Response) => ListResponse<Item>\n afterQuerySuccess?: (response: ListResponse<Item>, action?: QueryListAction) => void\n}\n\nconst QueryList = <Item extends object, Values = NonNullable<unknown>, Response = ListResponse<Item>>(\n props: QueryListProps<Item, Values, Response>,\n) => {\n const {\n code,\n confirmText,\n labelCol,\n swrKey,\n initialValues,\n renderForm,\n transformArg,\n transformResponse,\n afterQuerySuccess,\n ...tableProps\n } = props\n const { accessible } = usePermission(code ?? '')\n const [form] = Form.useForm<Values>()\n const setRefresh = useQueryListStore(state => state.setRefresh)\n const getPaginationData = useQueryListStore(state => state.getPaginationData)\n const setPaginationData = useQueryListStore(state => state.setPaginationData)\n const paginationData = getPaginationData(swrKey)\n const actionRef = useRef<QueryListAction>()\n\n const httpClient = useHttpClient()\n\n const { data, isMutating, trigger } = useSWRMutation(\n swrKey,\n async (key, { arg }: { arg?: Partial<PaginationParams> }) => {\n const newPaginationData = {\n page: arg?.page ?? paginationData.page,\n size: arg?.size ?? paginationData.size,\n }\n\n setPaginationData(swrKey, arg)\n\n const values = form.getFieldsValue()\n\n const _arg = {\n ...values,\n ...newPaginationData,\n }\n\n return httpClient\n .request<Response>({\n ...key,\n [key.method === 'POST' ? 'data' : 'params']: transformArg?.(_arg) ?? _arg,\n })\n .then(response => {\n const list = transformResponse?.(response) ?? (response as ListResponse<Item>)\n afterQuerySuccess?.(list, actionRef.current)\n return list\n })\n .finally(() => {\n actionRef.current = undefined\n })\n },\n )\n\n const onFinish = async () => {\n actionRef.current = QueryListAction.Submit\n await trigger({ page: 1 })\n }\n\n const onReset = useCallback(async () => {\n actionRef.current = QueryListAction.Reset\n try {\n form.resetFields()\n await form.validateFields()\n await trigger({ page: 1 })\n } catch (_) {\n console.log('表单校验失败')\n }\n }, [form, trigger])\n\n const onPaginationChange = useCallback(\n async (currentPage: number, currentSize: number) => {\n await trigger({\n page: currentPage,\n size: currentSize,\n })\n },\n [trigger],\n )\n\n useEffect(() => {\n setRefresh(swrKey, trigger)\n }, [swrKey, trigger, setRefresh])\n\n useEffect(() => {\n ;(async () => {\n try {\n await form.validateFields()\n await trigger()\n } catch (_) {\n form.resetFields()\n }\n })()\n }, [form, trigger])\n\n if (!accessible) {\n return <Result status={403} subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return (\n <>\n <FilterForm<Values>\n initialValues={initialValues}\n form={form}\n labelCol={labelCol}\n confirmText={confirmText}\n onFinish={onFinish}\n onReset={onReset}\n >\n {renderForm?.(form)}\n </FilterForm>\n <Table\n {...tableProps}\n dataSource={data?.List}\n loading={isMutating}\n pagination={{\n showSizeChanger: true,\n showQuickJumper: true,\n current: paginationData.page,\n pageSize: paginationData.size,\n total: data?.Total,\n onChange: onPaginationChange,\n }}\n />\n </>\n )\n}\n\nexport default QueryList\n","import { create, useStore } from 'zustand'\nimport { createContext, useContext } from 'react'\nimport type { StateStorage } from 'zustand/middleware'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport type { GameType } from '../GameSelect'\nimport type { ItemType2 } from '../NavMenu'\n\n// SessionStorage 在同一域下的不同页面间是隔离的,用于防止多开页面时的数据冲突\nconst mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n localStorage.setItem(name, value)\n sessionStorage.setItem(name, value)\n },\n removeItem: async (name: string) => {\n localStorage.removeItem(name)\n sessionStorage.removeItem(name)\n },\n}\n\nexport interface ReactToolkitsState {\n title: string\n isPermissionV2: boolean\n isGlobalNS: boolean\n game: GameType | null\n setGame: (game: GameType | null) => void\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n menuItems: ItemType2[]\n onlyDomesticGames: boolean\n}\n\nexport type ReactToolkitsStore = ReturnType<typeof createReactToolkitsStore>\n\nexport const createReactToolkitsStore = () => {\n return create<ReactToolkitsState>()(\n persist(\n set => ({\n title: '',\n isPermissionV2: false,\n isGlobalNS: false,\n game: null,\n setGame: game => set({ game }),\n openKeys: [],\n setOpenKeys: keys => set({ openKeys: keys }),\n selectedKeys: [],\n setSelectedKeys: keys => set({ selectedKeys: keys }),\n menuItems: [],\n onlyDomesticGames: false,\n }),\n {\n name: 'ReactToolkits',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({\n title: state.title,\n game: state.game,\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n },\n ),\n )\n}\n\nexport const ReactToolkitsContext = createContext<ReactToolkitsStore | null>(null)\n\nexport function useReactToolkitsContext<T>(\n selector: (state: ReactToolkitsState) => T,\n equalityFn?: (left: T, right: T) => boolean,\n): T {\n const store = useContext(ReactToolkitsContext)\n if (!store) throw new Error('Missing ReactToolkitsContext.Provider in the tree')\n return useStore(store, selector, equalityFn)\n}\n","import type { FC, PropsWithChildren } from 'react'\nimport { useEffect, useRef } from 'react'\nimport type { ReactToolkitsState, ReactToolkitsStore } from './context'\nimport { createReactToolkitsStore, ReactToolkitsContext } from './context'\n\nconst ReactToolkitsProvider: FC<\n PropsWithChildren<\n Partial<Pick<ReactToolkitsState, 'isPermissionV2' | 'isGlobalNS' | 'menuItems' | 'title' | 'onlyDomesticGames'>>\n >\n> = props => {\n const { children, ...restProps } = props\n const storeRef = useRef<ReactToolkitsStore>()\n\n if (!storeRef.current) {\n storeRef.current = createReactToolkitsStore()\n }\n\n useEffect(() => {\n storeRef.current?.setState(restProps)\n }, [restProps])\n\n return <ReactToolkitsContext.Provider value={storeRef.current}>{children}</ReactToolkitsContext.Provider>\n}\n\nexport default ReactToolkitsProvider\n","import { Select, Space, Typography } from 'antd'\nimport { useCallback, useMemo } from 'react'\nimport { useTokenStore } from '@/stores'\nimport useSWRImmutable from 'swr/immutable'\nimport { useReactToolkitsContext } from '@/components'\nimport { useHttpClient } from '@/hooks'\n\nconst { Text } = Typography\n\nexport interface GameType {\n id: string\n name: string\n area: 'cn' | 'global'\n Ctime: string\n}\n\nfunction useGames() {\n const { isPermissionV2, isGlobalNS } = useReactToolkitsContext(state => state)\n const user = useTokenStore(state => state.getUser())\n const httpClient = useHttpClient()\n\n const { data, isLoading } = useSWRImmutable<GameType[]>(\n isPermissionV2 && !isGlobalNS && user ? `/api/usystem/game/all?user=${user.authorityId}` : null,\n url =>\n httpClient.get(url, {\n headers: {\n 'App-ID': 'global',\n },\n }),\n )\n\n return {\n games: data,\n isLoading,\n }\n}\n\nconst GameSelect = () => {\n const { game, setGame, isGlobalNS, isPermissionV2, onlyDomesticGames } = useReactToolkitsContext(state => state)\n const { games, isLoading } = useGames()\n\n const options = useMemo(\n () =>\n (games ?? [])\n .filter(item => !onlyDomesticGames || item.area === 'cn')\n ?.map(item => ({\n label: item.name,\n value: item.id,\n })),\n [games, onlyDomesticGames],\n )\n\n const onGameChange = useCallback(\n async (id: string) => {\n const matchGame = (games ?? []).find(item => item.id === id) ?? null\n setGame(matchGame)\n },\n [games, setGame],\n )\n\n if (!isPermissionV2 || isGlobalNS) {\n return null\n }\n\n return (\n <Space>\n <Text>当前游戏</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={game?.id}\n placeholder=\"请选择游戏\"\n loading={isLoading}\n style={{ width: '200px' }}\n options={options}\n onChange={onGameChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { Dropdown, Space } from 'antd'\nimport Link from 'antd/es/typography/Link'\nimport { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport { useTokenStore } from '@/stores'\n\nconst UserWidget: FC = props => {\n const navigate = useNavigate()\n const clearToken = useTokenStore(state => state.clearToken)\n const user = useTokenStore(state => state.getUser())\n\n return (\n <Dropdown\n menu={{\n selectable: true,\n items: [\n {\n key: '1',\n label: (\n <Link\n onClick={() => {\n clearToken()\n navigate('/login')\n }}\n >\n 登出\n </Link>\n ),\n icon: <LogoutOutlined />,\n },\n ],\n }}\n placement=\"bottomRight\"\n >\n <Link>\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </Link>\n </Dropdown>\n )\n}\n\nexport default UserWidget\n","import {usePermissions} from '@/hooks'\nimport {Menu} from 'antd'\nimport type {\n ItemType,\n MenuDividerType,\n MenuItemGroupType,\n MenuItemType,\n SubMenuType,\n} from 'antd/es/menu/hooks/useItems'\nimport type {ReactNode} from 'react'\nimport {useCallback, useEffect, useMemo} from 'react'\nimport {Link, useLocation} from 'react-router-dom'\nimport type {Merge} from 'ts-essentials'\nimport {useReactToolkitsContext} from '@/components'\n\n// 扩展 antd Menu 的类型,使其支持一些我们想要的自定义字段。\ntype MenuItemType2 = Merge<\n MenuItemType,\n {\n code /** 权限编号 **/?: string\n route /** 前端路由地址 **/?: string\n }\n>\n\ntype SubMenuType2 = Merge<\n SubMenuType,\n {\n children?: ItemType2[]\n }\n>\n\ntype MenuItemGroupType2 = Merge<MenuItemGroupType, { children?: ItemType2[] }>\n\nexport type ItemType2 = MenuItemType2 | SubMenuType2 | MenuItemGroupType2 | MenuDividerType | null\n\nconst withLink = (label?: ReactNode, route?: string): ReactNode => {\n if (!label) {\n return <></>\n }\n\n if (route) {\n return <Link to={route}>{label}</Link>\n }\n\n return label\n}\n\nfunction transformItems(items: ItemType2[], permissions?: Record<string, boolean>) {\n const result: ItemType[] = []\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null) {\n result[i] = null\n } else if ((items[i] as MenuDividerType).type === 'divider') {\n result[i] = { ...items[i] } as MenuDividerType\n } else {\n if ((items[i] as SubMenuType2 | MenuItemGroupType2).children) {\n const { children, ...restProps } = items[i] as SubMenuType2 | MenuItemGroupType2\n result[i] = {\n ...restProps,\n children: transformItems(children ?? [], permissions),\n } as SubMenuType | MenuItemGroupType\n } else {\n const { route, label, code, ...restProps } = items[i] as MenuItemType2\n const isPass = !code || !permissions || permissions[code]\n\n result[i] = isPass\n ? ({\n ...restProps,\n label: withLink(label, route),\n } as MenuItemType)\n : null\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nfunction flatItems(\n items: ItemType2[],\n result: Merge<MenuItemType2, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n) {\n for (const item of items) {\n const children = (item as SubMenuType2 | MenuItemGroupType2)!.children as ItemType2[]\n\n if (Array.isArray(children)) {\n const _keys =\n (item as MenuItemGroupType2)!.type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, _keys)\n } else {\n result.push(Object.assign(item as MenuItemType2, { keypath }))\n }\n }\n\n return result\n}\n\nconst NavMenu = () => {\n const location = useLocation()\n const items = useReactToolkitsContext(state => state.menuItems)\n const flattenItems = useMemo(() => flatItems(items ?? []), [items])\n const codes = flattenItems.map(item => item.code).filter(Boolean) as string[]\n const { data: permissions } = usePermissions(codes, true)\n const internalItems = useMemo(() => transformItems(items ?? [], permissions), [items, permissions])\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useReactToolkitsContext(state => state)\n\n const onOpenChange = useCallback(\n (keys: string[]) => {\n const latestOpenKey = keys?.find(key => openKeys?.indexOf(key) === -1)\n const match = flattenItems.find(item => latestOpenKey === item.key)\n setOpenKeys((match?.keypath ?? [latestOpenKey]) as string[])\n },\n [flattenItems, openKeys, setOpenKeys],\n )\n\n useEffect(() => {\n const match = flattenItems.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 setSelectedKeys([key])\n setOpenKeys(keypath)\n }\n }, [flattenItems, location, setOpenKeys, setSelectedKeys])\n\n return (\n <Menu\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={onOpenChange}\n />\n )\n}\n\nexport default NavMenu\n","import * as Antd from 'antd'\nimport { Divider, Space } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport * as React from 'react'\nimport { Suspense } from 'react'\nimport { Link } from 'react-router-dom'\nimport { GameSelect, NavMenu, useReactToolkitsContext, UserWidget } from '@/components'\nimport { SWRConfig } from 'swr'\nimport logo from './logo.png'\nimport RequireGame from '@/components/RequireGame'\n\nconst { Spin, theme } = Antd\nconst { Header, Sider, Content } = Antd.Layout\n\nexport interface LayoutProps extends PropsWithChildren {\n extra?: React.ReactNode[]\n}\n\nconst Layout: FC<LayoutProps> = props => {\n const { children, extra } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { title, game } = useReactToolkitsContext(state => state)\n\n return (\n <Antd.Layout hasSider className=\"h-screen\">\n <Sider\n width={256}\n style={{\n overflow: 'auto',\n height: '100vh',\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n theme=\"light\"\n >\n <div className=\"flex items-end px-6 py-4\">\n <img src={logo} alt=\"logo\" className=\"w-8 h-8\" />\n <Link className=\"font-bold text-lg ml-2\" to=\"/\">\n {title}\n </Link>\n </div>\n <NavMenu />\n </Sider>\n <Antd.Layout className=\"ml-64\">\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: colorBorder,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <div>\n <GameSelect />\n </div>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {extra}\n <UserWidget />\n </Space>\n </div>\n </Header>\n <Content className=\"p-6 bg-gray-50\" style={{ overflow: 'overlay' }}>\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '50vh',\n }}\n />\n }\n >\n <SWRConfig\n value={{\n // GameSelect 组件内的 game 变化时,会触发 children 的重新渲染\n // 为了避免 SWR 使用缓存导致数据不更新,需要设置 revalidateOnMount 为 true\n revalidateOnMount: true,\n }}\n >\n <RequireGame>{React.createElement('div', { key: game?.id }, children)}</RequireGame>\n </SWRConfig>\n </Suspense>\n </Content>\n </Antd.Layout>\n </Antd.Layout>\n )\n}\n\nexport default Layout\n","import { Card, Empty } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useReactToolkitsContext } from '@/components'\n\nconst RequireGame: FC<PropsWithChildren> = props => {\n const { children } = props\n const { game, isPermissionV2, isGlobalNS } = useReactToolkitsContext(state => state)\n\n if (isPermissionV2 && !isGlobalNS && !game) {\n return (\n <Card>\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"请选择游戏\" />\n </Card>\n )\n }\n\n return <>{children}</>\n}\n\nexport default RequireGame\n","import { Result, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { usePermission } from '@/hooks'\n\nexport interface PermissionGuardProps {\n code: string\n}\n\nconst PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>> = props => {\n const { code, children } = props\n const { accessible, isValidating } = usePermission(code)\n\n if (isValidating) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status=\"403\" subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return <>{children}</>\n}\n\nexport default PermissionGuard\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -83,6 +83,10 @@ type PaginationParams = {
|
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
type QueryListKey = Omit<AxiosRequestConfig, 'data' | 'params'>;
|
|
86
|
+
declare enum QueryListAction {
|
|
87
|
+
Submit = "submit",
|
|
88
|
+
Reset = "reset"
|
|
89
|
+
}
|
|
86
90
|
interface QueryListProps<Item, Values, Response> extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'>, Pick<FormProps<Values>, 'initialValues' | 'labelCol'> {
|
|
87
91
|
swrKey: QueryListKey;
|
|
88
92
|
confirmText?: ReactNode;
|
|
@@ -90,6 +94,7 @@ interface QueryListProps<Item, Values, Response> extends Pick<TableProps<Item>,
|
|
|
90
94
|
renderForm?: (form: FormInstance<Values>) => ReactNode;
|
|
91
95
|
transformArg?: (arg: Merge<Values, PaginationParams>) => unknown;
|
|
92
96
|
transformResponse?: (response: Response) => ListResponse<Item>;
|
|
97
|
+
afterQuerySuccess?: (response: ListResponse<Item>, action?: QueryListAction) => void;
|
|
93
98
|
}
|
|
94
99
|
declare const QueryList: <Item extends object, Values = {}, Response_1 = ListResponse<Item>>(props: QueryListProps<Item, Values, Response_1>) => react_jsx_runtime.JSX.Element;
|
|
95
100
|
|
|
@@ -216,4 +221,4 @@ declare const routes: RouteObject;
|
|
|
216
221
|
|
|
217
222
|
declare const SSO_URL = "https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1";
|
|
218
223
|
|
|
219
|
-
export { DynamicTags, DynamicTagsProps, FilterForm, FilterFormProps, FormModal, FormModalProps, FormModalRef, GameSelect, Highlight, HighlightTextsProps, HttpClientError, ItemType2, Layout, LayoutProps, NavMenu, PermissionButton, PermissionButtonProps, PermissionCheckResult, PermissionGuard, PermissionGuardProps, QueryList, QueryListKey, QueryListProps, QueryListState, ReactToolkitsProvider, SSO_URL, TokenState, UseFormModalProps, UserWidget, routes$1 as baseRoutes, routes as permissionRoutes, useFormModal, useHttpClient, usePermission, usePermissions, useQueryListStore, useReactToolkitsContext, useTokenStore };
|
|
224
|
+
export { DynamicTags, DynamicTagsProps, FilterForm, FilterFormProps, FormModal, FormModalProps, FormModalRef, GameSelect, Highlight, HighlightTextsProps, HttpClientError, ItemType2, Layout, LayoutProps, NavMenu, PermissionButton, PermissionButtonProps, PermissionCheckResult, PermissionGuard, PermissionGuardProps, QueryList, QueryListAction, QueryListKey, QueryListProps, QueryListState, ReactToolkitsProvider, SSO_URL, TokenState, UseFormModalProps, UserWidget, routes$1 as baseRoutes, routes as permissionRoutes, useFormModal, useHttpClient, usePermission, usePermissions, useQueryListStore, useReactToolkitsContext, useTokenStore };
|