react-toolkits 0.2.8 → 0.2.9
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
CHANGED
|
@@ -2,23 +2,23 @@ import { PlusOutlined, LogoutOutlined, UserOutlined } from '@ant-design/icons';
|
|
|
2
2
|
import * as U from 'antd';
|
|
3
3
|
import { Form, Button, Modal, theme, Space, Input, Tag, Row, Col, Tooltip, Table, Result, Select, Dropdown, Menu, Divider, Spin, Typography, Card, Empty } from 'antd';
|
|
4
4
|
import * as Oe from 'react';
|
|
5
|
-
import { forwardRef, createContext, useId, useRef, useState, useImperativeHandle, useCallback,
|
|
5
|
+
import { forwardRef, createContext, useMemo, useId, useRef, useState, useImperativeHandle, useCallback, 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 Dt from 'jwt-decode';
|
|
12
|
+
import Gt from 'axios';
|
|
13
|
+
import At from 'swr/immutable';
|
|
14
|
+
import qt from 'swr/mutation';
|
|
15
15
|
import { useNavigate, useLocation, Link } from 'react-router-dom';
|
|
16
16
|
import Ne from 'antd/es/typography/Link';
|
|
17
17
|
import { SWRConfig } from 'swr';
|
|
18
|
-
import
|
|
18
|
+
import Wo from './logo-L6MFCL6M.png';
|
|
19
19
|
|
|
20
|
-
var _e=Object.defineProperty,$e=Object.defineProperties;var Je=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var Te=Object.prototype.hasOwnProperty,Re=Object.prototype.propertyIsEnumerable;var Pe=(t,e,o)=>e in t?_e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,y=(t,e)=>{for(var o in e||(e={}))Te.call(e,o)&&Pe(t,o,e[o]);if(_)for(var o of _(e))Re.call(e,o)&&Pe(t,o,e[o]);return t},R=(t,e)=>$e(t,Je(e));var F=(t,e)=>{var o={};for(var r in t)Te.call(t,r)&&e.indexOf(r)<0&&(o[r]=t[r]);if(t!=null&&_)for(var r of _(t))e.indexOf(r)<0&&Re.call(t,r)&&(o[r]=t[r]);return o};var b=(t,e,o)=>new Promise((r,i)=>{var n=l=>{try{a(o.next(l));}catch(m){i(m);}},s=l=>{try{a(o.throw(l));}catch(m){i(m);}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(n,s);a((o=o.apply(t,e)).next());});var Ye=t=>{let{initialTags:e,addable:o,removable:r,addCallback:i,removeCallback:n}=t,{token:s}=theme.useToken(),[a,l]=useState([]),[m,c]=useState(!1),[p,P]=useState(""),[f,u]=useState(-1),[S,M]=useState(""),G=useRef(null),w=useRef(null);useEffect(()=>{l(e!=null?e:[]);},[e]),useEffect(()=>{var d;m&&((d=G.current)==null||d.focus());},[m]),useEffect(()=>{var d;(d=w.current)==null||d.focus();},[p]);let A=d=>b(void 0,null,function*(){if(yield n==null?void 0:n(d)){let C=a.filter(qe=>qe!==d);l(C);}}),N=()=>{c(!0);},v=d=>{P(d.target.value);},B=()=>b(void 0,null,function*(){p&&a.indexOf(p)===-1&&(yield i==null?void 0:i(p))&&l([...a,p]),c(!1),P("");}),x=d=>{M(d.target.value);},D=()=>{let d=[...a];d[f]=S,l(d),u(-1),P("");},K={width:78,verticalAlign:"top"},X={background:s.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:a.map((d,T)=>f===T?jsx(Input,{ref:w,size:"small",style:K,value:S,onChange:x,onBlur:D,onPressEnter:D},d):jsx(Tag,{closable:r,style:{userSelect:"none"},onClose:C=>b(void 0,null,function*(){C.preventDefault(),yield A(d);}),children:jsx("span",{onDoubleClick:C=>{T!==0&&(u(T),M(d),C.preventDefault());},children:d})},d))}),o&&(m?jsx(Input,{ref:G,type:"text",size:"small",style:K,value:p,onChange:v,onBlur:B,onPressEnter:B}):jsxs(Tag,{style:X,onClick:N,children:[jsx(PlusOutlined,{}),"\xA0\u6DFB\u52A0"]}))]})},Ze=Ye;var st=t=>{let l=t,{children:e,confirmText:o,form:r,onReset:i}=l,n=F(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,R(y({},n),{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:i,children:"\u91CD\u7F6E"})]})})]})})}))},Z=st;var ut=(t,e)=>{let{form:o,width:r,children:i,title:n,open:s,footer:a,layout:l,labelCol:m,bodyStyle:c,initialValues:p,maskClosable:P,closeFn:f,onConfirm:u}=t,[S]=Form.useForm(),M=o!=null?o:S,G=useId(),w=useRef(null),[A,N]=useState(!1),v=typeof a=="object"?a:[jsx(Button,{onClick:()=>{f==null||f();},children:"\u53D6\u6D88"},"cancel"),jsx(Button,{form:G,type:"primary",htmlType:"submit",loading:A,children:"\u786E\u5B9A"},"submit")],B=m||{flex:!l||l==="horizontal"?"120px":"0"},x=D=>b(void 0,null,function*(){try{N(!0),yield u==null?void 0:u(D),f==null||f(),M.resetFields();}finally{N(!1);}});return useImperativeHandle(e,()=>({setFieldsValue(D){var K;(K=w.current)==null||K.setFieldsValue(D);}})),jsx(Modal,{destroyOnClose:!0,bodyStyle:c,style:{textAlign:"start"},width:r,open:s,title:n,forceRender:!0,getContainer:!1,maskClosable:P,footer:v,onCancel:f,children:jsx(Form,{form:M,ref:w,id:G,autoComplete:"off",labelAlign:"right",labelWrap:!0,layout:l,initialValues:p,labelCol:B,onFinish:x,children:i})})},ct=forwardRef(ut),ee=ct;function Pt(t){let f=t,{content:e,onConfirm:o}=f,r=F(f,["content","onConfirm"]),[i,n]=useState(!1),[s,a]=useState(),l=useRef(null),[m]=Form.useForm(),c=u=>{var S,M;a((S=u==null?void 0:u.title)!=null?S:r.title),u!=null&&u.initialValues&&((M=l.current)==null||M.setFieldsValue(u==null?void 0:u.initialValues)),n(!0);},p=useCallback(()=>{n(!1);},[]);return {Modal:useMemo(()=>createPortal(jsx(ee,R(y({},r),{ref:l,form:m,open:i,closeFn:p,title:s,onConfirm:o,children:e})),document.body),[s,e,r,m,i,p,o]),showModal:c,closeModal:p,form:m}}var St=t=>{let e=/(<[^>]*>)/;return t.split(e).filter(o=>o!=="")};function xt(t){let e=document.createElement("div"),o=createRoot(e);return new Promise(r=>{setTimeout(()=>{flushSync(()=>{o.render(t);}),r(e.innerHTML);});})}var Ft=t=>{let{texts:e,children:o}=t,[r,i]=useState("");return useEffect(()=>{xt(o).then(n=>{let s=St(n);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>`);i(s.join(""));});},[o,e]),jsx("p",{dangerouslySetInnerHTML:{__html:r}})},It=Ft;var V=create()(persist((t,e)=>({token:"",getUser:()=>{try{return Lt(e().token)}catch(o){return null}},setToken:o=>t({token:o}),clearToken:()=>{t({token:""}),V.persist.clearStorage();}}),{name:"token",partialize:t=>({token:t.token})}));var J=create((t,e)=>({data:new Map,getPaginationData:o=>{var i,n,s;let r=(i=e().data.get(o))==null?void 0:i.pagination;return {page:(n=r==null?void 0:r.page)!=null?n:1,size:(s=r==null?void 0:r.size)!=null?s:10}},setPaginationData:(o,r)=>{var i,n;t({data:new Map(e().data).set(o,R(y({},e().data.get(o)),{pagination:{page:(i=r==null?void 0:r.page)!=null?i:e().getPaginationData(o).page,size:(n=r==null?void 0:r.size)!=null?n:e().getPaginationData(o).size}}))});},refresh:(o,r)=>{var n,s,a;let i=(n=e().data.get(o))==null?void 0:n.refresh;i&&i({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 i=e().data;t({data:new Map(i).set(o,R(y({},i.get(o)),{refresh:r}))});}}));var L=class extends Error{constructor(o,r,i=!1){super(o);this.code=r,this.skip=i;}};function W(){let t=V(s=>s.token),{game:e,isGlobalNS:o,isPermissionV2:r}=k(s=>s),i={withCredentials:!0},n=Vt.create(i);return n.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}),n.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 L(s.data.msg,0)},s=>{throw s.response?s.response.status===401?new L("\u672A\u767B\u5F55\u6216\u767B\u5F55\u5DF2\u8FC7\u671F",s.response.status):s.response.status===403?new L("\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",s.response.status):[404,405].includes(s.response.status)?new L("Not Found or Method not Allowed",s.response.status,!0):s.response.status===412?new L("\u672A\u6CE8\u518C\u7528\u6237",s.response.status):s.response.status===504?new L("\u8BF7\u6C42\u8D85\u65F6",s.response.status):new L(s.response.message,s.response.status):new L("\u65E0\u54CD\u5E94")}),n}function te(t,e=!1){let o=W(),i=k(a=>a.isPermissionV2)?"/api/usystem/user/checkV2":"/api/usystem/user/check",{data:n,isLoading:s}=Gt(t.length>0?{method:"POST",url:i,data:{permissions:t},headers:e?{"App-ID":"global"}:{}}:null,a=>o.request(a).then(l=>l.has_all?t.reduce((m,c)=>(m[c]=!0,m),{}):t.reduce((m,c)=>(m[c]=l[c],m),{})),{suspense:!0,shouldRetryOnError:!1});return {data:n,isLoading:s}}function z(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 Kt=t=>{let a=t,{children:e,code:o,showLoading:r}=a,i=F(a,["children","code","showLoading"]),{accessible:n,isValidating:s}=z(o);return s?jsx(Button,R(y({loading:r,disabled:!r},i),{children:e})):n?jsx(Button,R(y({},i),{children:e})):jsx(Tooltip,{defaultOpen:!1,title:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",children:jsx(Button,R(y({disabled:!0},i),{children:e}))})},Nt=Kt;var Ge=(o=>(o.Submit="submit",o.Reset="reset",o))(Ge||{}),Ot=t=>{let d=t,{form:e,code:o,confirmText:r,labelCol:i,swrKey:n,initialValues:s,renderForm:a,transformArg:l,transformResponse:m,afterQuerySuccess:c}=d,p=F(d,["form","code","confirmText","labelCol","swrKey","initialValues","renderForm","transformArg","transformResponse","afterQuerySuccess"]),{accessible:P}=z(o!=null?o:""),[f]=Form.useForm(),u=e!=null?e:f,S=J(T=>T.setRefresh),M=J(T=>T.getPaginationData),G=J(T=>T.setPaginationData),w=M(n),A=useRef(),N=W(),{data:v,isMutating:B,trigger:x}=zt(n,(qe,Gn)=>b(void 0,[qe,Gn],function*(T,{arg:C}){var ce,de,fe;let He={page:(ce=C==null?void 0:C.page)!=null?ce:w.page,size:(de=C==null?void 0:C.size)!=null?de:w.size};G(n,C);let Ue=u.getFieldsValue(),ue=y(y({},Ue),He);return N.request(R(y({},T),{[T.method==="POST"?"data":"params"]:(fe=l==null?void 0:l(ue))!=null?fe:ue})).then(ye=>{var he;let ge=(he=m==null?void 0:m(ye))!=null?he:ye;return c==null||c(ge,A.current),ge}).finally(()=>{A.current=void 0;})})),D=()=>b(void 0,null,function*(){A.current="submit",yield x({page:1});}),K=useCallback(()=>b(void 0,null,function*(){try{u.resetFields(),yield u.validateFields(),yield x({page:1});}catch(T){console.log("\u8868\u5355\u6821\u9A8C\u5931\u8D25");}}),[u,x]),X=useCallback((T,C)=>b(void 0,null,function*(){yield x({page:T,size:C});}),[x]);return useEffect(()=>{S(n,x);},[n,x,S]),useEffect(()=>{b(void 0,null,function*(){try{yield u.validateFields(),yield x();}catch(T){u.resetFields();}});},[u,x]),P?jsxs(Fragment,{children:[jsx(Z,{initialValues:s,form:u,labelCol:i,confirmText:r,onFinish:D,onReset:K,children:a==null?void 0:a(u)}),jsx(Table,R(y({},p),{dataSource:v==null?void 0:v.List,loading:B,pagination:{showSizeChanger:!0,showQuickJumper:!0,current:w.page,pageSize:w.size,total:v==null?void 0:v.Total,onChange:X}}))]}):jsx(Result,{status:403,subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},qt=Ot;var Zt={getItem:t=>sessionStorage.getItem(t)||localStorage.getItem(t),setItem:(t,e)=>{localStorage.setItem(t,e),sessionStorage.setItem(t,e);},removeItem:t=>b(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(()=>Zt),partialize:t=>({title:t.title,game:t.game,openKeys:t.openKeys,selectedKeys:t.selectedKeys})})),se=createContext(null);function k(t,e){let o=useContext(se);if(!o)throw new Error("Missing ReactToolkitsContext.Provider in the tree");return useStore(o,t,e)}var oo=t=>{let i=t,{children:e}=i,o=F(i,["children"]),r=useRef();return r.current||(r.current=Ae()),useEffect(()=>{var n;(n=r.current)==null||n.setState(o);},[o]),jsx(se.Provider,{value:r.current,children:e})},ro=oo;var{Text:uo}=Typography;function co(){let{isPermissionV2:t,isGlobalNS:e}=k(s=>s),o=V(s=>s.getUser()),r=W(),{data:i,isLoading:n}=Gt(t&&!e&&o?`/api/usystem/game/all?user=${o.authorityId}`:null,s=>r.get(s,{headers:{"App-ID":"global"}}));return {games:i,isLoading:n}}var fo=()=>{let{game:t,setGame:e,isGlobalNS:o,isPermissionV2:r,onlyDomesticGames:i}=k(m=>m),{games:n,isLoading:s}=co(),a=useMemo(()=>{var m;return (m=(n!=null?n:[]).filter(c=>!i||c.area==="cn"))==null?void 0:m.map(c=>({label:c.name,value:c.id}))},[n,i]),l=useCallback(m=>b(void 0,null,function*(){var p;let c=(p=(n!=null?n:[]).find(P=>P.id===m))!=null?p:null;e(c);}),[n,e]);return !r||o?null:jsxs(Space,{children:[jsx(uo,{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=fo;var bo=t=>{let e=useNavigate(),o=V(i=>i.clearToken),r=V(i=>i.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"}})]})})})},ie=bo;var Mo=(t,e)=>t?e?jsx(Link,{to:e,children:t}):t:jsx(Fragment,{});function Ee(t,e){let o=[];for(let n=0;n<t.length;n++)if(t[n]===null)o[n]=null;else if(t[n].type==="divider")o[n]=y({},t[n]);else if(t[n].children){let r=t[n],{children:s}=r,a=F(r,["children"]);o[n]=R(y({},a),{children:Ee(s!=null?s:[],e)});}else {let i=t[n],{route:s,label:a,code:l}=i,m=F(i,["route","label","code"]),c=!l||!e||e[l];o[n]=c?R(y({},m),{label:Mo(a,s)}):null;}return o}function Qe(t,e=[],o=[]){for(let r of t){let i=r.children;if(Array.isArray(i)){let n=r.type!=="group"&&r.key?[...o,r.key]:o;Qe(i,e,n);}else e.push(Object.assign(r,{keypath:o}));}return e}var wo=()=>{let t=useLocation(),e=k(p=>p.menuItems),o=useMemo(()=>Qe(e!=null?e:[]),[e]),r=o.map(p=>p.code).filter(Boolean),{data:i}=te(r,!0),n=useMemo(()=>Ee(e!=null?e:[],i),[e,i]),{openKeys:s,selectedKeys:a,setOpenKeys:l,setSelectedKeys:m}=k(p=>p),c=useCallback(p=>{var u;let P=p==null?void 0:p.find(S=>(s==null?void 0:s.indexOf(S))===-1),f=o.find(S=>P===S.key);l((u=f==null?void 0:f.keypath)!=null?u:[P]);},[o,s,l]);return useEffect(()=>{let p=o.find(P=>t.pathname===P.route);if(p){let P=p.key,f=p.keypath;m([P]),l(f);}},[o,t,l,m]),jsx(Menu,{style:{borderRight:"none"},items:n,mode:"inline",openKeys:s,selectedKeys:a,onOpenChange:c})},le=wo;var Do=t=>{let{children:e}=t,{game:o,isPermissionV2:r,isGlobalNS:i}=k(n=>n);return r&&!i&&!o?jsx(Card,{children:jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:"\u8BF7\u9009\u62E9\u6E38\u620F"})}):jsx(Fragment,{children:e})},ze=Do;var {Spin:Qo,theme:Wo}=U,{Header:zo,Sider:Oo,Content:qo}=U.Layout,Ho=t=>{let{children:e,extra:o}=t,{token:{colorBgContainer:r,colorBorder:i}}=Wo.useToken(),{title:n,game:s}=k(a=>a);return jsxs(U.Layout,{hasSider:!0,className:"h-screen",children:[jsxs(Oo,{width:256,style:{overflow:"auto",height:"100vh",position:"fixed",left:0,top:0,bottom:0,borderRightWidth:1,borderRightStyle:"solid",borderRightColor:i},theme:"light",children:[jsxs("div",{className:"flex items-end px-6 py-4",children:[jsx("img",{src:Eo,alt:"logo",className:"w-8 h-8"}),jsx(Link,{className:"font-bold text-lg ml-2",to:"/",children:n})]}),jsx(le,{})]}),jsxs(U.Layout,{className:"ml-64",children:[jsx(zo,{style:{padding:"0 24px",background:r,borderBottomWidth:1,borderBottomStyle:"solid",borderBottomColor:i},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(qo,{className:"p-6 bg-gray-50",style:{overflow:"overlay"},children:jsx(Suspense,{fallback:jsx(Qo,{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)})})})})]})]})},Uo=Ho;var Jo=t=>{let{code:e,children:o}=t,{accessible:r,isValidating:i}=z(e);return i?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"})},jo=Jo;
|
|
20
|
+
var _e=Object.defineProperty,$e=Object.defineProperties;var Je=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var Pe=Object.prototype.hasOwnProperty,Te=Object.prototype.propertyIsEnumerable;var he=(t,e,o)=>e in t?_e(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,y=(t,e)=>{for(var o in e||(e={}))Pe.call(e,o)&&he(t,o,e[o]);if(_)for(var o of _(e))Te.call(e,o)&&he(t,o,e[o]);return t},T=(t,e)=>$e(t,Je(e));var F=(t,e)=>{var o={};for(var r in t)Pe.call(t,r)&&e.indexOf(r)<0&&(o[r]=t[r]);if(t!=null&&_)for(var r of _(t))e.indexOf(r)<0&&Te.call(t,r)&&(o[r]=t[r]);return o};var R=(t,e,o)=>new Promise((r,i)=>{var n=l=>{try{a(o.next(l));}catch(m){i(m);}},s=l=>{try{a(o.throw(l));}catch(m){i(m);}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(n,s);a((o=o.apply(t,e)).next());});var Ye=t=>{let{initialTags:e,addable:o,removable:r,addCallback:i,removeCallback:n}=t,{token:s}=theme.useToken(),[a,l]=useState([]),[m,c]=useState(!1),[p,P]=useState(""),[f,u]=useState(-1),[b,M]=useState(""),G=useRef(null),w=useRef(null);useEffect(()=>{l(e!=null?e:[]);},[e]),useEffect(()=>{var d;m&&((d=G.current)==null||d.focus());},[m]),useEffect(()=>{var d;(d=w.current)==null||d.focus();},[p]);let A=d=>R(void 0,null,function*(){if(yield n==null?void 0:n(d)){let C=a.filter(qe=>qe!==d);l(C);}}),N=()=>{c(!0);},v=d=>{P(d.target.value);},B=()=>R(void 0,null,function*(){p&&a.indexOf(p)===-1&&(yield i==null?void 0:i(p))&&l([...a,p]),c(!1),P("");}),S=d=>{M(d.target.value);},D=()=>{let d=[...a];d[f]=b,l(d),u(-1),P("");},K={width:78,verticalAlign:"top"},j={background:s.colorBgContainer,borderStyle:"dashed"};return jsxs(Space,{wrap:!0,size:[0,8],children:[jsx(Space,{wrap:!0,size:[0,8],children:a.map((d,x)=>f===x?jsx(Input,{ref:w,size:"small",style:K,value:b,onChange:S,onBlur:D,onPressEnter:D},d):jsx(Tag,{closable:r,style:{userSelect:"none"},onClose:C=>R(void 0,null,function*(){C.preventDefault(),yield A(d);}),children:jsx("span",{onDoubleClick:C=>{x!==0&&(u(x),M(d),C.preventDefault());},children:d})},d))}),o&&(m?jsx(Input,{ref:G,type:"text",size:"small",style:K,value:p,onChange:v,onBlur:B,onPressEnter:B}):jsxs(Tag,{style:j,onClick:N,children:[jsx(PlusOutlined,{}),"\xA0\u6DFB\u52A0"]}))]})},Ze=Ye;var st=t=>{let l=t,{children:e,confirmText:o,form:r,onReset:i}=l,n=F(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({},n),{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:i,children:"\u91CD\u7F6E"})]})})]})})}))},Y=st;var ct=(t,e)=>{let{form:o,width:r,children:i,title:n,open:s,footer:a,layout:l,labelCol:m,bodyStyle:c,initialValues:p,maskClosable:P,closeFn:f,onConfirm:u}=t,[b]=Form.useForm(),M=useMemo(()=>o!=null?o:b,[b,o]),G=useId(),w=useRef(null),[A,N]=useState(!1),v=typeof a=="object"?a:[jsx(Button,{onClick:()=>{f==null||f();},children:"\u53D6\u6D88"},"cancel"),jsx(Button,{form:G,type:"primary",htmlType:"submit",loading:A,children:"\u786E\u5B9A"},"submit")],B=m||{flex:!l||l==="horizontal"?"120px":"0"},S=D=>R(void 0,null,function*(){try{N(!0),yield u==null?void 0:u(D),f==null||f(),M.resetFields();}finally{N(!1);}});return useImperativeHandle(e,()=>({setFieldsValue(D){var K;(K=w.current)==null||K.setFieldsValue(D);}})),jsx(Modal,{destroyOnClose:!0,bodyStyle:c,style:{textAlign:"start"},width:r,open:s,title:n,forceRender:!0,getContainer:!1,maskClosable:P,footer:v,onCancel:f,children:jsx(Form,{form:M,ref:w,id:G,autoComplete:"off",labelAlign:"right",labelWrap:!0,layout:l,initialValues:p,labelCol:B,onFinish:S,children:i})})},dt=forwardRef(ct),Z=dt;function Tt(t){let f=t,{content:e,onConfirm:o}=f,r=F(f,["content","onConfirm"]),[i,n]=useState(!1),[s,a]=useState(),l=useRef(null),[m]=Form.useForm(),c=u=>{var b,M;a((b=u==null?void 0:u.title)!=null?b:r.title),u!=null&&u.initialValues&&((M=l.current)==null||M.setFieldsValue(u==null?void 0:u.initialValues)),n(!0);},p=useCallback(()=>{n(!1);},[]);return {Modal:useMemo(()=>createPortal(jsx(Z,T(y({},r),{ref:l,form:m,open:i,closeFn:p,title:s,onConfirm:o,children:e})),document.body),[s,e,r,m,i,p,o]),showModal:c,closeModal:p,form:m}}var xt=t=>{let e=/(<[^>]*>)/;return t.split(e).filter(o=>o!=="")};function Ft(t){let e=document.createElement("div"),o=createRoot(e);return new Promise(r=>{setTimeout(()=>{flushSync(()=>{o.render(t);}),r(e.innerHTML);});})}var It=t=>{let{texts:e,children:o}=t,[r,i]=useState("");return useEffect(()=>{Ft(o).then(n=>{let s=xt(n);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>`);i(s.join(""));});},[o,e]),jsx("p",{dangerouslySetInnerHTML:{__html:r}})},Mt=It;var V=create()(persist((t,e)=>({token:"",getUser:()=>{try{return Dt(e().token)}catch(o){return null}},setToken:o=>t({token:o}),clearToken:()=>{t({token:""}),V.persist.clearStorage();}}),{name:"token",partialize:t=>({token:t.token})}));var Le=create((t,e)=>({data:new Map,getPaginationData:o=>{var i,n,s;let r=(i=e().data.get(o))==null?void 0:i.pagination;return {page:(n=r==null?void 0:r.page)!=null?n:1,size:(s=r==null?void 0:r.size)!=null?s:10}},setPaginationData:(o,r)=>{var i,n;t({data:new Map(e().data).set(o,T(y({},e().data.get(o)),{pagination:{page:(i=r==null?void 0:r.page)!=null?i:e().getPaginationData(o).page,size:(n=r==null?void 0:r.size)!=null?n:e().getPaginationData(o).size}}))});},refresh:(o,r)=>{var n,s,a;let i=(n=e().data.get(o))==null?void 0:n.refresh;i&&i({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 i=e().data;t({data:new Map(i).set(o,T(y({},i.get(o)),{refresh:r}))});}}));var L=class extends Error{constructor(o,r,i=!1){super(o);this.code=r,this.skip=i;}};function W(){let t=V(s=>s.token),{game:e,isGlobalNS:o,isPermissionV2:r}=k(s=>s),i={withCredentials:!0},n=Gt.create(i);return n.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}),n.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 L(s.data.msg,0)},s=>{throw s.response?s.response.status===401?new L("\u672A\u767B\u5F55\u6216\u767B\u5F55\u5DF2\u8FC7\u671F",s.response.status):s.response.status===403?new L("\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743",s.response.status):[404,405].includes(s.response.status)?new L("Not Found or Method not Allowed",s.response.status,!0):s.response.status===412?new L("\u672A\u6CE8\u518C\u7528\u6237",s.response.status):s.response.status===504?new L("\u8BF7\u6C42\u8D85\u65F6",s.response.status):new L(s.response.message,s.response.status):new L("\u65E0\u54CD\u5E94")}),n}function ee(t,e=!1){let o=W(),i=k(a=>a.isPermissionV2)?"/api/usystem/user/checkV2":"/api/usystem/user/check",{data:n,isLoading:s}=At(t.length>0?{method:"POST",url:i,data:{permissions:t},headers:e?{"App-ID":"global"}:{}}:null,a=>o.request(a).then(l=>l.has_all?t.reduce((m,c)=>(m[c]=!0,m),{}):t.reduce((m,c)=>(m[c]=l[c],m),{})),{suspense:!0,shouldRetryOnError:!1});return {data:n,isLoading:s}}function z(t){var r;let{data:e,isLoading:o}=ee(t?[t]:[]);return t?{accessible:(r=e==null?void 0:e[t])!=null?r:!1,isValidating:o}:{accessible:!0,isValidating:!1}}var Nt=t=>{let a=t,{children:e,code:o,showLoading:r}=a,i=F(a,["children","code","showLoading"]),{accessible:n,isValidating:s}=z(o);return s?jsx(Button,T(y({loading:r,disabled:!r},i),{children:e})):n?jsx(Button,T(y({},i),{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},i),{children:e}))})},Bt=Nt;var Ge=(o=>(o.Submit="submit",o.Reset="reset",o))(Ge||{}),Ht=t=>{let d=t,{form:e,code:o,confirmText:r,labelCol:i,swrKey:n,initialValues:s,renderForm:a,transformArg:l,transformResponse:m,afterQuerySuccess:c}=d,p=F(d,["form","code","confirmText","labelCol","swrKey","initialValues","renderForm","transformArg","transformResponse","afterQuerySuccess"]),{accessible:P}=z(o!=null?o:""),[f]=Form.useForm(),u=useMemo(()=>e!=null?e:f,[f,e]),{setRefresh:b,getPaginationData:M,setPaginationData:G}=Le(x=>x),w=M(n),A=useRef(),N=W(),{data:v,isMutating:B,trigger:S}=qt(n,(qe,Kn)=>R(void 0,[qe,Kn],function*(x,{arg:C}){var ue,ce,de;let He={page:(ue=C==null?void 0:C.page)!=null?ue:w.page,size:(ce=C==null?void 0:C.size)!=null?ce:w.size};G(n,C);let Ue=u.getFieldsValue(),pe=y(y({},Ue),He);return N.request(T(y({},x),{[x.method==="POST"?"data":"params"]:(de=l==null?void 0:l(pe))!=null?de:pe})).then(fe=>{var ge;let ye=(ge=m==null?void 0:m(fe))!=null?ge:fe;return c==null||c(ye,A.current),ye}).finally(()=>{A.current=void 0;})})),D=()=>R(void 0,null,function*(){A.current="submit",yield S({page:1});}),K=useCallback(()=>R(void 0,null,function*(){try{u.resetFields(),yield u.validateFields(),yield S({page:1});}catch(x){console.log("\u8868\u5355\u6821\u9A8C\u5931\u8D25");}}),[u,S]),j=useCallback((x,C)=>R(void 0,null,function*(){yield S({page:x,size:C});}),[S]);return useEffect(()=>{b(n,S);},[n,S,b]),useEffect(()=>{R(void 0,null,function*(){try{yield u.validateFields(),yield S();}catch(x){u.resetFields();}});},[u,S]),P?jsxs(Fragment,{children:[jsx(Y,{initialValues:s,form:u,labelCol:i,confirmText:r,onFinish:D,onReset:K,children:a==null?void 0:a(u)}),jsx(Table,T(y({},p),{dataSource:v==null?void 0:v.List,loading:B,pagination:{showSizeChanger:!0,showQuickJumper:!0,current:w.page,pageSize:w.size,total:v==null?void 0:v.Total,onChange:j}}))]}):jsx(Result,{status:403,subTitle:"\u65E0\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8FDB\u884C\u6388\u6743"})},Ut=Ht;var to={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);})},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(()=>to),partialize:t=>({title:t.title,game:t.game,openKeys:t.openKeys,selectedKeys:t.selectedKeys})})),re=createContext(null);function k(t,e){let o=useContext(re);if(!o)throw new Error("Missing ReactToolkitsContext.Provider in the tree");return useStore(o,t,e)}var so=t=>{let i=t,{children:e}=i,o=F(i,["children"]),r=useRef();return r.current||(r.current=Ae()),useEffect(()=>{var n;(n=r.current)==null||n.setState(o);},[o]),jsx(re.Provider,{value:r.current,children:e})},no=so;var{Text:fo}=Typography;function yo(){let{isPermissionV2:t,isGlobalNS:e}=k(s=>s),o=V(s=>s.getUser()),r=W(),{data:i,isLoading:n}=At(t&&!e&&o?`/api/usystem/game/all?user=${o.authorityId}`:null,s=>r.get(s,{headers:{"App-ID":"global"}}));return {games:i,isLoading:n}}var go=()=>{let{game:t,setGame:e,isGlobalNS:o,isPermissionV2:r,onlyDomesticGames:i}=k(m=>m),{games:n,isLoading:s}=yo(),a=useMemo(()=>{var m;return (m=(n!=null?n:[]).filter(c=>!i||c.area==="cn"))==null?void 0:m.map(c=>({label:c.name,value:c.id}))},[n,i]),l=useCallback(m=>R(void 0,null,function*(){var p;let c=(p=(n!=null?n:[]).find(P=>P.id===m))!=null?p:null;e(c);}),[n,e]);return !r||o?null:jsxs(Space,{children:[jsx(fo,{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})]})},se=go;var ko=t=>{let e=useNavigate(),o=V(i=>i.clearToken),r=V(i=>i.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"}})]})})})},ne=ko;var vo=(t,e)=>t?e?jsx(Link,{to:e,children:t}):t:jsx(Fragment,{});function Ee(t,e){let o=[];for(let n=0;n<t.length;n++)if(t[n]===null)o[n]=null;else if(t[n].type==="divider")o[n]=y({},t[n]);else if(t[n].children){let r=t[n],{children:s}=r,a=F(r,["children"]);o[n]=T(y({},a),{children:Ee(s!=null?s:[],e)});}else {let i=t[n],{route:s,label:a,code:l}=i,m=F(i,["route","label","code"]),c=!l||!e||e[l];o[n]=c?T(y({},m),{label:vo(a,s)}):null;}return o}function Qe(t,e=[],o=[]){for(let r of t){let i=r.children;if(Array.isArray(i)){let n=r.type!=="group"&&r.key?[...o,r.key]:o;Qe(i,e,n);}else e.push(Object.assign(r,{keypath:o}));}return e}var Lo=()=>{let t=useLocation(),e=k(p=>p.menuItems),o=useMemo(()=>Qe(e!=null?e:[]),[e]),r=o.map(p=>p.code).filter(Boolean),{data:i}=ee(r,!0),n=useMemo(()=>Ee(e!=null?e:[],i),[e,i]),{openKeys:s,selectedKeys:a,setOpenKeys:l,setSelectedKeys:m}=k(p=>p),c=useCallback(p=>{var u;let P=p==null?void 0:p.find(b=>(s==null?void 0:s.indexOf(b))===-1),f=o.find(b=>P===b.key);l((u=f==null?void 0:f.keypath)!=null?u:[P]);},[o,s,l]);return useEffect(()=>{let p=o.find(P=>t.pathname===P.route);if(p){let P=p.key,f=p.keypath;m([P]),l(f);}},[o,t,l,m]),jsx(Menu,{style:{borderRight:"none"},items:n,mode:"inline",openKeys:s,selectedKeys:a,onOpenChange:c})},ae=Lo;var Go=t=>{let{children:e}=t,{game:o,isPermissionV2:r,isGlobalNS:i}=k(n=>n);return r&&!i&&!o?jsx(Card,{children:jsx(Empty,{image:Empty.PRESENTED_IMAGE_SIMPLE,description:"\u8BF7\u9009\u62E9\u6E38\u620F"})}):jsx(Fragment,{children:e})},ze=Go;var {Spin:zo,theme:Oo}=U,{Header:qo,Sider:Ho,Content:Uo}=U.Layout,_o=t=>{let{children:e,extra:o}=t,{token:{colorBgContainer:r,colorBorder:i}}=Oo.useToken(),{title:n,game:s}=k(a=>a);return jsxs(U.Layout,{hasSider:!0,className:"h-screen",children:[jsxs(Ho,{width:256,style:{overflow:"auto",height:"100vh",position:"fixed",left:0,top:0,bottom:0,borderRightWidth:1,borderRightStyle:"solid",borderRightColor:i},theme:"light",children:[jsxs("div",{className:"flex items-end px-6 py-4",children:[jsx("img",{src:Wo,alt:"logo",className:"w-8 h-8"}),jsx(Link,{className:"font-bold text-lg ml-2",to:"/",children:n})]}),jsx(ae,{})]}),jsxs(U.Layout,{className:"ml-64",children:[jsx(qo,{style:{padding:"0 24px",background:r,borderBottomWidth:1,borderBottomStyle:"solid",borderBottomColor:i},children:jsxs("div",{className:"flex justify-between items-center h-full",children:[jsx("div",{children:jsx(se,{})}),jsxs(Space,{size:"small",split:jsx(Divider,{type:"vertical"}),children:[o,jsx(ne,{})]})]})}),jsx(Uo,{className:"p-6 bg-gray-50",style:{overflow:"overlay"},children:jsx(Suspense,{fallback:jsx(zo,{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)})})})})]})]})},$o=_o;var Xo=t=>{let{code:e,children:o}=t,{accessible:r,isValidating:i}=z(e);return i?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"})},Yo=Xo;
|
|
21
21
|
|
|
22
|
-
export { Ze as DynamicTags,
|
|
22
|
+
export { Ze as DynamicTags, Y as FilterForm, Z as FormModal, se as GameSelect, Mt as Highlight, $o as Layout, ae as NavMenu, Bt as PermissionButton, Yo as PermissionGuard, Ut as QueryList, Ge as QueryListAction, no as ReactToolkitsProvider, ne as UserWidget, Tt as useFormModal, k 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","onConfirm","_form","internalForm","id","formRef","confirmLoading","setConfirmLoading","footerProp","labelColProp","onFinish","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","QueryListAction","QueryList","swrKey","renderForm","transformArg","transformResponse","afterQuerySuccess","tableProps","setRefresh","getPaginationData","setPaginationData","paginationData","actionRef","isMutating","trigger","_0","_1","arg","newPaginationData","_arg","list","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","i","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","/* eslint-disable react/jsx-indent */\nimport 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\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 form?: FormInstance<T>\n children?: ReactElement | ReactElement[]\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 form,\n width,\n children,\n title,\n open,\n footer,\n layout,\n labelCol,\n bodyStyle,\n initialValues,\n maskClosable,\n closeFn,\n onConfirm,\n } = props\n const [_form] = Form.useForm<T>()\n const internalForm = form ?? _form\n const id = useId()\n const formRef = useRef<FormInstance<T>>(null)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const footerProp =\n typeof footer === 'object'\n ? footer\n : [\n <Button\n key=\"cancel\"\n onClick={() => {\n closeFn?.()\n }}\n >\n 取消\n </Button>,\n <Button key=\"submit\" form={id} type=\"primary\" htmlType=\"submit\" loading={confirmLoading}>\n 确定\n </Button>,\n ]\n\n const labelColProp = labelCol || {\n flex: !layout || layout === 'horizontal' ? '120px' : '0',\n }\n\n const onFinish = async (values: T) => {\n try {\n setConfirmLoading(true)\n await onConfirm?.(values)\n closeFn?.()\n internalForm.resetFields()\n } finally {\n setConfirmLoading(false)\n }\n }\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={footerProp}\n onCancel={closeFn}\n >\n <Form\n form={internalForm}\n ref={formRef}\n id={id}\n autoComplete=\"off\"\n labelAlign=\"right\"\n labelWrap={true}\n layout={layout}\n initialValues={initialValues}\n labelCol={labelColProp}\n onFinish={onFinish}\n >\n {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'\nimport { Form } from 'antd'\n\nexport type UseFormModalProps<T> = Merge<\n Omit<FormModalProps<T>, 'open' | 'onCancel' | 'closeFn' | 'children' | 'form'>,\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 const [form] = Form.useForm<T>()\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 () =>\n createPortal(\n <FormModal\n {...restProps}\n ref={formRef}\n form={form}\n open={open}\n closeFn={closeModal}\n title={title}\n onConfirm={onConfirm}\n >\n {content}\n </FormModal>,\n document.body,\n ),\n [title, content, restProps, form, open, closeModal, onConfirm],\n )\n\n return {\n Modal,\n showModal,\n closeModal,\n form,\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 form?: FormInstance<Values>\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 form,\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 internalForm = form ?? _form\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 // TODO: 使用 useSWR 重构\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 = internalForm.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 try {\n internalForm.resetFields()\n await internalForm.validateFields()\n await trigger({ page: 1 })\n } catch (_) {\n console.log('表单校验失败')\n }\n }, [internalForm, 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 internalForm.validateFields()\n await trigger()\n } catch (_) {\n internalForm.resetFields()\n }\n })()\n }, [internalForm, trigger])\n\n if (!accessible) {\n return <Result status={403} subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return (\n <>\n <FilterForm<Values>\n initialValues={initialValues}\n form={internalForm}\n labelCol={labelCol}\n confirmText={confirmText}\n onFinish={onFinish}\n onReset={onReset}\n >\n {renderForm?.(internalForm)}\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\n// TODO: 合并嵌套 ReactToolkitsProvider 的配置\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","useMemo","InternalFormModal","ref","width","title","open","footer","layout","labelCol","bodyStyle","initialValues","maskClosable","closeFn","onConfirm","_form","internalForm","id","formRef","confirmLoading","setConfirmLoading","footerProp","labelColProp","onFinish","values","FormModal","FormModal_default","useCallback","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","QueryListAction","QueryList","swrKey","renderForm","transformArg","transformResponse","afterQuerySuccess","tableProps","setRefresh","getPaginationData","setPaginationData","paginationData","actionRef","isMutating","trigger","_0","_1","arg","newPaginationData","_arg","list","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","i","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","/* eslint-disable react/jsx-indent */\nimport type { FormInstance, FormProps, ModalProps } from 'antd'\nimport { Button, Form, Modal } from 'antd'\nimport type { ForwardedRef, ReactElement } from 'react'\nimport { forwardRef, useId, useImperativeHandle, useMemo, useRef, useState } from 'react'\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 form?: FormInstance<T>\n children?: ReactElement | ReactElement[]\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 form,\n width,\n children,\n title,\n open,\n footer,\n layout,\n labelCol,\n bodyStyle,\n initialValues,\n maskClosable,\n closeFn,\n onConfirm,\n } = props\n const [_form] = Form.useForm<T>()\n const internalForm = useMemo(() => form ?? _form, [_form, form])\n const id = useId()\n const formRef = useRef<FormInstance<T>>(null)\n const [confirmLoading, setConfirmLoading] = useState(false)\n const footerProp =\n typeof footer === 'object'\n ? footer\n : [\n <Button\n key=\"cancel\"\n onClick={() => {\n closeFn?.()\n }}\n >\n 取消\n </Button>,\n <Button key=\"submit\" form={id} type=\"primary\" htmlType=\"submit\" loading={confirmLoading}>\n 确定\n </Button>,\n ]\n\n const labelColProp = labelCol || {\n flex: !layout || layout === 'horizontal' ? '120px' : '0',\n }\n\n const onFinish = async (values: T) => {\n try {\n setConfirmLoading(true)\n await onConfirm?.(values)\n closeFn?.()\n internalForm.resetFields()\n } finally {\n setConfirmLoading(false)\n }\n }\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={footerProp}\n onCancel={closeFn}\n >\n <Form\n form={internalForm}\n ref={formRef}\n id={id}\n autoComplete=\"off\"\n labelAlign=\"right\"\n labelWrap={true}\n layout={layout}\n initialValues={initialValues}\n labelCol={labelColProp}\n onFinish={onFinish}\n >\n {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'\nimport { Form } from 'antd'\n\nexport type UseFormModalProps<T> = Merge<\n Omit<FormModalProps<T>, 'open' | 'onCancel' | 'closeFn' | 'children' | 'form'>,\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 const [form] = Form.useForm<T>()\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 () =>\n createPortal(\n <FormModal\n {...restProps}\n ref={formRef}\n form={form}\n open={open}\n closeFn={closeModal}\n title={title}\n onConfirm={onConfirm}\n >\n {content}\n </FormModal>,\n document.body,\n ),\n [title, content, restProps, form, open, closeModal, onConfirm],\n )\n\n return {\n Modal,\n showModal,\n closeModal,\n form,\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, useMemo, 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 form?: FormInstance<Values>\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 form,\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 internalForm = useMemo(() => form ?? _form, [_form, form])\n const { setRefresh, getPaginationData, setPaginationData } = useQueryListStore(state => state)\n const paginationData = getPaginationData(swrKey)\n const actionRef = useRef<QueryListAction>()\n\n const httpClient = useHttpClient()\n\n // TODO: 使用 useSWR 重构\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 = internalForm.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 try {\n internalForm.resetFields()\n await internalForm.validateFields()\n await trigger({ page: 1 })\n } catch (_) {\n console.log('表单校验失败')\n }\n }, [internalForm, 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 internalForm.validateFields()\n await trigger()\n } catch (_) {\n internalForm.resetFields()\n }\n })()\n }, [internalForm, trigger])\n\n if (!accessible) {\n return <Result status={403} subTitle=\"无权限,请联系管理员进行授权\" />\n }\n\n return (\n <>\n <FilterForm<Values>\n initialValues={initialValues}\n form={internalForm}\n labelCol={labelCol}\n confirmText={confirmText}\n onFinish={onFinish}\n onReset={onReset}\n >\n {renderForm?.(internalForm)}\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\n// TODO: 合并嵌套 ReactToolkitsProvider 的配置\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"]}
|