@topthink/common 1.6.10 → 1.6.11

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/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMenu as n,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useMatches as s,useRoutes as a,useLocation as l,Outlet as d,Link as h,useNavigate as u,Navigate as g,useParams as m,createBrowserRouter as p,RouterProvider as f}from"react-router-dom";export{Link,Navigate,Outlet,useLoaderData,useLocation,useMatches,useNavigate,useOutlet,useParams,useRevalidator,useRouteError,useRouteLoaderData,useRoutes,useSearchParams}from"react-router-dom";import*as v from"react";import x,{createContext as b,useState as w,useContext as y,useMemo as _,memo as k,useRef as N,useEffect as z,useCallback as L,Fragment as A}from"react";import{useAsyncCallback as R,isRequestError as I,useAsync as M,Result as S,Loader as $,styled as E,createGlobalStyle as C,useWindowSize as q,Offcanvas as P,css as T,Button as U,useRequest as j,isRecord as O,Card as B,request as F,ToastProvider as H,Modal as V,getAbsoluteUrl as D,useAsyncEffect as W}from"@topthink/components";export*from"@topthink/components";import{intersection as K}from"lodash";import{Nav as G,Dropdown as J,Container as Q,Row as X,Col as Y}from"react-bootstrap";import Z from"classnames";import ee from"query-string";import*as ce from"path";var te;function re(){return re=Object.assign?Object.assign.bind():function(e){for(var c=1;c<arguments.length;c++){var t=arguments[c];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},re.apply(null,arguments)}const ne=e=>v.createElement("svg",re({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},e),te||(te=v.createElement("g",{fill:"#888"},v.createElement("path",{d:"m8 3 1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z"}),v.createElement("path",{d:"M11 11H5V5h2V3H3v10h10V9h-2z"})))),ie=(c,t,r="/")=>{const n=[],i=c.user||void 0;for(const o of t){let{meta:t={},path:s="",children:a=[]}=o;if(t.hideInMenu)continue;if(t.access){let e=t.access,r=!1;if("function"==typeof e?r=e(c):"number"==typeof e?r=Number(i?.access_level||0)>=e:(Array.isArray(e)||(e=[e]),r=K(i?.roles||[],e).length>0),!r)continue}const l=t.title;if(!l)continue;let d=!1;t.href?(d=!0,s=t.href):s=`${r}/${s}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const h={title:l,icon:"string"==typeof t.icon?e("i",{className:`bi bi-${t.icon}`}):t.icon,path:s,isExternal:d,children:[]};!t.hideChildrenInMenu&&!d&&a.length>0&&(h.children=ie(c,a,s)),n.push(h)}return n};const oe=b(null);function se({appResolver:c,userResolver:t,onResolved:r,children:n}){const[i,o]=w(),{execute:s}=R(async()=>{if(t)return t()},{onError(e){I(e)&&401===e.response?.status&&o(e=>({...e,user:null}))},onSuccess(e){e&&(r(e),o(c=>({...c,user:e})))}}),{error:a}=M(async()=>{if(c)return c();await s()},[],{onSuccess(e={}){o(e),e.user&&r(e.user)}});return a?e(S,{status:"error",title:a.message}):i?e(oe.Provider,{value:[i,o,s],children:n}):e($,{})}function ae(){const e=y(oe);if(!e)throw new Error("useApp must be used within a AppProvider");return e}function le(){const[e]=ae();return e}function de(e){const{matches:c}=y(o),t=le(),r=c[c.length-1],n=r.pathnameBase||"/",i=e||r.route.children||[],s=_(()=>function(e,c,t="/"){return ie(e,c,t)}(t,i,n),[t,i,n]);return[s,_(()=>c.reduceRight((e,c)=>e||c.route.handle?.title,void 0),[c])]}function he(e,c){return e.map(e=>{e.children&&(e.children=he(e.children,e.meta?.hideChildrenInMenu)),e.handle=e.handle||{};const t=e.meta?.title;void 0!==t&&(e.handle.title=t),void 0!==(c=e.meta?.hideInMenu||c&&!e.index)&&(e.handle.hideInMenu=c);const r=e.meta?.hideMenu;void 0!==r&&(e.handle.hideMenu=r);const n=e.meta?.access;return void 0!==n&&(e.handle.access=n),e})}const ue=b(void 0),ge=()=>y(ue);function me(){const c=ge();return e(pe,{onClick:()=>c?.setShow(!0),children:e("i",{className:"bi bi-list"})})}const pe=E.div`
1
+ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMenu as n,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useMatches as s,useRoutes as a,useLocation as l,Outlet as d,Link as h,useNavigate as u,Navigate as g,useParams as m,RouterProvider as p,createBrowserRouter as f,createHashRouter as v,createMemoryRouter as x}from"react-router-dom";export{Link,Navigate,Outlet,useLoaderData,useLocation,useMatches,useNavigate,useOutlet,useParams,useRevalidator,useRouteError,useRouteLoaderData,useRoutes,useSearchParams}from"react-router-dom";import*as b from"react";import w,{createContext as y,useState as _,useContext as k,useMemo as N,memo as z,useRef as L,useEffect as A,useCallback as R,Fragment as I}from"react";import{useAsyncCallback as M,isRequestError as S,useAsync as $,Result as E,Loader as C,styled as q,createGlobalStyle as P,useWindowSize as T,Offcanvas as U,css as j,Button as O,useRequest as B,isRecord as F,Card as H,request as V,ToastProvider as D,Modal as W,getAbsoluteUrl as K,useAsyncEffect as G}from"@topthink/components";export*from"@topthink/components";import{intersection as J}from"lodash";import{Nav as Q,Dropdown as X,Container as Y,Row as Z,Col as ee}from"react-bootstrap";import ce from"classnames";import te from"query-string";import*as re from"path";var ne;function ie(){return ie=Object.assign?Object.assign.bind():function(e){for(var c=1;c<arguments.length;c++){var t=arguments[c];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},ie.apply(null,arguments)}const oe=e=>b.createElement("svg",ie({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},e),ne||(ne=b.createElement("g",{fill:"#888"},b.createElement("path",{d:"m8 3 1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z"}),b.createElement("path",{d:"M11 11H5V5h2V3H3v10h10V9h-2z"})))),se=(c,t,r="/")=>{const n=[],i=c.user||void 0;for(const o of t){let{meta:t={},path:s="",children:a=[]}=o;if(t.hideInMenu)continue;if(t.access){let e=t.access,r=!1;if("function"==typeof e?r=e(c):"number"==typeof e?r=Number(i?.access_level||0)>=e:(Array.isArray(e)||(e=[e]),r=J(i?.roles||[],e).length>0),!r)continue}const l=t.title;if(!l)continue;let d=!1;t.href?(d=!0,s=t.href):s=`${r}/${s}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const h={title:l,icon:"string"==typeof t.icon?e("i",{className:`bi bi-${t.icon}`}):t.icon,path:s,isExternal:d,children:[]};!t.hideChildrenInMenu&&!d&&a.length>0&&(h.children=se(c,a,s)),n.push(h)}return n};const ae=y(null);function le({appResolver:c,userResolver:t,onResolved:r,children:n}){const[i,o]=_(),{execute:s}=M(async()=>{if(t)return t()},{onError(e){S(e)&&401===e.response?.status&&o(e=>({...e,user:null}))},onSuccess(e){e&&(r(e),o(c=>({...c,user:e})))}}),{error:a}=$(async()=>{if(c)return c();await s()},[],{onSuccess(e={}){o(e),e.user&&r(e.user)}});return a?e(E,{status:"error",title:a.message}):i?e(ae.Provider,{value:[i,o,s],children:n}):e(C,{})}function de(){const e=k(ae);if(!e)throw new Error("useApp must be used within a AppProvider");return e}function he(){const[e]=de();return e}function ue(e){const{matches:c}=k(o),t=he(),r=c[c.length-1],n=r.pathnameBase||"/",i=e||r.route.children||[],s=N(()=>function(e,c,t="/"){return se(e,c,t)}(t,i,n),[t,i,n]);return[s,N(()=>c.reduceRight((e,c)=>e||c.route.handle?.title,void 0),[c])]}function ge(e,c){return e.map(e=>{e.children&&(e.children=ge(e.children,e.meta?.hideChildrenInMenu)),e.handle=e.handle||{};const t=e.meta?.title;void 0!==t&&(e.handle.title=t),void 0!==(c=e.meta?.hideInMenu||c&&!e.index)&&(e.handle.hideInMenu=c);const r=e.meta?.hideMenu;void 0!==r&&(e.handle.hideMenu=r);const n=e.meta?.access;return void 0!==n&&(e.handle.access=n),e})}const me=y(void 0),pe=()=>k(me);function fe(){const c=pe();return e(ve,{onClick:()=>c?.setShow(!0),children:e("i",{className:"bi bi-list"})})}const ve=q.div`
2
2
  width: 40px;
3
3
  height: 40px;
4
4
  display: flex;
@@ -6,7 +6,7 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
6
6
  align-items: center;
7
7
  justify-content: center;
8
8
  cursor: pointer;
9
- `;const fe=t=>t.map(t=>{const r=c(Ie,{children:[t.icon,t.title,t.isExternal&&e(ne,{})]});return t.children.length>0?e(n,{title:r,children:fe(t.children)},t.path):e(i,{children:t.isExternal?e("a",{href:t.path,target:"_blank",children:r}):e(h,{to:t.path,children:r})},t.path)}),ve=()=>({height:0}),xe=e=>({height:e.scrollHeight}),be={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:ve,onAppearActive:xe,onEnterStart:ve,onEnterActive:xe,onLeaveStart:xe,onLeaveActive:ve};function we({className:t,title:r,header:n,headerAs:i,footer:o,footerAs:a,top:h=54,routes:u}){const{isMobile:g}=q(),[m,p]=de(u),[f,v]=w(!1),{pathname:x,key:b}=l(),y=N(null),{hideMenu:k=!1}=s().reduce((e,c)=>({...e,...c.handle}),{}),A=_(()=>{const e=[];return x.split("/").reduce((c,t)=>(c.length>1&&e.push(c.join("/")),[...c,t]),[]),e.push(x),e},[x]),[R,I]=w([]);z(()=>{v(!1)},[b]),z(()=>{I(A.slice(0,-1))},[A]);const M=L(e=>{const c=e[e.length-1];I(e.filter(e=>c.startsWith(e)))},[R,I]),S=u?e(ye,{routes:u}):e(d,{});if(k)return S;n||(n=e(ke,{children:r||p}));const $=a||ze,E=c(_e,{className:t,children:[e(i||Ne,{children:n}),e(Me,{mode:"inline",motion:be,openKeys:R,onOpenChange:M,selectedKeys:A,children:fe(m)}),e($,{children:o})]}),C=g?e(me,{}):null;return c(ue.Provider,{value:{show:f,setShow:v,toggle:C,headless:0==h},children:[e($e,{$top:h}),c(Se,{children:[e(Ae,{ref:y,children:g?e(P,{container:y,show:f,onHide:()=>{v(!1)},placement:"start",style:{width:"231px"},children:E}):E}),e(Le,{children:e(Re,{children:S})})]})]})}const ye=k(function({routes:e}){return a(_(()=>he(e),[e]))}),_e=E.nav`
9
+ `;const xe=t=>t.map(t=>{const r=c(Se,{children:[t.icon,t.title,t.isExternal&&e(oe,{})]});return t.children.length>0?e(n,{title:r,children:xe(t.children)},t.path):e(i,{children:t.isExternal?e("a",{href:t.path,target:"_blank",children:r}):e(h,{to:t.path,children:r})},t.path)}),be=()=>({height:0}),we=e=>({height:e.scrollHeight}),ye={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:be,onAppearActive:we,onEnterStart:be,onEnterActive:we,onLeaveStart:we,onLeaveActive:be};function _e({className:t,title:r,header:n,headerAs:i,footer:o,footerAs:a,top:h=54,routes:u}){const{isMobile:g}=T(),[m,p]=ue(u),[f,v]=_(!1),{pathname:x,key:b}=l(),w=L(null),{hideMenu:y=!1}=s().reduce((e,c)=>({...e,...c.handle}),{}),k=N(()=>{const e=[];return x.split("/").reduce((c,t)=>(c.length>1&&e.push(c.join("/")),[...c,t]),[]),e.push(x),e},[x]),[z,I]=_([]);A(()=>{v(!1)},[b]),A(()=>{I(k.slice(0,-1))},[k]);const M=R(e=>{const c=e[e.length-1];I(e.filter(e=>c.startsWith(e)))},[z,I]),S=u?e(ke,{routes:u}):e(d,{});if(y)return S;n||(n=e(ze,{children:r||p}));const $=a||Ae,E=c(Ne,{className:t,children:[e(i||Le,{children:n}),e($e,{mode:"inline",motion:ye,openKeys:z,onOpenChange:M,selectedKeys:k,children:xe(m)}),e($,{children:o})]}),C=g?e(fe,{}):null;return c(me.Provider,{value:{show:f,setShow:v,toggle:C,headless:0==h},children:[e(Ce,{$top:h}),c(Ee,{children:[e(Ie,{ref:w,children:g?e(U,{container:w,show:f,onHide:()=>{v(!1)},placement:"start",style:{width:"231px"},children:E}):E}),e(Re,{children:e(Me,{children:S})})]})]})}const ke=z(function({routes:e}){return a(N(()=>ge(e),[e]))}),Ne=q.nav`
10
10
  position: fixed;
11
11
  top: var(--bs-header-height, 0);
12
12
  bottom: 0;
@@ -18,12 +18,12 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
18
18
  background-color: #f5f5f5;
19
19
  display: flex;
20
20
  flex-direction: column;
21
- `,ke=E.div`
21
+ `,ze=q.div`
22
22
  text-overflow: ellipsis;
23
23
  white-space: nowrap;
24
24
  overflow: hidden;
25
25
  font-size: 16px;
26
- `,Ne=E.div`
26
+ `,Le=q.div`
27
27
  height: 65px;
28
28
  display: flex;
29
29
  align-items: center;
@@ -31,15 +31,15 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
31
31
  border-bottom: 1px solid #e3e3e3;
32
32
  flex-grow: 0;
33
33
  flex-shrink: 0;
34
- `,ze=E.div`
34
+ `,Ae=q.div`
35
35
  flex-grow: 0;
36
36
  flex-shrink: 0;
37
- `,Le=E.div`
37
+ `,Re=q.div`
38
38
  flex: 1;
39
39
  @media (min-width: 992px) {
40
40
  margin-left: 230px;
41
41
  }
42
- `,Ae=E.div`
42
+ `,Ie=q.div`
43
43
  .offcanvas-backdrop {
44
44
  top: var(--bs-header-height, 0);
45
45
  }
@@ -47,15 +47,15 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
47
47
  .offcanvas-start {
48
48
  top: var(--bs-header-height, 0);
49
49
 
50
- ${_e} {
50
+ ${Ne} {
51
51
  position: absolute;
52
52
  top: 0;
53
53
  }
54
54
  }
55
- `,Re=E.main`
55
+ `,Me=q.main`
56
56
  min-height: calc(var(--100vh, 100vh) - var(--bs-header-height));
57
57
  position: relative;
58
- `,Ie=E.div`
58
+ `,Se=q.div`
59
59
  display: inline-flex;
60
60
  align-items: center;
61
61
  gap: 0.5rem;
@@ -66,7 +66,7 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
66
66
  min-width: 19px;
67
67
  text-align: center;
68
68
  }
69
- `,Me=E(r)`
69
+ `,$e=q(r)`
70
70
  border: none;
71
71
  box-shadow: none;
72
72
  padding: 10px 0;
@@ -205,28 +205,28 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
205
205
  }
206
206
  }
207
207
 
208
- `,Se=E.div`
208
+ `,Ee=q.div`
209
209
  display: flex;
210
210
  flex-wrap: nowrap;
211
211
  width: 100%;
212
212
 
213
213
  &:has(&) {
214
- > ${_e} {
214
+ > ${Ne} {
215
215
  display: none;
216
216
  }
217
217
 
218
- > ${Le} {
218
+ > ${Re} {
219
219
  margin-left: 0;
220
220
  }
221
221
  }
222
- `,$e=C`
222
+ `,Ce=P`
223
223
  :root {
224
224
  --bs-header-height: ${e=>e.$top}px;
225
225
  }
226
- `;function Ee({title:t,header:r,nav:n,children:i,extra:s,showBack:a,className:d,bodyAs:h,fixed:g=!0}){const{matches:m}=y(o),p=_(()=>m.reduceRight((e,c)=>e||c.route.index?e:c.route,void 0),[m]),f=ge(),v=Number.isFinite(g)?Number(g):!f||f.headless?0:54;g=!!Number.isFinite(g)||Boolean(g);const x=!0===p?.handle?.hideInMenu,b=p?.handle?.title,w=u(),k=l();return void 0===a&&(a=x),void 0===r&&(r=e(Ue,{className:"fs-4 text-truncate",children:t||b})),c(qe,{className:d,children:[e(Pe,{$fixed:g,$top:v,children:c("div",{className:"container",children:[f?.toggle,a&&("default"!==k.key||"string"==typeof a)&&e(Ce,{onClick:()=>w("string"==typeof a?a:-1),children:e("i",{className:"bi bi-arrow-left-short"})}),r,n,e(je,{children:s})]})}),e(Te,{className:"container",as:h,children:i})]})}const Ce=E.div`
226
+ `;function qe({title:t,header:r,nav:n,children:i,extra:s,showBack:a,className:d,bodyAs:h,fixed:g=!0}){const{matches:m}=k(o),p=N(()=>m.reduceRight((e,c)=>e||c.route.index?e:c.route,void 0),[m]),f=pe(),v=Number.isFinite(g)?Number(g):!f||f.headless?0:54;g=!!Number.isFinite(g)||Boolean(g);const x=!0===p?.handle?.hideInMenu,b=p?.handle?.title,w=u(),y=l();return void 0===a&&(a=x),void 0===r&&(r=e(Oe,{className:"fs-4 text-truncate",children:t||b})),c(Te,{className:d,children:[e(Ue,{$fixed:g,$top:v,children:c("div",{className:"container",children:[f?.toggle,a&&("default"!==y.key||"string"==typeof a)&&e(Pe,{onClick:()=>w("string"==typeof a?a:-1),children:e("i",{className:"bi bi-arrow-left-short"})}),r,n,e(Be,{children:s})]})}),e(je,{className:"container",as:h,children:i})]})}const Pe=q.div`
227
227
  font-size: 32px;
228
228
  cursor: pointer;
229
- `,qe=E.div`
229
+ `,Te=q.div`
230
230
  width: 100%;
231
231
  container-type: inline-size;
232
232
 
@@ -241,14 +241,14 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
241
241
  max-width: 100cqw;
242
242
  }
243
243
  }
244
- `,Pe=E.div`
244
+ `,Ue=q.div`
245
245
  background-color: #fff;
246
246
  display: flex;
247
247
  border-bottom: 1px solid rgb(227, 227, 227);
248
248
  align-items: center;
249
249
  height: 65px;
250
250
 
251
- ${e=>e.$fixed&&T`
251
+ ${e=>e.$fixed&&j`
252
252
  position: sticky;
253
253
  top: ${e.$top}px;
254
254
  z-index: 1000;
@@ -260,7 +260,7 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
260
260
  align-items: center;
261
261
  gap: .5rem;
262
262
  }
263
- `,Te=E.div`
263
+ `,je=q.div`
264
264
  margin-top: 24px;
265
265
  margin-bottom: 24px;
266
266
 
@@ -268,18 +268,18 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
268
268
  margin-top: 1rem;
269
269
  margin-bottom: 1rem;
270
270
  }
271
- `,Ue=E.div`
271
+ `,Oe=q.div`
272
272
  overflow: hidden;
273
273
  text-overflow: ellipsis;
274
274
  white-space: nowrap;
275
275
  min-width: 50px;
276
276
  flex-shrink: 0;
277
- `,je=E.div`
277
+ `,Be=q.div`
278
278
  margin-left: auto;
279
- `;function Oe({title:t,header:r,showBack:n,extra:i}){const[o,s]=de(),{pathname:a}=l(),{isMobile:u}=q(),g=u?c(J,{className:"ms-2 d-flex align-items-center",children:[e(J.Toggle,{variant:"light",size:"sm"}),e(J.Menu,{children:o.map(e=>c(J.Item,{active:a.startsWith(e.path),as:h,to:e.path,replace:!0,children:[e.icon,e.title]},e.path))})]}):e(Be,{children:o.map(t=>e(G.Item,{children:c(Fe,{className:Z("nav-link",{active:a.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path))});return e(Ee,{title:t||s,header:r,nav:g,showBack:n,extra:i,children:e(d,{})})}const Be=E(G)`
279
+ `;function Fe({title:t,header:r,showBack:n,extra:i}){const[o,s]=ue(),{pathname:a}=l(),{isMobile:u}=T(),g=u?c(X,{className:"ms-2 d-flex align-items-center",children:[e(X.Toggle,{variant:"light",size:"sm"}),e(X.Menu,{children:o.map(e=>c(X.Item,{active:a.startsWith(e.path),as:h,to:e.path,replace:!0,children:[e.icon,e.title]},e.path))})]}):e(He,{children:o.map(t=>e(Q.Item,{children:c(Ve,{className:ce("nav-link",{active:a.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path))});return e(qe,{title:t||s,header:r,nav:g,showBack:n,extra:i,children:e(d,{})})}const He=q(Q)`
280
280
  flex-wrap: nowrap;
281
281
  margin-left: 1.25rem;
282
- `,Fe=E(h)`
282
+ `,Ve=q(h)`
283
283
  display: flex;
284
284
  align-items: center;
285
285
  gap: 0.5rem;
@@ -302,9 +302,9 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
302
302
  bottom: -2px;
303
303
  }
304
304
  }
305
- `;const He=x.createContext(null),Ve=function(){const[c,t,r]=ae(),{user:n}=c,i=L(e=>{t("function"==typeof e?c=>({...c,user:e(c.user||void 0)}):c=>({...c,user:e}))},[]);if(!n){const c=window.location.pathname+window.location.search;return e(g,{to:"/login",state:{from:c}})}const o=[n,i,r];return o.user=n,o.setUser=i,o.refresh=r,e(He.Provider,{value:o,children:e(d,{})})};function De(){const e=y(He);if(!e)throw new Error("please use `useUser` in UserContext");return e}const We=E.a`
305
+ `;const De=w.createContext(null),We=function(){const[c,t,r]=de(),{user:n}=c,i=R(e=>{t("function"==typeof e?c=>({...c,user:e(c.user||void 0)}):c=>({...c,user:e}))},[]);if(!n){const c=window.location.pathname+window.location.search;return e(g,{to:"/login",state:{from:c}})}const o=[n,i,r];return o.user=n,o.setUser=i,o.refresh=r,e(De.Provider,{value:o,children:e(d,{})})};function Ke(){const e=k(De);if(!e)throw new Error("please use `useUser` in UserContext");return e}const Ge=q.a`
306
306
  cursor: pointer;
307
- `;function Ke({children:t,menus:r,className:n,logo:i=!0}){const[o]=De();return e(Ge,{className:Z("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",n),children:c("div",{className:"container-fluid",children:[i&&e("a",{className:"navbar-brand",href:"https://www.topthink.com",children:e("img",{src:"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e",height:"30"})}),t,c(J,{navbar:!0,children:[e(J.Toggle,{as:We,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:o.avatar})}),e(J.Menu,{className:"shadow",children:r})]})]})})}const Ge=E.header`
307
+ `;function Je({children:t,menus:r,className:n,logo:i=!0}){const[o]=Ke();return e(Qe,{className:ce("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",n),children:c("div",{className:"container-fluid",children:[i&&e("a",{className:"navbar-brand",href:"https://www.topthink.com",children:e("img",{src:"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e",height:"30"})}),t,c(X,{navbar:!0,children:[e(X.Toggle,{as:Ge,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:o.avatar})}),e(X.Menu,{className:"shadow",children:r})]})]})})}const Qe=q.header`
308
308
  height: 54px;
309
- `;function Je({require:c,children:r,fallback:n}){const[i]=De();let o=!1;return"function"==typeof c?o=c(i):("string"==typeof c&&(c=[c]),o=K(i.roles,c).length>0),o||(r=n),e(t,{children:r})}function Qe({to:c,replace:t,...r}){let n=u();return e(U,{...r,onClick:e=>{e.preventDefault(),n(c,{replace:t})}})}const Xe=b(void 0),Ye=function({request:c,children:t}){const{result:r}=j(c);return r?e(Xe.Provider,{value:r,children:t}):e($,{wrap:!0})};function Ze({request:c,children:t}){const r=m();return"string"==typeof c?c={url:c.replace(/:(\w+)/g,(e,c)=>r[c]||e)}:c.url&&(c.url=c.url.replace(/:(\w+)/g,(e,c)=>r[c]||e)),e(Ye,{request:c,children:t},c.url)}function ec(){return y(Xe)}function cc({onLogined:c,onAuthorize:t,implicit:r=!0}){const{result:n,error:i}=M(async()=>{let e;if(r){const c=ee.parse(window.location.hash);c.access_token&&(e=c.access_token)}else{const c=ee.parse(window.location.search);c&&(e=c,e.redirect_uri=sessionStorage.getItem("redirect_uri"))}if(t)try{const c=await t(e);c&&(e=c)}catch(e){if(I(e)){const c=e.response?.data;if(O(c))throw new Error(c.message)}throw e}return c(e)},[]);return i?e(Q,{className:"mt-5",children:e(B,{children:e(S,{status:"error",title:i.message})})}):n||e($,{})}function tc({onLogout:c}){const t=u(),[,r]=ae();return M(async()=>{await c(),r(e=>({...e,user:null})),t("/login",{state:{from:"logout"}})},[]),e($,{})}function rc({onLogin:c,onLogined:t,onAuthorize:r}){return e(Q,{className:"vh-100 d-flex align-items-center",children:e(X,{className:"flex-fill",children:e(Y,{lg:{span:6,offset:3},xxl:{span:4,offset:4},children:e(B,{className:"p-5",children:c({onAuthorize:r,onLogined:t})})})})})}function nc(e,c){return"/"===c?e:e.slice(c.length)}function ic(t){const{basename:r="/",onAuthorize:n,onLogout:i,onLogin:o,authentication:s="token",implicit:a,baseURL:l,appResolver:d,userResolver:h,routes:g,RootComponent:m=A,extraRoutes:v=[]}=t;l&&(F.defaults.baseURL=l);const x=e=>{"token"===s&&F.defaults.authTokenName&&(e?localStorage.setItem(F.defaults.authTokenName,e):localStorage.removeItem(F.defaults.authTokenName))},b=e=>{e.token?x(e.token):e.token=(()=>{if("token"===s&&F.defaults.authTokenName)return localStorage.getItem(F.defaults.authTokenName)})()},w=({url:c})=>{const[,,t]=ae(),r=u();return W(async()=>{await t(),r(c,{replace:!0})},[]),e($,{})},y=c=>{x(c);const{from:t}=window.history.state.usr||{};let n;return t&&"logout"!==t?n=nc(t,r):(n=sessionStorage.getItem("restore_uri"),n&&sessionStorage.removeItem("restore_uri")),e(w,{url:n||"/"})},_=p([...v,{path:"social",element:e(cc,{implicit:a,onAuthorize:n,onLogined:y})},{path:"logout",element:e(tc,{onLogout:async()=>{if(i)try{await i()}catch(e){}x()}})},{path:"login",element:e(rc,{onLogin:o,onAuthorize:(e,c)=>{const{from:t}=window.history.state.usr||{};t&&"logout"!==t&&sessionStorage.setItem("restore_uri",nc(t,r));const n=ee.stringifyUrl({url:D(ce.join(r,"/social")),query:c});a||sessionStorage.setItem("redirect_uri",n),window.location.href=ee.stringifyUrl({url:e,query:{redirect_uri:n}})},onLogined:y})},{path:"*",element:e(Ve,{}),children:he(g)}],{basename:r});return function(){return c(H,{children:[e(se,{appResolver:d,userResolver:h,onResolved:b,children:e(m,{children:e(f,{router:_})})}),e(V.Message,{})]})}}export{Je as Access,Ee as Content,Ke as Header,Qe as LinkButton,we as SiderLayout,Oe as TabLayout,Ze as WithRequest,ic as createApplication,le as useApp,ae as useAppState,ec as useRequestData,De as useUser};
309
+ `;function Xe({require:c,children:r,fallback:n}){const[i]=Ke();let o=!1;return"function"==typeof c?o=c(i):("string"==typeof c&&(c=[c]),o=J(i.roles,c).length>0),o||(r=n),e(t,{children:r})}function Ye({to:c,replace:t,...r}){let n=u();return e(O,{...r,onClick:e=>{e.preventDefault(),n(c,{replace:t})}})}const Ze=y(void 0),ec=function({request:c,children:t}){const{result:r}=B(c);return r?e(Ze.Provider,{value:r,children:t}):e(C,{wrap:!0})};function cc({request:c,children:t}){const r=m();return"string"==typeof c?c={url:c.replace(/:(\w+)/g,(e,c)=>r[c]||e)}:c.url&&(c.url=c.url.replace(/:(\w+)/g,(e,c)=>r[c]||e)),e(ec,{request:c,children:t},c.url)}function tc(){return k(Ze)}function rc({onLogined:c,onAuthorize:t,implicit:r=!0}){const{result:n,error:i}=$(async()=>{let e;if(r){const c=te.parse(window.location.hash);c.access_token&&(e=c.access_token)}else{const c=te.parse(window.location.search);c&&(e=c,e.redirect_uri=sessionStorage.getItem("redirect_uri"))}if(t)try{const c=await t(e);c&&(e=c)}catch(e){if(S(e)){const c=e.response?.data;if(F(c))throw new Error(c.message)}throw e}return c(e)},[]);return i?e(Y,{className:"mt-5",children:e(H,{children:e(E,{status:"error",title:i.message})})}):n||e(C,{})}function nc({onLogout:c}){const t=u(),[,r]=de();return $(async()=>{await c(),r(e=>({...e,user:null})),t("/login",{state:{from:"logout"}})},[]),e(C,{})}function ic({onLogin:c,onLogined:t,onAuthorize:r}){return e(Y,{className:"vh-100 d-flex align-items-center",children:e(Z,{className:"flex-fill",children:e(ee,{lg:{span:6,offset:3},xxl:{span:4,offset:4},children:e(H,{className:"p-5",children:c({onAuthorize:r,onLogined:t})})})})})}function oc(e,c){return"/"===c?e:e.slice(c.length)}function sc(t){const{routerType:r="browser",basename:n="/",onAuthorize:i,onLogout:o,onLogin:s,authentication:a="token",implicit:l,baseURL:d,appResolver:h,userResolver:g,routes:m,RootComponent:b=I,extraRoutes:w=[]}=t;d&&(V.defaults.baseURL=d);const y=e=>{"token"===a&&V.defaults.authTokenName&&(e?localStorage.setItem(V.defaults.authTokenName,e):localStorage.removeItem(V.defaults.authTokenName))},_=e=>{e.token?y(e.token):e.token=(()=>{if("token"===a&&V.defaults.authTokenName)return localStorage.getItem(V.defaults.authTokenName)})()},k=({url:c})=>{const[,,t]=de(),r=u();return G(async()=>{await t(),r(c,{replace:!0})},[]),e(C,{})},N=c=>{y(c);const{from:t}=window.history.state.usr||{};let r;return t&&"logout"!==t?r=oc(t,n):(r=sessionStorage.getItem("restore_uri"),r&&sessionStorage.removeItem("restore_uri")),e(k,{url:r||"/"})},z=[...w,{path:"social",element:e(rc,{implicit:l,onAuthorize:i,onLogined:N})},{path:"logout",element:e(nc,{onLogout:async()=>{if(o)try{await o()}catch(e){}y()}})},{path:"login",element:e(ic,{onLogin:s,onAuthorize:(e,c)=>{const{from:t}=window.history.state.usr||{};t&&"logout"!==t&&sessionStorage.setItem("restore_uri",oc(t,n));const r=te.stringifyUrl({url:K(re.join(n,"/social")),query:c});l||sessionStorage.setItem("redirect_uri",r),window.location.href=te.stringifyUrl({url:e,query:{redirect_uri:r}})},onLogined:N})},{path:"*",element:e(We,{}),children:ge(m)}],L=(0,{browser:f,hash:v,memory:x}[r])(z,{basename:n});return function(){return c(D,{children:[e(le,{appResolver:h,userResolver:g,onResolved:_,children:e(b,{children:e(p,{router:L})})}),e(W.Message,{})]})}}export{Xe as Access,qe as Content,Je as Header,Ye as LinkButton,_e as SiderLayout,Fe as TabLayout,cc as WithRequest,sc as createApplication,he as useApp,de as useAppState,tc as useRequestData,Ke as useUser};
310
310
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/images/external.svg","../src/utils/get-menu-data.tsx","../src/components/app-provider.tsx","../src/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider/context.tsx","../src/layout/sider/toggle.tsx","../src/layout/sider/index.tsx","../src/hooks/use-route-handle.ts","../src/components/content.tsx","../src/layout/tab.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/components/with-request.tsx","../src/pages/social.tsx","../src/pages/logout.tsx","../src/pages/login.tsx","../src/utils/create-application.tsx"],"sourcesContent":["var img = \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3e %3cg fill='%23888'%3e %3cpath d='M8 3l1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z'/%3e %3cpath d='M11 11H5V5h2V3H3v10h10V9h-2z'/%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import type { RouteObject } from 'react-router-dom';\nimport { ReactNode } from 'react';\nimport { App } from './types';\nimport { intersection } from 'lodash';\n\nexport interface MenuData {\n path: string;\n title: string;\n icon?: ReactNode;\n isExternal?: boolean;\n children: MenuData[];\n}\n\nconst formatRelativePath = (app: App, routes: RouteObject[], parent: string = '/'): MenuData[] => {\n\n const menus: MenuData[] = [];\n const user = app.user || undefined;\n\n for (const route of routes) {\n\n let { meta = {}, path = '', children = [] } = route;\n\n if (meta.hideInMenu) {\n continue;\n }\n\n if (meta.access) {\n let access = meta.access;\n let passed = false;\n if (typeof access === 'function') {\n passed = access(app);\n } else if (typeof access === 'number') {\n passed = Number(user?.access_level || 0) >= access;\n } else {\n if (!Array.isArray(access)) {\n access = [access];\n }\n\n passed = intersection((user?.roles || []), access).length > 0;\n }\n if (!passed) {\n continue;\n }\n }\n\n const title = meta.title;\n\n if (!title) {\n continue;\n }\n\n let isExternal = false;\n\n if (meta.href) {\n isExternal = true;\n path = meta.href;\n } else {\n path = `${parent}/${path}`.replace(/\\/{2,}/g, '/').replace(/\\/$/, '');\n }\n\n const icon = typeof meta.icon === 'string' ?\n <i className={`bi bi-${meta.icon}`} /> : meta.icon;\n\n const menu: MenuData = {\n title,\n icon,\n path,\n isExternal,\n children: [],\n };\n\n if (!meta.hideChildrenInMenu && !isExternal && children.length > 0) {\n menu.children = formatRelativePath(app, children, path);\n }\n\n menus.push(menu);\n }\n\n return menus;\n};\n\nexport default function getMenuData(app: App, routes: RouteObject[], base: string = '/'): MenuData[] {\n return formatRelativePath(app, routes, base);\n}\n","import { createContext, Dispatch, ReactNode, SetStateAction, useContext, useState } from 'react';\nimport { App, AppResolver, User, UserResolver } from '../utils/types';\nimport { isRequestError, Loader, Result, useAsync, useAsyncCallback } from '@topthink/components';\n\ntype AppContextType = [App, Dispatch<SetStateAction<App>>, () => Promise<User | undefined>];\n\nexport const AppContext = createContext<AppContextType | null>(null);\n\ninterface Props {\n appResolver?: AppResolver;\n userResolver: UserResolver;\n onResolved: (user: User) => void;\n children: ReactNode;\n}\n\nexport default function AppProvider({ appResolver, userResolver, onResolved, children }: Props) {\n const [app, setApp] = useState<App>();\n\n const { execute: getUser } = useAsyncCallback(async () => {\n if (userResolver) {\n return userResolver();\n }\n }, {\n onError(e) {\n if (isRequestError(e) && e.response?.status === 401) {\n setApp(current => ({ ...current, user: null }));\n }\n },\n onSuccess(user) {\n if (user) {\n onResolved(user);\n setApp(current => ({ ...current, user: user }));\n }\n },\n });\n\n const { error } = useAsync(async () => {\n if (appResolver) {\n return appResolver();\n } else {\n await getUser();\n }\n }, [], {\n onSuccess(app = {}) {\n setApp(app);\n if (app.user) {\n onResolved(app.user);\n }\n },\n });\n\n if (error) {\n return <Result status={'error'} title={error.message} />;\n }\n\n if (!app) {\n return <Loader />;\n }\n\n return <AppContext.Provider value={[app, setApp, getUser]}>\n {children}\n </AppContext.Provider>;\n}\n\nexport function useAppState() {\n const context = useContext(AppContext);\n if (!context) {\n throw new Error('useApp must be used within a AppProvider');\n }\n return context;\n}\n\nexport function useApp() {\n const [app] = useAppState();\n return app;\n}\n","import { useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext } from 'react-router-dom';\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\nimport { useApp } from '../components/app-provider';\n\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\n\n const { matches } = useContext(UNSAFE_RouteContext);\n const app = useApp();\n const routeMatch = matches[matches.length - 1];\n const pathnameBase = routeMatch.pathnameBase || '/';\n\n const routesMatch = routes || routeMatch.route.children || [];\n\n const menu = useMemo(() => getMenuData(app, routesMatch, pathnameBase), [app, routesMatch, pathnameBase]);\n\n const title = useMemo(() => {\n return matches.reduceRight((title, match) => {\n if (title) return title;\n return match.route.handle?.title;\n }, undefined);\n }, [matches]);\n\n return [menu, title];\n}\n","import { RouteObject } from 'react-router-dom';\n\nexport default function transformRoutes(routes: RouteObject[], hideInMenu?: boolean) {\n return routes.map((route) => {\n if (route.children) {\n route.children = transformRoutes(route.children, route.meta?.hideChildrenInMenu);\n }\n\n route.handle = route.handle || {};\n\n const title = route.meta?.title;\n if (title !== undefined) {\n route.handle.title = title;\n }\n\n hideInMenu = route.meta?.hideInMenu || (hideInMenu && !route.index);\n if (hideInMenu !== undefined) {\n route.handle.hideInMenu = hideInMenu;\n }\n\n const hideMenu = route.meta?.hideMenu;\n if (hideMenu !== undefined) {\n route.handle.hideMenu = hideMenu;\n }\n\n const access = route.meta?.access;\n if (access !== undefined) {\n route.handle.access = access;\n }\n\n return route;\n });\n}\n","import { createContext, ReactNode, useContext } from 'react';\n\nexport const SiderContext = createContext<{\n toggle: ReactNode,\n show: boolean,\n setShow: (show: boolean) => void,\n headless: boolean\n} | undefined>(undefined);\n\nexport const useSider = () => {\n return useContext(SiderContext);\n};\n","import { styled } from '@topthink/components';\nimport { useSider } from './context';\n\nexport default function Toggle() {\n const sider = useSider();\n return <Trigger onClick={() => sider?.setShow(true)}><i className='bi bi-list' /></Trigger>;\n}\n\nconst Trigger = styled.div`\n width: 40px;\n height: 40px;\n display: flex;\n font-size: 2rem;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n`;\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\nimport { ElementType, memo, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { MenuData } from '../../utils/get-menu-data';\nimport type { CSSMotionProps } from 'rc-motion';\nimport { Offcanvas, createGlobalStyle, styled, useWindowSize } from '@topthink/components';\nimport { ReactComponent as ExternalIcon } from '../../images/external.svg';\nimport useMenu from '../use-menu';\nimport transformRoutes from '../../utils/transform-routes';\nimport Toggle from './toggle';\nimport { SiderContext } from './context';\nimport useRouteHandle from '../../hooks/use-route-handle';\n\nconst renderMenuItems = (items: MenuData[]) => {\n return items.map((item) => {\n\n const title = <MenuTitle>\n {item.icon}\n {item.title}\n {item.isExternal && <ExternalIcon />}\n </MenuTitle>;\n\n if (item.children.length > 0) {\n return <SubMenu title={title} key={item.path}>\n {renderMenuItems(item.children)}\n </SubMenu>;\n } else {\n return <MenuItem key={item.path}>\n {item.isExternal ?\n <a href={item.path} target='_blank'>{title}</a> :\n <Link to={item.path}>{title}</Link>\n }\n </MenuItem>;\n }\n });\n};\n\nconst collapseNode = () => {\n return { height: 0 };\n};\nconst expandNode = (node: HTMLElement) => {\n return { height: node.scrollHeight };\n};\n\nconst motion: CSSMotionProps = {\n motionName: 'rc-menu-collapse',\n motionAppear: true,\n onAppearStart: collapseNode,\n onAppearActive: expandNode,\n onEnterStart: collapseNode,\n onEnterActive: expandNode,\n onLeaveStart: expandNode,\n onLeaveActive: collapseNode,\n};\n\ninterface Props<As extends ElementType = ElementType> {\n className?: string;\n title?: string;\n header?: ReactNode;\n headerAs?: As;\n footer?: ReactNode;\n footerAs?: As;\n routes?: RouteObject[];\n top?: number;\n}\n\nexport default function SiderLayout({ className, title, header, headerAs, footer, footerAs, top = 54, routes }: Props) {\n const { isMobile } = useWindowSize();\n const [menu, defaultTitle] = useMenu(routes);\n const [showToggle, setShowToggle] = useState(false);\n const { pathname, key } = useLocation();\n const siderRef = useRef<HTMLDivElement>(null);\n\n const { hideMenu = false } = useRouteHandle();\n\n const selectedKeys = useMemo(() => {\n const keys: string[] = [];\n const parts = pathname.split('/');\n parts.reduce<string[]>((pre, curr) => {\n if (pre.length > 1) {\n keys.push(pre.join('/'));\n }\n return [...pre, curr];\n }, []);\n keys.push(pathname);\n return keys;\n }, [pathname]);\n\n const [openKeys, setOpenKeys] = useState<string[]>([]);\n\n useEffect(() => {\n setShowToggle(false);\n }, [key]);\n\n useEffect(() => {\n setOpenKeys(selectedKeys.slice(0, -1));\n }, [selectedKeys]);\n\n const onOpenChange = useCallback((openKeys: string[]) => {\n const currentKey = openKeys[openKeys.length - 1];\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\n }, [openKeys, setOpenKeys]);\n\n const children = routes ? <Routes routes={routes} /> : <Outlet />;\n\n if (hideMenu) {\n return children;\n }\n\n if (!header) {\n header = <Title>{title || defaultTitle}</Title>;\n }\n\n const HeaderComp = headerAs || Header;\n\n const FooterComp = footerAs || Footer;\n\n const sidebar = <Sidebar className={className}>\n <HeaderComp>{header}</HeaderComp>\n <Menu\n mode='inline'\n motion={motion}\n openKeys={openKeys}\n onOpenChange={onOpenChange}\n selectedKeys={selectedKeys}\n >\n {renderMenuItems(menu)}\n </Menu>\n <FooterComp>{footer}</FooterComp>\n </Sidebar>;\n\n const siderToggle = isMobile ? <Toggle /> : null;\n\n return <SiderContext.Provider value={{\n show: showToggle,\n setShow: setShowToggle,\n toggle: siderToggle,\n headless: top == 0\n }}>\n <GlobalStyle $top={top} />\n <Container>\n <Sider ref={siderRef}>\n {isMobile ? <Offcanvas\n container={siderRef}\n show={showToggle}\n onHide={() => {\n setShowToggle(false);\n }}\n placement={'start'}\n style={{\n width: '231px',\n }}\n\n >\n {sidebar}\n </Offcanvas> : sidebar}\n </Sider>\n <Content>\n <Main>\n {children}\n </Main>\n </Content>\n </Container>\n </SiderContext.Provider>;\n}\n\n\nconst Routes = memo(function({ routes }: { routes: RouteObject[] }) {\n return useRoutes(useMemo(() => transformRoutes(routes), [routes]));\n});\n\nconst Sidebar = styled.nav`\n position: fixed;\n top: var(--bs-header-height, 0);\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 0;\n border-right: 1px solid #e3e3e3;\n width: 230px;\n background-color: #f5f5f5;\n display: flex;\n flex-direction: column;\n`;\n\nconst Title = styled.div`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n font-size: 16px;\n`;\n\nconst Header = styled.div`\n height: 65px;\n display: flex;\n align-items: center;\n padding: 10px 8px 10px 24px;\n border-bottom: 1px solid #e3e3e3;\n flex-grow: 0;\n flex-shrink: 0;\n`;\n\nconst Footer = styled.div`\n flex-grow: 0;\n flex-shrink: 0;\n`;\nconst Content = styled.div`\n flex: 1;\n @media (min-width: 992px) {\n margin-left: 230px;\n }\n`;\n\nconst Sider = styled.div`\n .offcanvas-backdrop {\n top: var(--bs-header-height, 0);\n }\n\n .offcanvas-start {\n top: var(--bs-header-height, 0);\n\n ${Sidebar} {\n position: absolute;\n top: 0;\n }\n }\n`;\n\nconst Main = styled.main`\n min-height: calc(var(--100vh, 100vh) - var(--bs-header-height));\n position: relative;\n`;\n\nconst MenuTitle = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n\n .bi {\n font-size: 16px;\n line-height: 18px;\n min-width: 19px;\n text-align: center;\n }\n`;\n\nconst Menu = styled(RcMenu)`\n border: none;\n box-shadow: none;\n padding: 10px 0;\n flex: 1;\n overflow: auto;\n\n .rc-menu-item {\n display: flex;\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n a {\n flex: 1;\n text-decoration: none;\n color: dimgray;\n }\n }\n\n .rc-menu-sub {\n background-color: #eee;\n border-top: 1px solid #eee;\n border-bottom: 1px solid #eee;\n\n & > li {\n &:first-child {\n margin-top: 4px;\n }\n\n &:last-child {\n margin-bottom: 4px;\n }\n }\n\n .rc-menu-item-selected {\n background-color: #eee;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-item {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu {\n & > .rc-menu-submenu-title {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-item-active,\n .rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #eee;\n }\n\n .rc-menu-item,\n .rc-menu-submenu > .rc-menu-submenu-title {\n padding: 0 8px 0 24px;\n font-size: 14px;\n line-height: 36px;\n cursor: pointer;\n }\n\n .rc-menu-sub > .rc-menu-item,\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\n padding-top: 0;\n padding-bottom: 0;\n padding-right: 0;\n }\n\n .rc-menu-submenu-arrow {\n line-height: 20px;\n }\n\n .rc-menu-item-selected {\n background-color: #f5f5f5;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-submenu-selected {\n background-color: #eee;\n\n & > .rc-menu-submenu-title {\n color: var(--bs-primary);\n font-weight: 500;\n }\n }\n\n & > .rc-menu-item {\n line-height: 38px;\n }\n\n & > .rc-menu-submenu {\n &.rc-menu-submenu-selected {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-submenu-title {\n line-height: 38px;\n\n &:hover {\n background-color: #f0f0f0;\n }\n }\n\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-sub {\n border-top: 1px solid #e6e6e6;\n border-bottom: 1px solid #e6e6e6;\n\n & > li {\n &:first-child {\n margin-top: 9px;\n }\n\n &:last-child {\n margin-bottom: 9px;\n }\n }\n }\n }\n\n`;\n\nconst Container = styled.div`\n display: flex;\n flex-wrap: nowrap;\n width: 100%;\n\n &:has(&) {\n > ${Sidebar} {\n display: none;\n }\n\n > ${Content} {\n margin-left: 0;\n }\n }\n`;\n\nconst GlobalStyle = createGlobalStyle<{ $top: number }>`\n :root {\n --bs-header-height: ${(p) => p.$top}px;\n }\n`;\n","import { useMatches } from 'react-router-dom';\n\nexport default function useRouteHandle() {\n const matches = useMatches();\n\n return matches.reduce<Record<string, any>>((route, match) => {\n return { ...route, ...match.handle };\n }, {});\n}\n","import { css, styled } from '@topthink/components';\nimport { ElementType, PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate } from 'react-router-dom';\nimport { useSider } from '../layout/sider/context';\n\ninterface ContentProps<As extends ElementType = ElementType> {\n title?: ReactNode;\n header?: ReactNode;\n nav?: ReactNode;\n extra?: ReactNode;\n showBack?: boolean | string;\n fixed?: boolean | number;\n className?: string;\n bodyAs?: As;\n}\n\nexport default function Content({\n title,\n header,\n nav,\n children,\n extra,\n showBack,\n className,\n bodyAs,\n fixed = true,\n}: PropsWithChildren<ContentProps>) {\n const { matches } = useContext(UNSAFE_RouteContext);\n const route = useMemo(() => {\n return matches.reduceRight<RouteObject | undefined>((route, match) => {\n if (route || match.route.index) return route;\n return match.route;\n }, undefined);\n }, [matches]);\n\n const sider = useSider();\n\n const top = Number.isFinite(fixed) ? Number(fixed) : ((!sider || sider.headless) ? 0 : 54);\n fixed = Number.isFinite(fixed) ? true : Boolean(fixed);\n const defaultShowBack = route?.handle?.hideInMenu === true;\n const defaultTitle = route?.handle?.title;\n\n const navigate = useNavigate();\n const location = useLocation();\n\n if (showBack === undefined) {\n showBack = defaultShowBack;\n }\n\n if (header === undefined) {\n header = <Title className={'fs-4 text-truncate'}>{title || defaultTitle}</Title>;\n }\n\n return <Container className={className}>\n <Header $fixed={fixed} $top={top}>\n <div className=\"container\">\n {sider?.toggle}\n {showBack && (location.key !== 'default' || typeof showBack === 'string') &&\n <Back onClick={() => typeof showBack === 'string' ? navigate(showBack) : navigate(-1)}><i className=\"bi bi-arrow-left-short\" /></Back>}\n {header}\n {nav}\n <Extra>{extra}</Extra>\n </div>\n </Header>\n <Body className=\"container\" as={bodyAs}>\n {children}\n </Body>\n </Container>;\n};\n\nconst Back = styled.div`\n font-size: 32px;\n cursor: pointer;\n`;\n\nconst Container = styled.div`\n width: 100%;\n container-type: inline-size;\n\n .container {\n @media (min-width: 992px) and (max-width: 1540px) {\n max-width: calc(100vw - 236px - 6px);\n }\n @media (max-width: 991px) {\n max-width: calc(100vw - 6px);\n }\n @container (max-width: 1310px) {\n max-width: 100cqw;\n }\n }\n`;\n\nconst Header = styled.div<{ $fixed?: boolean, $top: number }>`\n background-color: #fff;\n display: flex;\n border-bottom: 1px solid rgb(227, 227, 227);\n align-items: center;\n height: 65px;\n\n ${props => props.$fixed && css`\n position: sticky;\n top: ${props.$top}px;\n z-index: 1000;\n `};\n\n .container {\n padding: 0 12px;\n display: flex;\n align-items: center;\n gap: .5rem;\n }\n`;\n\nconst Body = styled.div`\n margin-top: 24px;\n margin-bottom: 24px;\n\n @container (max-width: 1310px) {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n`;\n\nconst Title = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 50px;\n flex-shrink: 0;\n`;\n\nconst Extra = styled.div`\n margin-left: auto;\n`;\n","import { Dropdown, Nav } from 'react-bootstrap';\nimport Content from '../components/content';\nimport { Link, Outlet, useLocation } from 'react-router-dom';\nimport useMenu from './use-menu';\nimport { styled, useWindowSize } from '@topthink/components';\nimport classNames from 'classnames';\nimport { ReactNode } from 'react';\n\ninterface Props {\n title?: ReactNode;\n header?: ReactNode;\n showBack?: boolean;\n extra?: ReactNode;\n}\n\nexport default function TabLayout({ title, header, showBack, extra }: Props) {\n\n const [menu, defaultTitle] = useMenu();\n const { pathname } = useLocation();\n const { isMobile } = useWindowSize();\n\n const nav = isMobile ? <Dropdown className='ms-2 d-flex align-items-center'>\n <Dropdown.Toggle variant='light' size={'sm'} />\n <Dropdown.Menu>\n {menu.map((item) => {\n return <Dropdown.Item active={pathname.startsWith(item.path)} as={Link} to={item.path} replace key={item.path}>\n {item.icon}\n {item.title}\n </Dropdown.Item>;\n })}\n </Dropdown.Menu>\n </Dropdown> : <StyledNav>\n {menu.map((item) => {\n return <Nav.Item key={item.path}>\n <NavLink className={classNames('nav-link', { active: pathname.startsWith(item.path) })} to={item.path} replace>\n {item.icon}\n {item.title}\n </NavLink>\n </Nav.Item>;\n })}\n </StyledNav>;\n\n return <Content title={title || defaultTitle} header={header} nav={nav} showBack={showBack} extra={extra}>\n <Outlet />\n </Content>;\n}\n\n\nconst StyledNav = styled(Nav)`\n flex-wrap: nowrap;\n margin-left: 1.25rem;\n`;\n\nconst NavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n white-space: nowrap;\n position: relative;\n\n .bi, svg {\n text-align: center;\n }\n\n &.active {\n &:after {\n content: '';\n height: 2px;\n background: var(--bs-primary);\n display: block;\n position: absolute;\n left: 1rem;\n right: 1rem;\n bottom: -2px;\n }\n }\n`;\n","import React, { Dispatch, SetStateAction, useCallback, useContext } from 'react';\nimport { Navigate, Outlet } from 'react-router-dom';\nimport { User } from '../utils/types';\nimport { useAppState } from './app-provider';\n\ntype UserContextType = [User, Dispatch<SetStateAction<User>>, () => void] & {\n user: User,\n setUser: Dispatch<SetStateAction<User>>,\n refresh: () => void\n};\n\nexport const UserContext = React.createContext<UserContextType | null>(null);\n\n\nconst UserProvider = function () {\n const [app, setApp, getUser] = useAppState();\n const { user } = app;\n\n const setUser = useCallback((user?: User | ((user?: User) => (User | undefined))) => {\n if (typeof user === 'function') {\n setApp(current => ({ ...current, user: user(current.user || undefined) }));\n } else {\n setApp(current => ({ ...current, user: user }));\n }\n }, []);\n\n if (!user) {\n const redirectUri = window.location.pathname + window.location.search;\n return <Navigate to={`/login`} state={{ from: redirectUri }} />;\n }\n\n const value: any = [user, setUser, getUser];\n\n value.user = user;\n value.setUser = setUser;\n value.refresh = getUser;\n\n return <UserContext.Provider value={value}>\n <Outlet />\n </UserContext.Provider>;\n};\n\nexport function useUser() {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error('please use `useUser` in UserContext');\n }\n\n return context;\n}\n\nexport default UserProvider;\n","import logoSrc from '../images/logo.svg';\nimport { Dropdown } from 'react-bootstrap';\nimport { PropsWithChildren, ReactNode } from 'react';\nimport { useUser } from './user-provider';\nimport classNames from 'classnames';\nimport { styled } from '@topthink/components';\n\nconst Avatar = styled.a`\n cursor: pointer;\n`;\n\ninterface Props {\n menus: ReactNode;\n className?: string;\n logo?: boolean;\n}\n\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\n const [user] = useUser();\n\n return <Container\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\n <div className='container-fluid'>\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\n <img src={logoSrc} height='30' />\n </a>}\n {children}\n <Dropdown navbar>\n <Dropdown.Toggle as={Avatar} className='nav-link'>\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\n </Dropdown.Toggle>\n <Dropdown.Menu className={'shadow'}>\n {menus}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </Container>;\n}\n\nconst Container = styled.header`\n height: 54px;\n`;\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import { ReactNode } from 'react';\nimport { intersection } from 'lodash';\nimport { useUser } from './user-provider';\nimport { User } from '../utils/types';\n\nexport interface AccessProps {\n require?: string | string[] | ((user: User) => boolean);\n fallback?: ReactNode;\n children: ReactNode;\n}\n\nexport default function Access({\n require,\n children,\n fallback\n}: AccessProps) {\n const [user,] = useUser();\n let passed = false;\n if (typeof require === 'function') {\n passed = require(user);\n } else {\n if (typeof require === 'string') {\n require = [require];\n }\n passed = intersection(user.roles, require).length > 0;\n }\n if (!passed) {\n children = fallback;\n }\n\n return <>{children}</>;\n}\n","import { LinkProps, useNavigate } from 'react-router-dom';\nimport { Button, ButtonProps } from '@topthink/components';\n\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\n\n}\n\nexport default function LinkButton({ to, replace, ...props }: Props) {\n let navigate = useNavigate();\n\n return <Button {...props} onClick={(e) => {\n e.preventDefault();\n navigate(to, { replace });\n }} />;\n}\n","import { Loader, RequestConfig, useRequest } from '@topthink/components';\nimport { createContext, ReactNode, useContext } from 'react';\nimport { useParams } from 'react-router-dom';\n\nconst Context = createContext<any>(undefined);\n\ninterface Props {\n request: RequestConfig;\n children: ReactNode;\n}\n\nconst Inner = function({ request, children }: Props) {\n const { result } = useRequest(request);\n\n if (!result) {\n return <Loader wrap />;\n }\n\n return <Context.Provider value={result}>\n {children}\n </Context.Provider>;\n};\n\nexport default function WithRequest({ request, children }: Props) {\n const params = useParams();\n\n if (typeof request === 'string') {\n request = {\n url: request.replace(/:(\\w+)/g, (all, name) => {\n return params[name] || all;\n })\n };\n } else if (request.url) {\n request.url = request.url.replace(/:(\\w+)/g, (all, name) => {\n return params[name] || all;\n });\n }\n\n return <Inner key={request.url} request={request}>{children}</Inner>;\n}\n\nexport function useRequestData<T = any>(): T {\n return useContext(Context);\n}\n","import { Card, isRecord, isRequestError, Loader, Result, useAsync } from '@topthink/components';\nimport { Container } from 'react-bootstrap';\nimport queryString from 'query-string';\nimport { Promisable } from '../utils/types';\nimport { ReactElement } from 'react';\n\ninterface LoginProps {\n onLogined: (token?: string) => ReactElement;\n onAuthorize?: (token?: any) => Promisable<void | string | undefined>;\n implicit?: boolean;\n}\n\nexport default function Social({ onLogined, onAuthorize, implicit = true }: LoginProps) {\n const { result, error } = useAsync(async () => {\n let token: any | undefined;\n\n if (implicit) {\n const parsed = queryString.parse(window.location.hash);\n if (parsed.access_token) {\n token = parsed.access_token;\n }\n } else {\n const parsed = queryString.parse(window.location.search);\n if (parsed) {\n token = parsed;\n\n token.redirect_uri = sessionStorage.getItem('redirect_uri');\n }\n }\n\n if (onAuthorize) {\n try {\n const newToken = await onAuthorize(token);\n if (newToken) {\n token = newToken;\n }\n } catch (e) {\n if (isRequestError(e)) {\n const data = e.response?.data;\n if (isRecord(data)) {\n throw new Error(data.message);\n }\n }\n throw e;\n }\n }\n\n return onLogined(token);\n }, []);\n\n if (error) {\n return <Container className={'mt-5'}>\n <Card>\n <Result status={'error'} title={error.message} />\n </Card>\n </Container>;\n }\n\n if (result) {\n return result;\n }\n\n return <Loader />;\n}\n","import { Loader, useAsync } from '@topthink/components';\nimport { useNavigate } from 'react-router-dom';\nimport { useAppState } from '../components/app-provider';\n\ninterface LogoutProps {\n onLogout: () => Promise<void>;\n}\n\nexport default function Logout({ onLogout }: LogoutProps) {\n const navigate = useNavigate();\n const [, setApp] = useAppState();\n useAsync(async () => {\n await onLogout();\n setApp(app => ({ ...app, user: null }));\n navigate('/login', { state: { from: 'logout' } });\n }, []);\n\n return <Loader />;\n}\n","import { Card } from '@topthink/components';\nimport { Col, Container, Row } from 'react-bootstrap';\nimport { ReactElement, ReactNode } from 'react';\n\nexport interface LoginProps {\n onAuthorize: (url: string, query?: Record<string, string>) => void;\n onLogined: (token?: string) => ReactElement;\n}\n\ninterface Props extends LoginProps {\n onLogin: (props: LoginProps) => ReactNode;\n}\n\nexport default function Login({ onLogin, onLogined, onAuthorize }: Props) {\n return <Container className=\"vh-100 d-flex align-items-center\">\n <Row className=\"flex-fill\">\n <Col lg={{ span: 6, offset: 3 }} xxl={{ span: 4, offset: 4 }}>\n <Card className=\"p-5\">\n {onLogin({ onAuthorize, onLogined })}\n </Card>\n </Col>\n </Row>\n </Container>;\n}\n","import { createBrowserRouter, RouteObject, RouterProvider, useNavigate } from 'react-router-dom';\nimport Social from '../pages/social';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { getAbsoluteUrl, Loader, Modal, request, ToastProvider, useAsyncEffect } from '@topthink/components';\nimport AppProvider, { useAppState } from '../components/app-provider';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport Login, { LoginProps } from '../pages/login';\nimport { AppResolver, Promisable, User, UserResolver } from './types';\nimport { Fragment, ReactElement, ReactNode } from 'react';\n\n\ninterface Component<P = {}> {\n (props: P): (ReactElement | null);\n}\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ninterface Options {\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n implicit?: boolean;\n onLogout?: () => Promisable<void>;\n onAuthorize?: (token?: any) => Promisable<void | string | undefined>;\n onLogin: (props: LoginProps) => ReactNode;\n appResolver?: AppResolver;\n userResolver: UserResolver;\n routes: RouteObject[];\n extraRoutes?: RouteObject[];\n RootComponent?: Component;\n}\n\nexport default function createApplication(options: Options) {\n const {\n basename = '/',\n onAuthorize,\n onLogout,\n onLogin,\n authentication = 'token',\n implicit,\n baseURL,\n appResolver,\n userResolver,\n routes,\n RootComponent = Fragment,\n extraRoutes = [],\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const updateToken = (token?: string) => {\n if (authentication === 'token' && request.defaults.authTokenName) {\n if (token) {\n localStorage.setItem(request.defaults.authTokenName, token);\n } else {\n localStorage.removeItem(request.defaults.authTokenName);\n }\n }\n };\n\n const getToken = () => {\n if (authentication === 'token' && request.defaults.authTokenName) {\n return localStorage.getItem(request.defaults.authTokenName);\n }\n };\n\n const handleResolved = (user: User) => {\n if (user.token) {\n updateToken(user.token);\n } else {\n user.token = getToken();\n }\n };\n\n const handleAuthorize = (url: string, query?: Record<string, string>) => {\n const { from } = window.history.state.usr || {};\n\n if (from && from !== 'logout') {\n sessionStorage.setItem('restore_uri', stripBasename(from, basename));\n }\n\n const redirectUri = queryString.stringifyUrl({\n url: getAbsoluteUrl(path.join(basename, '/social')),\n query,\n });\n\n if (!implicit) {\n sessionStorage.setItem('redirect_uri', redirectUri);\n }\n\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri },\n });\n };\n\n const Logined = ({ url }: { url: string }) => {\n const [, , getUser] = useAppState();\n const navigate = useNavigate();\n useAsyncEffect(async () => {\n await getUser();\n navigate(url, { replace: true });\n }, []);\n\n return <Loader />;\n };\n\n const handleLogined = (token?: string) => {\n updateToken(token);\n\n const { from } = window.history.state.usr || {};\n let redirectUri: string | null;\n if (from && from !== 'logout') {\n redirectUri = stripBasename(from, basename);\n } else {\n redirectUri = sessionStorage.getItem('restore_uri');\n if (redirectUri) {\n sessionStorage.removeItem('restore_uri');\n }\n }\n\n return <Logined url={redirectUri || '/'} />;\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch (e) {\n\n }\n }\n\n updateToken();\n };\n\n const router = createBrowserRouter(\n [\n ...extraRoutes,\n {\n path: 'social',\n element: <Social implicit={implicit} onAuthorize={onAuthorize} onLogined={handleLogined} />,\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />,\n },\n {\n path: 'login',\n element: <Login onLogin={onLogin} onAuthorize={handleAuthorize} onLogined={handleLogined} />,\n },\n {\n path: '*',\n element: <UserProvider />,\n children: transformRoutes(routes),\n },\n ],\n {\n basename,\n },\n );\n\n return function () {\n return <ToastProvider>\n <AppProvider appResolver={appResolver} userResolver={userResolver} onResolved={handleResolved}>\n <RootComponent>\n <RouterProvider router={router} />\n </RootComponent>\n </AppProvider>\n <Modal.Message />\n </ToastProvider>;\n };\n}\n"],"names":["_g","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","SvgExternal","props","React","createElement","xmlns","width","height","fill","d","formatRelativePath","app","routes","parent","menus","user","undefined","route","meta","path","children","hideInMenu","access","passed","Number","access_level","Array","isArray","intersection","roles","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","AppContext","createContext","AppProvider","appResolver","userResolver","onResolved","setApp","useState","execute","getUser","useAsyncCallback","async","onError","isRequestError","response","status","current","onSuccess","error","useAsync","Result","message","Provider","value","Loader","useAppState","context","useContext","Error","useApp","useMenu","matches","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","transformRoutes","map","index","hideMenu","SiderContext","useSider","Toggle","sider","Trigger","onClick","setShow","styled","div","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","target","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","header","headerAs","footer","footerAs","top","isMobile","useWindowSize","defaultTitle","showToggle","setShowToggle","pathname","key","useLocation","siderRef","useRef","useMatches","reduce","selectedKeys","keys","split","pre","curr","join","openKeys","setOpenKeys","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Routes","Outlet","Title","FooterComp","Footer","sidebar","Sidebar","Header","Menu","mode","siderToggle","show","toggle","headless","GlobalStyle","$top","Container","Sider","ref","Offcanvas","container","onHide","placement","style","Content","Main","memo","useRoutes","nav","main","RcMenu","createGlobalStyle","p","extra","showBack","bodyAs","fixed","isFinite","Boolean","defaultShowBack","navigate","useNavigate","location","$fixed","Back","Extra","Body","as","css","TabLayout","Dropdown","variant","size","Item","active","StyledNav","Nav","NavLink","classNames","UserContext","UserProvider","setUser","redirectUri","window","search","Navigate","state","from","refresh","useUser","Avatar","a","logo","src","navbar","avatar","Access","require","fallback","_Fragment","LinkButton","Button","preventDefault","Context","Inner","request","result","useRequest","wrap","WithRequest","params","useParams","url","all","name","useRequestData","Social","onLogined","onAuthorize","implicit","token","parsed","queryString","parse","hash","access_token","redirect_uri","sessionStorage","getItem","newToken","data","isRecord","Card","Logout","onLogout","Login","onLogin","Row","Col","lg","span","offset","xxl","stripBasename","basename","createApplication","options","authentication","baseURL","RootComponent","Fragment","extraRoutes","defaults","updateToken","authTokenName","localStorage","setItem","removeItem","handleResolved","getToken","Logined","useAsyncEffect","handleLogined","history","usr","router","createBrowserRouter","element","handleAuthorize","query","stringifyUrl","getAbsoluteUrl","ToastProvider","RouterProvider","Modal","Message"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/images/external.svg","../src/utils/get-menu-data.tsx","../src/components/app-provider.tsx","../src/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider/context.tsx","../src/layout/sider/toggle.tsx","../src/layout/sider/index.tsx","../src/hooks/use-route-handle.ts","../src/components/content.tsx","../src/layout/tab.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/components/with-request.tsx","../src/pages/social.tsx","../src/pages/logout.tsx","../src/pages/login.tsx","../src/utils/create-application.tsx"],"sourcesContent":["var img = \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3e %3cg fill='%23888'%3e %3cpath d='M8 3l1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z'/%3e %3cpath d='M11 11H5V5h2V3H3v10h10V9h-2z'/%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import type { RouteObject } from 'react-router-dom';\nimport { ReactNode } from 'react';\nimport { App } from './types';\nimport { intersection } from 'lodash';\n\nexport interface MenuData {\n path: string;\n title: string;\n icon?: ReactNode;\n isExternal?: boolean;\n children: MenuData[];\n}\n\nconst formatRelativePath = (app: App, routes: RouteObject[], parent: string = '/'): MenuData[] => {\n\n const menus: MenuData[] = [];\n const user = app.user || undefined;\n\n for (const route of routes) {\n\n let { meta = {}, path = '', children = [] } = route;\n\n if (meta.hideInMenu) {\n continue;\n }\n\n if (meta.access) {\n let access = meta.access;\n let passed = false;\n if (typeof access === 'function') {\n passed = access(app);\n } else if (typeof access === 'number') {\n passed = Number(user?.access_level || 0) >= access;\n } else {\n if (!Array.isArray(access)) {\n access = [access];\n }\n\n passed = intersection((user?.roles || []), access).length > 0;\n }\n if (!passed) {\n continue;\n }\n }\n\n const title = meta.title;\n\n if (!title) {\n continue;\n }\n\n let isExternal = false;\n\n if (meta.href) {\n isExternal = true;\n path = meta.href;\n } else {\n path = `${parent}/${path}`.replace(/\\/{2,}/g, '/').replace(/\\/$/, '');\n }\n\n const icon = typeof meta.icon === 'string' ?\n <i className={`bi bi-${meta.icon}`} /> : meta.icon;\n\n const menu: MenuData = {\n title,\n icon,\n path,\n isExternal,\n children: [],\n };\n\n if (!meta.hideChildrenInMenu && !isExternal && children.length > 0) {\n menu.children = formatRelativePath(app, children, path);\n }\n\n menus.push(menu);\n }\n\n return menus;\n};\n\nexport default function getMenuData(app: App, routes: RouteObject[], base: string = '/'): MenuData[] {\n return formatRelativePath(app, routes, base);\n}\n","import { createContext, Dispatch, ReactNode, SetStateAction, useContext, useState } from 'react';\nimport { App, AppResolver, User, UserResolver } from '../utils/types';\nimport { isRequestError, Loader, Result, useAsync, useAsyncCallback } from '@topthink/components';\n\ntype AppContextType = [App, Dispatch<SetStateAction<App>>, () => Promise<User | undefined>];\n\nexport const AppContext = createContext<AppContextType | null>(null);\n\ninterface Props {\n appResolver?: AppResolver;\n userResolver: UserResolver;\n onResolved: (user: User) => void;\n children: ReactNode;\n}\n\nexport default function AppProvider({ appResolver, userResolver, onResolved, children }: Props) {\n const [app, setApp] = useState<App>();\n\n const { execute: getUser } = useAsyncCallback(async () => {\n if (userResolver) {\n return userResolver();\n }\n }, {\n onError(e) {\n if (isRequestError(e) && e.response?.status === 401) {\n setApp(current => ({ ...current, user: null }));\n }\n },\n onSuccess(user) {\n if (user) {\n onResolved(user);\n setApp(current => ({ ...current, user: user }));\n }\n },\n });\n\n const { error } = useAsync(async () => {\n if (appResolver) {\n return appResolver();\n } else {\n await getUser();\n }\n }, [], {\n onSuccess(app = {}) {\n setApp(app);\n if (app.user) {\n onResolved(app.user);\n }\n },\n });\n\n if (error) {\n return <Result status={'error'} title={error.message} />;\n }\n\n if (!app) {\n return <Loader />;\n }\n\n return <AppContext.Provider value={[app, setApp, getUser]}>\n {children}\n </AppContext.Provider>;\n}\n\nexport function useAppState() {\n const context = useContext(AppContext);\n if (!context) {\n throw new Error('useApp must be used within a AppProvider');\n }\n return context;\n}\n\nexport function useApp() {\n const [app] = useAppState();\n return app;\n}\n","import { useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext } from 'react-router-dom';\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\nimport { useApp } from '../components/app-provider';\n\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\n\n const { matches } = useContext(UNSAFE_RouteContext);\n const app = useApp();\n const routeMatch = matches[matches.length - 1];\n const pathnameBase = routeMatch.pathnameBase || '/';\n\n const routesMatch = routes || routeMatch.route.children || [];\n\n const menu = useMemo(() => getMenuData(app, routesMatch, pathnameBase), [app, routesMatch, pathnameBase]);\n\n const title = useMemo(() => {\n return matches.reduceRight((title, match) => {\n if (title) return title;\n return match.route.handle?.title;\n }, undefined);\n }, [matches]);\n\n return [menu, title];\n}\n","import { RouteObject } from 'react-router-dom';\n\nexport default function transformRoutes(routes: RouteObject[], hideInMenu?: boolean) {\n return routes.map((route) => {\n if (route.children) {\n route.children = transformRoutes(route.children, route.meta?.hideChildrenInMenu);\n }\n\n route.handle = route.handle || {};\n\n const title = route.meta?.title;\n if (title !== undefined) {\n route.handle.title = title;\n }\n\n hideInMenu = route.meta?.hideInMenu || (hideInMenu && !route.index);\n if (hideInMenu !== undefined) {\n route.handle.hideInMenu = hideInMenu;\n }\n\n const hideMenu = route.meta?.hideMenu;\n if (hideMenu !== undefined) {\n route.handle.hideMenu = hideMenu;\n }\n\n const access = route.meta?.access;\n if (access !== undefined) {\n route.handle.access = access;\n }\n\n return route;\n });\n}\n","import { createContext, ReactNode, useContext } from 'react';\n\nexport const SiderContext = createContext<{\n toggle: ReactNode,\n show: boolean,\n setShow: (show: boolean) => void,\n headless: boolean\n} | undefined>(undefined);\n\nexport const useSider = () => {\n return useContext(SiderContext);\n};\n","import { styled } from '@topthink/components';\nimport { useSider } from './context';\n\nexport default function Toggle() {\n const sider = useSider();\n return <Trigger onClick={() => sider?.setShow(true)}><i className='bi bi-list' /></Trigger>;\n}\n\nconst Trigger = styled.div`\n width: 40px;\n height: 40px;\n display: flex;\n font-size: 2rem;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n`;\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\nimport { ElementType, memo, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { MenuData } from '../../utils/get-menu-data';\nimport type { CSSMotionProps } from 'rc-motion';\nimport { Offcanvas, createGlobalStyle, styled, useWindowSize } from '@topthink/components';\nimport { ReactComponent as ExternalIcon } from '../../images/external.svg';\nimport useMenu from '../use-menu';\nimport transformRoutes from '../../utils/transform-routes';\nimport Toggle from './toggle';\nimport { SiderContext } from './context';\nimport useRouteHandle from '../../hooks/use-route-handle';\n\nconst renderMenuItems = (items: MenuData[]) => {\n return items.map((item) => {\n\n const title = <MenuTitle>\n {item.icon}\n {item.title}\n {item.isExternal && <ExternalIcon />}\n </MenuTitle>;\n\n if (item.children.length > 0) {\n return <SubMenu title={title} key={item.path}>\n {renderMenuItems(item.children)}\n </SubMenu>;\n } else {\n return <MenuItem key={item.path}>\n {item.isExternal ?\n <a href={item.path} target='_blank'>{title}</a> :\n <Link to={item.path}>{title}</Link>\n }\n </MenuItem>;\n }\n });\n};\n\nconst collapseNode = () => {\n return { height: 0 };\n};\nconst expandNode = (node: HTMLElement) => {\n return { height: node.scrollHeight };\n};\n\nconst motion: CSSMotionProps = {\n motionName: 'rc-menu-collapse',\n motionAppear: true,\n onAppearStart: collapseNode,\n onAppearActive: expandNode,\n onEnterStart: collapseNode,\n onEnterActive: expandNode,\n onLeaveStart: expandNode,\n onLeaveActive: collapseNode,\n};\n\ninterface Props<As extends ElementType = ElementType> {\n className?: string;\n title?: string;\n header?: ReactNode;\n headerAs?: As;\n footer?: ReactNode;\n footerAs?: As;\n routes?: RouteObject[];\n top?: number;\n}\n\nexport default function SiderLayout({ className, title, header, headerAs, footer, footerAs, top = 54, routes }: Props) {\n const { isMobile } = useWindowSize();\n const [menu, defaultTitle] = useMenu(routes);\n const [showToggle, setShowToggle] = useState(false);\n const { pathname, key } = useLocation();\n const siderRef = useRef<HTMLDivElement>(null);\n\n const { hideMenu = false } = useRouteHandle();\n\n const selectedKeys = useMemo(() => {\n const keys: string[] = [];\n const parts = pathname.split('/');\n parts.reduce<string[]>((pre, curr) => {\n if (pre.length > 1) {\n keys.push(pre.join('/'));\n }\n return [...pre, curr];\n }, []);\n keys.push(pathname);\n return keys;\n }, [pathname]);\n\n const [openKeys, setOpenKeys] = useState<string[]>([]);\n\n useEffect(() => {\n setShowToggle(false);\n }, [key]);\n\n useEffect(() => {\n setOpenKeys(selectedKeys.slice(0, -1));\n }, [selectedKeys]);\n\n const onOpenChange = useCallback((openKeys: string[]) => {\n const currentKey = openKeys[openKeys.length - 1];\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\n }, [openKeys, setOpenKeys]);\n\n const children = routes ? <Routes routes={routes} /> : <Outlet />;\n\n if (hideMenu) {\n return children;\n }\n\n if (!header) {\n header = <Title>{title || defaultTitle}</Title>;\n }\n\n const HeaderComp = headerAs || Header;\n\n const FooterComp = footerAs || Footer;\n\n const sidebar = <Sidebar className={className}>\n <HeaderComp>{header}</HeaderComp>\n <Menu\n mode='inline'\n motion={motion}\n openKeys={openKeys}\n onOpenChange={onOpenChange}\n selectedKeys={selectedKeys}\n >\n {renderMenuItems(menu)}\n </Menu>\n <FooterComp>{footer}</FooterComp>\n </Sidebar>;\n\n const siderToggle = isMobile ? <Toggle /> : null;\n\n return <SiderContext.Provider value={{\n show: showToggle,\n setShow: setShowToggle,\n toggle: siderToggle,\n headless: top == 0\n }}>\n <GlobalStyle $top={top} />\n <Container>\n <Sider ref={siderRef}>\n {isMobile ? <Offcanvas\n container={siderRef}\n show={showToggle}\n onHide={() => {\n setShowToggle(false);\n }}\n placement={'start'}\n style={{\n width: '231px',\n }}\n\n >\n {sidebar}\n </Offcanvas> : sidebar}\n </Sider>\n <Content>\n <Main>\n {children}\n </Main>\n </Content>\n </Container>\n </SiderContext.Provider>;\n}\n\n\nconst Routes = memo(function({ routes }: { routes: RouteObject[] }) {\n return useRoutes(useMemo(() => transformRoutes(routes), [routes]));\n});\n\nconst Sidebar = styled.nav`\n position: fixed;\n top: var(--bs-header-height, 0);\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 0;\n border-right: 1px solid #e3e3e3;\n width: 230px;\n background-color: #f5f5f5;\n display: flex;\n flex-direction: column;\n`;\n\nconst Title = styled.div`\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n font-size: 16px;\n`;\n\nconst Header = styled.div`\n height: 65px;\n display: flex;\n align-items: center;\n padding: 10px 8px 10px 24px;\n border-bottom: 1px solid #e3e3e3;\n flex-grow: 0;\n flex-shrink: 0;\n`;\n\nconst Footer = styled.div`\n flex-grow: 0;\n flex-shrink: 0;\n`;\nconst Content = styled.div`\n flex: 1;\n @media (min-width: 992px) {\n margin-left: 230px;\n }\n`;\n\nconst Sider = styled.div`\n .offcanvas-backdrop {\n top: var(--bs-header-height, 0);\n }\n\n .offcanvas-start {\n top: var(--bs-header-height, 0);\n\n ${Sidebar} {\n position: absolute;\n top: 0;\n }\n }\n`;\n\nconst Main = styled.main`\n min-height: calc(var(--100vh, 100vh) - var(--bs-header-height));\n position: relative;\n`;\n\nconst MenuTitle = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n\n .bi {\n font-size: 16px;\n line-height: 18px;\n min-width: 19px;\n text-align: center;\n }\n`;\n\nconst Menu = styled(RcMenu)`\n border: none;\n box-shadow: none;\n padding: 10px 0;\n flex: 1;\n overflow: auto;\n\n .rc-menu-item {\n display: flex;\n\n &:hover {\n background-color: #f0f0f0;\n }\n\n a {\n flex: 1;\n text-decoration: none;\n color: dimgray;\n }\n }\n\n .rc-menu-sub {\n background-color: #eee;\n border-top: 1px solid #eee;\n border-bottom: 1px solid #eee;\n\n & > li {\n &:first-child {\n margin-top: 4px;\n }\n\n &:last-child {\n margin-bottom: 4px;\n }\n }\n\n .rc-menu-item-selected {\n background-color: #eee;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-item {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-submenu {\n & > .rc-menu-submenu-title {\n &:hover {\n background-color: #e7e7e7;\n }\n }\n }\n\n .rc-menu-item-active,\n .rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #eee;\n }\n\n .rc-menu-item,\n .rc-menu-submenu > .rc-menu-submenu-title {\n padding: 0 8px 0 24px;\n font-size: 14px;\n line-height: 36px;\n cursor: pointer;\n }\n\n .rc-menu-sub > .rc-menu-item,\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\n padding-top: 0;\n padding-bottom: 0;\n padding-right: 0;\n }\n\n .rc-menu-submenu-arrow {\n line-height: 20px;\n }\n\n .rc-menu-item-selected {\n background-color: #f5f5f5;\n color: var(--bs-primary);\n\n & > a {\n color: var(--bs-primary);\n }\n }\n\n .rc-menu-submenu-selected {\n background-color: #eee;\n\n & > .rc-menu-submenu-title {\n color: var(--bs-primary);\n font-weight: 500;\n }\n }\n\n & > .rc-menu-item {\n line-height: 38px;\n }\n\n & > .rc-menu-submenu {\n &.rc-menu-submenu-selected {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-submenu-title {\n line-height: 38px;\n\n &:hover {\n background-color: #f0f0f0;\n }\n }\n\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\n background-color: #f5f5f5;\n }\n\n & > .rc-menu-sub {\n border-top: 1px solid #e6e6e6;\n border-bottom: 1px solid #e6e6e6;\n\n & > li {\n &:first-child {\n margin-top: 9px;\n }\n\n &:last-child {\n margin-bottom: 9px;\n }\n }\n }\n }\n\n`;\n\nconst Container = styled.div`\n display: flex;\n flex-wrap: nowrap;\n width: 100%;\n\n &:has(&) {\n > ${Sidebar} {\n display: none;\n }\n\n > ${Content} {\n margin-left: 0;\n }\n }\n`;\n\nconst GlobalStyle = createGlobalStyle<{ $top: number }>`\n :root {\n --bs-header-height: ${(p) => p.$top}px;\n }\n`;\n","import { useMatches } from 'react-router-dom';\n\nexport default function useRouteHandle() {\n const matches = useMatches();\n\n return matches.reduce<Record<string, any>>((route, match) => {\n return { ...route, ...match.handle };\n }, {});\n}\n","import { css, styled } from '@topthink/components';\nimport { ElementType, PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate } from 'react-router-dom';\nimport { useSider } from '../layout/sider/context';\n\ninterface ContentProps<As extends ElementType = ElementType> {\n title?: ReactNode;\n header?: ReactNode;\n nav?: ReactNode;\n extra?: ReactNode;\n showBack?: boolean | string;\n fixed?: boolean | number;\n className?: string;\n bodyAs?: As;\n}\n\nexport default function Content({\n title,\n header,\n nav,\n children,\n extra,\n showBack,\n className,\n bodyAs,\n fixed = true,\n}: PropsWithChildren<ContentProps>) {\n const { matches } = useContext(UNSAFE_RouteContext);\n const route = useMemo(() => {\n return matches.reduceRight<RouteObject | undefined>((route, match) => {\n if (route || match.route.index) return route;\n return match.route;\n }, undefined);\n }, [matches]);\n\n const sider = useSider();\n\n const top = Number.isFinite(fixed) ? Number(fixed) : ((!sider || sider.headless) ? 0 : 54);\n fixed = Number.isFinite(fixed) ? true : Boolean(fixed);\n const defaultShowBack = route?.handle?.hideInMenu === true;\n const defaultTitle = route?.handle?.title;\n\n const navigate = useNavigate();\n const location = useLocation();\n\n if (showBack === undefined) {\n showBack = defaultShowBack;\n }\n\n if (header === undefined) {\n header = <Title className={'fs-4 text-truncate'}>{title || defaultTitle}</Title>;\n }\n\n return <Container className={className}>\n <Header $fixed={fixed} $top={top}>\n <div className=\"container\">\n {sider?.toggle}\n {showBack && (location.key !== 'default' || typeof showBack === 'string') &&\n <Back onClick={() => typeof showBack === 'string' ? navigate(showBack) : navigate(-1)}><i className=\"bi bi-arrow-left-short\" /></Back>}\n {header}\n {nav}\n <Extra>{extra}</Extra>\n </div>\n </Header>\n <Body className=\"container\" as={bodyAs}>\n {children}\n </Body>\n </Container>;\n};\n\nconst Back = styled.div`\n font-size: 32px;\n cursor: pointer;\n`;\n\nconst Container = styled.div`\n width: 100%;\n container-type: inline-size;\n\n .container {\n @media (min-width: 992px) and (max-width: 1540px) {\n max-width: calc(100vw - 236px - 6px);\n }\n @media (max-width: 991px) {\n max-width: calc(100vw - 6px);\n }\n @container (max-width: 1310px) {\n max-width: 100cqw;\n }\n }\n`;\n\nconst Header = styled.div<{ $fixed?: boolean, $top: number }>`\n background-color: #fff;\n display: flex;\n border-bottom: 1px solid rgb(227, 227, 227);\n align-items: center;\n height: 65px;\n\n ${props => props.$fixed && css`\n position: sticky;\n top: ${props.$top}px;\n z-index: 1000;\n `};\n\n .container {\n padding: 0 12px;\n display: flex;\n align-items: center;\n gap: .5rem;\n }\n`;\n\nconst Body = styled.div`\n margin-top: 24px;\n margin-bottom: 24px;\n\n @container (max-width: 1310px) {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n`;\n\nconst Title = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 50px;\n flex-shrink: 0;\n`;\n\nconst Extra = styled.div`\n margin-left: auto;\n`;\n","import { Dropdown, Nav } from 'react-bootstrap';\nimport Content from '../components/content';\nimport { Link, Outlet, useLocation } from 'react-router-dom';\nimport useMenu from './use-menu';\nimport { styled, useWindowSize } from '@topthink/components';\nimport classNames from 'classnames';\nimport { ReactNode } from 'react';\n\ninterface Props {\n title?: ReactNode;\n header?: ReactNode;\n showBack?: boolean;\n extra?: ReactNode;\n}\n\nexport default function TabLayout({ title, header, showBack, extra }: Props) {\n\n const [menu, defaultTitle] = useMenu();\n const { pathname } = useLocation();\n const { isMobile } = useWindowSize();\n\n const nav = isMobile ? <Dropdown className='ms-2 d-flex align-items-center'>\n <Dropdown.Toggle variant='light' size={'sm'} />\n <Dropdown.Menu>\n {menu.map((item) => {\n return <Dropdown.Item active={pathname.startsWith(item.path)} as={Link} to={item.path} replace key={item.path}>\n {item.icon}\n {item.title}\n </Dropdown.Item>;\n })}\n </Dropdown.Menu>\n </Dropdown> : <StyledNav>\n {menu.map((item) => {\n return <Nav.Item key={item.path}>\n <NavLink className={classNames('nav-link', { active: pathname.startsWith(item.path) })} to={item.path} replace>\n {item.icon}\n {item.title}\n </NavLink>\n </Nav.Item>;\n })}\n </StyledNav>;\n\n return <Content title={title || defaultTitle} header={header} nav={nav} showBack={showBack} extra={extra}>\n <Outlet />\n </Content>;\n}\n\n\nconst StyledNav = styled(Nav)`\n flex-wrap: nowrap;\n margin-left: 1.25rem;\n`;\n\nconst NavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n white-space: nowrap;\n position: relative;\n\n .bi, svg {\n text-align: center;\n }\n\n &.active {\n &:after {\n content: '';\n height: 2px;\n background: var(--bs-primary);\n display: block;\n position: absolute;\n left: 1rem;\n right: 1rem;\n bottom: -2px;\n }\n }\n`;\n","import React, { Dispatch, SetStateAction, useCallback, useContext } from 'react';\nimport { Navigate, Outlet } from 'react-router-dom';\nimport { User } from '../utils/types';\nimport { useAppState } from './app-provider';\n\ntype UserContextType = [User, Dispatch<SetStateAction<User>>, () => void] & {\n user: User,\n setUser: Dispatch<SetStateAction<User>>,\n refresh: () => void\n};\n\nexport const UserContext = React.createContext<UserContextType | null>(null);\n\n\nconst UserProvider = function () {\n const [app, setApp, getUser] = useAppState();\n const { user } = app;\n\n const setUser = useCallback((user?: User | ((user?: User) => (User | undefined))) => {\n if (typeof user === 'function') {\n setApp(current => ({ ...current, user: user(current.user || undefined) }));\n } else {\n setApp(current => ({ ...current, user: user }));\n }\n }, []);\n\n if (!user) {\n const redirectUri = window.location.pathname + window.location.search;\n return <Navigate to={`/login`} state={{ from: redirectUri }} />;\n }\n\n const value: any = [user, setUser, getUser];\n\n value.user = user;\n value.setUser = setUser;\n value.refresh = getUser;\n\n return <UserContext.Provider value={value}>\n <Outlet />\n </UserContext.Provider>;\n};\n\nexport function useUser() {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error('please use `useUser` in UserContext');\n }\n\n return context;\n}\n\nexport default UserProvider;\n","import logoSrc from '../images/logo.svg';\nimport { Dropdown } from 'react-bootstrap';\nimport { PropsWithChildren, ReactNode } from 'react';\nimport { useUser } from './user-provider';\nimport classNames from 'classnames';\nimport { styled } from '@topthink/components';\n\nconst Avatar = styled.a`\n cursor: pointer;\n`;\n\ninterface Props {\n menus: ReactNode;\n className?: string;\n logo?: boolean;\n}\n\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\n const [user] = useUser();\n\n return <Container\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\n <div className='container-fluid'>\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\n <img src={logoSrc} height='30' />\n </a>}\n {children}\n <Dropdown navbar>\n <Dropdown.Toggle as={Avatar} className='nav-link'>\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\n </Dropdown.Toggle>\n <Dropdown.Menu className={'shadow'}>\n {menus}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </Container>;\n}\n\nconst Container = styled.header`\n height: 54px;\n`;\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import { ReactNode } from 'react';\nimport { intersection } from 'lodash';\nimport { useUser } from './user-provider';\nimport { User } from '../utils/types';\n\nexport interface AccessProps {\n require?: string | string[] | ((user: User) => boolean);\n fallback?: ReactNode;\n children: ReactNode;\n}\n\nexport default function Access({\n require,\n children,\n fallback\n}: AccessProps) {\n const [user,] = useUser();\n let passed = false;\n if (typeof require === 'function') {\n passed = require(user);\n } else {\n if (typeof require === 'string') {\n require = [require];\n }\n passed = intersection(user.roles, require).length > 0;\n }\n if (!passed) {\n children = fallback;\n }\n\n return <>{children}</>;\n}\n","import { LinkProps, useNavigate } from 'react-router-dom';\nimport { Button, ButtonProps } from '@topthink/components';\n\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\n\n}\n\nexport default function LinkButton({ to, replace, ...props }: Props) {\n let navigate = useNavigate();\n\n return <Button {...props} onClick={(e) => {\n e.preventDefault();\n navigate(to, { replace });\n }} />;\n}\n","import { Loader, RequestConfig, useRequest } from '@topthink/components';\nimport { createContext, ReactNode, useContext } from 'react';\nimport { useParams } from 'react-router-dom';\n\nconst Context = createContext<any>(undefined);\n\ninterface Props {\n request: RequestConfig;\n children: ReactNode;\n}\n\nconst Inner = function({ request, children }: Props) {\n const { result } = useRequest(request);\n\n if (!result) {\n return <Loader wrap />;\n }\n\n return <Context.Provider value={result}>\n {children}\n </Context.Provider>;\n};\n\nexport default function WithRequest({ request, children }: Props) {\n const params = useParams();\n\n if (typeof request === 'string') {\n request = {\n url: request.replace(/:(\\w+)/g, (all, name) => {\n return params[name] || all;\n })\n };\n } else if (request.url) {\n request.url = request.url.replace(/:(\\w+)/g, (all, name) => {\n return params[name] || all;\n });\n }\n\n return <Inner key={request.url} request={request}>{children}</Inner>;\n}\n\nexport function useRequestData<T = any>(): T {\n return useContext(Context);\n}\n","import { Card, isRecord, isRequestError, Loader, Result, useAsync } from '@topthink/components';\nimport { Container } from 'react-bootstrap';\nimport queryString from 'query-string';\nimport { Promisable } from '../utils/types';\nimport { ReactElement } from 'react';\n\ninterface LoginProps {\n onLogined: (token?: string) => ReactElement;\n onAuthorize?: (token?: any) => Promisable<void | string | undefined>;\n implicit?: boolean;\n}\n\nexport default function Social({ onLogined, onAuthorize, implicit = true }: LoginProps) {\n const { result, error } = useAsync(async () => {\n let token: any | undefined;\n\n if (implicit) {\n const parsed = queryString.parse(window.location.hash);\n if (parsed.access_token) {\n token = parsed.access_token;\n }\n } else {\n const parsed = queryString.parse(window.location.search);\n if (parsed) {\n token = parsed;\n\n token.redirect_uri = sessionStorage.getItem('redirect_uri');\n }\n }\n\n if (onAuthorize) {\n try {\n const newToken = await onAuthorize(token);\n if (newToken) {\n token = newToken;\n }\n } catch (e) {\n if (isRequestError(e)) {\n const data = e.response?.data;\n if (isRecord(data)) {\n throw new Error(data.message);\n }\n }\n throw e;\n }\n }\n\n return onLogined(token);\n }, []);\n\n if (error) {\n return <Container className={'mt-5'}>\n <Card>\n <Result status={'error'} title={error.message} />\n </Card>\n </Container>;\n }\n\n if (result) {\n return result;\n }\n\n return <Loader />;\n}\n","import { Loader, useAsync } from '@topthink/components';\nimport { useNavigate } from 'react-router-dom';\nimport { useAppState } from '../components/app-provider';\n\ninterface LogoutProps {\n onLogout: () => Promise<void>;\n}\n\nexport default function Logout({ onLogout }: LogoutProps) {\n const navigate = useNavigate();\n const [, setApp] = useAppState();\n useAsync(async () => {\n await onLogout();\n setApp(app => ({ ...app, user: null }));\n navigate('/login', { state: { from: 'logout' } });\n }, []);\n\n return <Loader />;\n}\n","import { Card } from '@topthink/components';\nimport { Col, Container, Row } from 'react-bootstrap';\nimport { ReactElement, ReactNode } from 'react';\n\nexport interface LoginProps {\n onAuthorize: (url: string, query?: Record<string, string>) => void;\n onLogined: (token?: string) => ReactElement;\n}\n\ninterface Props extends LoginProps {\n onLogin: (props: LoginProps) => ReactNode;\n}\n\nexport default function Login({ onLogin, onLogined, onAuthorize }: Props) {\n return <Container className=\"vh-100 d-flex align-items-center\">\n <Row className=\"flex-fill\">\n <Col lg={{ span: 6, offset: 3 }} xxl={{ span: 4, offset: 4 }}>\n <Card className=\"p-5\">\n {onLogin({ onAuthorize, onLogined })}\n </Card>\n </Col>\n </Row>\n </Container>;\n}\n","import { createBrowserRouter, createHashRouter, createMemoryRouter, RouteObject, RouterProvider, useNavigate } from 'react-router-dom';\nimport Social from '../pages/social';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { getAbsoluteUrl, Loader, Modal, request, ToastProvider, useAsyncEffect } from '@topthink/components';\nimport AppProvider, { useAppState } from '../components/app-provider';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport Login, { LoginProps } from '../pages/login';\nimport { AppResolver, Promisable, User, UserResolver } from './types';\nimport { Fragment, ReactElement, ReactNode } from 'react';\n\n\ninterface Component<P = {}> {\n (props: P): (ReactElement | null);\n}\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ntype RouterType = 'browser' | 'hash' | 'memory';\n\ninterface Options {\n routerType?: RouterType;\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n implicit?: boolean;\n onLogout?: () => Promisable<void>;\n onAuthorize?: (token?: any) => Promisable<void | string | undefined>;\n onLogin: (props: LoginProps) => ReactNode;\n appResolver?: AppResolver;\n userResolver: UserResolver;\n routes: RouteObject[];\n extraRoutes?: RouteObject[];\n RootComponent?: Component;\n}\n\nexport default function createApplication(options: Options) {\n const {\n routerType = 'browser',\n basename = '/',\n onAuthorize,\n onLogout,\n onLogin,\n authentication = 'token',\n implicit,\n baseURL,\n appResolver,\n userResolver,\n routes,\n RootComponent = Fragment,\n extraRoutes = [],\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const updateToken = (token?: string) => {\n if (authentication === 'token' && request.defaults.authTokenName) {\n if (token) {\n localStorage.setItem(request.defaults.authTokenName, token);\n } else {\n localStorage.removeItem(request.defaults.authTokenName);\n }\n }\n };\n\n const getToken = () => {\n if (authentication === 'token' && request.defaults.authTokenName) {\n return localStorage.getItem(request.defaults.authTokenName);\n }\n };\n\n const handleResolved = (user: User) => {\n if (user.token) {\n updateToken(user.token);\n } else {\n user.token = getToken();\n }\n };\n\n const handleAuthorize = (url: string, query?: Record<string, string>) => {\n const { from } = window.history.state.usr || {};\n\n if (from && from !== 'logout') {\n sessionStorage.setItem('restore_uri', stripBasename(from, basename));\n }\n\n const redirectUri = queryString.stringifyUrl({\n url: getAbsoluteUrl(path.join(basename, '/social')),\n query,\n });\n\n if (!implicit) {\n sessionStorage.setItem('redirect_uri', redirectUri);\n }\n\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri },\n });\n };\n\n const Logined = ({ url }: { url: string }) => {\n const [, , getUser] = useAppState();\n const navigate = useNavigate();\n useAsyncEffect(async () => {\n await getUser();\n navigate(url, { replace: true });\n }, []);\n\n return <Loader />;\n };\n\n const handleLogined = (token?: string) => {\n updateToken(token);\n\n const { from } = window.history.state.usr || {};\n let redirectUri: string | null;\n if (from && from !== 'logout') {\n redirectUri = stripBasename(from, basename);\n } else {\n redirectUri = sessionStorage.getItem('restore_uri');\n if (redirectUri) {\n sessionStorage.removeItem('restore_uri');\n }\n }\n\n return <Logined url={redirectUri || '/'} />;\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch (e) {\n\n }\n }\n\n updateToken();\n };\n\n const routeObjects: RouteObject[] = [\n ...extraRoutes,\n {\n path: 'social',\n element: <Social implicit={implicit} onAuthorize={onAuthorize} onLogined={handleLogined} />,\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />,\n },\n {\n path: 'login',\n element: <Login onLogin={onLogin} onAuthorize={handleAuthorize} onLogined={handleLogined} />,\n },\n {\n path: '*',\n element: <UserProvider />,\n children: transformRoutes(routes),\n },\n ];\n\n const createRouter = {\n browser: createBrowserRouter,\n hash: createHashRouter,\n memory: createMemoryRouter,\n }[routerType];\n\n const router = createRouter(routeObjects, { basename });\n\n return function () {\n return <ToastProvider>\n <AppProvider appResolver={appResolver} userResolver={userResolver} onResolved={handleResolved}>\n <RootComponent>\n <RouterProvider router={router} />\n </RootComponent>\n </AppProvider>\n <Modal.Message />\n </ToastProvider>;\n };\n}\n"],"names":["_g","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","SvgExternal","props","React","createElement","xmlns","width","height","fill","d","formatRelativePath","app","routes","parent","menus","user","undefined","route","meta","path","children","hideInMenu","access","passed","Number","access_level","Array","isArray","intersection","roles","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","AppContext","createContext","AppProvider","appResolver","userResolver","onResolved","setApp","useState","execute","getUser","useAsyncCallback","async","onError","isRequestError","response","status","current","onSuccess","error","useAsync","Result","message","Provider","value","Loader","useAppState","context","useContext","Error","useApp","useMenu","matches","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","transformRoutes","map","index","hideMenu","SiderContext","useSider","Toggle","sider","Trigger","onClick","setShow","styled","div","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","target","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","header","headerAs","footer","footerAs","top","isMobile","useWindowSize","defaultTitle","showToggle","setShowToggle","pathname","key","useLocation","siderRef","useRef","useMatches","reduce","selectedKeys","keys","split","pre","curr","join","openKeys","setOpenKeys","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Routes","Outlet","Title","FooterComp","Footer","sidebar","Sidebar","Header","Menu","mode","siderToggle","show","toggle","headless","GlobalStyle","$top","Container","Sider","ref","Offcanvas","container","onHide","placement","style","Content","Main","memo","useRoutes","nav","main","RcMenu","createGlobalStyle","p","extra","showBack","bodyAs","fixed","isFinite","Boolean","defaultShowBack","navigate","useNavigate","location","$fixed","Back","Extra","Body","as","css","TabLayout","Dropdown","variant","size","Item","active","StyledNav","Nav","NavLink","classNames","UserContext","UserProvider","setUser","redirectUri","window","search","Navigate","state","from","refresh","useUser","Avatar","a","logo","src","navbar","avatar","Access","require","fallback","_Fragment","LinkButton","Button","preventDefault","Context","Inner","request","result","useRequest","wrap","WithRequest","params","useParams","url","all","name","useRequestData","Social","onLogined","onAuthorize","implicit","token","parsed","queryString","parse","hash","access_token","redirect_uri","sessionStorage","getItem","newToken","data","isRecord","Card","Logout","onLogout","Login","onLogin","Row","Col","lg","span","offset","xxl","stripBasename","basename","createApplication","options","routerType","authentication","baseURL","RootComponent","Fragment","extraRoutes","defaults","updateToken","authTokenName","localStorage","setItem","removeItem","handleResolved","getToken","Logined","useAsyncEffect","handleLogined","history","usr","routeObjects","element","handleAuthorize","query","stringifyUrl","getAbsoluteUrl","router","createRouter","browser","createBrowserRouter","createHashRouter","memory","createMemoryRouter","ToastProvider","RouterProvider","Modal","Message"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topthink/common",
3
- "version": "1.6.10",
3
+ "version": "1.6.11",
4
4
  "scripts": {
5
5
  "prebuild": "rimraf lib types",
6
6
  "build": "rollup -c --environment NODE_ENV:production",
@@ -51,5 +51,5 @@
51
51
  },
52
52
  "author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
53
53
  "license": "MIT",
54
- "gitHead": "3805ea3590d7a332559eb54464dfb457e09a4bbb"
54
+ "gitHead": "e69be5d8285400454f26239ae5a86c0be94741db"
55
55
  }
@@ -5,7 +5,9 @@ import { ReactElement, ReactNode } from 'react';
5
5
  interface Component<P = {}> {
6
6
  (props: P): (ReactElement | null);
7
7
  }
8
+ type RouterType = 'browser' | 'hash' | 'memory';
8
9
  interface Options {
10
+ routerType?: RouterType;
9
11
  baseURL?: string;
10
12
  basename?: string;
11
13
  authentication?: 'cookie' | 'token';