@topthink/common 1.2.8 → 1.2.10

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 c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMenu as r,MenuItem as n}from"rc-menu";import{UNSAFE_RouteContext as o,useLocation as l,Outlet as a,Link as s,useMatches as d,useNavigate as h,useLoaderData as g,Navigate as u,createBrowserRouter as m,RouterProvider as p}from"react-router-dom";export{Link,Navigate,Outlet,useLoaderData,useLocation,useMatches,useNavigate,useOutlet,useParams,useRevalidator,useRouteLoaderData,useRoutes}from"react-router-dom";import*as v from"react";import f,{useContext as x,useMemo as b,useState as w,useEffect as y}from"react";import{styled as _,Space as k,useAsync as z,Unauthorized as L,Loader as N,Button as E,request as R}from"@topthink/components";export*from"@topthink/components";import{Nav as S,Dropdown as I}from"react-bootstrap";import C from"classnames";import{intersection as j}from"lodash";import A from"query-string";import*as O from"path";var U;function $(){return $=Object.assign?Object.assign.bind():function(c){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(c[i]=t[i])}return c},$.apply(this,arguments)}const B=c=>v.createElement("svg",$({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},c),U||(U=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"})))),M=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const i=[];for(const r of e){let{meta:e={},path:n="",children:o=[]}=r;if(e.hideInMenu)continue;const l=e.title;if(!l)continue;let a=!1;e.href?(a=!0,n=e.href):n=`${t}/${n}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const s={title:l,icon:"string"==typeof e.icon?c("i",{className:`bi bi-${e.icon}`}):e.icon,path:n,isExternal:a,children:[]};!e.hideChildrenInMenu&&!a&&o.length>0&&(s.children=M(o,n)),i.push(s)}return i};function q(){const{matches:c}=x(o),e=c[c.length-1],t=e.pathnameBase||"/",i=e.route.children||[],r=b((()=>function(c){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";return M(c,e)}(i,t)),[i,t]);return[r,b((()=>c.reduceRight(((c,e)=>c||e.route.handle?.title),void 0)),[c])]}const P=t=>t.map((t=>{const i=e(X,{children:[t.icon,t.title,t.isExternal&&c(B,{})]});return t.children.length>0?c(r,{title:i,children:P(t.children)},t.path):c(n,{children:t.isExternal?c("a",{href:t.path,target:"_blank",children:i}):c(s,{to:t.path,children:i})},t.path)})),V=()=>({height:0}),D=c=>({height:c.scrollHeight}),H={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:V,onAppearActive:D,onEnterStart:V,onEnterActive:D,onLeaveStart:D,onLeaveActive:V};function W(t){let{title:i,header:r,footer:n}=t;const[o,s]=q(),{pathname:d}=l(),h=b((()=>{const c=[];return d.split("/").reduce(((e,t)=>(e.length>1&&c.push(e.join("/")),[...e,t])),[]),c.push(d),c}),[d]),[g,u]=w([]);y((()=>{u(h.slice(0,-1))}),[h]);return r||(r=c(K,{children:i||s})),e(Z,{children:[e(F,{children:[c(T,{children:r}),c(Y,{mode:"inline",motion:H,openKeys:g,onOpenChange:c=>{const e=c[c.length-1];u(c.filter((c=>e.startsWith(c))))},selectedKeys:h,children:P(o)}),c(G,{children:n})]}),c(J,{children:c(Q,{children:c(a,{})})})]})}const F=_.nav`
1
+ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMenu as n,MenuItem as r}from"rc-menu";import{UNSAFE_RouteContext as o,useRoutes as l,useLocation as a,Outlet as s,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 v,{useContext as f,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 L,Unauthorized as N,Loader as I,Button as E,request as R}from"@topthink/components";export*from"@topthink/components";import{Nav as S,Dropdown as C}from"react-bootstrap";import M from"classnames";import{intersection as j}from"lodash";import A from"query-string";import*as O from"path";var U;function $(){return $=Object.assign?Object.assign.bind():function(c){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(c[i]=t[i])}return c},$.apply(this,arguments)}const B=c=>p.createElement("svg",$({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},c),U||(U=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"})))),q=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const i=[];for(const n of e){let{meta:e={},path:r="",children:o=[]}=n;if(e.hideInMenu)continue;const l=e.title;if(!l)continue;let a=!1;e.href?(a=!0,r=e.href):r=`${t}/${r}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const s={title:l,icon:"string"==typeof e.icon?c("i",{className:`bi bi-${e.icon}`}):e.icon,path:r,isExternal:a,children:[]};!e.hideChildrenInMenu&&!a&&o.length>0&&(s.children=q(o,r)),i.push(s)}return i};function P(c){const{matches:e}=f(o),t=e[e.length-1],i=t.pathnameBase||"/",n=c||t.route.children||[],r=x((()=>function(c){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";return q(c,e)}(n,i)),[n,i]);return[r,x((()=>e.reduceRight(((c,e)=>c||e.route.handle?.title),void 0)),[e])]}function V(c,e){return c.map((c=>(c.children&&(c.children=V(c.children,c.meta?.hideChildrenInMenu)),c.handle={title:c.meta?.title,hideInMenu:c.meta?.hideInMenu||e&&!c.index,...c.handle},c)))}const D=t=>t.map((t=>{const i=e(cc,{children:[t.icon,t.title,t.isExternal&&c(B,{})]});return t.children.length>0?c(n,{title:i,children:D(t.children)},t.path):c(r,{children:t.isExternal?c("a",{href:t.path,target:"_blank",children:i}):c(d,{to:t.path,children:i})},t.path)})),H=()=>({height:0}),F=c=>({height:c.scrollHeight}),K={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:H,onAppearActive:F,onEnterStart:H,onEnterActive:F,onLeaveStart:F,onLeaveActive:H};function W(t){let{title:i,header:n,footer:r,routes:o}=t;const[l,d]=P(o),{pathname:h}=a(),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(J,{children:i||d})),e(tc,{children:[e(G,{children:[c(Q,{children:n}),c(ec,{mode:"inline",motion:K,openKeys:u,onOpenChange:p,selectedKeys:g,children:D(l)}),c(X,{children:r})]}),c(Y,{children:c(Z,{children:o?c(T,{routes:o}):c(s,{})})})]})}const T=b((function(c){let{routes:e}=c;return l(x((()=>V(e)),[e]))})),G=k.nav`
2
2
  position: fixed;
3
3
  top: 0;
4
4
  bottom: 0;
@@ -10,12 +10,12 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMen
10
10
  background-color: #f5f5f5;
11
11
  display: flex;
12
12
  flex-direction: column;
13
- `,K=_.div`
13
+ `,J=k.div`
14
14
  text-overflow: ellipsis;
15
15
  white-space: nowrap;
16
16
  overflow: hidden;
17
17
  font-size: 16px;
18
- `,T=_.div`
18
+ `,Q=k.div`
19
19
  height: 64px;
20
20
  display: flex;
21
21
  align-items: center;
@@ -23,16 +23,16 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMen
23
23
  border-bottom: 1px solid #e3e3e3;
24
24
  flex-grow: 0;
25
25
  flex-shrink: 0;
26
- `,G=_.div`
26
+ `,X=k.div`
27
27
  flex-grow: 0;
28
28
  flex-shrink: 0;
29
- `,J=_.div`
29
+ `,Y=k.div`
30
30
  margin-left: 230px;
31
31
  flex: 1;
32
- `,Q=_.main`
32
+ `,Z=k.main`
33
33
  min-height: calc(100vh - 54px);
34
34
  position: relative;
35
- `,X=_.div`
35
+ `,cc=k.div`
36
36
  display: inline-flex;
37
37
  align-items: center;
38
38
  gap: 0.5rem;
@@ -43,7 +43,7 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMen
43
43
  min-width: 19px;
44
44
  text-align: center;
45
45
  }
46
- `,Y=_(i)`
46
+ `,ec=k(i)`
47
47
  border: none;
48
48
  box-shadow: none;
49
49
  padding: 10px 0;
@@ -182,26 +182,26 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMen
182
182
  }
183
183
  }
184
184
 
185
- `,Z=_.div`
185
+ `,tc=k.div`
186
186
  display: flex;
187
187
  flex-wrap: nowrap;
188
188
  width: 100%;
189
189
 
190
190
  &:has(&) {
191
- > ${F} {
191
+ > ${G} {
192
192
  display: none;
193
193
  }
194
194
 
195
- > ${J} {
195
+ > ${Y} {
196
196
  margin-left: 0;
197
197
  }
198
198
  }
199
- `;function cc(t){let{title:i,children:r,nav:n,extra:o,showBack:a}=t;const s=d(),g=h(),u=l(),[m,p]=b((()=>{let c;return[s.reduceRight(((e,t)=>(void 0!==c||t.pathname.endsWith("/")||(c=!t.handle?.title),e||t.handle?.title)),void 0),c]}),[s]);return void 0===a&&(a=p),e(tc,{children:[c(ic,{children:e("div",{className:"container",children:[e(k,{children:[a&&"default"!==u.key&&c(ec,{onClick:()=>g(-1),children:c("i",{className:"bi bi-arrow-left-short"})}),c(nc,{children:i||m})]}),n,c(oc,{children:o})]})}),c(rc,{className:"container",children:r})]})}const ec=_.div`
199
+ `;function ic(t){let{title:i,children:n,nav:r,extra:l,showBack:s}=t;const{matches:d}=f(o),g=x((()=>d.reduceRight(((c,e)=>c||e.route.index?c:e.route),void 0)),[d]),u=!0===g?.handle?.hideInMenu,m=g?.handle?.title,p=h(),v=a();return void 0===s&&(s=u),e(rc,{children:[c(oc,{children:e("div",{className:"container",children:[e(z,{children:[s&&"default"!==v.key&&c(nc,{onClick:()=>p(-1),children:c("i",{className:"bi bi-arrow-left-short"})}),c(ac,{children:i||m})]}),r,c(sc,{children:l})]})}),c(lc,{className:"container",children:n})]})}const nc=k.div`
200
200
  font-size: 32px;
201
201
  cursor: pointer;
202
- `,tc=_.div`
202
+ `,rc=k.div`
203
203
  width: 100%;
204
- `,ic=_.div`
204
+ `,oc=k.div`
205
205
  background-color: #fff;
206
206
  display: flex;
207
207
 
@@ -231,17 +231,25 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import i,{SubMen
231
231
  }
232
232
  }
233
233
  }
234
- `,rc=_.div`
234
+ `,lc=k.div`
235
235
  margin-top: 24px;
236
- `,nc=_.div`
236
+ `,ac=k.div`
237
237
  font-size: 22px;
238
238
  line-height: 64px;
239
239
  height: 64px;
240
- `,oc=_.div`
240
+ `,sc=k.div`
241
241
  margin-left: auto;
242
- `;function lc(e){let{title:t,showBack:i}=e;const r=g();"function"==typeof t&&(t=t(r));const[n,o]=q(),{pathname:d}=l(),h=c(S,{children:n.map((e=>c(S.Item,{children:c(S.Link,{as:s,to:e.path,active:d.startsWith(e.path),children:e.title})},e.path)))});return c(cc,{title:t||o,nav:h,showBack:i,children:c(a,{})})}const ac=f.createContext({}),sc=f.createContext(null),dc=function(){const[e,t]=w(null),{userResolver:i,onUnauthorized:r}=x(ac);return z((async()=>{if(i)return i()}),[],{onError(c){c instanceof L&&r&&r(c)},onSuccess(c){c&&t(c)}}),e?c(sc.Provider,{value:[e,t],children:c(a,{})}):c(N,{})};function hc(){const c=x(sc);if(!c)throw new Error("please use `useUser` in UserContext");return c}const gc=_.a`
242
+ `;function dc(t){let{title:i,showBack:n,extra:r}=t;const[o,l]=P(),{pathname:d}=a(),h=c(S,{children:o.map((t=>c(S.Item,{children:e(hc,{className:M("nav-link",{active:d.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path)))});return c(ic,{title:i||l,nav:h,showBack:n,extra:r,children:c(s,{})})}const hc=k(d)`
243
+ display: flex;
244
+ align-items: center;
245
+ gap: 0.5rem;
246
+
247
+ .bi, svg {
248
+ text-align: center;
249
+ }
250
+ `;const gc=v.createContext({}),uc=v.createContext(null),mc=function(){const[e,t]=w(null),{userResolver:i,onUnauthorized:n}=f(gc);return L((async()=>{if(i)return i()}),[],{onError(c){c instanceof N&&n&&n(c)},onSuccess(c){c&&t(c)}}),e?c(uc.Provider,{value:[e,t],children:c(s,{})}):c(I,{})};function pc(){const c=f(uc);if(!c)throw new Error("please use `useUser` in UserContext");return c}const vc=k.a`
243
251
  cursor: pointer;
244
- `;function uc(t){let{children:i,menus:r,className:n,logo:o=!0}=t;const[l]=hc();return c(mc,{className:C("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",n),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"})}),i,e(I,{navbar:!0,children:[c(I.Toggle,{as:gc,className:"nav-link",children:c("img",{className:"rounded-circle",width:"25",height:"25",src:l.avatar})}),c(I.Menu,{className:"shadow",children:r})]})]})})}const mc=_.header`
252
+ `;function fc(t){let{children:i,menus:n,className:r,logo:o=!0}=t;const[l]=pc();return c(xc,{className:M("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",r),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"})}),i,e(C,{navbar:!0,children:[c(C.Toggle,{as:vc,className:"nav-link",children:c("img",{className:"rounded-circle",width:"25",height:"25",src:l.avatar})}),c(C.Menu,{className:"shadow",children:n})]})]})})}const xc=k.header`
245
253
  height: 54px;
246
- `;function pc(e){let{require:i,children:r,fallback:n}=e;const[o]=hc();let l=!1;return"function"==typeof i?l=i(o):("string"==typeof i&&(i=[i]),l=j(o.roles,i).length>0),l||(r=n),c(t,{children:r})}function vc(e){let{to:t,replace:i,...r}=e,n=h();return c(E,{...r,onClick:c=>{c.preventDefault(),n(t,{replace:i})}})}function fc(e){let{onLogin:t}=e;const{result:i}=z((async()=>{await t();const c=localStorage.getItem("redirect_uri");return c&&localStorage.removeItem("redirect_uri"),c||"/"}),[]);return i?c(u,{to:i,replace:!0}):c(N,{})}function xc(e){let{onLogout:t}=e;return z((async()=>{await t()}),[]),c(N,{})}function bc(c){return c.map((c=>(c.children&&(c.children=bc(c.children)),c.handle={title:c.meta?.title,...c.handle},c)))}function wc(e){const{basename:t="/",onLogin:i,onLogout:r,authentication:n,baseURL:o,userResolver:l}=e;o&&(R.defaults.baseURL=o),"token"===n&&R.interceptors.request.use((c=>{const e=localStorage.getItem("authorization");return e&&(c.headers={...c.headers,Authorization:`Bearer ${e}`}),c}));const a=c=>{window.location.pathname!==O.join(t,"/logout")&&localStorage.setItem("redirect_uri",function(c,e){return"/"===e?c:c.slice(e.length)}(window.location.pathname+window.location.search,t));const e=window.location.origin+O.join(t,"/login");window.location.href=A.stringifyUrl({url:c.url,query:{redirect_uri:e}})},s=async()=>{let c;if(i)c=await i();else{const e=A.parse(window.location.hash.substr(1));e.access_token&&(c=e.access_token)}"token"===n&&c&&localStorage.setItem("authorization",c)},d=async()=>{if(r)try{await r()}catch(c){c instanceof L&&a(c)}"token"===n&&localStorage.removeItem("authorization")};return function(e){let{routes:i}=e;const r=m([{path:"*",element:c(dc,{}),children:bc(i)},{path:"login",element:c(fc,{onLogin:s})},{path:"logout",element:c(xc,{onLogout:d})}],{basename:t});return c(ac.Provider,{value:{userResolver:l,onUnauthorized:a},children:c(p,{router:r})})}}export{pc as Access,cc as Content,uc as Header,vc as LinkButton,W as SiderLayout,lc as TabLayout,wc as createApplication,hc as useUser};
254
+ `;function bc(e){let{require:i,children:n,fallback:r}=e;const[o]=pc();let l=!1;return"function"==typeof i?l=i(o):("string"==typeof i&&(i=[i]),l=j(o.roles,i).length>0),l||(n=r),c(t,{children:n})}function wc(e){let{to:t,replace:i,...n}=e,r=h();return c(E,{...n,onClick:c=>{c.preventDefault(),r(t,{replace:i})}})}function yc(e){let{onLogin:t}=e;const{result:i}=L((async()=>{await t();const c=localStorage.getItem("redirect_uri");return c&&localStorage.removeItem("redirect_uri"),c||"/"}),[]);return i?c(g,{to:i,replace:!0}):c(I,{})}function _c(e){let{onLogout:t}=e;return L((async()=>{await t()}),[]),c(I,{})}function kc(e){const{basename:t="/",onLogin:i,onLogout:n,authentication:r,baseURL:o,userResolver:l}=e;o&&(R.defaults.baseURL=o),"token"===r&&R.interceptors.request.use((c=>{const e=localStorage.getItem("authorization");return e&&(c.headers={...c.headers,Authorization:`Bearer ${e}`}),c}));const a=c=>{window.location.pathname!==O.join(t,"/logout")&&localStorage.setItem("redirect_uri",function(c,e){return"/"===e?c:c.slice(e.length)}(window.location.pathname+window.location.search,t));const e=window.location.origin+O.join(t,"/login");window.location.href=A.stringifyUrl({url:c.url,query:{redirect_uri:e}})},s=async()=>{let c;if(i)c=await i();else{const e=A.parse(window.location.hash.substr(1));e.access_token&&(c=e.access_token)}"token"===r&&c&&localStorage.setItem("authorization",c)},d=async()=>{if(n)try{await n()}catch(c){c instanceof N&&a(c)}"token"===r&&localStorage.removeItem("authorization")};return function(e){let{routes:i}=e;const n=u([{path:"*",element:c(mc,{}),children:V(i)},{path:"login",element:c(yc,{onLogin:s})},{path:"logout",element:c(_c,{onLogout:d})}],{basename:t});return c(gc.Provider,{value:{userResolver:l,onUnauthorized:a},children:c(m,{router:n})})}}export{bc as Access,ic as Content,fc as Header,wc as LinkButton,W as SiderLayout,dc as TabLayout,kc as createApplication,pc as useUser};
247
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/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/transform-routes.ts","../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\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 = (\r\n routes: RouteObject[],\r\n parent: string = '/',\r\n): 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 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(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(routes: RouteObject[], base: string = '/'): MenuData[] {\r\n return formatRelativePath(routes, base);\r\n}\r\n","import { useContext, useMemo } from 'react';\r\nimport { UNSAFE_RouteContext } from 'react-router-dom';\r\nimport getMenuData, { MenuData } from '../utils/get-menu-data';\r\n\r\nexport default function useMenu(): [MenuData[], string | undefined] {\r\n const { matches } = useContext(UNSAFE_RouteContext);\r\n\r\n const routeMatch = matches[matches.length - 1];\r\n const pathnameBase = routeMatch.pathnameBase || '/';\r\n const routes = routeMatch.route.children || [];\r\n\r\n const menu = useMemo(() => getMenuData(routes, pathnameBase), [routes, 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 RcMenu, { MenuItem, SubMenu } from 'rc-menu';\r\nimport { Link, Outlet, useLocation } from 'react-router-dom';\r\nimport { ReactNode, useEffect, useMemo, useState } from 'react';\r\nimport { MenuData } from '../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\nimport { styled } from '@topthink/components';\r\nimport { ReactComponent as ExternalIcon } from '../images/external.svg';\r\nimport useMenu from './use-menu';\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 {\r\n title?: string;\r\n header?: ReactNode;\r\n footer?: ReactNode;\r\n}\r\n\r\nexport default function SiderLayout({ title, header, footer }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n\r\n const { pathname } = useLocation();\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 setOpenKeys(selectedKeys.slice(0, -1));\r\n }, [selectedKeys]);\r\n\r\n const onOpenChange = (openKeys: string[]) => {\r\n const currentKey = openKeys[openKeys.length - 1];\r\n setOpenKeys(openKeys.filter(key => currentKey.startsWith(key)));\r\n };\r\n\r\n if (!header) {\r\n header = <Title>{title || defaultTitle}</Title>;\r\n }\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{header}</Header>\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 <Footer>{footer}</Footer>\r\n </Sidebar>\r\n <Content>\r\n <Main>\r\n <Outlet />\r\n </Main>\r\n </Content>\r\n </Container>;\r\n}\r\n\r\nconst Sidebar = styled.nav`\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n padding: 54px 0 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: 64px;\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 margin-left: 230px;\r\n flex: 1;\r\n`;\r\n\r\nconst Main = styled.main`\r\n min-height: calc(100vh - 54px);\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","import { Space, styled } from '@topthink/components';\r\nimport { PropsWithChildren, ReactNode, useMemo } from 'react';\r\nimport { useLocation, useMatches, useNavigate, } from 'react-router-dom';\r\n\r\ninterface ContentProps {\r\n title?: string;\r\n nav?: ReactNode;\r\n extra?: ReactNode;\r\n showBack?: boolean;\r\n}\r\n\r\nexport default function Content({ title, children, nav, extra, showBack }: PropsWithChildren<ContentProps>) {\r\n const matches = useMatches();\r\n\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const [defaultTitle, defaultShowBack] = useMemo(() => {\r\n let showBack: boolean | undefined = undefined;\r\n\r\n return [matches.reduceRight((title, match) => {\r\n if (showBack === undefined && !match.pathname.endsWith('/')) {\r\n showBack = !match.handle?.title;\r\n }\r\n if (title) return title;\r\n return match.handle?.title;\r\n }, undefined), showBack];\r\n }, [matches]);\r\n\r\n if (showBack === undefined) {\r\n showBack = defaultShowBack;\r\n }\r\n\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Space>\r\n {showBack && location.key !== 'default' &&\r\n <Back onClick={() => navigate(-1)}><i className='bi bi-arrow-left-short' /></Back>}\r\n <Title>{title || defaultTitle}</Title>\r\n </Space>\r\n {nav}\r\n <Extra>{extra}</Extra>\r\n </div>\r\n </Header>\r\n <Body className='container'>\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`;\r\n\r\nconst Header = styled.div`\r\n background-color: #fff;\r\n display: flex;\r\n\r\n .container {\r\n padding: 0 12px;\r\n display: flex;\r\n align-items: center;\r\n\r\n .nav {\r\n margin-left: 1.5rem;\r\n\r\n .nav-link {\r\n position: relative;\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 }\r\n }\r\n`;\r\n\r\nconst Body = styled.div`\r\n margin-top: 24px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 22px;\r\n line-height: 64px;\r\n height: 64px;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n margin-left: auto;\r\n`;\r\n","import { Nav } from 'react-bootstrap';\r\nimport Content from '../components/content';\r\nimport { Link, Outlet, useLoaderData, useLocation } from 'react-router-dom';\r\nimport useMenu from './use-menu';\r\n\r\ninterface Props {\r\n title?: string | ((data: any) => string);\r\n showBack?: boolean;\r\n}\r\n\r\nexport default function TabLayout({ title, showBack }: Props) {\r\n\r\n const data = useLoaderData();\r\n\r\n if (typeof title === 'function') {\r\n title = title(data);\r\n }\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n const { pathname } = useLocation();\r\n\r\n const nav = <Nav>\r\n {menu.map((item) => {\r\n return <Nav.Item key={item.path}>\r\n <Nav.Link as={Link} to={item.path} active={pathname.startsWith(item.path)}>{item.title}</Nav.Link>\r\n </Nav.Item>;\r\n })}\r\n </Nav>;\r\n\r\n return <Content title={title || defaultTitle} nav={nav} showBack={showBack}>\r\n <Outlet />\r\n </Content>;\r\n\r\n}\r\n","import React from 'react';\r\nimport { Unauthorized } from '@topthink/components';\r\nimport { User } from './types';\r\n\r\nexport type UserResolver = () => User | Promise<User>\r\n\r\nconst AppContext = React.createContext<{\r\n userResolver?: UserResolver,\r\n onUnauthorized?: (error: Unauthorized) => void\r\n}>({});\r\n\r\nexport default AppContext;\r\n","import React, { useContext, useState } from 'react';\r\nimport { User } from '../utils/types';\r\nimport { Loader, Unauthorized, useAsync } from '@topthink/components';\r\nimport AppContext from '../utils/app-context';\r\nimport { Outlet } from 'react-router-dom';\r\n\r\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\r\n\r\nconst UserProvider = function() {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const { userResolver, onUnauthorized } = useContext(AppContext);\r\n\r\n useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n onError(e) {\r\n if (e instanceof Unauthorized && onUnauthorized) {\r\n onUnauthorized(e);\r\n }\r\n },\r\n onSuccess(user) {\r\n if (user) {\r\n setState(user);\r\n }\r\n }\r\n });\r\n\r\n if (!state) {\r\n return <Loader />;\r\n }\r\n\r\n return <UserContext.Provider value={[state, setState]}>\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, useAsync } from '@topthink/components';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\ninterface LoginProps {\r\n onLogin: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Login({ onLogin }: LoginProps) {\r\n const { result } = useAsync(async () => {\r\n await onLogin();\r\n\r\n const redirectUri = localStorage.getItem('redirect_uri');\r\n if (redirectUri) {\r\n localStorage.removeItem('redirect_uri');\r\n }\r\n return redirectUri || '/';\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\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n useAsync(async () => {\r\n await onLogout();\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { RouteObject } from 'react-router-dom';\r\n\r\nexport default function transformRoutes(routes: RouteObject[]) {\r\n return routes.map((route) => {\r\n if (route.children) {\r\n route.children = transformRoutes(route.children);\r\n }\r\n\r\n route.handle = {\r\n title: route.meta?.title,\r\n ...route.handle,\r\n };\r\n\r\n return route;\r\n });\r\n}\r\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\r\nimport Login from '../pages/login';\r\nimport Logout from '../pages/logout';\r\nimport queryString from 'query-string';\r\nimport * as path from 'path';\r\nimport { request, Unauthorized } from '@topthink/components';\r\nimport UserProvider from '../components/user-provider';\r\nimport transformRoutes from './transform-routes';\r\nimport AppContext, { UserResolver } from './app-context';\r\n\r\nfunction stripBasename(pathname: string, basename: string) {\r\n if (basename === '/') return pathname;\r\n\r\n return pathname.slice(basename.length);\r\n}\r\n\r\ninterface AppProps {\r\n routes: RouteObject[];\r\n}\r\n\r\ninterface Options {\r\n baseURL?: string;\r\n basename?: string;\r\n authentication?: 'cookie' | 'token';\r\n onLogout?: () => void | Promise<void>;\r\n onLogin?: () => (void | string) | Promise<void | string>;\r\n userResolver?: UserResolver;\r\n}\r\n\r\nexport default function createApplication(options: Options) {\r\n const { basename = '/', onLogin, onLogout, authentication, baseURL, userResolver } = options;\r\n\r\n if (baseURL) {\r\n request.defaults.baseURL = baseURL;\r\n }\r\n\r\n if (authentication === 'token') {\r\n request.interceptors.request.use(\r\n config => {\r\n const token = localStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n }\r\n );\r\n }\r\n\r\n const onUnauthorized = (error: Unauthorized) => {\r\n if (window.location.pathname !== path.join(basename, '/logout')) {\r\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\r\n }\r\n const redirectUri = window.location.origin + path.join(basename, '/login');\r\n\r\n window.location.href = queryString.stringifyUrl({\r\n url: error.url,\r\n query: { redirect_uri: redirectUri }\r\n });\r\n };\r\n\r\n const handleLogin = async () => {\r\n let token: string | void;\r\n if (onLogin) {\r\n token = await onLogin();\r\n } else {\r\n const parsed = queryString.parse(window.location.hash.substr(1));\r\n if (parsed.access_token) {\r\n token = parsed.access_token as string;\r\n }\r\n }\r\n\r\n if (authentication === 'token' && token) {\r\n localStorage.setItem('authorization', token);\r\n }\r\n };\r\n\r\n const handleLogout = async () => {\r\n if (onLogout) {\r\n try {\r\n await onLogout();\r\n } catch (e) {\r\n if (e instanceof Unauthorized) {\r\n onUnauthorized(e);\r\n }\r\n }\r\n }\r\n\r\n if (authentication === 'token') {\r\n localStorage.removeItem('authorization');\r\n }\r\n };\r\n\r\n return function({ routes }: AppProps) {\r\n const router = createBrowserRouter(\r\n [\r\n {\r\n path: '*',\r\n element: <UserProvider />,\r\n children: transformRoutes(routes),\r\n },\r\n {\r\n path: 'login',\r\n element: <Login onLogin={handleLogin} />\r\n },\r\n {\r\n path: 'logout',\r\n element: <Logout onLogout={handleLogout} />\r\n }\r\n ],\r\n {\r\n basename\r\n }\r\n );\r\n\r\n return <AppContext.Provider value={{ userResolver, onUnauthorized }}>\r\n <RouterProvider router={router} />\r\n </AppContext.Provider>;\r\n };\r\n}\r\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","useMemo","base","getMenuData","reduceRight","match","handle","undefined","renderMenuItems","items","map","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","Title","Container","Sidebar","Header","Menu","mode","onOpenChange","currentKey","filter","startsWith","Footer","Content","Main","Outlet","styled","nav","div","main","RcMenu","extra","showBack","useMatches","navigate","useNavigate","location","defaultShowBack","endsWith","Space","Back","onClick","Extra","Body","TabLayout","data","useLoaderData","Nav","Item","as","active","AppContext","createContext","UserContext","UserProvider","state","setState","userResolver","onUnauthorized","useAsync","async","onError","e","Unauthorized","onSuccess","user","Provider","value","Loader","useUser","context","Error","Avatar","a","logo","classNames","src","Dropdown","navbar","Toggle","avatar","Access","require","fallback","passed","intersection","roles","_Fragment","LinkButton","Button","preventDefault","Login","onLogin","result","redirectUri","localStorage","getItem","removeItem","Navigate","Logout","onLogout","transformRoutes","createApplication","options","basename","authentication","baseURL","request","defaults","interceptors","use","config","token","headers","Authorization","error","window","setItem","stripBasename","search","origin","queryString","stringifyUrl","url","query","redirect_uri","handleLogin","parsed","parse","hash","substr","access_token","handleLogout","router","createBrowserRouter","element","RouterProvider"],"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';\r\nimport { ReactNode } from 'react';\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 = (\r\n routes: RouteObject[],\r\n parent: string = '/',\r\n): 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 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(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(routes: RouteObject[], base: string = '/'): MenuData[] {\r\n return formatRelativePath(routes, base);\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\n\r\nexport default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined] {\r\n\r\n const { matches } = useContext(UNSAFE_RouteContext);\r\n\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(routesMatch, pathnameBase), [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 = {\r\n title: route.meta?.title,\r\n hideInMenu: route.meta?.hideInMenu || (hideInMenu && !route.index),\r\n ...route.handle,\r\n };\r\n\r\n return route;\r\n });\r\n}\r\n","import RcMenu, { MenuItem, SubMenu } from 'rc-menu';\r\nimport { Link, Outlet, RouteObject, useLocation, useRoutes } from 'react-router-dom';\r\nimport { memo, ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { MenuData } from '../utils/get-menu-data';\r\nimport type { CSSMotionProps } from 'rc-motion';\r\nimport { styled } 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\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 {\r\n title?: string;\r\n header?: ReactNode;\r\n footer?: ReactNode;\r\n routes?: RouteObject[];\r\n}\r\n\r\nexport default function SiderLayout({ title, header, footer, routes }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu(routes);\r\n\r\n const { pathname } = useLocation();\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 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 if (!header) {\r\n header = <Title>{title || defaultTitle}</Title>;\r\n }\r\n\r\n return <Container>\r\n <Sidebar>\r\n <Header>{header}</Header>\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 <Footer>{footer}</Footer>\r\n </Sidebar>\r\n <Content>\r\n <Main>\r\n {routes ? <Routes routes={routes} /> : <Outlet />}\r\n </Main>\r\n </Content>\r\n </Container>;\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: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 100;\r\n padding: 54px 0 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: 64px;\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 margin-left: 230px;\r\n flex: 1;\r\n`;\r\n\r\nconst Main = styled.main`\r\n min-height: calc(100vh - 54px);\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","import { Space, styled } from '@topthink/components';\r\nimport { PropsWithChildren, ReactNode, useContext, useMemo } from 'react';\r\nimport { RouteObject, UNSAFE_RouteContext, useLocation, useNavigate, } from 'react-router-dom';\r\n\r\ninterface ContentProps {\r\n title?: string;\r\n nav?: ReactNode;\r\n extra?: ReactNode;\r\n showBack?: boolean;\r\n}\r\n\r\nexport default function Content({ title, children, nav, extra, showBack }: 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 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 return <Container>\r\n <Header>\r\n <div className='container'>\r\n <Space>\r\n {showBack && location.key !== 'default' &&\r\n <Back onClick={() => navigate(-1)}><i className='bi bi-arrow-left-short' /></Back>}\r\n <Title>{title || defaultTitle}</Title>\r\n </Space>\r\n {nav}\r\n <Extra>{extra}</Extra>\r\n </div>\r\n </Header>\r\n <Body className='container'>\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`;\r\n\r\nconst Header = styled.div`\r\n background-color: #fff;\r\n display: flex;\r\n\r\n .container {\r\n padding: 0 12px;\r\n display: flex;\r\n align-items: center;\r\n\r\n .nav {\r\n margin-left: 1.5rem;\r\n\r\n .nav-link {\r\n position: relative;\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 }\r\n }\r\n`;\r\n\r\nconst Body = styled.div`\r\n margin-top: 24px;\r\n`;\r\n\r\nconst Title = styled.div`\r\n font-size: 22px;\r\n line-height: 64px;\r\n height: 64px;\r\n`;\r\n\r\nconst Extra = styled.div`\r\n margin-left: auto;\r\n`;\r\n","import { 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 } from '@topthink/components';\r\nimport classNames from 'classnames';\r\nimport { ReactNode } from 'react';\r\n\r\ninterface Props {\r\n title?: string;\r\n showBack?: boolean;\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function TabLayout({ title, showBack, extra }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n const { pathname } = useLocation();\r\n\r\n const nav = <Nav>\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 </Nav>;\r\n\r\n return <Content title={title || defaultTitle} nav={nav} showBack={showBack} extra={extra}>\r\n <Outlet />\r\n </Content>;\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\r\n .bi, svg {\r\n text-align: center;\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { Unauthorized } from '@topthink/components';\r\nimport { User } from './types';\r\n\r\nexport type UserResolver = () => User | Promise<User>\r\n\r\nconst AppContext = React.createContext<{\r\n userResolver?: UserResolver,\r\n onUnauthorized?: (error: Unauthorized) => void\r\n}>({});\r\n\r\nexport default AppContext;\r\n","import React, { useContext, useState } from 'react';\r\nimport { User } from '../utils/types';\r\nimport { Loader, Unauthorized, useAsync } from '@topthink/components';\r\nimport AppContext from '../utils/app-context';\r\nimport { Outlet } from 'react-router-dom';\r\n\r\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\r\n\r\nconst UserProvider = function() {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const { userResolver, onUnauthorized } = useContext(AppContext);\r\n\r\n useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n onError(e) {\r\n if (e instanceof Unauthorized && onUnauthorized) {\r\n onUnauthorized(e);\r\n }\r\n },\r\n onSuccess(user) {\r\n if (user) {\r\n setState(user);\r\n }\r\n }\r\n });\r\n\r\n if (!state) {\r\n return <Loader />;\r\n }\r\n\r\n return <UserContext.Provider value={[state, setState]}>\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, useAsync } from '@topthink/components';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\ninterface LoginProps {\r\n onLogin: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Login({ onLogin }: LoginProps) {\r\n const { result } = useAsync(async () => {\r\n await onLogin();\r\n\r\n const redirectUri = localStorage.getItem('redirect_uri');\r\n if (redirectUri) {\r\n localStorage.removeItem('redirect_uri');\r\n }\r\n return redirectUri || '/';\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\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n useAsync(async () => {\r\n await onLogout();\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\r\nimport Login from '../pages/login';\r\nimport Logout from '../pages/logout';\r\nimport queryString from 'query-string';\r\nimport * as path from 'path';\r\nimport { request, Unauthorized } from '@topthink/components';\r\nimport UserProvider from '../components/user-provider';\r\nimport transformRoutes from './transform-routes';\r\nimport AppContext, { UserResolver } from './app-context';\r\n\r\nfunction stripBasename(pathname: string, basename: string) {\r\n if (basename === '/') return pathname;\r\n\r\n return pathname.slice(basename.length);\r\n}\r\n\r\ninterface AppProps {\r\n routes: RouteObject[];\r\n}\r\n\r\ninterface Options {\r\n baseURL?: string;\r\n basename?: string;\r\n authentication?: 'cookie' | 'token';\r\n onLogout?: () => void | Promise<void>;\r\n onLogin?: () => (void | string) | Promise<void | string>;\r\n userResolver?: UserResolver;\r\n}\r\n\r\nexport default function createApplication(options: Options) {\r\n const { basename = '/', onLogin, onLogout, authentication, baseURL, userResolver } = options;\r\n\r\n if (baseURL) {\r\n request.defaults.baseURL = baseURL;\r\n }\r\n\r\n if (authentication === 'token') {\r\n request.interceptors.request.use(\r\n config => {\r\n const token = localStorage.getItem('authorization');\r\n\r\n if (token) {\r\n config.headers = {\r\n ...config.headers,\r\n Authorization: `Bearer ${token}`\r\n };\r\n }\r\n return config;\r\n }\r\n );\r\n }\r\n\r\n const onUnauthorized = (error: Unauthorized) => {\r\n if (window.location.pathname !== path.join(basename, '/logout')) {\r\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\r\n }\r\n const redirectUri = window.location.origin + path.join(basename, '/login');\r\n\r\n window.location.href = queryString.stringifyUrl({\r\n url: error.url,\r\n query: { redirect_uri: redirectUri }\r\n });\r\n };\r\n\r\n const handleLogin = async () => {\r\n let token: string | void;\r\n if (onLogin) {\r\n token = await onLogin();\r\n } else {\r\n const parsed = queryString.parse(window.location.hash.substr(1));\r\n if (parsed.access_token) {\r\n token = parsed.access_token as string;\r\n }\r\n }\r\n\r\n if (authentication === 'token' && token) {\r\n localStorage.setItem('authorization', token);\r\n }\r\n };\r\n\r\n const handleLogout = async () => {\r\n if (onLogout) {\r\n try {\r\n await onLogout();\r\n } catch (e) {\r\n if (e instanceof Unauthorized) {\r\n onUnauthorized(e);\r\n }\r\n }\r\n }\r\n\r\n if (authentication === 'token') {\r\n localStorage.removeItem('authorization');\r\n }\r\n };\r\n\r\n return function({ routes }: AppProps) {\r\n const router = createBrowserRouter(\r\n [\r\n {\r\n path: '*',\r\n element: <UserProvider />,\r\n children: transformRoutes(routes),\r\n },\r\n {\r\n path: 'login',\r\n element: <Login onLogin={handleLogin} />\r\n },\r\n {\r\n path: 'logout',\r\n element: <Logout onLogout={handleLogout} />\r\n }\r\n ],\r\n {\r\n basename\r\n }\r\n );\r\n\r\n return <AppContext.Provider value={{ userResolver, onUnauthorized }}>\r\n <RouterProvider router={router} />\r\n </AppContext.Provider>;\r\n };\r\n}\r\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","Unauthorized","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","redirectUri","localStorage","getItem","removeItem","Navigate","Logout","onLogout","createApplication","options","basename","authentication","baseURL","request","defaults","interceptors","use","config","token","headers","Authorization","error","window","setItem","stripBasename","search","origin","queryString","stringifyUrl","url","query","redirect_uri","handleLogin","parsed","parse","hash","substr","access_token","handleLogout","router","createBrowserRouter","element","RouterProvider"],"mappings":"05BAAA,IAAIA,EACJ,SAASC,IAAiS,OAApRA,EAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CAAE,IAAIG,EAASF,UAAUD,GAAI,IAAK,IAAII,KAAOD,EAAcP,OAAOS,UAAUC,eAAeC,KAAKJ,EAAQC,KAAQL,EAAOK,GAAOD,EAAOC,IAAY,OAAOL,CAAS,EAASJ,EAASa,MAAMC,KAAMR,UAAa,CAEnV,MAAMS,EAAcC,GAAsBC,EAAMC,cAAc,MAAOlB,EAAS,CAC5EmB,MAAO,6BACPC,MAAO,GACPC,OAAQ,IACPL,GAAQjB,IAAOA,EAAkBkB,EAAMC,cAAc,IAAK,CAC3DI,KAAM,QACQL,EAAMC,cAAc,OAAQ,CAC1CK,EAAG,0DACYN,EAAMC,cAAc,OAAQ,CAC3CK,EAAG,oCCDCC,EAAqB,SACvBC,GAEY,IADZC,yDAAiB,IAGjB,MAAMC,EAAoB,GAE1B,IAAK,MAAMC,KAASH,EAAQ,CAExB,IAAII,KAAEA,EAAO,CAAE,EAAAC,KAAEA,EAAO,GAAEC,SAAEA,EAAW,IAAOH,EAE9C,GAAIC,EAAKG,WACL,SAGJ,MAAMC,EAAQJ,EAAKI,MAEnB,IAAKA,EACD,SAGJ,IAAIC,GAAa,EAEbL,EAAKM,MACLD,GAAa,EACbJ,EAAOD,EAAKM,MAEZL,KAAUJ,KAAUI,IAAOM,QAAQ,UAAW,KAAKA,QAAQ,MAAO,IAGtE,MAGMC,EAAiB,CACnBJ,QACAK,KAL8B,iBAAdT,EAAKS,KACrBC,EAAA,IAAA,CAAGC,UAAoB,SAAAX,EAAKS,SAAaT,EAAKS,KAK9CR,OACAI,aACAH,SAAU,KAGTF,EAAKY,qBAAuBP,GAAcH,EAASxB,OAAS,IAC7D8B,EAAKN,SAAWP,EAAmBO,EAAUD,IAGjDH,EAAMe,KAAKL,EACd,CAED,OAAOV,CACX,ECxDwB,SAAAgB,EAAQlB,GAE5B,MAAMmB,QAAEA,GAAYC,EAAWC,GAEzBC,EAAaH,EAAQA,EAAQrC,OAAS,GACtCyC,EAAeD,EAAWC,cAAgB,IAE1CC,EAAcxB,GAAUsB,EAAWnB,MAAMG,UAAY,GAErDM,EAAOa,GAAQ,IDiDD,SAAYzB,GAAyC,IAAlB0B,yDAAe,IACtE,OAAO3B,EAAmBC,EAAQ0B,EACtC,CCnD+BC,CAAYH,EAAaD,IAAe,CAACC,EAAaD,IASjF,MAAO,CAACX,EAPMa,GAAQ,IACXN,EAAQS,aAAY,CAACpB,EAAOqB,IAC3BrB,GACGqB,EAAM1B,MAAM2B,QAAQtB,YAC5BuB,IACJ,CAACZ,IAGR,CCrBc,SAAUa,EAAgBhC,EAAuBO,GAC3D,OAAOP,EAAOiC,KAAK9B,IACXA,EAAMG,WACNH,EAAMG,SAAW0B,EAAgB7B,EAAMG,SAAUH,EAAMC,MAAMY,qBAGjEb,EAAM2B,OAAS,CACXtB,MAAOL,EAAMC,MAAMI,MACnBD,WAAYJ,EAAMC,MAAMG,YAAeA,IAAeJ,EAAM+B,SACzD/B,EAAM2B,QAGN3B,IAEf,CCNA,MAAMgC,EAAmBC,GACdA,EAAMH,KAAKI,IAEd,MAAM7B,EAAQ8B,EAACC,cACVF,EAAKxB,KACLwB,EAAK7B,MACL6B,EAAK5B,YAAcK,EAAC0B,EAAe,CAAA,MAGxC,OAAIH,EAAK/B,SAASxB,OAAS,EAChBgC,EAAC2B,EAAO,CAACjC,MAAOA,WAClB2B,EAAgBE,EAAK/B,WADS+B,EAAKhC,MAIjCS,EAAC4B,EAAQ,CAAApC,SACX+B,EAAK5B,WACFK,EAAA,IAAA,CAAGJ,KAAM2B,EAAKhC,KAAM1B,OAAO,SAAQ2B,SAAEE,IACrCM,EAAC6B,EAAI,CAACC,GAAIP,EAAKhC,KAAOC,SAAAE,KAHR6B,EAAKhC,KAM9B,IAIHwC,EAAe,KACV,CAAEjD,OAAQ,IAEfkD,EAAcC,IACT,CAAEnD,OAAQmD,EAAKC,eAGpBC,EAAyB,CAC3BC,WAAY,mBACZC,cAAc,EACdC,cAAeP,EACfQ,eAAgBP,EAChBQ,aAAcT,EACdU,cAAeT,EACfU,aAAcV,EACdW,cAAeZ,GAUK,SAAAa,EAAoDC,GAAA,IAAxCnD,MAAEA,EAAKoD,OAAEA,EAAMC,OAAEA,EAAM7D,OAAEA,GAAe2D,EAExE,MAAO/C,EAAMkD,GAAgB5C,EAAQlB,IAE/B+D,SAAEA,GAAaC,IAEfC,EAAexC,GAAQ,KACzB,MAAMyC,EAAiB,GASvB,OARcH,EAASI,MAAM,KACvBC,QAAiB,CAACC,EAAKC,KACrBD,EAAIvF,OAAS,GACboF,EAAKjD,KAAKoD,EAAIE,KAAK,MAEhB,IAAIF,EAAKC,KACjB,IACHJ,EAAKjD,KAAK8C,GACHG,CAAI,GACZ,CAACH,KAEGS,EAAUC,GAAeC,EAAmB,IAEnDC,GAAU,KACNF,EAAYR,EAAaW,MAAM,GAAI,GAAG,GACvC,CAACX,IAEJ,MAAMY,EAAeC,GAAaN,IAC9B,MAAMO,EAAaP,EAASA,EAAS1F,OAAS,GAC9C2F,EAAYD,EAASQ,QAAOhG,GAAO+F,EAAWE,WAAWjG,KAAM,GAChE,CAACwF,EAAUC,IAMd,OAJKb,IACDA,EAAS9C,EAACoE,EAAK,CAAA5E,SAAEE,GAASsD,KAGvBxB,EAAC6C,GACJ,CAAA7E,SAAA,CAAAgC,EAAC8C,EACG,CAAA9E,SAAA,CAAAQ,EAACuE,EAAM,CAAA/E,SAAEsD,IACT9C,EAACwE,IACGC,KAAK,SACLtC,OAAQA,EACRuB,SAAUA,EACVK,aAAcA,EACdZ,aAAcA,WAEb9B,EAAgBvB,KAErBE,EAAC0E,YAAQ3B,OAEb/C,EAAC2E,EAAO,CAAAnF,SACJQ,EAAC4E,YACI1F,EAASc,EAAC6E,EAAM,CAAC3F,OAAQA,IAAac,EAAC8E,EAAM,UAI9D,CAEA,MAAMD,EAASE,GAAK,SAA8CC,GAAA,IAArC9F,OAAEA,GAAmC8F,EAC9D,OAAOC,EAAUtE,GAAQ,IAAMO,EAAgBhC,IAAS,CAACA,IAC7D,IAEMoF,EAAUY,EAAOC,GAAG;;;;;;;;;;;;EAcpBf,EAAQc,EAAOE,GAAG;;;;;EAOlBb,EAASW,EAAOE,GAAG;;;;;;;;EAUnBV,EAASQ,EAAOE,GAAG;;;EAInBT,EAAUO,EAAOE,GAAG;;;EAKpBR,EAAOM,EAAOG,IAAI;;;EAKlB5D,GAAYyD,EAAOE,GAAG;;;;;;;;;;;EAatBZ,GAAOU,EAAOI,EAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6IrBjB,GAAYa,EAAOE,GAAG;;;;;;QAMpBd;;;;QAIAK;;;;EC7TgB,SAAAA,GAAkF9B,GAAA,IAA1EnD,MAAEA,EAAKF,SAAEA,EAAQ2F,IAAEA,EAAGI,MAAEA,EAAKC,SAAEA,GAA2C3C,EACtG,MAAMxC,QAAEA,GAAYC,EAAWC,GACzBlB,EAAQsB,GAAQ,IACXN,EAAQS,aAAqC,CAACzB,EAAO0B,IACpD1B,GAAS0B,EAAM1B,MAAM+B,MAAc/B,EAChC0B,EAAM1B,YACd4B,IACJ,CAACZ,IAEEoF,GAAgD,IAA9BpG,GAAO2B,QAAQvB,WACjCuD,EAAe3D,GAAO2B,QAAQtB,MAE9BgG,EAAWC,IACXC,EAAW1C,IAMjB,YAJiBjC,IAAbuE,IACAA,EAAWC,GAGRjE,EAAC6C,GACJ,CAAA7E,SAAA,CAAAQ,EAACuE,GACG,CAAA/E,SAAAgC,EAAA,MAAA,CAAKvB,UAAU,sBACXuB,EAACqE,aACIL,GAA6B,YAAjBI,EAAS1H,KAClB8B,EAAC8F,IAAKC,QAAS,IAAML,GAAU,GAAIlG,SAAAQ,EAAA,IAAA,CAAGC,UAAU,6BACpDD,EAACoE,GAAO,CAAA5E,SAAAE,GAASsD,OAEpBmC,EACDnF,EAACgG,GAAO,CAAAxG,SAAA+F,SAGhBvF,EAACiG,GAAI,CAAChG,UAAU,YACXT,SAAAA,MAGb,CAEA,MAAMsG,GAAOZ,EAAOE,GAAG;;;EAKjBf,GAAYa,EAAOE,GAAG;;EAItBb,GAASW,EAAOE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCnBa,GAAOf,EAAOE,GAAG;;EAIjBhB,GAAQc,EAAOE,GAAG;;;;EAMlBY,GAAQd,EAAOE,GAAG;;ECrFV,SAAUc,GAA2CrD,GAAA,IAAjCnD,MAAEA,EAAK8F,SAAEA,EAAQD,MAAEA,GAAc1C,EAE/D,MAAO/C,EAAMkD,GAAgB5C,KACvB6C,SAAEA,GAAaC,IAEfiC,EAAMnF,EAACmG,EACR,CAAA3G,SAAAM,EAAKqB,KAAKI,GACAvB,EAACmG,EAAIC,eACR5E,EAAC6E,GAAQ,CAAApG,UAAWqG,EAAW,WAAY,CAAEC,OAAQtD,EAASkB,WAAW5C,EAAKhC,QAAUuC,GAAIP,EAAKhC,KAAMM,SAClG,EAAAL,SAAA,CAAA+B,EAAKxB,KACLwB,EAAK7B,UAHQ6B,EAAKhC,UASnC,OAAOS,EAAC2E,GAAO,CAACjF,MAAOA,GAASsD,EAAcmC,IAAKA,EAAKK,SAAUA,EAAUD,MAAOA,EAAK/F,SACpFQ,EAAC8E,EAAS,KAElB,CAEA,MAAMuB,GAAUnB,EAAOrD,EAAK;;;;;;;;EC7B5B,MAAM2E,GAAa9H,EAAM+H,cAGtB,ICHUC,GAAchI,EAAM+H,cAAqD,MAEhFE,GAAe,WACjB,MAAOC,EAAOC,GAAYjD,EAAsB,OAE1CkD,aAAEA,EAAYC,eAAEA,GAAmBzG,EAAWkG,IAmBpD,OAjBAQ,GAASC,UACL,GAAIH,EACA,OAAOA,GACV,GACF,GAAI,CACHI,QAAQC,GACAA,aAAaC,GAAgBL,GAC7BA,EAAeI,EAEtB,EACDE,UAAUC,GACFA,GACAT,EAASS,EAEjB,IAGCV,EAIE5G,EAAC0G,GAAYa,SAAQ,CAACC,MAAO,CAACZ,EAAOC,GAASrH,SACjDQ,EAAC8E,EAAM,MAJA9E,EAACyH,EAAM,CAAA,EAMtB,WAEgBC,KACZ,MAAMC,EAAUrH,EAAWoG,IAC3B,IAAKiB,EACD,MAAM,IAAIC,MAAM,uCAGpB,OAAOD,CACX,CCvCA,MAAME,GAAS3C,EAAO4C,CAAC;;EAUC,SAAAvD,GAA4E1B,GAAA,IAArErD,SAAEA,EAAQJ,MAAEA,EAAKa,UAAEA,EAAS8H,KAAEA,GAAO,GAAgClF,EAChG,MAAOyE,GAAQI,KAEf,OAAO1H,EAACqE,GACJ,CAAApE,UAAWqG,EAAW,yEAA0ErG,GAChGT,SAAAgC,EAAA,MAAA,CAAKvB,UAAU,4BACV8H,GAAQ/H,OAAGC,UAAU,eAAeL,KAAK,2BAA0BJ,SAChEQ,SAAKgI,IC6HX,4/MD7HyBlJ,OAAO,SAE7BU,EACDgC,EAACyG,EAAS,CAAAC,QACN,EAAA1I,SAAA,CAAAQ,EAACiI,EAASE,QAAOC,GAAIP,GAAQ5H,UAAU,WAAUT,SAC7CQ,SAAKC,UAAU,iBAAiBpB,MAAM,KAAKC,OAAO,KAAKkJ,IAAKV,EAAKe,WAErErI,EAACiI,EAASzD,KAAK,CAAAvE,UAAW,SAAQT,SAC7BJ,WAKrB,CAEA,MAAMiF,GAAYa,EAAOpC,MAAM;;EE5BjB,SAAUwF,GAIVzF,GAAA,IAJiB0F,QAC3BA,EAAO/I,SACPA,EAAQgJ,SACRA,GACU3F,EACV,MAAOyE,GAASI,KAChB,IAAIe,GAAS,EAab,MAZuB,mBAAZF,EACPE,EAASF,EAAQjB,IAEM,iBAAZiB,IACPA,EAAU,CAACA,IAEfE,EAASC,EAAapB,EAAKqB,MAAOJ,GAASvK,OAAS,GAEnDyK,IACDjJ,EAAWgJ,GAGRxI,EAAA4I,EAAA,CAAApJ,SAAGA,GACd,CCxBwB,SAAAqJ,GAA2ChG,GAAA,IAAhCf,GAAEA,EAAEjC,QAAEA,KAAYpB,GAAcoE,EAC3D6C,EAAWC,IAEf,OAAO3F,EAAC8I,EAAM,IAAKrK,EAAOsH,QAAUoB,IAChCA,EAAE4B,iBACFrD,EAAS5D,EAAI,CAAEjC,WAAU,GAEjC,CCPc,SAAUmJ,GAA6BnG,GAAA,IAAvBoG,QAAEA,GAAqBpG,EACjD,MAAMqG,OAAEA,GAAWlC,GAASC,gBAClBgC,IAEN,MAAME,EAAcC,aAAaC,QAAQ,gBAIzC,OAHIF,GACAC,aAAaE,WAAW,gBAErBH,GAAe,GAAG,GAC1B,IAEH,OAAID,EACOlJ,EAACuJ,EAAS,CAAAzH,GAAIoH,EAAQrJ,SAAO,IAGjCG,EAACyH,EAAM,CAAA,EAClB,CCjBc,SAAU+B,GAAgC3G,GAAA,IAAzB4G,SAAEA,GAAuB5G,EAKpD,OAJAmE,GAASC,gBACCwC,GAAU,GACjB,IAEIzJ,EAACyH,EAAM,CAAA,EAClB,CCiBwB,SAAAiC,GAAkBC,GACtC,MAAMC,SAAEA,EAAW,IAAGX,QAAEA,EAAOQ,SAAEA,EAAQI,eAAEA,EAAcC,QAAEA,EAAOhD,aAAEA,GAAiB6C,EAEjFG,IACAC,EAAQC,SAASF,QAAUA,GAGR,UAAnBD,GACAE,EAAQE,aAAaF,QAAQG,KACzBC,IACI,MAAMC,EAAQhB,aAAaC,QAAQ,iBAQnC,OANIe,IACAD,EAAOE,QAAU,IACVF,EAAOE,QACVC,cAAyB,UAAAF,MAG1BD,CAAM,IAKzB,MAAMpD,EAAkBwD,IAChBC,OAAO5E,SAAS3C,WAAa1D,EAAKkE,KAAKmG,EAAU,YACjDR,aAAaqB,QAAQ,eA5CjC,SAAuBxH,EAAkB2G,GACrC,MAAiB,MAAbA,EAAyB3G,EAEtBA,EAASa,MAAM8F,EAAS5L,OACnC,CAwCiD0M,CAAcF,OAAO5E,SAAS3C,SAAWuH,OAAO5E,SAAS+E,OAAQf,IAE1G,MAAMT,EAAcqB,OAAO5E,SAASgF,OAASrL,EAAKkE,KAAKmG,EAAU,UAEjEY,OAAO5E,SAAShG,KAAOiL,EAAYC,aAAa,CAC5CC,IAAKR,EAAMQ,IACXC,MAAO,CAAEC,aAAc9B,IACzB,EAGA+B,EAAcjE,UAChB,IAAImD,EACJ,GAAInB,EACAmB,QAAcnB,QACX,CACH,MAAMkC,EAASN,EAAYO,MAAMZ,OAAO5E,SAASyF,KAAKC,OAAO,IACzDH,EAAOI,eACPnB,EAAQe,EAAOI,aAEtB,CAEsB,UAAnB1B,GAA8BO,GAC9BhB,aAAaqB,QAAQ,gBAAiBL,EACzC,EAGCoB,EAAevE,UACjB,GAAIwC,EACA,UACUA,GAKT,CAJC,MAAOtC,GACDA,aAAaC,GACbL,EAAeI,EAEtB,CAGkB,UAAnB0C,GACAT,aAAaE,WAAW,gBAC3B,EAGL,OAAO,SAA6BzG,GAAA,IAApB3D,OAAEA,GAAkB2D,EAChC,MAAM4I,EAASC,EACX,CACI,CACInM,KAAM,IACNoM,QAAS3L,EAAC2G,GAAe,IACzBnH,SAAU0B,EAAgBhC,IAE9B,CACIK,KAAM,QACNoM,QAAS3L,EAACgJ,IAAMC,QAASiC,KAE7B,CACI3L,KAAM,SACNoM,QAAS3L,EAACwJ,IAAOC,SAAU+B,MAGnC,CACI5B,aAIR,OAAO5J,EAACwG,GAAWe,UAASC,MAAO,CAAEV,eAAcC,kBAAgBvH,SAC/DQ,EAAC4L,EAAc,CAACH,OAAQA,MAGpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topthink/common",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
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.29",
19
+ "@topthink/components": "^1.0.31",
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": "74add375b0cab269a949c06be40d4687ae65cbed"
54
+ "gitHead": "32cbd3a9e15fe1f46ec0ee9f0938c867462466c8"
55
55
  }
@@ -1,8 +1,10 @@
1
+ import { RouteObject } from 'react-router-dom';
1
2
  import { ReactNode } from 'react';
2
3
  interface Props {
3
4
  title?: string;
4
5
  header?: ReactNode;
5
6
  footer?: ReactNode;
7
+ routes?: RouteObject[];
6
8
  }
7
- export default function SiderLayout({ title, header, footer }: Props): JSX.Element;
9
+ export default function SiderLayout({ title, header, footer, routes }: Props): JSX.Element;
8
10
  export {};
@@ -1,7 +1,8 @@
1
- /// <reference types="react" />
1
+ import { ReactNode } from 'react';
2
2
  interface Props {
3
- title?: string | ((data: any) => string);
3
+ title?: string;
4
4
  showBack?: boolean;
5
+ extra?: ReactNode;
5
6
  }
6
- export default function TabLayout({ title, showBack }: Props): JSX.Element;
7
+ export default function TabLayout({ title, showBack, extra }: Props): JSX.Element;
7
8
  export {};
@@ -1,2 +1,3 @@
1
+ import { RouteObject } from 'react-router-dom';
1
2
  import { MenuData } from '../utils/get-menu-data';
2
- export default function useMenu(): [MenuData[], string | undefined];
3
+ export default function useMenu(routes?: RouteObject[]): [MenuData[], string | undefined];
@@ -1,2 +1,2 @@
1
1
  import { RouteObject } from 'react-router-dom';
2
- export default function transformRoutes(routes: RouteObject[]): RouteObject[];
2
+ export default function transformRoutes(routes: RouteObject[], hideInMenu?: boolean): RouteObject[];