@topthink/common 1.5.28 → 1.5.30

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 i,MenuItem as n}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,useParams as g,Navigate 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{useAsync as R,Loader as I,styled as M,createGlobalStyle as S,useWindowSize as $,Offcanvas as E,css as C,isRequestError as q,Button as P,useRequest as j,isRecord as O,Card as T,Result as U,request as B,ToastProvider as F,Modal as H,getAbsoluteUrl as V}from"@topthink/components";export*from"@topthink/components";import{intersection as D}from"lodash";import{Nav as W,Dropdown as K,Container as G,Row as J,Col as Q}from"react-bootstrap";import X from"classnames";import Y from"query-string";import*as Z from"path";var ee;function ce(){return ce=Object.assign?Object.assign.bind():function(e){for(var c=1;c<arguments.length;c++){var t=arguments[c];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},ce.apply(this,arguments)}const te=e=>v.createElement("svg",ce({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},e),ee||(ee=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"})))),re=function(c,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"/";const i=[];for(const n of t){let{meta:t={},path:o="",children:s=[]}=n;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(c.user?.access_level||0)>=e:(Array.isArray(e)||(e=[e]),r=D(c.user?.roles||[],e).length>0),!r)continue}const a=t.title;if(!a)continue;let l=!1;t.href?(l=!0,o=t.href):o=`${r}/${o}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const d={title:a,icon:"string"==typeof t.icon?e("i",{className:`bi bi-${t.icon}`}):t.icon,path:o,isExternal:l,children:[]};!t.hideChildrenInMenu&&!l&&s.length>0&&(d.children=re(c,s,o)),i.push(d)}return i};const ie=b(null);function ne(c){let{appResolver:t,children:r}=c;const[i,n]=w(null);return R((async()=>{if(t)return t()}),[],{onSuccess(e){n(e||{})}}),i?e(ie.Provider,{value:[i,n],children:r}):e(I,{})}function oe(){const e=y(ie);if(!e)throw new Error("useApp must be used within a AppProvider");return e}function se(){const[e]=oe();return e}function ae(e){const{matches:c}=y(o),t=se(),r=c[c.length-1],i=r.pathnameBase||"/",n=e||r.route.children||[],s=_((()=>function(e,c){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"/";return re(e,c,t)}(t,n,i)),[t,n,i]);return[s,_((()=>c.reduceRight(((e,c)=>e||c.route.handle?.title),void 0)),[c])]}function le(e,c){return e.map((e=>{e.children&&(e.children=le(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 i=e.meta?.access;return void 0!==i&&(e.handle.access=i),e}))}const de=b(void 0),he=()=>y(de);function ue(){const c=he();return e(ge,{onClick:()=>c?.setShow(!0),children:e("i",{className:"bi bi-list"})})}const ge=M.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,useParams as g,Navigate 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{useAsync as R,Loader as I,styled as M,createGlobalStyle as S,useWindowSize as $,Offcanvas as E,css as C,isRequestError as q,Button as P,useRequest as T,isRecord as U,Card as j,Result as O,request as B,ToastProvider as F,Modal as H,getAbsoluteUrl as V}from"@topthink/components";export*from"@topthink/components";import{intersection as D}from"lodash";import{Nav as W,Dropdown as K,Container as G,Row as J,Col as Q}from"react-bootstrap";import X from"classnames";import Y from"query-string";import*as Z from"path";var ee;function ce(){return ce=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},ce.apply(null,arguments)}const te=e=>v.createElement("svg",ce({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},e),ee||(ee=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"})))),re=(c,t,r="/")=>{const n=[];for(const i of t){let{meta:t={},path:o="",children:s=[]}=i;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(c.user?.access_level||0)>=e:(Array.isArray(e)||(e=[e]),r=D(c.user?.roles||[],e).length>0),!r)continue}const a=t.title;if(!a)continue;let l=!1;t.href?(l=!0,o=t.href):o=`${r}/${o}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const d={title:a,icon:"string"==typeof t.icon?e("i",{className:`bi bi-${t.icon}`}):t.icon,path:o,isExternal:l,children:[]};!t.hideChildrenInMenu&&!l&&s.length>0&&(d.children=re(c,s,o)),n.push(d)}return n};const ne=b(null);function ie({appResolver:c,children:t}){const[r,n]=w(null);return R(async()=>{if(c)return c()},[],{onSuccess(e){n(e||{})}}),r?e(ne.Provider,{value:[r,n],children:t}):e(I,{})}function oe(){const e=y(ne);if(!e)throw new Error("useApp must be used within a AppProvider");return e}function se(){const[e]=oe();return e}function ae(e){const{matches:c}=y(o),t=se(),r=c[c.length-1],n=r.pathnameBase||"/",i=e||r.route.children||[],s=_(()=>function(e,c,t="/"){return re(e,c,t)}(t,i,n),[t,i,n]);return[s,_(()=>c.reduceRight((e,c)=>e||c.route.handle?.title,void 0),[c])]}function le(e,c){return e.map(e=>{e.children&&(e.children=le(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 de=b(void 0),he=()=>y(de);function ue(){const c=he();return e(ge,{onClick:()=>c?.setShow(!0),children:e("i",{className:"bi bi-list"})})}const ge=M.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 me=t=>t.map((t=>{const r=c(Ae,{children:[t.icon,t.title,t.isExternal&&e(te,{})]});return t.children.length>0?e(i,{title:r,children:me(t.children)},t.path):e(n,{children:t.isExternal?e("a",{href:t.path,target:"_blank",children:r}):e(h,{to:t.path,children:r})},t.path)})),pe=()=>({height:0}),fe=e=>({height:e.scrollHeight}),ve={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:pe,onAppearActive:fe,onEnterStart:pe,onEnterActive:fe,onLeaveStart:fe,onLeaveActive:pe};function xe(t){let{className:r,title:i,header:n,headerAs:o,footer:a,footerAs:h,top:u=54,routes:g}=t;const{isMobile:m}=$(),[p,f]=ae(g),[v,x]=w(!1),{pathname:b,key:y}=l(),k=N(null),{hideMenu:A=!1}=s().reduce(((e,c)=>({...e,...c.handle})),{}),R=_((()=>{const e=[];return b.split("/").reduce(((c,t)=>(c.length>1&&e.push(c.join("/")),[...c,t])),[]),e.push(b),e}),[b]),[I,M]=w([]);z((()=>{x(!1)}),[y]),z((()=>{M(R.slice(0,-1))}),[R]);const S=L((e=>{const c=e[e.length-1];M(e.filter((e=>c.startsWith(e))))}),[I,M]),C=g?e(be,{routes:g}):e(d,{});if(A)return C;n||(n=e(ye,{children:i||f}));const q=h||ke,P=c(we,{className:r,children:[e(o||_e,{children:n}),e(Re,{mode:"inline",motion:ve,openKeys:I,onOpenChange:S,selectedKeys:R,children:me(p)}),e(q,{children:a})]}),j=m?e(ue,{}):null;return c(de.Provider,{value:{show:v,setShow:x,toggle:j,headless:0==u},children:[e(Me,{$top:u}),c(Ie,{children:[e(ze,{ref:k,children:m?e(E,{container:k,show:v,onHide:()=>{x(!1)},placement:"start",style:{width:"231px"},children:P}):P}),e(Ne,{children:e(Le,{children:C})})]})]})}const be=k((function(e){let{routes:c}=e;return a(_((()=>le(c)),[c]))})),we=M.nav`
9
+ `;const me=t=>t.map(t=>{const r=c(Ae,{children:[t.icon,t.title,t.isExternal&&e(te,{})]});return t.children.length>0?e(n,{title:r,children:me(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)}),pe=()=>({height:0}),fe=e=>({height:e.scrollHeight}),ve={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:pe,onAppearActive:fe,onEnterStart:pe,onEnterActive:fe,onLeaveStart:fe,onLeaveActive:pe};function xe({className:t,title:r,header:n,headerAs:i,footer:o,footerAs:a,top:h=54,routes:u}){const{isMobile:g}=$(),[m,p]=ae(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(be,{routes:u}):e(d,{});if(k)return S;n||(n=e(ye,{children:r||p}));const C=a||ke,q=c(we,{className:t,children:[e(i||_e,{children:n}),e(Re,{mode:"inline",motion:ve,openKeys:R,onOpenChange:M,selectedKeys:A,children:me(m)}),e(C,{children:o})]}),P=g?e(ue,{}):null;return c(de.Provider,{value:{show:f,setShow:v,toggle:P,headless:0==h},children:[e(Me,{$top:h}),c(Ie,{children:[e(ze,{ref:y,children:g?e(E,{container:y,show:f,onHide:()=>{v(!1)},placement:"start",style:{width:"231px"},children:q}):q}),e(Ne,{children:e(Le,{children:S})})]})]})}const be=k(function({routes:e}){return a(_(()=>le(e),[e]))}),we=M.nav`
10
10
  position: fixed;
11
11
  top: var(--bs-header-height, 0);
12
12
  bottom: 0;
@@ -223,7 +223,7 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
223
223
  :root {
224
224
  --bs-header-height: ${e=>e.$top}px;
225
225
  }
226
- `;function Se(t){let{title:r,header:i,nav:n,children:s,extra:a,showBack:d,className:h,bodyAs:g,fixed:m=!0}=t;const{matches:p}=y(o),f=_((()=>p.reduceRight(((e,c)=>e||c.route.index?e:c.route),void 0)),[p]),v=he(),x=Number.isFinite(m)?Number(m):!v||v.headless?0:54;m=!!Number.isFinite(m)||Boolean(m);const b=!0===f?.handle?.hideInMenu,w=f?.handle?.title,k=u(),N=l();return void 0===d&&(d=b),void 0===i&&(i=e(Pe,{className:"fs-4 text-truncate",children:r||w})),c(Ee,{className:h,children:[e(Ce,{$fixed:m,$top:x,children:c("div",{className:"container",children:[v?.toggle,d&&("default"!==N.key||"string"==typeof d)&&e($e,{onClick:()=>k("string"==typeof d?d:-1),children:e("i",{className:"bi bi-arrow-left-short"})}),i,n,e(je,{children:a})]})}),e(qe,{className:"container",as:g,children:s})]})}const $e=M.div`
226
+ `;function Se({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=he(),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(Pe,{className:"fs-4 text-truncate",children:t||b})),c(Ee,{className:d,children:[e(Ce,{$fixed:g,$top:v,children:c("div",{className:"container",children:[f?.toggle,a&&("default"!==k.key||"string"==typeof a)&&e($e,{onClick:()=>w("string"==typeof a?a:-1),children:e("i",{className:"bi bi-arrow-left-short"})}),r,n,e(Te,{children:s})]})}),e(qe,{className:"container",as:h,children:i})]})}const $e=M.div`
227
227
  font-size: 32px;
228
228
  cursor: pointer;
229
229
  `,Ee=M.div`
@@ -274,12 +274,12 @@ import{jsx as e,jsxs as c,Fragment as t}from"react/jsx-runtime";import r,{SubMen
274
274
  white-space: nowrap;
275
275
  min-width: 50px;
276
276
  flex-shrink: 0;
277
- `,je=M.div`
277
+ `,Te=M.div`
278
278
  margin-left: auto;
279
- `;function Oe(t){let{title:r,header:i,showBack:n,extra:o}=t;const[s,a]=ae(),{pathname:u}=l(),{isMobile:g}=$(),m=g?c(K,{className:"ms-2 d-flex align-items-center",children:[e(K.Toggle,{variant:"light",size:"sm"}),e(K.Menu,{children:s.map((e=>c(K.Item,{active:u.startsWith(e.path),as:h,to:e.path,replace:!0,children:[e.icon,e.title]},e.path)))})]}):e(Te,{children:s.map((t=>e(W.Item,{children:c(Ue,{className:X("nav-link",{active:u.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path)))});return e(Se,{title:r||a,header:i,nav:m,showBack:n,extra:o,children:e(d,{})})}const Te=M(W)`
279
+ `;function Ue({title:t,header:r,showBack:n,extra:i}){const[o,s]=ae(),{pathname:a}=l(),{isMobile:u}=$(),g=u?c(K,{className:"ms-2 d-flex align-items-center",children:[e(K.Toggle,{variant:"light",size:"sm"}),e(K.Menu,{children:o.map(e=>c(K.Item,{active:a.startsWith(e.path),as:h,to:e.path,replace:!0,children:[e.icon,e.title]},e.path))})]}):e(je,{children:o.map(t=>e(W.Item,{children:c(Oe,{className:X("nav-link",{active:a.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path))});return e(Se,{title:t||s,header:r,nav:g,showBack:n,extra:i,children:e(d,{})})}const je=M(W)`
280
280
  flex-wrap: nowrap;
281
281
  margin-left: 1.25rem;
282
- `,Ue=M(h)`
282
+ `,Oe=M(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 Be=x.createContext(null),Fe=function(c){let{userResolver:t,onResolved:r}=c;const[i,n]=oe(),{user:o}=i,s=L((e=>{n("function"==typeof e?c=>({...c,user:e(c.user)}):c=>({...c,user:e}))}),[]),a=u(),{execute:l}=R((async()=>{if(t){const e=await t();return r(e),e}}),[],{async onError(e){if(q(e)&&401===e.response?.status){const e=window.location.pathname+window.location.search;a("/login",{state:{from:e}})}},onSuccess(e){e&&s(e)}});if(!o)return e(I,{});const h=[o,s,l];return h.user=o,h.setUser=s,h.refresh=l,e(Be.Provider,{value:h,children:e(d,{})})};function He(){const e=y(Be);if(!e)throw new Error("please use `useUser` in UserContext");return e}const Ve=M.a`
305
+ `;const Be=x.createContext(null),Fe=function({userResolver:c,onResolved:t}){const[r,n]=oe(),{user:i}=r,o=L(e=>{n("function"==typeof e?c=>({...c,user:e(c.user)}):c=>({...c,user:e}))},[]),s=u(),{execute:a}=R(async()=>{if(c){const e=await c();return t(e),e}},[],{async onError(e){if(q(e)&&401===e.response?.status){const e=window.location.pathname+window.location.search;s("/login",{state:{from:e}})}},onSuccess(e){e&&o(e)}});if(!i)return e(I,{});const l=[i,o,a];return l.user=i,l.setUser=o,l.refresh=a,e(Be.Provider,{value:l,children:e(d,{})})};function He(){const e=y(Be);if(!e)throw new Error("please use `useUser` in UserContext");return e}const Ve=M.a`
306
306
  cursor: pointer;
307
- `;function De(t){let{children:r,menus:i,className:n,logo:o=!0}=t;const[s]=He();return e(We,{className:X("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",n),children:c("div",{className:"container-fluid",children:[o&&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"})}),r,c(K,{navbar:!0,children:[e(K.Toggle,{as:Ve,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:s.avatar})}),e(K.Menu,{className:"shadow",children:i})]})]})})}const We=M.header`
307
+ `;function De({children:t,menus:r,className:n,logo:i=!0}){const[o]=He();return e(We,{className:X("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(K,{navbar:!0,children:[e(K.Toggle,{as:Ve,className:"nav-link",children:e("img",{className:"rounded-circle",width:"25",height:"25",src:o.avatar})}),e(K.Menu,{className:"shadow",children:r})]})]})})}const We=M.header`
308
308
  height: 54px;
309
- `;function Ke(c){let{require:r,children:i,fallback:n}=c;const[o]=He();let s=!1;return"function"==typeof r?s=r(o):("string"==typeof r&&(r=[r]),s=D(o.roles,r).length>0),s||(i=n),e(t,{children:i})}function Ge(c){let{to:t,replace:r,...i}=c,n=u();return e(P,{...i,onClick:e=>{e.preventDefault(),n(t,{replace:r})}})}const Je=b(void 0),Qe=function(c){let{request:t,children:r}=c;const{result:i}=j(t);return i?e(Je.Provider,{value:i,children:r}):e(I,{wrap:!0})};function Xe(c){let{request:t,children:r}=c;const i=g();return"string"==typeof t?t={url:t.replace(/:(\w+)/g,((e,c)=>i[c]||e))}:t.url&&(t.url=t.url.replace(/:(\w+)/g,((e,c)=>i[c]||e))),e(Qe,{request:t,children:r},t.url)}function Ye(){return y(Je)}function Ze(c){let{onLogined:t,onAuthorize:r,implicit:i=!0}=c;const{result:n,error:o}=R((async()=>{let e;if(i){const c=Y.parse(window.location.hash);c.access_token&&(e=c.access_token)}else{const c=Y.parse(window.location.search);c&&(e=c,e.redirect_uri=sessionStorage.getItem("redirect_uri"))}if(r)try{const c=await r(e);c&&(e=c)}catch(e){if(q(e)){const c=e.response?.data;if(O(c))throw new Error(c.message)}throw e}return t(e)}),[]);return o?e(G,{className:"mt-5",children:e(T,{children:e(U,{status:"error",title:o.message})})}):n?e(m,{to:n,replace:!0}):e(I,{})}function ec(c){let{onLogout:t}=c;const r=u();return R((async()=>{await t(),r("/login",{state:{from:"logout"}})}),[]),e(I,{})}function cc(c){let{onLogin:t,onLogined:r,onAuthorize:i}=c;return e(G,{className:"vh-100 d-flex align-items-center",children:e(J,{className:"flex-fill",children:e(Q,{lg:{span:6,offset:3},xxl:{span:4,offset:4},children:e(T,{className:"p-5",children:t({onAuthorize:i,onLogined:r})})})})})}function tc(e,c){return"/"===c?e:e.slice(c.length)}function rc(t){const{basename:r="/",onAuthorize:i,onLogout:n,onLogin:o,authentication:s="token",implicit:a,baseURL:l,appResolver:d,userResolver:h,routes:u,RootComponent:g=A,extraRoutes:m=[]}=t;l&&(B.defaults.baseURL=l);const v=e=>{"token"===s&&B.defaults.authTokenName&&(e?localStorage.setItem(B.defaults.authTokenName,e):localStorage.removeItem(B.defaults.authTokenName))},x=e=>{v(e);const{from:c}=window.history.state.usr||{};let t;return c&&"logout"!==c?t=tc(c,r):(t=sessionStorage.getItem("restore_uri"),t&&sessionStorage.removeItem("restore_uri")),t||"/"},b=p([{path:"*",element:e(Fe,{userResolver:h,onResolved:e=>{e.token?v(e.token):e.token=(()=>{if("token"===s&&B.defaults.authTokenName)return localStorage.getItem(B.defaults.authTokenName)})()}}),children:le(u)},{path:"social",element:e(Ze,{implicit:a,onAuthorize:i,onLogined:x})},{path:"logout",element:e(ec,{onLogout:async()=>{if(n)try{await n()}catch(e){}v()}})},{path:"login",element:e(cc,{onLogin:o,onAuthorize:(e,c)=>{const{from:t}=window.history.state.usr||{};t&&"logout"!==t&&sessionStorage.setItem("restore_uri",tc(t,r));const i=Y.stringifyUrl({url:V(Z.join(r,"/social")),query:c});a||sessionStorage.setItem("redirect_uri",i),window.location.href=Y.stringifyUrl({url:e,query:{redirect_uri:i}})},onLogined:x})},...m],{basename:r});return function(){return c(F,{children:[e(ne,{appResolver:d,children:e(g,{children:e(f,{router:b})})}),e(H.Message,{})]})}}export{Ke as Access,Se as Content,De as Header,Ge as LinkButton,xe as SiderLayout,Oe as TabLayout,Xe as WithRequest,rc as createApplication,se as useApp,oe as useAppState,Ye as useRequestData,He as useUser};
309
+ `;function Ke({require:c,children:r,fallback:n}){const[i]=He();let o=!1;return"function"==typeof c?o=c(i):("string"==typeof c&&(c=[c]),o=D(i.roles,c).length>0),o||(r=n),e(t,{children:r})}function Ge({to:c,replace:t,...r}){let n=u();return e(P,{...r,onClick:e=>{e.preventDefault(),n(c,{replace:t})}})}const Je=b(void 0),Qe=function({request:c,children:t}){const{result:r}=T(c);return r?e(Je.Provider,{value:r,children:t}):e(I,{wrap:!0})};function Xe({request:c,children:t}){const r=g();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(Qe,{request:c,children:t},c.url)}function Ye(){return y(Je)}function Ze({onLogined:c,onAuthorize:t,implicit:r=!0}){const{result:n,error:i}=R(async()=>{let e;if(r){const c=Y.parse(window.location.hash);c.access_token&&(e=c.access_token)}else{const c=Y.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(q(e)){const c=e.response?.data;if(U(c))throw new Error(c.message)}throw e}return c(e)},[]);return i?e(G,{className:"mt-5",children:e(j,{children:e(O,{status:"error",title:i.message})})}):n?e(m,{to:n,replace:!0}):e(I,{})}function ec({onLogout:c}){const t=u();return R(async()=>{await c(),t("/login",{state:{from:"logout"}})},[]),e(I,{})}function cc({onLogin:c,onLogined:t,onAuthorize:r}){return e(G,{className:"vh-100 d-flex align-items-center",children:e(J,{className:"flex-fill",children:e(Q,{lg:{span:6,offset:3},xxl:{span:4,offset:4},children:e(j,{className:"p-5",children:c({onAuthorize:r,onLogined:t})})})})})}function tc(e,c){return"/"===c?e:e.slice(c.length)}function rc(t){const{basename:r="/",onAuthorize:n,onLogout:i,onLogin:o,authentication:s="token",implicit:a,baseURL:l,appResolver:d,userResolver:h,routes:u,RootComponent:g=A,extraRoutes:m=[]}=t;l&&(B.defaults.baseURL=l);const v=e=>{"token"===s&&B.defaults.authTokenName&&(e?localStorage.setItem(B.defaults.authTokenName,e):localStorage.removeItem(B.defaults.authTokenName))},x=e=>{v(e);const{from:c}=window.history.state.usr||{};let t;return c&&"logout"!==c?t=tc(c,r):(t=sessionStorage.getItem("restore_uri"),t&&sessionStorage.removeItem("restore_uri")),t||"/"},b=p([{path:"*",element:e(Fe,{userResolver:h,onResolved:e=>{e.token?v(e.token):e.token=(()=>{if("token"===s&&B.defaults.authTokenName)return localStorage.getItem(B.defaults.authTokenName)})()}}),children:le(u)},{path:"social",element:e(Ze,{implicit:a,onAuthorize:n,onLogined:x})},{path:"logout",element:e(ec,{onLogout:async()=>{if(i)try{await i()}catch(e){}v()}})},{path:"login",element:e(cc,{onLogin:o,onAuthorize:(e,c)=>{const{from:t}=window.history.state.usr||{};t&&"logout"!==t&&sessionStorage.setItem("restore_uri",tc(t,r));const n=Y.stringifyUrl({url:V(Z.join(r,"/social")),query:c});a||sessionStorage.setItem("redirect_uri",n),window.location.href=Y.stringifyUrl({url:e,query:{redirect_uri:n}})},onLogined:x})},...m],{basename:r});return function(){return c(F,{children:[e(ie,{appResolver:d,children:e(g,{children:e(f,{router:b})})}),e(H.Message,{})]})}}export{Ke as Access,Se as Content,De as Header,Ge as LinkButton,xe as SiderLayout,Ue as TabLayout,Xe as WithRequest,rc as createApplication,se as useApp,oe as useAppState,Ye as useRequestData,He 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';\r\nimport { ReactNode } from 'react';\r\nimport { App } from './types';\r\nimport { intersection } from 'lodash';\r\n\r\nexport interface MenuData {\r\n path: string;\r\n title: string;\r\n icon?: ReactNode;\r\n isExternal?: boolean;\r\n children: MenuData[];\r\n}\r\n\r\nconst formatRelativePath = (app: App, routes: RouteObject[], parent: string = '/'): MenuData[] => {\r\n\r\n const menus: MenuData[] = [];\r\n\r\n for (const route of routes) {\r\n\r\n let { meta = {}, path = '', children = [] } = route;\r\n\r\n if (meta.hideInMenu) {\r\n continue;\r\n }\r\n\r\n if (meta.access) {\r\n let access = meta.access;\r\n let passed = false;\r\n if (typeof access === 'function') {\r\n passed = access(app);\r\n } else if (typeof access === 'number') {\r\n passed = Number(app.user?.access_level || 0) >= access;\r\n } else {\r\n if (!Array.isArray(access)) {\r\n access = [access];\r\n }\r\n\r\n passed = intersection((app.user?.roles || []), access).length > 0;\r\n }\r\n if (!passed) {\r\n continue;\r\n }\r\n }\r\n\r\n const title = meta.title;\r\n\r\n if (!title) {\r\n continue;\r\n }\r\n\r\n let isExternal = false;\r\n\r\n if (meta.href) {\r\n isExternal = true;\r\n path = meta.href;\r\n } else {\r\n path = `${parent}/${path}`.replace(/\\/{2,}/g, '/').replace(/\\/$/, '');\r\n }\r\n\r\n const icon = typeof meta.icon === 'string' ?\r\n <i className={`bi bi-${meta.icon}`} /> : meta.icon;\r\n\r\n const menu: MenuData = {\r\n title,\r\n icon,\r\n path,\r\n isExternal,\r\n children: []\r\n };\r\n\r\n if (!meta.hideChildrenInMenu && !isExternal && children.length > 0) {\r\n menu.children = formatRelativePath(app, children, path);\r\n }\r\n\r\n menus.push(menu);\r\n }\r\n\r\n return menus;\r\n};\r\n\r\nexport default function getMenuData(app: App, routes: RouteObject[], base: string = '/'): MenuData[] {\r\n return formatRelativePath(app, routes, base);\r\n}\r\n","import { Dispatch, ReactNode, SetStateAction, createContext, useContext, useState } from 'react';\r\nimport { App, AppResolver } from '../utils/types';\r\nimport { Loader, useAsync } from '@topthink/components';\r\n\r\ntype AppContextType = [App, Dispatch<SetStateAction<App>>];\r\n\r\nexport const AppContext = createContext<AppContextType | null>(null);\r\n\r\ninterface Props {\r\n appResolver?: AppResolver;\r\n children: ReactNode;\r\n}\r\n\r\nexport default function AppProvider({ appResolver, children }: Props) {\r\n const [app, setApp] = useState<App | null>(null);\r\n\r\n useAsync(async () => {\r\n if (appResolver) {\r\n return appResolver();\r\n }\r\n }, [], {\r\n onSuccess(app) {\r\n setApp(app || {});\r\n }\r\n });\r\n\r\n if (!app) {\r\n return <Loader />;\r\n }\r\n\r\n return <AppContext.Provider value={[app, setApp]}>\r\n {children}\r\n </AppContext.Provider>;\r\n}\r\n\r\nexport function useAppState() {\r\n const context = useContext(AppContext);\r\n if (!context) {\r\n throw new Error('useApp must be used within a AppProvider');\r\n }\r\n return context;\r\n}\r\n\r\nexport function useApp() {\r\n const [app] = useAppState();\r\n return app;\r\n}\r\n","import { useContext, useMemo } from 'react';\r\nimport { RouteObject, UNSAFE_RouteContext } from 'react-router-dom';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\nimport { useApp } from '../components/app-provider';\r\n\r\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\r\n\r\n const { matches } = useContext(UNSAFE_RouteContext);\r\n const app = useApp();\r\n const routeMatch = matches[matches.length - 1];\r\n const pathnameBase = routeMatch.pathnameBase || '/';\r\n\r\n const routesMatch = routes || routeMatch.route.children || [];\r\n\r\n const menu = useMemo(() => getMenuData(app, routesMatch, pathnameBase), [app, routesMatch, pathnameBase]);\r\n\r\n const title = useMemo(() => {\r\n return matches.reduceRight((title, match) => {\r\n if (title) return title;\r\n return match.route.handle?.title;\r\n }, undefined);\r\n }, [matches]);\r\n\r\n return [menu, title];\r\n}\r\n","import { RouteObject } from 'react-router-dom';\r\n\r\nexport default function transformRoutes(routes: RouteObject[], hideInMenu?: boolean) {\r\n return routes.map((route) => {\r\n if (route.children) {\r\n route.children = transformRoutes(route.children, route.meta?.hideChildrenInMenu);\r\n }\r\n\r\n route.handle = route.handle || {};\r\n\r\n const title = route.meta?.title;\r\n if (title !== undefined) {\r\n route.handle.title = title;\r\n }\r\n\r\n hideInMenu = route.meta?.hideInMenu || (hideInMenu && !route.index);\r\n if (hideInMenu !== undefined) {\r\n route.handle.hideInMenu = hideInMenu;\r\n }\r\n\r\n const hideMenu = route.meta?.hideMenu;\r\n if (hideMenu !== undefined) {\r\n route.handle.hideMenu = hideMenu;\r\n }\r\n\r\n const access = route.meta?.access;\r\n if (access !== undefined) {\r\n route.handle.access = access;\r\n }\r\n\r\n return route;\r\n });\r\n}\r\n","import { createContext, ReactNode, useContext } from 'react';\r\n\r\nexport const SiderContext = createContext<{\r\n toggle: ReactNode,\r\n show: boolean,\r\n setShow: (show: boolean) => void,\r\n headless: boolean\r\n} | undefined>(undefined);\r\n\r\nexport const useSider = () => {\r\n return useContext(SiderContext);\r\n};\r\n","import { styled } from '@topthink/components';\r\nimport { useSider } from './context';\r\n\r\nexport default function Toggle() {\r\n const sider = useSider();\r\n return <Trigger onClick={() => sider?.setShow(true)}><i className='bi bi-list' /></Trigger>;\r\n}\r\n\r\nconst Trigger = styled.div`\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n font-size: 2rem;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n`;\r\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\r\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\r\nimport { ElementType, memo, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { MenuData } from '../../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\nimport { Offcanvas, createGlobalStyle, styled, useWindowSize } from '@topthink/components';\r\nimport { ReactComponent as ExternalIcon } from '../../images/external.svg';\r\nimport useMenu from '../use-menu';\r\nimport transformRoutes from '../../utils/transform-routes';\r\nimport Toggle from './toggle';\r\nimport { SiderContext } from './context';\r\nimport useRouteHandle from '../../hooks/use-route-handle';\r\n\r\nconst renderMenuItems = (items: MenuData[]) => {\r\n return items.map((item) => {\r\n\r\n const title = <MenuTitle>\r\n {item.icon}\r\n {item.title}\r\n {item.isExternal && <ExternalIcon />}\r\n </MenuTitle>;\r\n\r\n if (item.children.length > 0) {\r\n return <SubMenu title={title} key={item.path}>\r\n {renderMenuItems(item.children)}\r\n </SubMenu>;\r\n } else {\r\n return <MenuItem key={item.path}>\r\n {item.isExternal ?\r\n <a href={item.path} target='_blank'>{title}</a> :\r\n <Link to={item.path}>{title}</Link>\r\n }\r\n </MenuItem>;\r\n }\r\n });\r\n};\r\n\r\nconst collapseNode = () => {\r\n return { height: 0 };\r\n};\r\nconst expandNode = (node: HTMLElement) => {\r\n return { height: node.scrollHeight };\r\n};\r\n\r\nconst motion: CSSMotionProps = {\r\n motionName: 'rc-menu-collapse',\r\n motionAppear: true,\r\n onAppearStart: collapseNode,\r\n onAppearActive: expandNode,\r\n onEnterStart: collapseNode,\r\n onEnterActive: expandNode,\r\n onLeaveStart: expandNode,\r\n onLeaveActive: collapseNode,\r\n};\r\n\r\ninterface Props<As extends ElementType = ElementType> {\r\n className?: string;\r\n title?: string;\r\n header?: ReactNode;\r\n headerAs?: As;\r\n footer?: ReactNode;\r\n footerAs?: As;\r\n routes?: RouteObject[];\r\n top?: number;\r\n}\r\n\r\nexport default function SiderLayout({ className, title, header, headerAs, footer, footerAs, top = 54, routes }: Props) {\r\n const { isMobile } = useWindowSize();\r\n const [menu, defaultTitle] = useMenu(routes);\r\n const [showToggle, setShowToggle] = useState(false);\r\n const { pathname, key } = useLocation();\r\n const siderRef = useRef<HTMLDivElement>(null);\r\n\r\n const { hideMenu = false } = useRouteHandle();\r\n\r\n const selectedKeys = useMemo(() => {\r\n const keys: string[] = [];\r\n const parts = pathname.split('/');\r\n parts.reduce<string[]>((pre, curr) => {\r\n if (pre.length > 1) {\r\n keys.push(pre.join('/'));\r\n }\r\n return [...pre, curr];\r\n }, []);\r\n keys.push(pathname);\r\n return keys;\r\n }, [pathname]);\r\n\r\n const [openKeys, setOpenKeys] = useState<string[]>([]);\r\n\r\n useEffect(() => {\r\n setShowToggle(false);\r\n }, [key]);\r\n\r\n useEffect(() => {\r\n setOpenKeys(selectedKeys.slice(0, -1));\r\n }, [selectedKeys]);\r\n\r\n const onOpenChange = useCallback((openKeys: string[]) => {\r\n const currentKey = openKeys[openKeys.length - 1];\r\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\r\n }, [openKeys, setOpenKeys]);\r\n\r\n const children = routes ? <Routes routes={routes} /> : <Outlet />;\r\n\r\n if (hideMenu) {\r\n return children;\r\n }\r\n\r\n if (!header) {\r\n header = <Title>{title || defaultTitle}</Title>;\r\n }\r\n\r\n const HeaderComp = headerAs || Header;\r\n\r\n const FooterComp = footerAs || Footer;\r\n\r\n const sidebar = <Sidebar className={className}>\r\n <HeaderComp>{header}</HeaderComp>\r\n <Menu\r\n mode='inline'\r\n motion={motion}\r\n openKeys={openKeys}\r\n onOpenChange={onOpenChange}\r\n selectedKeys={selectedKeys}\r\n >\r\n {renderMenuItems(menu)}\r\n </Menu>\r\n <FooterComp>{footer}</FooterComp>\r\n </Sidebar>;\r\n\r\n const siderToggle = isMobile ? <Toggle /> : null;\r\n\r\n return <SiderContext.Provider value={{\r\n show: showToggle,\r\n setShow: setShowToggle,\r\n toggle: siderToggle,\r\n headless: top == 0\r\n }}>\r\n <GlobalStyle $top={top} />\r\n <Container>\r\n <Sider ref={siderRef}>\r\n {isMobile ? <Offcanvas\r\n container={siderRef}\r\n show={showToggle}\r\n onHide={() => {\r\n setShowToggle(false);\r\n }}\r\n placement={'start'}\r\n style={{\r\n width: '231px',\r\n }}\r\n\r\n >\r\n {sidebar}\r\n </Offcanvas> : sidebar}\r\n </Sider>\r\n <Content>\r\n <Main>\r\n {children}\r\n </Main>\r\n </Content>\r\n </Container>\r\n </SiderContext.Provider>;\r\n}\r\n\r\n\r\nconst Routes = memo(function({ routes }: { routes: RouteObject[] }) {\r\n return useRoutes(useMemo(() => transformRoutes(routes), [routes]));\r\n});\r\n\r\nconst Sidebar = styled.nav`\r\n position: fixed;\r\n top: var(--bs-header-height, 0);\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n padding: 0;\r\n border-right: 1px solid #e3e3e3;\r\n width: 230px;\r\n background-color: #f5f5f5;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst Title = styled.div`\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n font-size: 16px;\r\n`;\r\n\r\nconst Header = styled.div`\r\n height: 65px;\r\n display: flex;\r\n align-items: center;\r\n padding: 10px 8px 10px 24px;\r\n border-bottom: 1px solid #e3e3e3;\r\n flex-grow: 0;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst Footer = styled.div`\r\n flex-grow: 0;\r\n flex-shrink: 0;\r\n`;\r\nconst Content = styled.div`\r\n flex: 1;\r\n @media (min-width: 992px) {\r\n margin-left: 230px;\r\n }\r\n`;\r\n\r\nconst Sider = styled.div`\r\n .offcanvas-backdrop {\r\n top: var(--bs-header-height, 0);\r\n }\r\n\r\n .offcanvas-start {\r\n top: var(--bs-header-height, 0);\r\n\r\n ${Sidebar} {\r\n position: absolute;\r\n top: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst Main = styled.main`\r\n min-height: calc(var(--100vh, 100vh) - var(--bs-header-height));\r\n position: relative;\r\n`;\r\n\r\nconst MenuTitle = styled.div`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n\r\n .bi {\r\n font-size: 16px;\r\n line-height: 18px;\r\n min-width: 19px;\r\n text-align: center;\r\n }\r\n`;\r\n\r\nconst Menu = styled(RcMenu)`\r\n border: none;\r\n box-shadow: none;\r\n padding: 10px 0;\r\n flex: 1;\r\n overflow: auto;\r\n\r\n .rc-menu-item {\r\n display: flex;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n\r\n a {\r\n flex: 1;\r\n text-decoration: none;\r\n color: dimgray;\r\n }\r\n }\r\n\r\n .rc-menu-sub {\r\n background-color: #eee;\r\n border-top: 1px solid #eee;\r\n border-bottom: 1px solid #eee;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 4px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 4px;\r\n }\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #eee;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-item {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu {\r\n & > .rc-menu-submenu-title {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-item-active,\r\n .rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item,\r\n .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding: 0 8px 0 24px;\r\n font-size: 14px;\r\n line-height: 36px;\r\n cursor: pointer;\r\n }\r\n\r\n .rc-menu-sub > .rc-menu-item,\r\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n padding-right: 0;\r\n }\r\n\r\n .rc-menu-submenu-arrow {\r\n line-height: 20px;\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #f5f5f5;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-submenu-selected {\r\n background-color: #eee;\r\n\r\n & > .rc-menu-submenu-title {\r\n color: var(--bs-primary);\r\n font-weight: 500;\r\n }\r\n }\r\n\r\n & > .rc-menu-item {\r\n line-height: 38px;\r\n }\r\n\r\n & > .rc-menu-submenu {\r\n &.rc-menu-submenu-selected {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-submenu-title {\r\n line-height: 38px;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n\r\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-sub {\r\n border-top: 1px solid #e6e6e6;\r\n border-bottom: 1px solid #e6e6e6;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 9px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 9px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n`;\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-wrap: nowrap;\r\n width: 100%;\r\n\r\n &:has(&) {\r\n > ${Sidebar} {\r\n display: none;\r\n }\r\n\r\n > ${Content} {\r\n margin-left: 0;\r\n }\r\n }\r\n`;\r\n\r\nconst GlobalStyle = createGlobalStyle<{ $top: number }>`\r\n :root {\r\n --bs-header-height: ${(p) => p.$top}px;\r\n }\r\n`;\r\n","import { useMatches } from 'react-router-dom';\r\n\r\nexport default function useRouteHandle() {\r\n const matches = useMatches();\r\n\r\n return matches.reduce<Record<string, any>>((route, match) => {\r\n return { ...route, ...match.handle };\r\n }, {});\r\n}\r\n","import { css, styled } from '@topthink/components';\r\nimport { ElementType, PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\r\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate, } from 'react-router-dom';\r\nimport { useSider } from '../layout/sider/context';\r\n\r\ninterface ContentProps<As extends ElementType = ElementType> {\r\n title?: ReactNode;\r\n header?: ReactNode;\r\n nav?: ReactNode;\r\n extra?: ReactNode;\r\n showBack?: boolean | string;\r\n fixed?: boolean | number;\r\n className?: string;\r\n bodyAs?: As;\r\n}\r\n\r\nexport default function Content({\r\n title,\r\n header,\r\n nav,\r\n children,\r\n extra,\r\n showBack,\r\n className,\r\n bodyAs,\r\n fixed = true\r\n}: PropsWithChildren<ContentProps>) {\r\n const { matches } = useContext(UNSAFE_RouteContext);\r\n const route = useMemo(() => {\r\n return matches.reduceRight<RouteObject | undefined>((route, match) => {\r\n if (route || match.route.index) return route;\r\n return match.route;\r\n }, undefined);\r\n }, [matches]);\r\n\r\n const sider = useSider();\r\n\r\n const top = Number.isFinite(fixed) ? Number(fixed) : ((!sider || sider.headless) ? 0 : 54);\r\n fixed = Number.isFinite(fixed) ? true : Boolean(fixed);\r\n const defaultShowBack = route?.handle?.hideInMenu === true;\r\n const defaultTitle = route?.handle?.title;\r\n\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n if (showBack === undefined) {\r\n showBack = defaultShowBack;\r\n }\r\n\r\n if (header === undefined) {\r\n header = <Title className={'fs-4 text-truncate'}>{title || defaultTitle}</Title>;\r\n }\r\n\r\n return <Container className={className}>\r\n <Header $fixed={fixed} $top={top}>\r\n <div className='container'>\r\n {sider?.toggle}\r\n {showBack && (location.key !== 'default' || typeof showBack === 'string') &&\r\n <Back onClick={() => typeof showBack === 'string' ? navigate(showBack) : navigate(-1)}><i className='bi bi-arrow-left-short' /></Back>}\r\n {header}\r\n {nav}\r\n <Extra>{extra}</Extra>\r\n </div>\r\n </Header>\r\n <Body className='container' as={bodyAs}>\r\n {children}\r\n </Body>\r\n </Container>;\r\n};\r\n\r\nconst Back = styled.div`\r\n font-size: 32px;\r\n cursor: pointer;\r\n`;\r\n\r\nconst Container = styled.div`\r\n width: 100%;\r\n container-type: inline-size;\r\n\r\n .container {\r\n @media (min-width: 992px) and (max-width: 1540px) {\r\n max-width: calc(100vw - 236px - 6px);\r\n }\r\n @media (max-width: 991px) {\r\n max-width: calc(100vw - 6px);\r\n }\r\n @container (max-width: 1310px) {\r\n max-width: 100cqw;\r\n }\r\n }\r\n`;\r\n\r\nconst Header = styled.div<{ $fixed?: boolean, $top: number }>`\r\n background-color: #fff;\r\n display: flex;\r\n border-bottom: 1px solid rgb(227, 227, 227);\r\n align-items: center;\r\n height: 65px;\r\n\r\n ${props => props.$fixed && css`\r\n position: sticky;\r\n top: ${props.$top}px;\r\n z-index: 1000;\r\n `};\r\n\r\n .container {\r\n padding: 0 12px;\r\n display: flex;\r\n align-items: center;\r\n gap: .5rem;\r\n }\r\n`;\r\n\r\nconst Body = styled.div`\r\n margin-top: 24px;\r\n margin-bottom: 24px;\r\n\r\n @media (max-width: 1540px) {\r\n margin-top: 1rem;\r\n margin-bottom: 1rem;\r\n }\r\n`;\r\n\r\nconst Title = styled.div`\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n min-width: 50px;\r\n flex-shrink: 0;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n margin-left: auto;\r\n`;\r\n","import { Dropdown, Nav } from 'react-bootstrap';\r\nimport Content from '../components/content';\r\nimport { Link, Outlet, useLocation } from 'react-router-dom';\r\nimport useMenu from './use-menu';\r\nimport { styled, useWindowSize } from '@topthink/components';\r\nimport classNames from 'classnames';\r\nimport { ReactNode } from 'react';\r\n\r\ninterface Props {\r\n title?: ReactNode;\r\n header?: ReactNode;\r\n showBack?: boolean;\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function TabLayout({ title, header, showBack, extra }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n const { pathname } = useLocation();\r\n const { isMobile } = useWindowSize();\r\n\r\n const nav = isMobile ? <Dropdown className='ms-2 d-flex align-items-center'>\r\n <Dropdown.Toggle variant='light' size={'sm'} />\r\n <Dropdown.Menu>\r\n {menu.map((item) => {\r\n return <Dropdown.Item active={pathname.startsWith(item.path)} as={Link} to={item.path} replace key={item.path}>\r\n {item.icon}\r\n {item.title}\r\n </Dropdown.Item>;\r\n })}\r\n </Dropdown.Menu>\r\n </Dropdown> : <StyledNav>\r\n {menu.map((item) => {\r\n return <Nav.Item key={item.path}>\r\n <NavLink className={classNames('nav-link', { active: pathname.startsWith(item.path) })} to={item.path} replace>\r\n {item.icon}\r\n {item.title}\r\n </NavLink>\r\n </Nav.Item>;\r\n })}\r\n </StyledNav>;\r\n\r\n return <Content title={title || defaultTitle} header={header} nav={nav} showBack={showBack} extra={extra}>\r\n <Outlet />\r\n </Content>;\r\n}\r\n\r\n\r\nconst StyledNav = styled(Nav)`\r\n flex-wrap: nowrap;\r\n margin-left: 1.25rem;\r\n`;\r\n\r\nconst NavLink = styled(Link)`\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n white-space: nowrap;\r\n position: relative;\r\n\r\n .bi, svg {\r\n text-align: center;\r\n }\r\n\r\n &.active {\r\n &:after {\r\n content: '';\r\n height: 2px;\r\n background: var(--bs-primary);\r\n display: block;\r\n position: absolute;\r\n left: 1rem;\r\n right: 1rem;\r\n bottom: -2px;\r\n }\r\n }\r\n`;\r\n","import { isRequestError, Loader, useAsync } from '@topthink/components';\r\nimport React, { Dispatch, SetStateAction, useCallback, useContext } from 'react';\r\nimport { Outlet, useNavigate } from 'react-router-dom';\r\nimport { User, UserResolver } from '../utils/types';\r\nimport { useAppState } from './app-provider';\r\n\r\ntype UserContextType = [User, Dispatch<SetStateAction<User>>, () => void] & {\r\n user: User,\r\n setUser: Dispatch<SetStateAction<User>>,\r\n refresh: () => void\r\n};\r\n\r\nexport const UserContext = React.createContext<UserContextType | null>(null);\r\n\r\ninterface Props {\r\n userResolver: UserResolver;\r\n onResolved: (user: User) => void;\r\n}\r\n\r\nconst UserProvider = function({ userResolver, onResolved }: Props) {\r\n const [app, setApp] = useAppState();\r\n const { user } = app;\r\n\r\n const setUser = useCallback((user?: User | ((user?: User) => (User | undefined))) => {\r\n if (typeof user === 'function') {\r\n setApp(current => ({ ...current, user: user(current.user) }));\r\n } else {\r\n setApp(current => ({ ...current, user: user }));\r\n }\r\n }, []);\r\n\r\n const navigate = useNavigate();\r\n\r\n const { execute } = useAsync(async () => {\r\n if (userResolver) {\r\n const user = await userResolver();\r\n onResolved(user);\r\n return user;\r\n }\r\n }, [], {\r\n async onError(e) {\r\n if (isRequestError(e) && e.response?.status === 401) {\r\n const redirectUri = window.location.pathname + window.location.search;\r\n navigate(`/login`, { state: { from: redirectUri } });\r\n }\r\n },\r\n onSuccess(user) {\r\n if (user) {\r\n setUser(user);\r\n }\r\n }\r\n });\r\n\r\n if (!user) {\r\n return <Loader />;\r\n }\r\n\r\n const value: any = [user, setUser, execute];\r\n\r\n value.user = user;\r\n value.setUser = setUser;\r\n value.refresh = execute;\r\n\r\n return <UserContext.Provider value={value}>\r\n <Outlet />\r\n </UserContext.Provider>;\r\n};\r\n\r\nexport function useUser() {\r\n const context = useContext(UserContext);\r\n if (!context) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport default UserProvider;\r\n","import logoSrc from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\nimport { useUser } from './user-provider';\r\nimport classNames from 'classnames';\r\nimport { styled } from '@topthink/components';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode;\r\n className?: string;\r\n logo?: boolean;\r\n}\r\n\r\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\r\n const [user] = useUser();\r\n\r\n return <Container\r\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\r\n <div className='container-fluid'>\r\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logoSrc} height='30' />\r\n </a>}\r\n {children}\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.header`\r\n height: 54px;\r\n`;\r\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';\r\nimport { intersection } from 'lodash';\r\nimport { useUser } from './user-provider';\r\nimport { User } from '../utils/types';\r\n\r\nexport interface AccessProps {\r\n require?: string | string[] | ((user: User) => boolean);\r\n fallback?: ReactNode;\r\n children: ReactNode;\r\n}\r\n\r\nexport default function Access({\r\n require,\r\n children,\r\n fallback\r\n}: AccessProps) {\r\n const [user,] = useUser();\r\n let passed = false;\r\n if (typeof require === 'function') {\r\n passed = require(user);\r\n } else {\r\n if (typeof require === 'string') {\r\n require = [require];\r\n }\r\n passed = intersection(user.roles, require).length > 0;\r\n }\r\n if (!passed) {\r\n children = fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n","import { LinkProps, useNavigate } from 'react-router-dom';\r\nimport { Button, ButtonProps } from '@topthink/components';\r\n\r\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\r\n\r\n}\r\n\r\nexport default function LinkButton({ to, replace, ...props }: Props) {\r\n let navigate = useNavigate();\r\n\r\n return <Button {...props} onClick={(e) => {\r\n e.preventDefault();\r\n navigate(to, { replace });\r\n }} />;\r\n}\r\n","import { Loader, RequestConfig, useRequest } from '@topthink/components';\r\nimport { createContext, ReactNode, useContext } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nconst Context = createContext<any>(undefined);\r\n\r\ninterface Props {\r\n request: RequestConfig;\r\n children: ReactNode;\r\n}\r\n\r\nconst Inner = function({ request, children }: Props) {\r\n const { result } = useRequest(request);\r\n\r\n if (!result) {\r\n return <Loader wrap />;\r\n }\r\n\r\n return <Context.Provider value={result}>\r\n {children}\r\n </Context.Provider>;\r\n};\r\n\r\nexport default function WithRequest({ request, children }: Props) {\r\n const params = useParams();\r\n\r\n if (typeof request === 'string') {\r\n request = {\r\n url: request.replace(/:(\\w+)/g, (all, name) => {\r\n return params[name] || all;\r\n })\r\n };\r\n } else if (request.url) {\r\n request.url = request.url.replace(/:(\\w+)/g, (all, name) => {\r\n return params[name] || all;\r\n });\r\n }\r\n\r\n return <Inner key={request.url} request={request}>{children}</Inner>;\r\n}\r\n\r\nexport function useRequestData<T = any>(): T {\r\n return useContext(Context);\r\n}\r\n","import { Card, isRecord, isRequestError, Loader, Result, useAsync } from '@topthink/components';\r\nimport { Navigate } from 'react-router-dom';\r\nimport { Container } from 'react-bootstrap';\r\nimport queryString from 'query-string';\r\nimport { Promisable } from '../utils/types';\r\n\r\ninterface LoginProps {\r\n onLogined: (token?: string) => string;\r\n onAuthorize?: (token?: any) => Promisable<void | string | undefined>;\r\n implicit?: boolean;\r\n}\r\n\r\nexport default function Social({ onLogined, onAuthorize, implicit = true }: LoginProps) {\r\n const { result, error } = useAsync(async () => {\r\n let token: any | undefined;\r\n\r\n if (implicit) {\r\n const parsed = queryString.parse(window.location.hash);\r\n if (parsed.access_token) {\r\n token = parsed.access_token;\r\n }\r\n } else {\r\n const parsed = queryString.parse(window.location.search);\r\n if (parsed) {\r\n token = parsed;\r\n\r\n token.redirect_uri = sessionStorage.getItem('redirect_uri');\r\n }\r\n }\r\n\r\n if (onAuthorize) {\r\n try {\r\n const newToken = await onAuthorize(token);\r\n if (newToken) {\r\n token = newToken;\r\n }\r\n } catch (e) {\r\n if (isRequestError(e)) {\r\n const data = e.response?.data;\r\n if (isRecord(data)) {\r\n throw new Error(data.message);\r\n }\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n return onLogined(token);\r\n }, []);\r\n\r\n if (error) {\r\n return <Container className={'mt-5'}>\r\n <Card>\r\n <Result status={'error'} title={error.message} />\r\n </Card>\r\n </Container>;\r\n }\r\n\r\n if (result) {\r\n return <Navigate to={result} replace />;\r\n }\r\n\r\n return <Loader />;\r\n}\r\n","import { Loader, useAsync } from '@topthink/components';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n const navigate = useNavigate();\r\n\r\n useAsync(async () => {\r\n await onLogout();\r\n navigate('/login', { state: { from: 'logout' } });\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { Card } from '@topthink/components';\r\nimport { Col, Container, Row } from 'react-bootstrap';\r\nimport { ReactNode } from 'react';\r\n\r\nexport interface LoginProps {\r\n onAuthorize: (url: string, query?: Record<string, string>) => void;\r\n onLogined: (token?: string) => string;\r\n}\r\n\r\ninterface Props extends LoginProps {\r\n onLogin: (props: LoginProps) => ReactNode;\r\n}\r\n\r\nexport default function Login({ onLogin, onLogined, onAuthorize }: Props) {\r\n return <Container className='vh-100 d-flex align-items-center'>\r\n <Row className='flex-fill'>\r\n <Col lg={{ span: 6, offset: 3 }} xxl={{ span: 4, offset: 4 }}>\r\n <Card className='p-5'>\r\n {onLogin({ onAuthorize, onLogined })}\r\n </Card>\r\n </Col>\r\n </Row>\r\n </Container>;\r\n}\r\n","import { createBrowserRouter, RouteObject, RouterProvider } 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, Modal, request, ToastProvider } from '@topthink/components';\nimport AppProvider 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 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 return 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 {\n path: '*',\n element: <UserProvider userResolver={userResolver} onResolved={handleResolved} />,\n children: transformRoutes(routes),\n },\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 ...extraRoutes\n ],\n {\n basename\n }\n );\n\n return function() {\n return <ToastProvider>\n <AppProvider appResolver={appResolver}>\n <RootComponent>\n <RouterProvider router={router} />\n </RootComponent>\n </AppProvider>\n <Modal.Message />\n </ToastProvider>;\n };\n}\n"],"names":["_g","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgExternal","props","React","createElement","xmlns","width","height","fill","d","formatRelativePath","app","routes","parent","menus","route","meta","path","children","hideInMenu","access","passed","Number","user","access_level","Array","isArray","intersection","roles","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","AppContext","createContext","AppProvider","_ref","appResolver","setApp","useState","useAsync","async","onSuccess","Provider","value","Loader","useAppState","context","useContext","Error","useApp","useMenu","matches","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","transformRoutes","map","index","hideMenu","SiderContext","useSider","Toggle","sider","Trigger","onClick","setShow","styled","div","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","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","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","_ref2","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","userResolver","onResolved","setUser","current","execute","e","isRequestError","response","status","redirectUri","window","search","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","error","token","parsed","queryString","parse","hash","access_token","redirect_uri","sessionStorage","getItem","newToken","data","isRecord","message","Card","Result","Navigate","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","handleLogined","history","usr","router","createBrowserRouter","element","getToken","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\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(app.user?.access_level || 0) >= access;\n } else {\n if (!Array.isArray(access)) {\n access = [access];\n }\n\n passed = intersection((app.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 { Dispatch, ReactNode, SetStateAction, createContext, useContext, useState } from 'react';\nimport { App, AppResolver } from '../utils/types';\nimport { Loader, useAsync } from '@topthink/components';\n\ntype AppContextType = [App, Dispatch<SetStateAction<App>>];\n\nexport const AppContext = createContext<AppContextType | null>(null);\n\ninterface Props {\n appResolver?: AppResolver;\n children: ReactNode;\n}\n\nexport default function AppProvider({ appResolver, children }: Props) {\n const [app, setApp] = useState<App | null>(null);\n\n useAsync(async () => {\n if (appResolver) {\n return appResolver();\n }\n }, [], {\n onSuccess(app) {\n setApp(app || {});\n }\n });\n\n if (!app) {\n return <Loader />;\n }\n\n return <AppContext.Provider value={[app, setApp]}>\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 @media (max-width: 1540px) {\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 { isRequestError, Loader, useAsync } from '@topthink/components';\nimport React, { Dispatch, SetStateAction, useCallback, useContext } from 'react';\nimport { Outlet, useNavigate } from 'react-router-dom';\nimport { User, UserResolver } 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\ninterface Props {\n userResolver: UserResolver;\n onResolved: (user: User) => void;\n}\n\nconst UserProvider = function({ userResolver, onResolved }: Props) {\n const [app, setApp] = 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) }));\n } else {\n setApp(current => ({ ...current, user: user }));\n }\n }, []);\n\n const navigate = useNavigate();\n\n const { execute } = useAsync(async () => {\n if (userResolver) {\n const user = await userResolver();\n onResolved(user);\n return user;\n }\n }, [], {\n async onError(e) {\n if (isRequestError(e) && e.response?.status === 401) {\n const redirectUri = window.location.pathname + window.location.search;\n navigate(`/login`, { state: { from: redirectUri } });\n }\n },\n onSuccess(user) {\n if (user) {\n setUser(user);\n }\n }\n });\n\n if (!user) {\n return <Loader />;\n }\n\n const value: any = [user, setUser, execute];\n\n value.user = user;\n value.setUser = setUser;\n value.refresh = execute;\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 { Navigate } from 'react-router-dom';\nimport { Container } from 'react-bootstrap';\nimport queryString from 'query-string';\nimport { Promisable } from '../utils/types';\n\ninterface LoginProps {\n onLogined: (token?: string) => string;\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 <Navigate to={result} replace />;\n }\n\n return <Loader />;\n}\n","import { Loader, useAsync } from '@topthink/components';\nimport { useNavigate } from 'react-router-dom';\n\ninterface LogoutProps {\n onLogout: () => void | Promise<void>;\n}\n\nexport default function Logout({ onLogout }: LogoutProps) {\n const navigate = useNavigate();\n\n useAsync(async () => {\n await onLogout();\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 { ReactNode } from 'react';\n\nexport interface LoginProps {\n onAuthorize: (url: string, query?: Record<string, string>) => void;\n onLogined: (token?: string) => string;\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 } 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, Modal, request, ToastProvider } from '@topthink/components';\nimport AppProvider 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 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 return 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 {\n path: '*',\n element: <UserProvider userResolver={userResolver} onResolved={handleResolved} />,\n children: transformRoutes(routes),\n },\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 ...extraRoutes\n ],\n {\n basename\n }\n );\n\n return function() {\n return <ToastProvider>\n <AppProvider appResolver={appResolver}>\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","route","meta","path","children","hideInMenu","access","passed","Number","user","access_level","Array","isArray","intersection","roles","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","AppContext","createContext","AppProvider","appResolver","setApp","useState","useAsync","async","onSuccess","Provider","value","Loader","useAppState","context","useContext","Error","useApp","useMenu","matches","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","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","userResolver","onResolved","setUser","current","execute","onError","isRequestError","response","status","redirectUri","window","search","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","error","token","parsed","queryString","parse","hash","access_token","redirect_uri","sessionStorage","getItem","newToken","data","isRecord","message","Card","Result","Navigate","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","handleLogined","history","usr","router","createBrowserRouter","element","getToken","handleAuthorize","query","stringifyUrl","getAbsoluteUrl","ToastProvider","RouterProvider","Modal","Message"],"mappings":"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"}