@topthink/common 1.2.47 → 1.2.49
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 +5 -5
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
- package/types/utils/create-application.d.ts +2 -2
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMenu as n,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useRoutes as l,useLocation as
|
|
1
|
+
import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMenu as n,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useRoutes as l,useLocation as s,Outlet as a,Link as d,useNavigate as h,Navigate as g,createBrowserRouter as u,RouterProvider as m}from"react-router-dom";export{Link,Navigate,Outlet,useLoaderData,useLocation,useMatches,useNavigate,useOutlet,useParams,useRevalidator,useRouteLoaderData,useRoutes}from"react-router-dom";import*as p from"react";import f,{useContext as v,useMemo as x,memo as b,useState as w,useEffect as y,useCallback as _}from"react";import{styled as k,Space as z,useAsync as N,isRequestError as L,isRecord as E,Loader as I,Button as C,Card as M,Result as R,request as S,Modal as U}from"@topthink/components";export*from"@topthink/components";import{Nav as j,Dropdown as O,Container as A}from"react-bootstrap";import $ from"classnames";import{intersection as B}from"lodash";import P from"query-string";import*as V from"path";var q;function D(){return D=Object.assign?Object.assign.bind():function(c){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(c[r]=t[r])}return c},D.apply(this,arguments)}const H=c=>p.createElement("svg",D({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},c),q||(q=p.createElement("g",{fill:"#888"},p.createElement("path",{d:"m8 3 1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z"}),p.createElement("path",{d:"M11 11H5V5h2V3H3v10h10V9h-2z"})))),T=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const r=[];for(const n of e){let{meta:e={},path:i="",children:o=[]}=n;if(e.hideInMenu)continue;const l=e.title;if(!l)continue;let s=!1;e.href?(s=!0,i=e.href):i=`${t}/${i}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const a={title:l,icon:"string"==typeof e.icon?c("i",{className:`bi bi-${e.icon}`}):e.icon,path:i,isExternal:s,children:[]};!e.hideChildrenInMenu&&!s&&o.length>0&&(a.children=T(o,i)),r.push(a)}return r};function F(c){const{matches:e}=v(o),t=e[e.length-1],r=t.pathnameBase||"/",n=c||t.route.children||[],i=x((()=>function(c){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";return T(c,e)}(n,r)),[n,r]);return[i,x((()=>e.reduceRight(((c,e)=>c||e.route.handle?.title),void 0)),[e])]}function K(c,e){return c.map((c=>(c.children&&(c.children=K(c.children,c.meta?.hideChildrenInMenu)),c.handle={title:c.meta?.title,hideInMenu:c.meta?.hideInMenu||e&&!c.index,...c.handle},c)))}const W=t=>t.map((t=>{const r=e(ic,{children:[t.icon,t.title,t.isExternal&&c(H,{})]});return t.children.length>0?c(n,{title:r,children:W(t.children)},t.path):c(i,{children:t.isExternal?c("a",{href:t.path,target:"_blank",children:r}):c(d,{to:t.path,children:r})},t.path)})),G=()=>({height:0}),J=c=>({height:c.scrollHeight}),Q={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:G,onAppearActive:J,onEnterStart:G,onEnterActive:J,onLeaveStart:J,onLeaveActive:G};function X(t){let{title:r,header:n,footer:i,routes:o}=t;const[l,d]=F(o),{pathname:h}=s(),g=x((()=>{const c=[];return h.split("/").reduce(((e,t)=>(e.length>1&&c.push(e.join("/")),[...e,t])),[]),c.push(h),c}),[h]),[u,m]=w([]);y((()=>{m(g.slice(0,-1))}),[g]);const p=_((c=>{const e=c[c.length-1];m(c.filter((c=>e.startsWith(c))))}),[u,m]);return n||(n=c(cc,{children:r||d})),e(lc,{children:[e(Z,{children:[c(ec,{children:n}),c(oc,{mode:"inline",motion:Q,openKeys:u,onOpenChange:p,selectedKeys:g,children:W(l)}),c(tc,{children:i})]}),c(rc,{children:c(nc,{children:o?c(Y,{routes:o}):c(a,{})})})]})}const Y=b((function(c){let{routes:e}=c;return l(x((()=>K(e)),[e]))})),Z=k.nav`
|
|
2
2
|
position: fixed;
|
|
3
3
|
top: 0;
|
|
4
4
|
bottom: 0;
|
|
@@ -196,7 +196,7 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMen
|
|
|
196
196
|
margin-left: 0;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
|
-
`;function
|
|
199
|
+
`;function sc(t){let{title:r,header:n,nav:i,children:l,extra:a,showBack:d}=t;const{matches:g}=v(o),u=x((()=>g.reduceRight(((c,e)=>c||e.route.index?c:e.route),void 0)),[g]),m=!0===u?.handle?.hideInMenu,p=u?.handle?.title,f=h(),b=s();return void 0===d&&(d=m),void 0===n&&(n=e(z,{children:[d&&"default"!==b.key&&c(ac,{onClick:()=>f(-1),children:c("i",{className:"bi bi-arrow-left-short"})}),c(uc,{children:r||p})]})),e(dc,{children:[c(hc,{children:e("div",{className:"container",children:[n,i,c(mc,{children:a})]})}),c(gc,{className:"container",children:l})]})}const ac=k.div`
|
|
200
200
|
font-size: 32px;
|
|
201
201
|
cursor: pointer;
|
|
202
202
|
`,dc=k.div`
|
|
@@ -239,7 +239,7 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMen
|
|
|
239
239
|
height: 64px;
|
|
240
240
|
`,mc=k.div`
|
|
241
241
|
margin-left: auto;
|
|
242
|
-
`;function pc(t){let{title:r,header:n,showBack:i,extra:o}=t;const[l,d]=F(),{pathname:h}=
|
|
242
|
+
`;function pc(t){let{title:r,header:n,showBack:i,extra:o}=t;const[l,d]=F(),{pathname:h}=s(),g=c(j,{children:l.map((t=>c(j.Item,{children:e(fc,{className:$("nav-link",{active:h.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path)))});return c(sc,{title:r||d,header:n,nav:g,showBack:i,extra:o,children:c(a,{})})}const fc=k(d)`
|
|
243
243
|
display: flex;
|
|
244
244
|
align-items: center;
|
|
245
245
|
gap: 0.5rem;
|
|
@@ -247,9 +247,9 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMen
|
|
|
247
247
|
.bi, svg {
|
|
248
248
|
text-align: center;
|
|
249
249
|
}
|
|
250
|
-
`;const vc=f.createContext({}),xc=f.createContext(null),bc=function(){const[e,t]=w(null),{userResolver:r,onUnauthorized:n}=v(vc);return N((async()=>{if(r)return r()}),[],{onError(c){if(n&&L(c)&&401===c.response?.status){const e=c.response.data;let t;E(e)&&e.url&&(t=e.url),n(t)}},onSuccess(c){c&&t(c)}}),e?c(xc.Provider,{value:[e,t],children:c(
|
|
250
|
+
`;const vc=f.createContext({}),xc=f.createContext(null),bc=function(){const[e,t]=w(null),{userResolver:r,onUnauthorized:n}=v(vc);return N((async()=>{if(r)return r()}),[],{onError(c){if(n&&L(c)&&401===c.response?.status){const e=c.response.data;let t;E(e)&&e.url&&(t=e.url),n(t)}},onSuccess(c){c&&t(c)}}),e?c(xc.Provider,{value:[e,t],children:c(a,{})}):c(I,{})};function wc(){const c=v(xc);if(!c)throw new Error("please use `useUser` in UserContext");return c}const yc=k.a`
|
|
251
251
|
cursor: pointer;
|
|
252
252
|
`;function _c(t){let{children:r,menus:n,className:i,logo:o=!0}=t;const[l]=wc();return c(kc,{className:$("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",i),children:e("div",{className:"container-fluid",children:[o&&c("a",{className:"navbar-brand",href:"https://www.topthink.com",children:c("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,e(O,{navbar:!0,children:[c(O.Toggle,{as:yc,className:"nav-link",children:c("img",{className:"rounded-circle",width:"25",height:"25",src:l.avatar})}),c(O.Menu,{className:"shadow",children:n})]})]})})}const kc=k.header`
|
|
253
253
|
height: 54px;
|
|
254
|
-
`;function zc(e){let{require:r,children:n,fallback:i}=e;const[o]=wc();let l=!1;return"function"==typeof r?l=r(o):("string"==typeof r&&(r=[r]),l=B(o.roles,r).length>0),l||(n=i),c(t,{children:n})}function Nc(e){let{to:t,replace:r,...n}=e,i=h();return c(C,{...n,onClick:c=>{c.preventDefault(),i(t,{replace:r})}})}function Lc(e){let{onLogin:t}=e;const{result:r,error:n}=N((async()=>{await t();const c=localStorage.getItem("redirect_uri");return c&&localStorage.removeItem("redirect_uri"),c||"/"}),[]);return n?c(A,{className:"mt-5",children:c(M,{children:c(R,{status:"error",title:n.message})})}):r?c(g,{to:r,replace:!0}):c(I,{})}function Ec(e){let{onLogout:t}=e;return N((async()=>{await t()}),[]),c(I,{})}function Ic(t){const{basename:r="/",onLogin:n,onLogout:i,authentication:o="token",baseURL:l,userResolver:
|
|
254
|
+
`;function zc(e){let{require:r,children:n,fallback:i}=e;const[o]=wc();let l=!1;return"function"==typeof r?l=r(o):("string"==typeof r&&(r=[r]),l=B(o.roles,r).length>0),l||(n=i),c(t,{children:n})}function Nc(e){let{to:t,replace:r,...n}=e,i=h();return c(C,{...n,onClick:c=>{c.preventDefault(),i(t,{replace:r})}})}function Lc(e){let{onLogin:t}=e;const{result:r,error:n}=N((async()=>{await t();const c=localStorage.getItem("redirect_uri");return c&&localStorage.removeItem("redirect_uri"),c||"/"}),[]);return n?c(A,{className:"mt-5",children:c(M,{children:c(R,{status:"error",title:n.message})})}):r?c(g,{to:r,replace:!0}):c(I,{})}function Ec(e){let{onLogout:t}=e;return N((async()=>{await t()}),[]),c(I,{})}function Ic(t){const{basename:r="/",onLogin:n,onLogout:i,authentication:o="token",baseURL:l,userResolver:s,onUnauthorized:a}=t;l&&(S.defaults.baseURL=l);const d=async c=>{window.location.pathname!==V.join(r,"/logout")&&localStorage.setItem("redirect_uri",function(c,e){return"/"===e?c:c.slice(e.length)}(window.location.pathname+window.location.search,r));const e=window.location.origin+V.join(r,"/login");if(a){const t=await a(e);t&&(c=t)}c&&(window.location.href=P.stringifyUrl({url:c,query:{redirect_uri:e}}))},h=async()=>{let c;const e=P.parse(window.location.hash.substr(1));if(e.access_token&&(c=e.access_token),n)try{const e=await n(c);e&&(c=e)}catch(c){if(L(c)){const e=c.response?.data;if(E(e))throw new Error(e.message)}throw c}"token"===o&&c&&S.defaults.authTokenName&&localStorage.setItem(S.defaults.authTokenName,c)},g=async()=>{if(i)try{await i()}catch(c){if(L(c)&&401===c.response?.status){const e=c.response.data;let t;E(e)&&e.url&&(t=e.url),d(t)}}"token"===o&&localStorage.removeItem("authorization")};return function(t){let{routes:n}=t;const i=u([{path:"*",element:c(bc,{}),children:K(n)},{path:"login",element:c(Lc,{onLogin:h})},{path:"logout",element:c(Ec,{onLogout:g})}],{basename:r});return e(vc.Provider,{value:{userResolver:s,onUnauthorized:d},children:[c(m,{router:i}),c(U.Message,{})]})}}export{zc as Access,sc as Content,_c as Header,Nc as LinkButton,X as SiderLayout,pc as TabLayout,Ic as createApplication,wc as useUser};
|
|
255
255
|
//# 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/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider.tsx","../src/components/content.tsx","../src/layout/tab.tsx","../src/utils/app-context.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/pages/login.tsx","../src/pages/logout.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';\n\nexport interface MenuData {\n path: string;\n title: string;\n icon?: ReactNode;\n isExternal?: boolean;\n children: MenuData[];\n}\n\nconst formatRelativePath = (\n routes: RouteObject[],\n parent: string = '/',\n): 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 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(children, path);\n }\n\n menus.push(menu);\n }\n\n return menus;\n};\n\nexport default function getMenuData(routes: RouteObject[], base: string = '/'): MenuData[] {\n return formatRelativePath(routes, base);\n}\n","import { useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext } from 'react-router-dom';\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\n\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\n\n const { matches } = useContext(UNSAFE_RouteContext);\n\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(routesMatch, pathnameBase), [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 = {\n title: route.meta?.title,\n hideInMenu: route.meta?.hideInMenu || (hideInMenu && !route.index),\n ...route.handle,\n };\n\n return route;\n });\n}\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\nimport { memo, ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\nimport { MenuData } from '../utils/get-menu-data';\nimport type { CSSMotionProps } from 'rc-motion';\nimport { styled } from '@topthink/components';\nimport { ReactComponent as ExternalIcon } from '../images/external.svg';\nimport useMenu from './use-menu';\nimport transformRoutes from '../utils/transform-routes';\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 {\n title?: string;\n header?: ReactNode;\n footer?: ReactNode;\n routes?: RouteObject[];\n}\n\nexport default function SiderLayout({ title, header, footer, routes }: Props) {\n\n const [menu, defaultTitle] = useMenu(routes);\n\n const { pathname } = useLocation();\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 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 if (!header) {\n header = <Title>{title || defaultTitle}</Title>;\n }\n\n return <Container>\n <Sidebar>\n <Header>{header}</Header>\n <Menu\n mode='inline'\n motion={motion}\n openKeys={openKeys}\n onOpenChange={onOpenChange}\n selectedKeys={selectedKeys}\n >\n {renderMenuItems(menu)}\n </Menu>\n <Footer>{footer}</Footer>\n </Sidebar>\n <Content>\n <Main>\n {routes ? <Routes routes={routes} /> : <Outlet />}\n </Main>\n </Content>\n </Container>;\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: 0;\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 54px 0 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: 64px;\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 margin-left: 230px;\n flex: 1;\n`;\n\nconst Main = styled.main`\n min-height: calc(100vh - 54px);\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","import { Space, styled } from '@topthink/components';\nimport { PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate, } from 'react-router-dom';\n\ninterface ContentProps {\n title?: ReactNode;\n header?: ReactNode;\n nav?: ReactNode;\n extra?: ReactNode;\n showBack?: boolean;\n}\n\nexport default function Content({ title, header, nav, children, extra, showBack }: 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 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 = <Space>\n {showBack && location.key !== 'default' &&\n <Back onClick={() => navigate(-1)}><i className='bi bi-arrow-left-short' /></Back>}\n {<Title>{title || defaultTitle}</Title>}\n </Space>;\n }\n\n return <Container>\n <Header>\n <div className='container'>\n {header}\n {nav}\n <Extra>{extra}</Extra>\n </div>\n </Header>\n <Body className='container'>\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`;\n\nconst Header = styled.div`\n background-color: #fff;\n display: flex;\n\n .container {\n padding: 0 12px;\n display: flex;\n align-items: center;\n\n .nav {\n margin-left: 1.5rem;\n\n .nav-link {\n position: relative;\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 }\n }\n`;\n\nconst Body = styled.div`\n margin-top: 24px;\n`;\n\nconst Title = styled.div`\n font-size: 22px;\n line-height: 64px;\n height: 64px;\n`;\n\nconst Extra = styled.div`\n margin-left: auto;\n`;\n","import { Nav } from 'react-bootstrap';\nimport Content from '../components/content';\nimport { Link, Outlet, useLocation } from 'react-router-dom';\nimport useMenu from './use-menu';\nimport { styled } 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\n const nav = <Nav>\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 </Nav>;\n\n return <Content title={title || defaultTitle} header={header} nav={nav} showBack={showBack} extra={extra}>\n <Outlet />\n </Content>;\n}\n\nconst NavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n .bi, svg {\n text-align: center;\n }\n`;\n","import React from 'react';\nimport { User } from './types';\n\nexport type UserResolver = () => User | Promise<User>\n\nconst AppContext = React.createContext<{\n userResolver?: UserResolver,\n onUnauthorized?: (url?: string) => void\n}>({});\n\nexport default AppContext;\n","import React, { useContext, useState } from 'react';\nimport { User } from '../utils/types';\nimport { isRecord, isRequestError, Loader, useAsync } from '@topthink/components';\nimport AppContext from '../utils/app-context';\nimport { Outlet } from 'react-router-dom';\n\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\n\nconst UserProvider = function() {\n const [state, setState] = useState<User | null>(null);\n\n const { userResolver, onUnauthorized } = useContext(AppContext);\n\n useAsync(async () => {\n if (userResolver) {\n return userResolver();\n }\n }, [], {\n onError(e) {\n if (onUnauthorized && isRequestError(e) && e.response?.status === 401) {\n const data = e.response.data;\n let url: string | undefined = undefined;\n if (isRecord(data) && data.url) {\n url = data.url;\n }\n onUnauthorized(url);\n }\n },\n onSuccess(user) {\n if (user) {\n setState(user);\n }\n }\n });\n\n if (!state) {\n return <Loader />;\n }\n\n return <UserContext.Provider value={[state, setState]}>\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 { Card, Loader, Result, useAsync } from '@topthink/components';\nimport { Navigate } from 'react-router-dom';\nimport { Container } from 'react-bootstrap';\n\ninterface LoginProps {\n onLogin: () => void | Promise<void>;\n}\n\nexport default function Login({ onLogin }: LoginProps) {\n const { result, error } = useAsync(async () => {\n await onLogin();\n\n const redirectUri = localStorage.getItem('redirect_uri');\n if (redirectUri) {\n localStorage.removeItem('redirect_uri');\n }\n return redirectUri || '/';\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';\n\ninterface LogoutProps {\n onLogout: () => void | Promise<void>;\n}\n\nexport default function Logout({ onLogout }: LogoutProps) {\n useAsync(async () => {\n await onLogout();\n }, []);\n\n return <Loader />;\n}\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\nimport Login from '../pages/login';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { isRecord, isRequestError, Modal, request } from '@topthink/components';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport AppContext, { UserResolver } from './app-context';\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ninterface AppProps {\n routes: RouteObject[];\n}\n\ntype Promisable<T> = T | Promise<T>;\n\ninterface Options {\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n onLogout?: () => Promisable<void>;\n onLogin?: (token: string | void) => Promisable<void | string>;\n userResolver?: UserResolver;\n onUnauthorized?: (redirectUri: string) => Promisable<void | string>;\n}\n\nexport default function createApplication(options: Options) {\n const {\n basename = '/',\n onLogin,\n onLogout,\n authentication = 'token',\n baseURL,\n userResolver,\n onUnauthorized\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const handleUnauthorized = async (url?: string | void) => {\n if (window.location.pathname !== path.join(basename, '/logout')) {\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\n }\n\n const redirectUri = window.location.origin + path.join(basename, '/login');\n\n if (onUnauthorized) {\n url = await onUnauthorized(redirectUri);\n }\n\n if (url) {\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri }\n });\n }\n };\n\n const handleLogin = async () => {\n let token: string | void;\n\n const parsed = queryString.parse(window.location.hash.substr(1));\n if (parsed.access_token) {\n token = parsed.access_token as string;\n }\n\n if (onLogin) {\n try {\n token = await onLogin(token);\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 if (authentication === 'token' && token && request.defaults.authTokenName) {\n localStorage.setItem(request.defaults.authTokenName, token);\n }\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch {\n\n }\n }\n\n if (authentication === 'token') {\n localStorage.removeItem('authorization');\n }\n };\n\n return function({ routes }: AppProps) {\n const router = createBrowserRouter(\n [\n {\n path: '*',\n element: <UserProvider />,\n children: transformRoutes(routes),\n },\n {\n path: 'login',\n element: <Login onLogin={handleLogin} />\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />\n }\n ],\n {\n basename\n }\n );\n\n return <AppContext.Provider value={{ userResolver, onUnauthorized: handleUnauthorized }}>\n <RouterProvider router={router} />\n <Modal.Message />\n </AppContext.Provider>;\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","routes","parent","menus","route","meta","path","children","hideInMenu","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","useMenu","matches","useContext","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","transformRoutes","map","index","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","_ref","header","footer","defaultTitle","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Title","Container","Sidebar","Header","Menu","mode","Footer","Content","Main","Routes","Outlet","memo","_ref2","useRoutes","styled","nav","div","main","RcMenu","extra","showBack","defaultShowBack","navigate","useNavigate","location","Space","Back","onClick","Extra","Body","TabLayout","Nav","Item","NavLink","classNames","active","AppContext","createContext","UserContext","UserProvider","state","setState","userResolver","onUnauthorized","useAsync","async","onError","e","isRequestError","response","status","data","url","isRecord","onSuccess","user","Provider","value","Loader","useUser","context","Error","Avatar","a","logo","src","Dropdown","navbar","Toggle","as","avatar","Access","require","fallback","passed","intersection","roles","_Fragment","LinkButton","Button","preventDefault","Login","onLogin","result","error","redirectUri","localStorage","getItem","removeItem","Card","Result","message","Navigate","Logout","onLogout","createApplication","options","basename","authentication","baseURL","request","defaults","handleUnauthorized","window","setItem","stripBasename","search","origin","queryString","stringifyUrl","query","redirect_uri","handleLogin","token","parsed","parse","hash","substr","access_token","authTokenName","handleLogout","router","createBrowserRouter","element","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/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider.tsx","../src/components/content.tsx","../src/layout/tab.tsx","../src/utils/app-context.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/pages/login.tsx","../src/pages/logout.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';\n\nexport interface MenuData {\n path: string;\n title: string;\n icon?: ReactNode;\n isExternal?: boolean;\n children: MenuData[];\n}\n\nconst formatRelativePath = (\n routes: RouteObject[],\n parent: string = '/',\n): 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 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(children, path);\n }\n\n menus.push(menu);\n }\n\n return menus;\n};\n\nexport default function getMenuData(routes: RouteObject[], base: string = '/'): MenuData[] {\n return formatRelativePath(routes, base);\n}\n","import { useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext } from 'react-router-dom';\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\n\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\n\n const { matches } = useContext(UNSAFE_RouteContext);\n\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(routesMatch, pathnameBase), [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 = {\n title: route.meta?.title,\n hideInMenu: route.meta?.hideInMenu || (hideInMenu && !route.index),\n ...route.handle,\n };\n\n return route;\n });\n}\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\nimport { memo, ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\nimport { MenuData } from '../utils/get-menu-data';\nimport type { CSSMotionProps } from 'rc-motion';\nimport { styled } from '@topthink/components';\nimport { ReactComponent as ExternalIcon } from '../images/external.svg';\nimport useMenu from './use-menu';\nimport transformRoutes from '../utils/transform-routes';\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 {\n title?: string;\n header?: ReactNode;\n footer?: ReactNode;\n routes?: RouteObject[];\n}\n\nexport default function SiderLayout({ title, header, footer, routes }: Props) {\n\n const [menu, defaultTitle] = useMenu(routes);\n\n const { pathname } = useLocation();\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 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 if (!header) {\n header = <Title>{title || defaultTitle}</Title>;\n }\n\n return <Container>\n <Sidebar>\n <Header>{header}</Header>\n <Menu\n mode='inline'\n motion={motion}\n openKeys={openKeys}\n onOpenChange={onOpenChange}\n selectedKeys={selectedKeys}\n >\n {renderMenuItems(menu)}\n </Menu>\n <Footer>{footer}</Footer>\n </Sidebar>\n <Content>\n <Main>\n {routes ? <Routes routes={routes} /> : <Outlet />}\n </Main>\n </Content>\n </Container>;\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: 0;\n bottom: 0;\n left: 0;\n z-index: 100;\n padding: 54px 0 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: 64px;\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 margin-left: 230px;\n flex: 1;\n`;\n\nconst Main = styled.main`\n min-height: calc(100vh - 54px);\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","import { Space, styled } from '@topthink/components';\nimport { PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate, } from 'react-router-dom';\n\ninterface ContentProps {\n title?: ReactNode;\n header?: ReactNode;\n nav?: ReactNode;\n extra?: ReactNode;\n showBack?: boolean;\n}\n\nexport default function Content({ title, header, nav, children, extra, showBack }: 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 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 = <Space>\n {showBack && location.key !== 'default' &&\n <Back onClick={() => navigate(-1)}><i className='bi bi-arrow-left-short' /></Back>}\n {<Title>{title || defaultTitle}</Title>}\n </Space>;\n }\n\n return <Container>\n <Header>\n <div className='container'>\n {header}\n {nav}\n <Extra>{extra}</Extra>\n </div>\n </Header>\n <Body className='container'>\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`;\n\nconst Header = styled.div`\n background-color: #fff;\n display: flex;\n\n .container {\n padding: 0 12px;\n display: flex;\n align-items: center;\n\n .nav {\n margin-left: 1.5rem;\n\n .nav-link {\n position: relative;\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 }\n }\n`;\n\nconst Body = styled.div`\n margin-top: 24px;\n`;\n\nconst Title = styled.div`\n font-size: 22px;\n line-height: 64px;\n height: 64px;\n`;\n\nconst Extra = styled.div`\n margin-left: auto;\n`;\n","import { Nav } from 'react-bootstrap';\nimport Content from '../components/content';\nimport { Link, Outlet, useLocation } from 'react-router-dom';\nimport useMenu from './use-menu';\nimport { styled } 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\n const nav = <Nav>\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 </Nav>;\n\n return <Content title={title || defaultTitle} header={header} nav={nav} showBack={showBack} extra={extra}>\n <Outlet />\n </Content>;\n}\n\nconst NavLink = styled(Link)`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n .bi, svg {\n text-align: center;\n }\n`;\n","import React from 'react';\nimport { User } from './types';\n\nexport type UserResolver = () => User | Promise<User>\n\nconst AppContext = React.createContext<{\n userResolver?: UserResolver,\n onUnauthorized?: (url?: string) => void\n}>({});\n\nexport default AppContext;\n","import React, { useContext, useState } from 'react';\nimport { User } from '../utils/types';\nimport { isRecord, isRequestError, Loader, useAsync } from '@topthink/components';\nimport AppContext from '../utils/app-context';\nimport { Outlet } from 'react-router-dom';\n\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\n\nconst UserProvider = function() {\n const [state, setState] = useState<User | null>(null);\n\n const { userResolver, onUnauthorized } = useContext(AppContext);\n\n useAsync(async () => {\n if (userResolver) {\n return userResolver();\n }\n }, [], {\n onError(e) {\n if (onUnauthorized && isRequestError(e) && e.response?.status === 401) {\n const data = e.response.data;\n let url: string | undefined = undefined;\n if (isRecord(data) && data.url) {\n url = data.url;\n }\n onUnauthorized(url);\n }\n },\n onSuccess(user) {\n if (user) {\n setState(user);\n }\n }\n });\n\n if (!state) {\n return <Loader />;\n }\n\n return <UserContext.Provider value={[state, setState]}>\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 { Card, Loader, Result, useAsync } from '@topthink/components';\nimport { Navigate } from 'react-router-dom';\nimport { Container } from 'react-bootstrap';\n\ninterface LoginProps {\n onLogin: () => void | Promise<void>;\n}\n\nexport default function Login({ onLogin }: LoginProps) {\n const { result, error } = useAsync(async () => {\n await onLogin();\n\n const redirectUri = localStorage.getItem('redirect_uri');\n if (redirectUri) {\n localStorage.removeItem('redirect_uri');\n }\n return redirectUri || '/';\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';\n\ninterface LogoutProps {\n onLogout: () => void | Promise<void>;\n}\n\nexport default function Logout({ onLogout }: LogoutProps) {\n useAsync(async () => {\n await onLogout();\n }, []);\n\n return <Loader />;\n}\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\nimport Login from '../pages/login';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { isRecord, isRequestError, Modal, request } from '@topthink/components';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport AppContext, { UserResolver } from './app-context';\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ninterface AppProps {\n routes: RouteObject[];\n}\n\ntype Promisable<T> = T | Promise<T>;\n\ninterface Options {\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n onLogout?: () => Promisable<void>;\n onLogin?: (token?: string) => Promisable<void | string | undefined>;\n userResolver?: UserResolver;\n onUnauthorized?: (redirectUri: string) => Promisable<void | string | undefined>;\n}\n\nexport default function createApplication(options: Options) {\n const {\n basename = '/',\n onLogin,\n onLogout,\n authentication = 'token',\n baseURL,\n userResolver,\n onUnauthorized\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const handleUnauthorized = async (url?: string) => {\n if (window.location.pathname !== path.join(basename, '/logout')) {\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\n }\n\n const redirectUri = window.location.origin + path.join(basename, '/login');\n\n if (onUnauthorized) {\n const newUrl = await onUnauthorized(redirectUri);\n if (newUrl) {\n url = newUrl;\n }\n }\n\n if (url) {\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri }\n });\n }\n };\n\n const handleLogin = async () => {\n let token: string | undefined;\n\n const parsed = queryString.parse(window.location.hash.substr(1));\n if (parsed.access_token) {\n token = parsed.access_token as string;\n }\n\n if (onLogin) {\n try {\n const newToken = await onLogin(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 if (authentication === 'token' && token && request.defaults.authTokenName) {\n localStorage.setItem(request.defaults.authTokenName, token);\n }\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch (e) {\n if (isRequestError(e) && e.response?.status === 401) {\n const data = e.response.data;\n let url: string | undefined = undefined;\n if (isRecord(data) && data.url) {\n url = data.url;\n }\n handleUnauthorized(url);\n }\n }\n }\n\n if (authentication === 'token') {\n localStorage.removeItem('authorization');\n }\n };\n\n return function ({ routes }: AppProps) {\n const router = createBrowserRouter(\n [\n {\n path: '*',\n element: <UserProvider />,\n children: transformRoutes(routes),\n },\n {\n path: 'login',\n element: <Login onLogin={handleLogin} />\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />\n }\n ],\n {\n basename\n }\n );\n\n return <AppContext.Provider value={{ userResolver, onUnauthorized: handleUnauthorized }}>\n <RouterProvider router={router} />\n <Modal.Message />\n </AppContext.Provider>;\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","routes","parent","menus","route","meta","path","children","hideInMenu","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","useMenu","matches","useContext","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","transformRoutes","map","index","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","_ref","header","footer","defaultTitle","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Title","Container","Sidebar","Header","Menu","mode","Footer","Content","Main","Routes","Outlet","memo","_ref2","useRoutes","styled","nav","div","main","RcMenu","extra","showBack","defaultShowBack","navigate","useNavigate","location","Space","Back","onClick","Extra","Body","TabLayout","Nav","Item","NavLink","classNames","active","AppContext","createContext","UserContext","UserProvider","state","setState","userResolver","onUnauthorized","useAsync","async","onError","e","isRequestError","response","status","data","url","isRecord","onSuccess","user","Provider","value","Loader","useUser","context","Error","Avatar","a","logo","src","Dropdown","navbar","Toggle","as","avatar","Access","require","fallback","passed","intersection","roles","_Fragment","LinkButton","Button","preventDefault","Login","onLogin","result","error","redirectUri","localStorage","getItem","removeItem","Card","Result","message","Navigate","Logout","onLogout","createApplication","options","basename","authentication","baseURL","request","defaults","handleUnauthorized","window","setItem","stripBasename","search","origin","newUrl","queryString","stringifyUrl","query","redirect_uri","handleLogin","token","parsed","parse","hash","substr","access_token","newToken","authTokenName","handleLogout","router","createBrowserRouter","element","RouterProvider","Modal","Message"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topthink/common",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.49",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"prebuild": "rimraf lib types",
|
|
6
6
|
"build": "rollup -c --environment NODE_ENV:production",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"scss"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@topthink/components": "^1.0.
|
|
19
|
+
"@topthink/components": "^1.0.63",
|
|
20
20
|
"classnames": "^2.3.1",
|
|
21
21
|
"history": "^5.0.0",
|
|
22
22
|
"query-string": "^8.1.0",
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
},
|
|
52
52
|
"author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
|
|
53
53
|
"license": "MIT",
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "0156220316df6bcb0ba53987d55ac84f4d846d7c"
|
|
55
55
|
}
|
|
@@ -10,9 +10,9 @@ interface Options {
|
|
|
10
10
|
basename?: string;
|
|
11
11
|
authentication?: 'cookie' | 'token';
|
|
12
12
|
onLogout?: () => Promisable<void>;
|
|
13
|
-
onLogin?: (token
|
|
13
|
+
onLogin?: (token?: string) => Promisable<void | string | undefined>;
|
|
14
14
|
userResolver?: UserResolver;
|
|
15
|
-
onUnauthorized?: (redirectUri: string) => Promisable<void | string>;
|
|
15
|
+
onUnauthorized?: (redirectUri: string) => Promisable<void | string | undefined>;
|
|
16
16
|
}
|
|
17
17
|
export default function createApplication(options: Options): ({ routes }: AppProps) => JSX.Element;
|
|
18
18
|
export {};
|