@topthink/common 1.3.16 → 1.3.18-alpha.0

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 n,{SubMenu as r,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useRoutes as l,useLocation as s,Outlet as a,Link as d,useNavigate as h,Navigate as g,createBrowserRouter as u,RouterProvider as m}from"react-router-dom";export{Link,Navigate,Outlet,useLoaderData,useLocation,useMatches,useNavigate,useOutlet,useParams,useRevalidator,useRouteLoaderData,useRoutes}from"react-router-dom";import*as p from"react";import f,{useContext as v,useMemo as x,memo as b,useState as w,useEffect as y,useCallback as _}from"react";import{styled as k,Space as z,useAsync as N,isRequestError as L,Loader as A,Button as E,isRecord as I,Card as M,Result as R,request as C,Modal as S}from"@topthink/components";export*from"@topthink/components";import{Nav as $,Dropdown as j,Container as O,Row as U,Col as B}from"react-bootstrap";import V from"classnames";import{intersection as q}from"lodash";import D from"query-string";import*as H from"path";var P;function T(){return T=Object.assign?Object.assign.bind():function(c){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(c[n]=t[n])}return c},T.apply(this,arguments)}const F=c=>p.createElement("svg",T({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},c),P||(P=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"})))),K=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const n=[];for(const r of e){let{meta:e={},path:i="",children:o=[]}=r;if(e.hideInMenu)continue;const l=e.title;if(!l)continue;let s=!1;e.href?(s=!0,i=e.href):i=`${t}/${i}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const a={title:l,icon:"string"==typeof e.icon?c("i",{className:`bi bi-${e.icon}`}):e.icon,path:i,isExternal:s,children:[]};!e.hideChildrenInMenu&&!s&&o.length>0&&(a.children=K(o,i)),n.push(a)}return n};function W(c){const{matches:e}=v(o),t=e[e.length-1],n=t.pathnameBase||"/",r=c||t.route.children||[],i=x((()=>function(c){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";return K(c,e)}(r,n)),[r,n]);return[i,x((()=>e.reduceRight(((c,e)=>c||e.route.handle?.title),void 0)),[e])]}function G(c,e){return c.map((c=>(c.children&&(c.children=G(c.children,c.meta?.hideChildrenInMenu)),c.handle={title:c.meta?.title,hideInMenu:c.meta?.hideInMenu||e&&!c.index,...c.handle},c)))}const J=t=>t.map((t=>{const n=e(lc,{children:[t.icon,t.title,t.isExternal&&c(F,{})]});return t.children.length>0?c(r,{title:n,children:J(t.children)},t.path):c(i,{children:t.isExternal?c("a",{href:t.path,target:"_blank",children:n}):c(d,{to:t.path,children:n})},t.path)})),Q=()=>({height:0}),X=c=>({height:c.scrollHeight}),Y={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:Q,onAppearActive:X,onEnterStart:Q,onEnterActive:X,onLeaveStart:X,onLeaveActive:Q};function Z(t){let{className:n,title:r,header:i,headerAs:o,footer:l,footerAs:d,top:h=54,routes:g}=t;const[u,m]=W(g),{pathname:p}=s(),f=x((()=>{const c=[];return p.split("/").reduce(((e,t)=>(e.length>1&&c.push(e.join("/")),[...e,t])),[]),c.push(p),c}),[p]),[v,b]=w([]);y((()=>{b(f.slice(0,-1))}),[f]);const k=_((c=>{const e=c[c.length-1];b(c.filter((c=>e.startsWith(c))))}),[v,b]);i||(i=c(tc,{children:r||m}));const z=d||rc;return e(ac,{$top:h,children:[e(ec,{className:n,children:[c(o||nc,{children:i}),c(sc,{mode:"inline",motion:Y,openKeys:v,onOpenChange:k,selectedKeys:f,children:J(u)}),c(z,{children:l})]}),c(ic,{children:c(oc,{children:g?c(cc,{routes:g}):c(a,{})})})]})}const cc=b((function(c){let{routes:e}=c;return l(x((()=>G(e)),[e]))})),ec=k.nav`
1
+ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import r,{SubMenu as n,MenuItem as i}from"rc-menu";import{UNSAFE_RouteContext as o,useRoutes as l,useLocation as s,Outlet as a,Link as d,useNavigate as h,useParams 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 f from"react";import v,{useContext as x,useMemo as b,memo as w,useState as y,useEffect as _,useCallback as k,createContext as z}from"react";import{styled as N,Space as L,useAsync as A,isRequestError as E,Loader as I,Button as M,useRequest as R,isRecord as C,Card as S,Result as $,request as j,Modal as O}from"@topthink/components";export*from"@topthink/components";import{Nav as q,Dropdown as U,Container as B,Row as P,Col as V}from"react-bootstrap";import D from"classnames";import{intersection as H}from"lodash";import T from"query-string";import*as F from"path";var K;function W(){return W=Object.assign?Object.assign.bind():function(c){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(c[r]=t[r])}return c},W.apply(this,arguments)}const G=c=>f.createElement("svg",W({xmlns:"http://www.w3.org/2000/svg",width:16,height:16},c),K||(K=f.createElement("g",{fill:"#888"},f.createElement("path",{d:"m8 3 1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z"}),f.createElement("path",{d:"M11 11H5V5h2V3H3v10h10V9h-2z"})))),J=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";const r=[];for(const n of e){let{meta:e={},path:i="",children:o=[]}=n;if(e.hideInMenu)continue;const l=e.title;if(!l)continue;let s=!1;e.href?(s=!0,i=e.href):i=`${t}/${i}`.replace(/\/{2,}/g,"/").replace(/\/$/,"");const a={title:l,icon:"string"==typeof e.icon?c("i",{className:`bi bi-${e.icon}`}):e.icon,path:i,isExternal:s,children:[]};!e.hideChildrenInMenu&&!s&&o.length>0&&(a.children=J(o,i)),r.push(a)}return r};function Q(c){const{matches:e}=x(o),t=e[e.length-1],r=t.pathnameBase||"/",n=c||t.route.children||[],i=b((()=>function(c){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/";return J(c,e)}(n,r)),[n,r]);return[i,b((()=>e.reduceRight(((c,e)=>c||e.route.handle?.title),void 0)),[e])]}function X(c,e){return c.map((c=>(c.children&&(c.children=X(c.children,c.meta?.hideChildrenInMenu)),c.handle={title:c.meta?.title,hideInMenu:c.meta?.hideInMenu||e&&!c.index,...c.handle},c)))}const Y=t=>t.map((t=>{const r=e(dc,{children:[t.icon,t.title,t.isExternal&&c(G,{})]});return t.children.length>0?c(n,{title:r,children:Y(t.children)},t.path):c(i,{children:t.isExternal?c("a",{href:t.path,target:"_blank",children:r}):c(d,{to:t.path,children:r})},t.path)})),Z=()=>({height:0}),cc=c=>({height:c.scrollHeight}),ec={motionName:"rc-menu-collapse",motionAppear:!0,onAppearStart:Z,onAppearActive:cc,onEnterStart:Z,onEnterActive:cc,onLeaveStart:cc,onLeaveActive:Z};function tc(t){let{className:r,title:n,header:i,headerAs:o,footer:l,footerAs:d,top:h=54,routes:g}=t;const[u,m]=Q(g),{pathname:p}=s(),f=b((()=>{const c=[];return p.split("/").reduce(((e,t)=>(e.length>1&&c.push(e.join("/")),[...e,t])),[]),c.push(p),c}),[p]),[v,x]=y([]);_((()=>{x(f.slice(0,-1))}),[f]);const w=k((c=>{const e=c[c.length-1];x(c.filter((c=>e.startsWith(c))))}),[v,x]);i||(i=c(ic,{children:n||m}));const z=d||lc;return e(gc,{$top:h,children:[e(nc,{className:r,children:[c(o||oc,{children:i}),c(hc,{mode:"inline",motion:ec,openKeys:v,onOpenChange:w,selectedKeys:f,children:Y(u)}),c(z,{children:l})]}),c(sc,{children:c(ac,{children:g?c(rc,{routes:g}):c(a,{})})})]})}const rc=w((function(c){let{routes:e}=c;return l(b((()=>X(e)),[e]))})),nc=N.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 n,{SubMen
10
10
  background-color: #f5f5f5;
11
11
  display: flex;
12
12
  flex-direction: column;
13
- `,tc=k.div`
13
+ `,ic=N.div`
14
14
  text-overflow: ellipsis;
15
15
  white-space: nowrap;
16
16
  overflow: hidden;
17
17
  font-size: 16px;
18
- `,nc=k.div`
18
+ `,oc=N.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 n,{SubMen
23
23
  border-bottom: 1px solid #e3e3e3;
24
24
  flex-grow: 0;
25
25
  flex-shrink: 0;
26
- `,rc=k.div`
26
+ `,lc=N.div`
27
27
  flex-grow: 0;
28
28
  flex-shrink: 0;
29
- `,ic=k.div`
29
+ `,sc=N.div`
30
30
  margin-left: 230px;
31
31
  flex: 1;
32
- `,oc=k.main`
32
+ `,ac=N.main`
33
33
  min-height: calc(100vh - var(--bs-header-height));
34
34
  position: relative;
35
- `,lc=k.div`
35
+ `,dc=N.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 n,{SubMen
43
43
  min-width: 19px;
44
44
  text-align: center;
45
45
  }
46
- `,sc=k(n)`
46
+ `,hc=N(r)`
47
47
  border: none;
48
48
  box-shadow: none;
49
49
  padding: 10px 0;
@@ -182,27 +182,27 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import n,{SubMen
182
182
  }
183
183
  }
184
184
 
185
- `,ac=k.div`
185
+ `,gc=N.div`
186
186
  --bs-header-height: ${c=>c.$top}px;
187
187
  display: flex;
188
188
  flex-wrap: nowrap;
189
189
  width: 100%;
190
190
 
191
191
  &:has(&) {
192
- > ${ec} {
192
+ > ${nc} {
193
193
  display: none;
194
194
  }
195
195
 
196
- > ${ic} {
196
+ > ${sc} {
197
197
  margin-left: 0;
198
198
  }
199
199
  }
200
- `;function dc(t){let{title:n,header:r,nav:i,children:l,extra:a,showBack:d}=t;const{matches:g}=v(o),u=x((()=>g.reduceRight(((c,e)=>c||e.route.index?c:e.route),void 0)),[g]),m=!0===u?.handle?.hideInMenu,p=u?.handle?.title,f=h(),b=s();return void 0===d&&(d=m),void 0===r&&(r=e(z,{children:[d&&"default"!==b.key&&c(hc,{onClick:()=>f(-1),children:c("i",{className:"bi bi-arrow-left-short"})}),c(pc,{children:n||p})]})),e(gc,{children:[c(uc,{children:e("div",{className:"container",children:[r,i,c(fc,{children:a})]})}),c(mc,{className:"container",children:l})]})}const hc=k.div`
200
+ `;function uc(t){let{title:r,header:n,nav:i,children:l,extra:a,showBack:d}=t;const{matches:g}=x(o),u=b((()=>g.reduceRight(((c,e)=>c||e.route.index?c:e.route),void 0)),[g]),m=!0===u?.handle?.hideInMenu,p=u?.handle?.title,f=h(),v=s();return void 0===d&&(d=m),void 0===n&&(n=e(L,{children:[d&&"default"!==v.key&&c(mc,{onClick:()=>f(-1),children:c("i",{className:"bi bi-arrow-left-short"})}),c(xc,{children:r||p})]})),e(pc,{children:[c(fc,{children:e("div",{className:"container",children:[n,i,c(bc,{children:a})]})}),c(vc,{className:"container",children:l})]})}const mc=N.div`
201
201
  font-size: 32px;
202
202
  cursor: pointer;
203
- `,gc=k.div`
203
+ `,pc=N.div`
204
204
  width: 100%;
205
- `,uc=k.div`
205
+ `,fc=N.div`
206
206
  background-color: #fff;
207
207
  display: flex;
208
208
 
@@ -232,15 +232,15 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import n,{SubMen
232
232
  }
233
233
  }
234
234
  }
235
- `,mc=k.div`
235
+ `,vc=N.div`
236
236
  margin-top: 24px;
237
- `,pc=k.div`
237
+ `,xc=N.div`
238
238
  font-size: 22px;
239
239
  line-height: 64px;
240
240
  height: 64px;
241
- `,fc=k.div`
241
+ `,bc=N.div`
242
242
  margin-left: auto;
243
- `;function vc(t){let{title:n,header:r,showBack:i,extra:o}=t;const[l,d]=W(),{pathname:h}=s(),g=c($,{children:l.map((t=>c($.Item,{children:e(xc,{className:V("nav-link",{active:h.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path)))});return c(dc,{title:n||d,header:r,nav:g,showBack:i,extra:o,children:c(a,{})})}const xc=k(d)`
243
+ `;function wc(t){let{title:r,header:n,showBack:i,extra:o}=t;const[l,d]=Q(),{pathname:h}=s(),g=c(q,{children:l.map((t=>c(q.Item,{children:e(yc,{className:D("nav-link",{active:h.startsWith(t.path)}),to:t.path,replace:!0,children:[t.icon,t.title]})},t.path)))});return c(uc,{title:r||d,header:n,nav:g,showBack:i,extra:o,children:c(a,{})})}const yc=N(d)`
244
244
  display: flex;
245
245
  align-items: center;
246
246
  gap: 0.5rem;
@@ -248,9 +248,9 @@ import{jsx as c,jsxs as e,Fragment as t}from"react/jsx-runtime";import n,{SubMen
248
248
  .bi, svg {
249
249
  text-align: center;
250
250
  }
251
- `;const bc=f.createContext(null),wc=function(e){let{userResolver:t}=e;const[n,r]=w(null),i=h();return N((async()=>{if(t)return t()}),[],{async onError(c){L(c)&&401===c.response?.status&&i("/login")},onSuccess(c){c&&r(c)}}),n?c(bc.Provider,{value:[n,r],children:c(a,{})}):c(A,{})};function yc(){const c=v(bc);if(!c)throw new Error("please use `useUser` in UserContext");return c}const _c=k.a`
251
+ `;const _c=v.createContext(null),kc=function(e){let{userResolver:t}=e;const[r,n]=y(null),i=h(),{execute:o}=A((async()=>{if(t)return t()}),[],{async onError(c){E(c)&&401===c.response?.status&&i("/login")},onSuccess(c){c&&n(c)}});if(!r)return c(I,{});const l=[r,n,o];return l.user=r,l.setUser=n,l.refresh=o,c(_c.Provider,{value:l,children:c(a,{})})};function zc(){const c=x(_c);if(!c)throw new Error("please use `useUser` in UserContext");return c}const Nc=N.a`
252
252
  cursor: pointer;
253
- `;function kc(t){let{children:n,menus:r,className:i,logo:o=!0}=t;const[l]=yc();return c(zc,{className:V("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",i),children:e("div",{className:"container-fluid",children:[o&&c("a",{className:"navbar-brand",href:"https://www.topthink.com",children:c("img",{src:"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e",height:"30"})}),n,e(j,{navbar:!0,children:[c(j.Toggle,{as:_c,className:"nav-link",children:c("img",{className:"rounded-circle",width:"25",height:"25",src:l.avatar})}),c(j.Menu,{className:"shadow",children:r})]})]})})}const zc=k.header`
253
+ `;function Lc(t){let{children:r,menus:n,className:i,logo:o=!0}=t;const[l]=zc();return c(Ac,{className:D("navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top",i),children:e("div",{className:"container-fluid",children:[o&&c("a",{className:"navbar-brand",href:"https://www.topthink.com",children:c("img",{src:"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e",height:"30"})}),r,e(U,{navbar:!0,children:[c(U.Toggle,{as:Nc,className:"nav-link",children:c("img",{className:"rounded-circle",width:"25",height:"25",src:l.avatar})}),c(U.Menu,{className:"shadow",children:n})]})]})})}const Ac=N.header`
254
254
  height: 54px;
255
- `;function Nc(e){let{require:n,children:r,fallback:i}=e;const[o]=yc();let l=!1;return"function"==typeof n?l=n(o):("string"==typeof n&&(n=[n]),l=q(o.roles,n).length>0),l||(r=i),c(t,{children:r})}function Lc(e){let{to:t,replace:n,...r}=e,i=h();return c(E,{...r,onClick:c=>{c.preventDefault(),i(t,{replace:n})}})}function Ac(e){let{onLogined:t,onAuthorize:n}=e;const{result:r,error:i}=N((async()=>{let c;const e=D.parse(window.location.hash.substr(1));if(e.access_token&&(c=e.access_token),n)try{const e=await n(c);e&&(c=e)}catch(c){if(L(c)){const e=c.response?.data;if(I(e))throw new Error(e.message)}throw c}return t(c)}),[]);return i?c(O,{className:"mt-5",children:c(M,{children:c(R,{status:"error",title:i.message})})}):r?c(g,{to:r,replace:!0}):c(A,{})}function Ec(e){let{onLogout:t}=e;const n=h();return N((async()=>{await t(),n("/login",{state:{from:"logout"}})}),[]),c(A,{})}function Ic(e){let{onLogin:t,onLogined:n,onAuthorize:r}=e;return c(O,{className:"vh-100 d-flex align-items-center",children:c(U,{className:"flex-fill",children:c(B,{md:{span:4,offset:4},children:c(M,{className:"p-5",children:t({onAuthorize:r,onLogined:n})})})})})}function Mc(n){const{basename:r="/",onAuthorize:i,onLogout:o,onLogin:l,authentication:s="token",baseURL:a,userResolver:d}=n;a&&(C.defaults.baseURL=a);const h=c=>{[H.join(r,"/login"),H.join(r,"/logout")].includes(window.location.pathname)||localStorage.setItem("redirect_uri",function(c,e){return"/"===e?c:c.slice(e.length)}(window.location.pathname+window.location.search,r));const e=window.location.origin+H.join(r,"/social");window.location.href=D.stringifyUrl({url:c,query:{redirect_uri:e}})},g=c=>{"token"===s&&c&&C.defaults.authTokenName&&localStorage.setItem(C.defaults.authTokenName,c);const e=localStorage.getItem("redirect_uri");return e&&localStorage.removeItem("redirect_uri"),e||"/"},p=async()=>{if(o)try{await o()}catch(c){}"token"===s&&localStorage.removeItem("authorization")};return function(n){let{routes:o}=n;const s=u([{path:"*",element:c(wc,{userResolver:d}),children:G(o)},{path:"social",element:c(Ac,{onAuthorize:i,onLogined:g})},{path:"logout",element:c(Ec,{onLogout:p})},{path:"login",element:c(Ic,{onLogin:l,onAuthorize:h,onLogined:g})}],{basename:r});return e(t,{children:[c(m,{router:s}),c(S.Message,{})]})}}export{Nc as Access,dc as Content,kc as Header,Lc as LinkButton,Z as SiderLayout,vc as TabLayout,Mc as createApplication,yc as useUser};
255
+ `;function Ec(e){let{require:r,children:n,fallback:i}=e;const[o]=zc();let l=!1;return"function"==typeof r?l=r(o):("string"==typeof r&&(r=[r]),l=H(o.roles,r).length>0),l||(n=i),c(t,{children:n})}function Ic(e){let{to:t,replace:r,...n}=e,i=h();return c(M,{...n,onClick:c=>{c.preventDefault(),i(t,{replace:r})}})}const Mc=z(void 0),Rc=function(e){let{request:t,children:r}=e;const{result:n}=R(t);return n?c(Mc.Provider,{value:n,children:r}):c(I,{wrap:!0})};function Cc(e){let{request:t,children:r}=e;const n=g();return"string"==typeof t?t={url:t.replace(/:(\w+)/g,((c,e)=>n[e]||c))}:t.url&&(t.url=t.url.replace(/:(\w+)/g,((c,e)=>n[e]||c))),c(Rc,{request:t,children:r},t.url)}function Sc(){return x(Mc)}function $c(e){let{onLogined:t,onAuthorize:r}=e;const{result:n,error:i}=A((async()=>{let c;const e=T.parse(window.location.hash.substr(1));if(e.access_token&&(c=e.access_token),r)try{const e=await r(c);e&&(c=e)}catch(c){if(E(c)){const e=c.response?.data;if(C(e))throw new Error(e.message)}throw c}return t(c)}),[]);return i?c(B,{className:"mt-5",children:c(S,{children:c($,{status:"error",title:i.message})})}):n?c(u,{to:n,replace:!0}):c(I,{})}function jc(e){let{onLogout:t}=e;const r=h();return A((async()=>{await t(),r("/login",{state:{from:"logout"}})}),[]),c(I,{})}function Oc(e){let{onLogin:t,onLogined:r,onAuthorize:n}=e;return c(B,{className:"vh-100 d-flex align-items-center",children:c(P,{className:"flex-fill",children:c(V,{md:{span:4,offset:4},children:c(S,{className:"p-5",children:t({onAuthorize:n,onLogined:r})})})})})}function qc(r){const{basename:n="/",onAuthorize:i,onLogout:o,onLogin:l,authentication:s="token",baseURL:a,userResolver:d}=r;a&&(j.defaults.baseURL=a);const h=c=>{[F.join(n,"/login"),F.join(n,"/logout")].includes(window.location.pathname)||localStorage.setItem("redirect_uri",function(c,e){return"/"===e?c:c.slice(e.length)}(window.location.pathname+window.location.search,n));const e=window.location.origin+F.join(n,"/social");window.location.href=T.stringifyUrl({url:c,query:{redirect_uri:e}})},g=c=>{"token"===s&&c&&j.defaults.authTokenName&&localStorage.setItem(j.defaults.authTokenName,c);const e=localStorage.getItem("redirect_uri");return e&&localStorage.removeItem("redirect_uri"),e||"/"},u=async()=>{if(o)try{await o()}catch(c){}"token"===s&&localStorage.removeItem("authorization")};return function(r){let{routes:o}=r;const s=m([{path:"*",element:c(kc,{userResolver:d}),children:X(o)},{path:"social",element:c($c,{onAuthorize:i,onLogined:g})},{path:"logout",element:c(jc,{onLogout:u})},{path:"login",element:c(Oc,{onLogin:l,onAuthorize:h,onLogined:g})}],{basename:n});return e(t,{children:[c(p,{router:s}),c(O.Message,{})]})}}export{Ec as Access,uc as Content,Lc as Header,Ic as LinkButton,tc as SiderLayout,wc as TabLayout,Cc as WithRequest,qc as createApplication,Sc as useRequestData,zc as useUser};
256
256
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/images/external.svg","../src/utils/get-menu-data.tsx","../src/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider.tsx","../src/components/content.tsx","../src/layout/tab.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/pages/social.tsx","../src/pages/logout.tsx","../src/pages/login.tsx","../src/utils/create-application.tsx"],"sourcesContent":["var img = \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3e %3cg fill='%23888'%3e %3cpath d='M8 3l1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z'/%3e %3cpath d='M11 11H5V5h2V3H3v10h10V9h-2z'/%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import type { RouteObject } from 'react-router-dom';\r\nimport { ReactNode } from 'react';\r\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 { ElementType, 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<As extends ElementType = ElementType> {\r\n className?: string;\r\n title?: string;\r\n header?: ReactNode;\r\n headerAs?: As;\r\n footer?: ReactNode;\r\n footerAs?: As;\r\n routes?: RouteObject[];\r\n top?: number;\r\n}\r\n\r\nexport default function SiderLayout({ className, title, header, headerAs, footer, footerAs, top = 54, routes }: Props) {\r\n\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 const HeaderComp = headerAs || Header;\r\n\r\n const FooterComp = footerAs || Footer;\r\n\r\n return <Container $top={top}>\r\n <Sidebar className={className}>\r\n <HeaderComp>{header}</HeaderComp>\r\n <Menu\r\n mode='inline'\r\n motion={motion}\r\n openKeys={openKeys}\r\n onOpenChange={onOpenChange}\r\n selectedKeys={selectedKeys}\r\n >\r\n {renderMenuItems(menu)}\r\n </Menu>\r\n <FooterComp>{footer}</FooterComp>\r\n </Sidebar>\r\n <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: var(--bs-header-height) 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 - var(--bs-header-height));\r\n position: relative;\r\n`;\r\n\r\nconst MenuTitle = styled.div`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n\r\n .bi {\r\n font-size: 16px;\r\n line-height: 18px;\r\n min-width: 19px;\r\n text-align: center;\r\n }\r\n`;\r\n\r\nconst Menu = styled(RcMenu)`\r\n border: none;\r\n box-shadow: none;\r\n padding: 10px 0;\r\n flex: 1;\r\n overflow: auto;\r\n\r\n .rc-menu-item {\r\n display: flex;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n\r\n a {\r\n flex: 1;\r\n text-decoration: none;\r\n color: dimgray;\r\n }\r\n }\r\n\r\n .rc-menu-sub {\r\n background-color: #eee;\r\n border-top: 1px solid #eee;\r\n border-bottom: 1px solid #eee;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 4px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 4px;\r\n }\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #eee;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-item {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu {\r\n & > .rc-menu-submenu-title {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-item-active,\r\n .rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item,\r\n .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding: 0 8px 0 24px;\r\n font-size: 14px;\r\n line-height: 36px;\r\n cursor: pointer;\r\n }\r\n\r\n .rc-menu-sub > .rc-menu-item,\r\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n padding-right: 0;\r\n }\r\n\r\n .rc-menu-submenu-arrow {\r\n line-height: 20px;\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #f5f5f5;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-submenu-selected {\r\n background-color: #eee;\r\n\r\n & > .rc-menu-submenu-title {\r\n color: var(--bs-primary);\r\n font-weight: 500;\r\n }\r\n }\r\n\r\n & > .rc-menu-item {\r\n line-height: 38px;\r\n }\r\n\r\n & > .rc-menu-submenu {\r\n &.rc-menu-submenu-selected {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-submenu-title {\r\n line-height: 38px;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n\r\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-sub {\r\n border-top: 1px solid #e6e6e6;\r\n border-bottom: 1px solid #e6e6e6;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 9px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 9px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n`;\r\n\r\nconst Container = styled.div<{ $top: number }>`\r\n --bs-header-height: ${(p) => p.$top}px;\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?: ReactNode;\r\n header?: ReactNode;\r\n nav?: ReactNode;\r\n extra?: ReactNode;\r\n showBack?: boolean;\r\n}\r\n\r\nexport default function Content({ title, header, nav, children, 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 if (header === undefined) {\r\n header = <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 }\r\n\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n {header}\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?: ReactNode;\r\n header?: ReactNode;\r\n showBack?: boolean;\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function TabLayout({ title, header, showBack, extra }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n const { pathname } = useLocation();\r\n\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} header={header} 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, { useContext, useState } from 'react';\r\nimport { User, UserResolver } from '../utils/types';\r\nimport { isRequestError, Loader, useAsync } from '@topthink/components';\r\nimport { Outlet, useNavigate } from 'react-router-dom';\r\n\r\nexport const UserContext = React.createContext<[User, ((user: User) => void)] | null>(null);\r\n\r\ninterface Props {\r\n userResolver: UserResolver;\r\n}\r\n\r\nconst UserProvider = function({ userResolver }: Props) {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const navigate = useNavigate();\r\n\r\n useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n async onError(e) {\r\n if (isRequestError(e) && e.response?.status === 401) {\r\n navigate('/login');\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 { Card, isRecord, isRequestError, Loader, Result, useAsync } from '@topthink/components';\r\nimport { Navigate } from 'react-router-dom';\r\nimport { Container } from 'react-bootstrap';\r\nimport queryString from 'query-string';\r\nimport { Promisable } from '../utils/types';\r\n\r\ninterface LoginProps {\r\n onLogined: (token?: string) => string;\r\n onAuthorize?: (token?: string) => Promisable<void | string | undefined>;\r\n}\r\n\r\nexport default function Social({ onLogined, onAuthorize }: LoginProps) {\r\n const { result, error } = useAsync(async () => {\r\n let token: string | undefined;\r\n\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 if (onAuthorize) {\r\n try {\r\n const newToken = await onAuthorize(token);\r\n if (newToken) {\r\n token = newToken;\r\n }\r\n } catch (e) {\r\n if (isRequestError(e)) {\r\n const data = e.response?.data;\r\n if (isRecord(data)) {\r\n throw new Error(data.message);\r\n }\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n return onLogined(token);\r\n }, []);\r\n\r\n if (error) {\r\n return <Container className={'mt-5'}>\r\n <Card>\r\n <Result status={'error'} title={error.message} />\r\n </Card>\r\n </Container>;\r\n }\r\n\r\n if (result) {\r\n return <Navigate to={result} replace />;\r\n }\r\n\r\n return <Loader />;\r\n}\r\n","import { Loader, useAsync } from '@topthink/components';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n const navigate = useNavigate();\r\n\r\n useAsync(async () => {\r\n await onLogout();\r\n navigate('/login', { state: { from: 'logout' } });\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { Card } from '@topthink/components';\r\nimport { Col, Container, Row } from 'react-bootstrap';\r\nimport { ReactNode } from 'react';\r\n\r\nexport interface LoginProps {\r\n onAuthorize: (url: string) => void;\r\n onLogined: (token?: string) => string;\r\n}\r\n\r\ninterface Props {\r\n onLogin: (props: LoginProps) => ReactNode;\r\n onAuthorize: (url: string) => void;\r\n onLogined: (token?: string) => string;\r\n}\r\n\r\nexport default function Login({ onLogin, onLogined, onAuthorize }: Props) {\r\n return <Container className='vh-100 d-flex align-items-center'>\r\n <Row className='flex-fill'>\r\n <Col md={{ span: 4, offset: 4 }}>\r\n <Card className='p-5'>\r\n {onLogin({ onAuthorize, onLogined })}\r\n </Card>\r\n </Col>\r\n </Row>\r\n </Container>;\r\n}\r\n\r\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\nimport Social from '../pages/social';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { Modal, request } from '@topthink/components';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport Login, { LoginProps } from '../pages/login';\nimport { Promisable, UserResolver } from './types';\nimport { ReactNode } from 'react';\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ninterface AppProps {\n routes: RouteObject[];\n}\n\ninterface Options {\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n onLogout?: () => Promisable<void>;\n onAuthorize?: (token?: string) => Promisable<void | string | undefined>;\n onLogin: (props: LoginProps) => ReactNode;\n userResolver: UserResolver;\n}\n\nexport default function createApplication(options: Options) {\n const {\n basename = '/',\n onAuthorize,\n onLogout,\n onLogin,\n authentication = 'token',\n baseURL,\n userResolver,\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const handleAuthorize = (url: string) => {\n const ignorePaths = [path.join(basename, '/login'), path.join(basename, '/logout')];\n\n if (!ignorePaths.includes(window.location.pathname)) {\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\n }\n\n const redirectUri = window.location.origin + path.join(basename, '/social');\n\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri }\n });\n };\n\n const handleLogined = (token?: string) => {\n if (authentication === 'token' && token && request.defaults.authTokenName) {\n localStorage.setItem(request.defaults.authTokenName, token);\n }\n\n const redirectUri = localStorage.getItem('redirect_uri');\n if (redirectUri) {\n localStorage.removeItem('redirect_uri');\n }\n return redirectUri || '/';\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch (e) {\n\n }\n }\n\n if (authentication === 'token') {\n localStorage.removeItem('authorization');\n }\n };\n\n return function({ routes }: AppProps) {\n const router = createBrowserRouter(\n [\n {\n path: '*',\n element: <UserProvider userResolver={userResolver} />,\n children: transformRoutes(routes),\n },\n {\n path: 'social',\n element: <Social onAuthorize={onAuthorize} onLogined={handleLogined} />\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />\n },\n {\n path: 'login',\n element: <Login onLogin={onLogin} onAuthorize={handleAuthorize} onLogined={handleLogined} />\n }\n ],\n {\n basename\n }\n );\n\n return <>\n <RouterProvider router={router} />\n <Modal.Message />\n </>;\n };\n}\n"],"names":["_g","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgExternal","props","React","createElement","xmlns","width","height","fill","d","formatRelativePath","routes","parent","menus","route","meta","path","children","hideInMenu","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","useMenu","matches","useContext","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","transformRoutes","map","index","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","_ref","header","headerAs","footer","footerAs","top","defaultTitle","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Title","FooterComp","Footer","Container","$top","Sidebar","Header","Menu","mode","Content","Main","Routes","Outlet","memo","_ref2","useRoutes","styled","nav","div","main","RcMenu","p","extra","showBack","defaultShowBack","navigate","useNavigate","location","Space","Back","onClick","Extra","Body","TabLayout","Nav","Item","NavLink","classNames","active","UserContext","createContext","UserProvider","userResolver","state","setState","useAsync","async","e","isRequestError","response","status","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","Social","onLogined","onAuthorize","result","error","token","parsed","queryString","parse","window","hash","substr","access_token","newToken","data","isRecord","message","Card","Result","Navigate","Logout","onLogout","from","Login","onLogin","Row","Col","md","span","offset","createApplication","options","basename","authentication","baseURL","request","defaults","handleAuthorize","url","includes","localStorage","setItem","stripBasename","search","redirectUri","origin","stringifyUrl","query","redirect_uri","handleLogined","authTokenName","getItem","removeItem","handleLogout","router","createBrowserRouter","element","RouterProvider","Modal","Message"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/images/external.svg","../src/utils/get-menu-data.tsx","../src/layout/use-menu.tsx","../src/utils/transform-routes.ts","../src/layout/sider.tsx","../src/components/content.tsx","../src/layout/tab.tsx","../src/components/user-provider.tsx","../src/components/header.tsx","../src/images/logo.svg","../src/components/access.tsx","../src/components/link-button.tsx","../src/components/with-request.tsx","../src/pages/social.tsx","../src/pages/logout.tsx","../src/pages/login.tsx","../src/utils/create-application.tsx"],"sourcesContent":["var img = \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3e %3cg fill='%23888'%3e %3cpath d='M8 3l1.793 1.793L6 8.586 7.414 10l3.793-3.793L13 8V3z'/%3e %3cpath d='M11 11H5V5h2V3H3v10h10V9h-2z'/%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import type { RouteObject } from 'react-router-dom';\r\nimport { ReactNode } from 'react';\r\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 { ElementType, 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<As extends ElementType = ElementType> {\r\n className?: string;\r\n title?: string;\r\n header?: ReactNode;\r\n headerAs?: As;\r\n footer?: ReactNode;\r\n footerAs?: As;\r\n routes?: RouteObject[];\r\n top?: number;\r\n}\r\n\r\nexport default function SiderLayout({ className, title, header, headerAs, footer, footerAs, top = 54, routes }: Props) {\r\n\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 const HeaderComp = headerAs || Header;\r\n\r\n const FooterComp = footerAs || Footer;\r\n\r\n return <Container $top={top}>\r\n <Sidebar className={className}>\r\n <HeaderComp>{header}</HeaderComp>\r\n <Menu\r\n mode='inline'\r\n motion={motion}\r\n openKeys={openKeys}\r\n onOpenChange={onOpenChange}\r\n selectedKeys={selectedKeys}\r\n >\r\n {renderMenuItems(menu)}\r\n </Menu>\r\n <FooterComp>{footer}</FooterComp>\r\n </Sidebar>\r\n <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: var(--bs-header-height) 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 - var(--bs-header-height));\r\n position: relative;\r\n`;\r\n\r\nconst MenuTitle = styled.div`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n\r\n .bi {\r\n font-size: 16px;\r\n line-height: 18px;\r\n min-width: 19px;\r\n text-align: center;\r\n }\r\n`;\r\n\r\nconst Menu = styled(RcMenu)`\r\n border: none;\r\n box-shadow: none;\r\n padding: 10px 0;\r\n flex: 1;\r\n overflow: auto;\r\n\r\n .rc-menu-item {\r\n display: flex;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n\r\n a {\r\n flex: 1;\r\n text-decoration: none;\r\n color: dimgray;\r\n }\r\n }\r\n\r\n .rc-menu-sub {\r\n background-color: #eee;\r\n border-top: 1px solid #eee;\r\n border-bottom: 1px solid #eee;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 4px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 4px;\r\n }\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #eee;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-item {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-submenu {\r\n & > .rc-menu-submenu-title {\r\n &:hover {\r\n background-color: #e7e7e7;\r\n }\r\n }\r\n }\r\n\r\n .rc-menu-item-active,\r\n .rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #eee;\r\n }\r\n\r\n .rc-menu-item,\r\n .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding: 0 8px 0 24px;\r\n font-size: 14px;\r\n line-height: 36px;\r\n cursor: pointer;\r\n }\r\n\r\n .rc-menu-sub > .rc-menu-item,\r\n .rc-menu-sub > .rc-menu-submenu > .rc-menu-submenu-title {\r\n padding-top: 0;\r\n padding-bottom: 0;\r\n padding-right: 0;\r\n }\r\n\r\n .rc-menu-submenu-arrow {\r\n line-height: 20px;\r\n }\r\n\r\n .rc-menu-item-selected {\r\n background-color: #f5f5f5;\r\n color: var(--bs-primary);\r\n\r\n & > a {\r\n color: var(--bs-primary);\r\n }\r\n }\r\n\r\n .rc-menu-submenu-selected {\r\n background-color: #eee;\r\n\r\n & > .rc-menu-submenu-title {\r\n color: var(--bs-primary);\r\n font-weight: 500;\r\n }\r\n }\r\n\r\n & > .rc-menu-item {\r\n line-height: 38px;\r\n }\r\n\r\n & > .rc-menu-submenu {\r\n &.rc-menu-submenu-selected {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-submenu-title {\r\n line-height: 38px;\r\n\r\n &:hover {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n\r\n &.rc-menu-submenu-active > .rc-menu-submenu-title {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n & > .rc-menu-sub {\r\n border-top: 1px solid #e6e6e6;\r\n border-bottom: 1px solid #e6e6e6;\r\n\r\n & > li {\r\n &:first-child {\r\n margin-top: 9px;\r\n }\r\n\r\n &:last-child {\r\n margin-bottom: 9px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n`;\r\n\r\nconst Container = styled.div<{ $top: number }>`\r\n --bs-header-height: ${(p) => p.$top}px;\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?: ReactNode;\r\n header?: ReactNode;\r\n nav?: ReactNode;\r\n extra?: ReactNode;\r\n showBack?: boolean;\r\n}\r\n\r\nexport default function Content({ title, header, nav, children, 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 if (header === undefined) {\r\n header = <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 }\r\n\r\n return <Container>\r\n <Header>\r\n <div className='container'>\r\n {header}\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?: ReactNode;\r\n header?: ReactNode;\r\n showBack?: boolean;\r\n extra?: ReactNode;\r\n}\r\n\r\nexport default function TabLayout({ title, header, showBack, extra }: Props) {\r\n\r\n const [menu, defaultTitle] = useMenu();\r\n const { pathname } = useLocation();\r\n\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} header={header} 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, { useContext, useState } from 'react';\r\nimport { User, UserResolver } from '../utils/types';\r\nimport { isRequestError, Loader, useAsync } from '@topthink/components';\r\nimport { Outlet, useNavigate } from 'react-router-dom';\r\n\r\ntype UserContextType = [User, ((user: User) => void), () => void] & {\r\n user: User,\r\n setUser: (user: User) => void,\r\n refresh: () => void\r\n};\r\n\r\nexport const UserContext = React.createContext<UserContextType | null>(null);\r\n\r\ninterface Props {\r\n userResolver: UserResolver;\r\n}\r\n\r\nconst UserProvider = function({ userResolver }: Props) {\r\n const [state, setState] = useState<User | null>(null);\r\n\r\n const navigate = useNavigate();\r\n\r\n const { execute } = useAsync(async () => {\r\n if (userResolver) {\r\n return userResolver();\r\n }\r\n }, [], {\r\n async onError(e) {\r\n if (isRequestError(e) && e.response?.status === 401) {\r\n navigate('/login');\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 const value: any = [state, setState, execute];\r\n\r\n value.user = state;\r\n value.setUser = setState;\r\n value.refresh = execute;\r\n\r\n return <UserContext.Provider value={value}>\r\n <Outlet />\r\n </UserContext.Provider>;\r\n};\r\n\r\nexport function useUser() {\r\n const context = useContext(UserContext);\r\n if (!context) {\r\n throw new Error('please use `useUser` in UserContext');\r\n }\r\n\r\n return context;\r\n}\r\n\r\nexport default UserProvider;\r\n","import logoSrc from '../images/logo.svg';\r\nimport { Dropdown } from 'react-bootstrap';\r\nimport { PropsWithChildren, ReactNode } from 'react';\r\nimport { useUser } from './user-provider';\r\nimport classNames from 'classnames';\r\nimport { styled } from '@topthink/components';\r\n\r\nconst Avatar = styled.a`\r\n cursor: pointer;\r\n`;\r\n\r\ninterface Props {\r\n menus: ReactNode;\r\n className?: string;\r\n logo?: boolean;\r\n}\r\n\r\nexport default function Header({ children, menus, className, logo = true }: PropsWithChildren<Props>) {\r\n const [user] = useUser();\r\n\r\n return <Container\r\n className={classNames('navbar navbar-expand-lg navbar-light bg-white border-bottom sticky-top', className)}>\r\n <div className='container-fluid'>\r\n {logo && <a className='navbar-brand' href='https://www.topthink.com'>\r\n <img src={logoSrc} height='30' />\r\n </a>}\r\n {children}\r\n <Dropdown navbar>\r\n <Dropdown.Toggle as={Avatar} className='nav-link'>\r\n <img className='rounded-circle' width='25' height='25' src={user.avatar} />\r\n </Dropdown.Toggle>\r\n <Dropdown.Menu className={'shadow'}>\r\n {menus}\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </div>\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.header`\r\n height: 54px;\r\n`;\r\n","var img = \"data:image/svg+xml,%3csvg width='485' height='132' xmlns='http://www.w3.org/2000/svg' xml:space='preserve' style='enable-background:new 0 0 531.69 198.43%3b' version='1.1'%3e %3cstyle type='text/css'%3e.st0%7bfill:%233C60FF%3b%7d%3c/style%3e %3cg%3e %3ctitle%3ebackground%3c/title%3e %3crect fill='none' id='canvas_background' height='134' width='487' y='-1' x='-1'/%3e %3c/g%3e %3cg%3e %3ctitle%3eLayer 1%3c/title%3e %3cpath id='svg_1' d='m132.29%2c62.34c-1.19%2c-18.77 -10.34%2c-35.36 -24.11%2c-46.46c-11.15%2c-8.99 -25.34%2c-14.38 -40.79%2c-14.38c-0.55%2c0 -1.09%2c0.01 -1.63%2c0.02c-3.32%2c0.08 -6.57%2c0.41 -9.75%2c0.98c-30.49%2c5.38 -53.65%2c32 -53.65%2c64.04c0%2c1.87 0.08%2c3.73 0.24%2c5.57c2.5%2c29.51 24.7%2c53.4 53.41%2c58.47c2.38%2c0.42 4.8%2c0.72 7.26%2c0.86c0.83%2c0.05 1.66%2c0.09 2.5%2c0.11c0.54%2c0.01 1.08%2c0.02 1.63%2c0.02c34.04%2c0 61.97%2c-26.16 64.79%2c-59.46c0.16%2c-1.83 0.24%2c-3.69 0.24%2c-5.57c0%2c-1.42 -0.05%2c-2.82 -0.14%2c-4.2zm-76.27%2c32.5c-0.26%2c0.01 -0.53%2c0.01 -0.79%2c0.01c-14.56%2c0 -26.88%2c-9.57 -31.03%2c-22.76c-0.97%2c-3.08 -1.49%2c-6.35 -1.49%2c-9.75c0%2c-17.95 14.56%2c-32.52 32.51%2c-32.52c0.26%2c0 0.53%2c0 0.79%2c0.01c3.41%2c0.08 6.69%2c0.68 9.75%2c1.74c6.5%2c2.22 12.06%2c6.45 15.97%2c11.94c1.98%2c2.78 3.54%2c5.9 4.57%2c9.25c0.94%2c3.03 1.44%2c6.24 1.44%2c9.58l-9.75%2c0c0%2c-2.18 -0.31%2c-4.29 -0.88%2c-6.28c-0.92%2c-3.23 -2.55%2c-6.17 -4.69%2c-8.64c-1.86%2c-2.14 -4.12%2c-3.93 -6.65%2c-5.25c-2.93%2c-1.54 -6.24%2c-2.46 -9.75%2c-2.58c-0.26%2c-0.01 -0.52%2c-0.01 -0.79%2c-0.01c-12.57%2c0 -22.76%2c10.19 -22.76%2c22.76c0%2c3.49 0.79%2c6.8 2.19%2c9.75c3.65%2c7.69 11.49%2c13.01 20.57%2c13.01c0.27%2c0 0.53%2c-0.01 0.79%2c-0.01l0%2c9.75zm55.7%2c-17.92c-3.35%2c10.5 -13.18%2c18.09 -24.78%2c18.09c-3.13%2c0 -6.13%2c-0.55 -8.91%2c-1.57c-2.18%2c-0.8 -4.24%2c-1.88 -6.11%2c-3.21c-2.38%2c-1.68 -4.47%2c-3.76 -6.16%2c-6.13c-0.28%2c-0.39 -0.55%2c-0.79 -0.81%2c-1.2c-2.03%2c-3.2 -3.38%2c-6.87 -3.85%2c-10.82l9.87%2c0c0.33%2c1.71 0.92%2c3.32 1.74%2c4.8c1.61%2c2.91 4.09%2c5.26 7.09%2c6.72c0.57%2c0.28 1.15%2c0.53 1.76%2c0.73c1.68%2c0.6 3.49%2c0.92 5.37%2c0.92c7.92%2c0 14.52%2c-5.67 15.96%2c-13.17c0.2%2c-1 0.3%2c-2.04 0.3%2c-3.09c0%2c-2.37 -0.51%2c-4.63 -1.43%2c-6.67c-1.66%2c-3.71 -4.68%2c-6.68 -8.43%2c-8.28l3.54%2c-9.1c7.43%2c3.08 13.13%2c9.49 15.21%2c17.38c0.44%2c1.64 0.72%2c3.34 0.81%2c5.09c0.04%2c0.52 0.05%2c1.05 0.05%2c1.58c0%2c1.05 -0.07%2c2.07 -0.18%2c3.09c-0.18%2c1.68 -0.54%2c3.3 -1.04%2c4.84z' class='st0'/%3e %3cg id='svg_2'%3e %3cg id='svg_3'%3e %3crect id='svg_4' height='6.34' width='94.12' class='st0' y='20.46' x='163.29'/%3e %3c/g%3e %3cg id='svg_5'%3e %3cpath id='svg_6' d='m169.31%2c113.72l0%2c-6.34c6.49%2c0 11.77%2c-5.28 11.77%2c-11.77l0%2c-71.98l6.34%2c0l0%2c71.98c0%2c9.98 -8.12%2c18.11 -18.11%2c18.11z' class='st0'/%3e %3c/g%3e %3cg id='svg_7'%3e %3cpath id='svg_8' d='m255.49%2c91.27l-6.34%2c0l0%2c-38.2c0%2c-5.06 -4.12%2c-9.18 -9.18%2c-9.18l-19.37%2c0c-5.06%2c0 -9.18%2c4.12 -9.18%2c9.18l0%2c38.2l-6.34%2c0l0%2c-38.2c0%2c-8.55 6.96%2c-15.51 15.51%2c-15.51l19.38%2c0c8.55%2c0 15.51%2c6.96 15.51%2c15.51l0%2c38.2l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_9'%3e %3crect id='svg_10' height='17.09' width='6.34' class='st0' y='23.63' x='227.12'/%3e %3c/g%3e %3cg id='svg_11'%3e %3cpath id='svg_12' d='m206.43%2c113.84l-3.34%2c0l0%2c-6.34l3.34%2c0c6.3%2c0 12.9%2c-3.56 15.35%2c-8.29c3.49%2c-6.71 5.33%2c-14.25 5.33%2c-21.81l0%2c-26.13l6.34%2c0l0%2c26.13c0%2c8.58 -2.09%2c17.13 -6.05%2c24.74c-3.98%2c7.68 -13.57%2c11.7 -20.97%2c11.7z' class='st0'/%3e %3c/g%3e %3cg id='svg_13'%3e %3cpath id='svg_14' d='m257.48%2c113.84l-3.34%2c0c-7.4%2c0 -16.98%2c-4.02 -20.98%2c-11.7c-3.96%2c-7.61 -6.05%2c-16.16 -6.05%2c-24.74l6.34%2c0c0%2c7.56 1.84%2c15.1 5.33%2c21.81c2.46%2c4.73 9.06%2c8.29 15.35%2c8.29l3.34%2c0l0%2c6.34l0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_15'%3e %3crect id='svg_16' height='6.34' width='42.87' class='st0' y='27.89' x='274.07'/%3e %3c/g%3e %3cg id='svg_17'%3e %3crect id='svg_18' height='61.38' width='6.34' class='st0' y='14.89' x='293.05'/%3e %3c/g%3e %3cg id='svg_19'%3e %3crect id='svg_20' height='6.34' width='33.26' class='st0' transform='matrix(0.11%2c-0.9939%2c0.9939%2c0.11%2c194.7608%2c392.0006) ' y='46.985071' x='325.728637'/%3e %3c/g%3e %3cg id='svg_21'%3e %3crect id='svg_22' height='33.26' width='6.34' class='st0' transform='matrix(0.9939%2c-0.11%2c0.11%2c0.9939%2c-7.5075%2c38.3801) ' y='37.060893' x='310.495485'/%3e %3c/g%3e %3cg id='svg_23'%3e %3cpath id='svg_24' d='m352.9%2c77.14l-15.15%2c0c-7.52%2c0 -13.64%2c-6.12 -13.64%2c-13.63l0%2c-29.61c0%2c-7.52 6.12%2c-13.64 13.64%2c-13.64l15.15%2c0c7.52%2c0 13.64%2c6.12 13.64%2c13.64l0%2c29.61c0%2c7.52 -6.12%2c13.63 -13.64%2c13.63zm-15.15%2c-50.54c-4.02%2c0 -7.3%2c3.27 -7.3%2c7.3l0%2c29.61c0%2c4.02 3.27%2c7.3 7.3%2c7.3l15.15%2c0c4.02%2c0 7.3%2c-3.27 7.3%2c-7.3l0%2c-29.61c0%2c-4.02 -3.27%2c-7.3 -7.3%2c-7.3l-15.15%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_25'%3e %3cg id='svg_26'%3e %3crect id='svg_27' height='6.34' width='17.8' class='st0' y='37.2' x='336.43'/%3e %3c/g%3e %3cg id='svg_28'%3e %3crect id='svg_29' height='6.34' width='17.8' class='st0' y='53.87' x='336.43'/%3e %3c/g%3e %3c/g%3e %3cg id='svg_30'%3e %3cpath id='svg_31' d='m352.7%2c113.84l-37.98%2c0c-8%2c0 -14.5%2c-6.51 -14.5%2c-14.5l0%2c-16.14l6.34%2c0l0%2c16.13c0%2c4.5 3.66%2c8.17 8.17%2c8.17l37.98%2c0l0%2c6.34l-0.01%2c0z' class='st0'/%3e %3c/g%3e %3cg id='svg_32'%3e %3crect id='svg_33' height='6.34' width='23.57' class='st0' transform='matrix(0.2529%2c-0.9675%2c0.9675%2c0.2529%2c114.4986%2c402.9877) ' y='83.698593' x='326.836101'/%3e %3c/g%3e %3cg id='svg_34'%3e %3crect id='svg_35' height='6.34' width='20.52' class='st0' y='86.2' x='321.58'/%3e %3c/g%3e %3cg id='svg_36'%3e %3crect id='svg_37' height='24.75' width='6.34' class='st0' transform='matrix(0.9556%2c-0.2946%2c0.2946%2c0.9556%2c-19.7967%2c122.424) ' y='75.874073' x='369.686666'/%3e %3c/g%3e %3cg id='svg_38'%3e %3crect id='svg_39' height='6.34' width='71.83' class='st0' y='20.46' x='395.51'/%3e %3c/g%3e %3cg id='svg_40'%3e %3crect id='svg_41' height='6.34' width='90.81' class='st0' y='57.44' x='386.02'/%3e %3c/g%3e %3cg id='svg_42'%3e %3cpath id='svg_43' d='m463.12%2c113.64l-56%2c0c-4.5%2c0 -8.59%2c-2.29 -10.94%2c-6.14c-2.35%2c-3.84 -2.52%2c-8.53 -0.46%2c-12.53l17.68%2c-35.81l5.64%2c2.89l-17.68%2c35.81c-1.04%2c2.02 -0.95%2c4.39 0.23%2c6.33c1.19%2c1.94 3.25%2c3.1 5.53%2c3.1l56%2c0c1.51%2c0 2.88%2c-0.71 3.74%2c-1.95c0.81%2c-1.16 1.03%2c-2.57 0.63%2c-3.91l-7.8%2c-12.34l5.36%2c-3.39l8.18%2c12.94l0.12%2c0.31c1.24%2c3.34 0.76%2c7.08 -1.28%2c10.01c-2.04%2c2.94 -5.39%2c4.68 -8.95%2c4.68z' class='st0'/%3e %3c/g%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import { ReactNode } from 'react';\r\nimport { intersection } from 'lodash';\r\nimport { useUser } from './user-provider';\r\nimport { User } from '../utils/types';\r\n\r\nexport interface AccessProps {\r\n require?: string | string[] | ((user: User) => boolean);\r\n fallback?: ReactNode;\r\n children: ReactNode;\r\n}\r\n\r\nexport default function Access({\r\n require,\r\n children,\r\n fallback\r\n}: AccessProps) {\r\n const [user,] = useUser();\r\n let passed = false;\r\n if (typeof require === 'function') {\r\n passed = require(user);\r\n } else {\r\n if (typeof require === 'string') {\r\n require = [require];\r\n }\r\n passed = intersection(user.roles, require).length > 0;\r\n }\r\n if (!passed) {\r\n children = fallback;\r\n }\r\n\r\n return <>{children}</>;\r\n}\r\n","import { LinkProps, useNavigate } from 'react-router-dom';\r\nimport { Button, ButtonProps } from '@topthink/components';\r\n\r\ninterface Props extends ButtonProps, Pick<LinkProps, 'to' | 'replace'> {\r\n\r\n}\r\n\r\nexport default function LinkButton({ to, replace, ...props }: Props) {\r\n let navigate = useNavigate();\r\n\r\n return <Button {...props} onClick={(e) => {\r\n e.preventDefault();\r\n navigate(to, { replace });\r\n }} />;\r\n}\r\n","import { Loader, RequestConfig, useRequest } from '@topthink/components';\r\nimport { createContext, ReactNode, useContext } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nconst Context = createContext<any>(undefined);\r\n\r\ninterface Props {\r\n request: RequestConfig;\r\n children: ReactNode;\r\n}\r\n\r\nconst Inner = function({ request, children }: Props) {\r\n const { result } = useRequest(request);\r\n\r\n if (!result) {\r\n return <Loader wrap />;\r\n }\r\n\r\n return <Context.Provider value={result}>\r\n {children}\r\n </Context.Provider>;\r\n};\r\n\r\nexport default function WithRequest({ request, children }: Props) {\r\n const params = useParams();\r\n\r\n if (typeof request === 'string') {\r\n request = {\r\n url: request.replace(/:(\\w+)/g, (all, name) => {\r\n return params[name] || all;\r\n })\r\n };\r\n } else if (request.url) {\r\n request.url = request.url.replace(/:(\\w+)/g, (all, name) => {\r\n return params[name] || all;\r\n });\r\n }\r\n\r\n return <Inner key={request.url} request={request}>{children}</Inner>;\r\n}\r\n\r\nexport function useRequestData<T = any>(): T {\r\n return useContext(Context);\r\n}\r\n","import { Card, isRecord, isRequestError, Loader, Result, useAsync } from '@topthink/components';\r\nimport { Navigate } from 'react-router-dom';\r\nimport { Container } from 'react-bootstrap';\r\nimport queryString from 'query-string';\r\nimport { Promisable } from '../utils/types';\r\n\r\ninterface LoginProps {\r\n onLogined: (token?: string) => string;\r\n onAuthorize?: (token?: string) => Promisable<void | string | undefined>;\r\n}\r\n\r\nexport default function Social({ onLogined, onAuthorize }: LoginProps) {\r\n const { result, error } = useAsync(async () => {\r\n let token: string | undefined;\r\n\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 if (onAuthorize) {\r\n try {\r\n const newToken = await onAuthorize(token);\r\n if (newToken) {\r\n token = newToken;\r\n }\r\n } catch (e) {\r\n if (isRequestError(e)) {\r\n const data = e.response?.data;\r\n if (isRecord(data)) {\r\n throw new Error(data.message);\r\n }\r\n }\r\n throw e;\r\n }\r\n }\r\n\r\n return onLogined(token);\r\n }, []);\r\n\r\n if (error) {\r\n return <Container className={'mt-5'}>\r\n <Card>\r\n <Result status={'error'} title={error.message} />\r\n </Card>\r\n </Container>;\r\n }\r\n\r\n if (result) {\r\n return <Navigate to={result} replace />;\r\n }\r\n\r\n return <Loader />;\r\n}\r\n","import { Loader, useAsync } from '@topthink/components';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ninterface LogoutProps {\r\n onLogout: () => void | Promise<void>;\r\n}\r\n\r\nexport default function Logout({ onLogout }: LogoutProps) {\r\n const navigate = useNavigate();\r\n\r\n useAsync(async () => {\r\n await onLogout();\r\n navigate('/login', { state: { from: 'logout' } });\r\n }, []);\r\n\r\n return <Loader />;\r\n}\r\n","import { Card } from '@topthink/components';\r\nimport { Col, Container, Row } from 'react-bootstrap';\r\nimport { ReactNode } from 'react';\r\n\r\nexport interface LoginProps {\r\n onAuthorize: (url: string) => void;\r\n onLogined: (token?: string) => string;\r\n}\r\n\r\ninterface Props {\r\n onLogin: (props: LoginProps) => ReactNode;\r\n onAuthorize: (url: string) => void;\r\n onLogined: (token?: string) => string;\r\n}\r\n\r\nexport default function Login({ onLogin, onLogined, onAuthorize }: Props) {\r\n return <Container className='vh-100 d-flex align-items-center'>\r\n <Row className='flex-fill'>\r\n <Col md={{ span: 4, offset: 4 }}>\r\n <Card className='p-5'>\r\n {onLogin({ onAuthorize, onLogined })}\r\n </Card>\r\n </Col>\r\n </Row>\r\n </Container>;\r\n}\r\n\r\n","import { createBrowserRouter, RouteObject, RouterProvider } from 'react-router-dom';\nimport Social from '../pages/social';\nimport Logout from '../pages/logout';\nimport queryString from 'query-string';\nimport * as path from 'path';\nimport { Modal, request } from '@topthink/components';\nimport UserProvider from '../components/user-provider';\nimport transformRoutes from './transform-routes';\nimport Login, { LoginProps } from '../pages/login';\nimport { Promisable, UserResolver } from './types';\nimport { ReactNode } from 'react';\n\nfunction stripBasename(pathname: string, basename: string) {\n if (basename === '/') return pathname;\n\n return pathname.slice(basename.length);\n}\n\ninterface AppProps {\n routes: RouteObject[];\n}\n\ninterface Options {\n baseURL?: string;\n basename?: string;\n authentication?: 'cookie' | 'token';\n onLogout?: () => Promisable<void>;\n onAuthorize?: (token?: string) => Promisable<void | string | undefined>;\n onLogin: (props: LoginProps) => ReactNode;\n userResolver: UserResolver;\n}\n\nexport default function createApplication(options: Options) {\n const {\n basename = '/',\n onAuthorize,\n onLogout,\n onLogin,\n authentication = 'token',\n baseURL,\n userResolver,\n } = options;\n\n if (baseURL) {\n request.defaults.baseURL = baseURL;\n }\n\n const handleAuthorize = (url: string) => {\n const ignorePaths = [path.join(basename, '/login'), path.join(basename, '/logout')];\n\n if (!ignorePaths.includes(window.location.pathname)) {\n localStorage.setItem('redirect_uri', stripBasename(window.location.pathname + window.location.search, basename));\n }\n\n const redirectUri = window.location.origin + path.join(basename, '/social');\n\n window.location.href = queryString.stringifyUrl({\n url,\n query: { redirect_uri: redirectUri }\n });\n };\n\n const handleLogined = (token?: string) => {\n if (authentication === 'token' && token && request.defaults.authTokenName) {\n localStorage.setItem(request.defaults.authTokenName, token);\n }\n\n const redirectUri = localStorage.getItem('redirect_uri');\n if (redirectUri) {\n localStorage.removeItem('redirect_uri');\n }\n return redirectUri || '/';\n };\n\n const handleLogout = async () => {\n if (onLogout) {\n try {\n await onLogout();\n } catch (e) {\n\n }\n }\n\n if (authentication === 'token') {\n localStorage.removeItem('authorization');\n }\n };\n\n return function({ routes }: AppProps) {\n const router = createBrowserRouter(\n [\n {\n path: '*',\n element: <UserProvider userResolver={userResolver} />,\n children: transformRoutes(routes),\n },\n {\n path: 'social',\n element: <Social onAuthorize={onAuthorize} onLogined={handleLogined} />\n },\n {\n path: 'logout',\n element: <Logout onLogout={handleLogout} />\n },\n {\n path: 'login',\n element: <Login onLogin={onLogin} onAuthorize={handleAuthorize} onLogined={handleLogined} />\n }\n ],\n {\n basename\n }\n );\n\n return <>\n <RouterProvider router={router} />\n <Modal.Message />\n </>;\n };\n}\n"],"names":["_g","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgExternal","props","React","createElement","xmlns","width","height","fill","d","formatRelativePath","routes","parent","menus","route","meta","path","children","hideInMenu","title","isExternal","href","replace","menu","icon","_jsx","className","hideChildrenInMenu","push","useMenu","matches","useContext","UNSAFE_RouteContext","routeMatch","pathnameBase","routesMatch","useMemo","base","getMenuData","reduceRight","match","handle","undefined","transformRoutes","map","index","renderMenuItems","items","item","_jsxs","MenuTitle","ExternalIcon","SubMenu","MenuItem","Link","to","collapseNode","expandNode","node","scrollHeight","motion","motionName","motionAppear","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","SiderLayout","_ref","header","headerAs","footer","footerAs","top","defaultTitle","pathname","useLocation","selectedKeys","keys","split","reduce","pre","curr","join","openKeys","setOpenKeys","useState","useEffect","slice","onOpenChange","useCallback","currentKey","filter","startsWith","Title","FooterComp","Footer","Container","$top","Sidebar","Header","Menu","mode","Content","Main","Routes","Outlet","memo","_ref2","useRoutes","styled","nav","div","main","RcMenu","p","extra","showBack","defaultShowBack","navigate","useNavigate","location","Space","Back","onClick","Extra","Body","TabLayout","Nav","Item","NavLink","classNames","active","UserContext","createContext","UserProvider","userResolver","state","setState","execute","useAsync","async","e","isRequestError","response","status","onSuccess","user","Loader","value","setUser","refresh","Provider","useUser","context","Error","Avatar","a","logo","src","Dropdown","navbar","Toggle","as","avatar","Access","require","fallback","passed","intersection","roles","_Fragment","LinkButton","Button","preventDefault","Context","Inner","request","result","useRequest","wrap","WithRequest","params","useParams","url","all","name","useRequestData","Social","onLogined","onAuthorize","error","token","parsed","queryString","parse","window","hash","substr","access_token","newToken","data","isRecord","message","Card","Result","Navigate","Logout","onLogout","from","Login","onLogin","Row","Col","md","span","offset","createApplication","options","basename","authentication","baseURL","defaults","handleAuthorize","includes","localStorage","setItem","stripBasename","search","redirectUri","origin","stringifyUrl","query","redirect_uri","handleLogined","authTokenName","getItem","removeItem","handleLogout","router","createBrowserRouter","element","RouterProvider","Modal","Message"],"mappings":"8hCAAA,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,GAAcC,IACT,CAAEnD,OAAQmD,EAAKC,eAGpBC,GAAyB,CAC3BC,WAAY,mBACZC,cAAc,EACdC,cAAeP,EACfQ,eAAgBP,GAChBQ,aAAcT,EACdU,cAAeT,GACfU,aAAcV,GACdW,cAAeZ,GAcK,SAAAa,GAA6FC,GAAA,IAAjF5C,UAAEA,EAASP,MAAEA,EAAKoD,OAAEA,EAAMC,SAAEA,EAAQC,OAAEA,EAAMC,SAAEA,EAAQC,IAAEA,EAAM,GAAEhE,OAAEA,GAAe2D,EAEjH,MAAO/C,EAAMqD,GAAgB/C,EAAQlB,IAE/BkE,SAAEA,GAAaC,IAEfC,EAAe3C,GAAQ,KACzB,MAAM4C,EAAiB,GASvB,OARcH,EAASI,MAAM,KACvBC,QAAiB,CAACC,EAAKC,KACrBD,EAAI1F,OAAS,GACbuF,EAAKpD,KAAKuD,EAAIE,KAAK,MAEhB,IAAIF,EAAKC,KACjB,IACHJ,EAAKpD,KAAKiD,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,EAAS7F,OAAS,GAC9C8F,EAAYD,EAASQ,QAAOnG,GAAOkG,EAAWE,WAAWpG,KAAM,GAChE,CAAC2F,EAAUC,IAEThB,IACDA,EAAS9C,EAACuE,GAAK,CAAA/E,SAAEE,GAASyD,KAG9B,MAEMqB,EAAavB,GAAYwB,GAE/B,OAAOjD,EAACkD,GAAS,CAAAC,KAAOzB,EAAG1D,SAAA,CACvBgC,EAACoD,GAAO,CAAC3E,UAAWA,EAChBT,SAAA,CAAAQ,EANW+C,GAAY8B,GAMV,CAAArF,SAAAsD,IACb9C,EAAC8E,GAAI,CACDC,KAAK,SACL5C,OAAQA,GACR0B,SAAUA,EACVK,aAAcA,EACdZ,aAAcA,EAEb9D,SAAA6B,EAAgBvB,KAErBE,EAACwE,EAAU,CAAAhF,SAAEwD,OAEjBhD,EAACgF,GACG,CAAAxF,SAAAQ,EAACiF,GACI,CAAAzF,SAAAN,EAASc,EAACkF,GAAO,CAAAhG,OAAQA,IAAac,EAACmF,YAIxD,CAEA,MAAMD,GAASE,GAAK,SAA8CC,GAAA,IAArCnG,OAAEA,GAAmCmG,EAC9D,OAAOC,EAAU3E,GAAQ,IAAMO,EAAgBhC,IAAS,CAACA,IAC7D,IAEM0F,GAAUW,EAAOC,GAAG;;;;;;;;;;;;EAcpBjB,GAAQgB,EAAOE,GAAG;;;;;EAOlBZ,GAASU,EAAOE,GAAG;;;;;;;;EAUnBhB,GAASc,EAAOE,GAAG;;;EAInBT,GAAUO,EAAOE,GAAG;;;EAKpBR,GAAOM,EAAOG,IAAI;;;EAKlBjE,GAAY8D,EAAOE,GAAG;;;;;;;;;;;EAatBX,GAAOS,EAAOI,EAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6IrBjB,GAAYa,EAAOE,GAAqB;0BACnBG,GAAMA,EAAEjB;;;;;;YAMvBC;;;;YAIAI;;;;ECrUE,SAAUA,GAA0FnC,GAAA,IAAlFnD,MAAEA,EAAKoD,OAAEA,EAAM0C,IAAEA,EAAGhG,SAAEA,EAAQqG,MAAEA,EAAKC,SAAEA,GAA2CjD,EAC9G,MAAMxC,QAAEA,GAAYC,EAAWC,GACzBlB,EAAQsB,GAAQ,IACXN,EAAQS,aAAqC,CAACzB,EAAO0B,IACpD1B,GAAS0B,EAAM1B,MAAM+B,MAAc/B,EAChC0B,EAAM1B,YACd4B,IACJ,CAACZ,IAEE0F,GAAgD,IAA9B1G,GAAO2B,QAAQvB,WACjC0D,EAAe9D,GAAO2B,QAAQtB,MAE9BsG,EAAWC,IACXC,EAAW7C,IAcjB,YAZiBpC,IAAb6E,IACAA,EAAWC,QAGA9E,IAAX6B,IACAA,EAAStB,EAAC2E,EACL,CAAA3G,SAAA,CAAAsG,GAA6B,YAAjBI,EAAShI,KAClB8B,EAACoG,GAAI,CAACC,QAAS,IAAML,GAAU,GAAIxG,SAAAQ,EAAA,IAAA,CAAGC,UAAU,6BACnDD,EAACuE,GAAO,CAAA/E,SAAAE,GAASyD,QAInB3B,EAACkD,GACJ,CAAAlF,SAAA,CAAAQ,EAAC6E,GACG,CAAArF,SAAAgC,EAAA,MAAA,CAAKvB,UAAU,YAAWT,SAAA,CACrBsD,EACA0C,EACDxF,EAACsG,GAAK,CAAA9G,SAAEqG,SAGhB7F,EAACuG,GAAK,CAAAtG,UAAU,YAAWT,SACtBA,MAGb,CAEA,MAAM4G,GAAOb,EAAOE,GAAG;;;EAKjBf,GAAYa,EAAOE,GAAG;;EAItBZ,GAASU,EAAOE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCnBc,GAAOhB,EAAOE,GAAG;;EAIjBlB,GAAQgB,EAAOE,GAAG;;;;EAMlBa,GAAQf,EAAOE,GAAG;;ECzFA,SAAAe,GAAmD3D,GAAA,IAAzCnD,MAAEA,EAAKoD,OAAEA,EAAMgD,SAAEA,EAAQD,MAAEA,GAAchD,EAEvE,MAAO/C,EAAMqD,GAAgB/C,KACvBgD,SAAEA,GAAaC,IAEfmC,EAAMxF,EAACyG,EACR,CAAAjH,SAAAM,EAAKqB,KAAKI,GACAvB,EAACyG,EAAIC,eACRlF,EAACmF,GAAQ,CAAA1G,UAAW2G,EAAW,WAAY,CAAEC,OAAQzD,EAASkB,WAAW/C,EAAKhC,QAAUuC,GAAIP,EAAKhC,KAAMM,SAClG,EAAAL,SAAA,CAAA+B,EAAKxB,KACLwB,EAAK7B,UAHQ6B,EAAKhC,UASnC,OAAOS,EAACgF,GAAQ,CAAAtF,MAAOA,GAASyD,EAAcL,OAAQA,EAAQ0C,IAAKA,EAAKM,SAAUA,EAAUD,MAAOA,EAC/FrG,SAAAQ,EAACmF,EAAM,KAEf,CAEA,MAAMwB,GAAUpB,EAAO1D,EAAK;;;;;;;;ECzBrB,MAAMiF,GAAcpI,EAAMqI,cAAsC,MAMjEC,GAAe,SAAgCnE,GAAA,IAAvBoE,aAAEA,GAAqBpE,EACjD,MAAOqE,EAAOC,GAAYpD,EAAsB,MAE1CiC,EAAWC,KAEXmB,QAAEA,GAAYC,GAASC,UACzB,GAAIL,EACA,OAAOA,GACV,GACF,GAAI,CACHK,cAAcC,GACNC,EAAeD,IAA6B,MAAvBA,EAAEE,UAAUC,QACjC1B,EAAS,SAEhB,EACD2B,UAAUC,GACFA,GACAT,EAASS,EAEjB,IAGJ,IAAKV,EACD,OAAOlH,EAAC6H,EAAM,CAAA,GAGlB,MAAMC,EAAa,CAACZ,EAAOC,EAAUC,GAMrC,OAJAU,EAAMF,KAAOV,EACbY,EAAMC,QAAUZ,EAChBW,EAAME,QAAUZ,EAETpH,EAAC8G,GAAYmB,SAAS,CAAAH,MAAOA,EAChCtI,SAAAQ,EAACmF,EAAM,KAEf,WAEgB+C,KACZ,MAAMC,EAAU7H,EAAWwG,IAC3B,IAAKqB,EACD,MAAM,IAAIC,MAAM,uCAGpB,OAAOD,CACX,CCtDA,MAAME,GAAS9C,EAAO+C,CAAC;;EAUC,SAAAzD,GAA4EhC,GAAA,IAArErD,SAAEA,EAAQJ,MAAEA,EAAKa,UAAEA,EAASsI,KAAEA,GAAO,GAAgC1F,EAChG,MAAO+E,GAAQM,KAEf,OAAOlI,EAAC0E,GACJ,CAAAzE,UAAW2G,EAAW,yEAA0E3G,GAChGT,SAAAgC,EAAA,MAAA,CAAKvB,UAAU,4BACVsI,GAAQvI,OAAGC,UAAU,eAAeL,KAAK,2BAA0BJ,SAChEQ,SAAKwI,IC6HX,4/MD7HyB1J,OAAO,SAE7BU,EACDgC,EAACiH,EAAS,CAAAC,QACN,EAAAlJ,SAAA,CAAAQ,EAACyI,EAASE,QAAOC,GAAIP,GAAQpI,UAAU,WAAUT,SAC7CQ,SAAKC,UAAU,iBAAiBpB,MAAM,KAAKC,OAAO,KAAK0J,IAAKZ,EAAKiB,WAErE7I,EAACyI,EAAS3D,KAAK,CAAA7E,UAAW,SAAQT,SAC7BJ,WAKrB,CAEA,MAAMsF,GAAYa,EAAOzC,MAAM;;EE5BjB,SAAUgG,GAIVjG,GAAA,IAJiBkG,QAC3BA,EAAOvJ,SACPA,EAAQwJ,SACRA,GACUnG,EACV,MAAO+E,GAASM,KAChB,IAAIe,GAAS,EAab,MAZuB,mBAAZF,EACPE,EAASF,EAAQnB,IAEM,iBAAZmB,IACPA,EAAU,CAACA,IAEfE,EAASC,EAAatB,EAAKuB,MAAOJ,GAAS/K,OAAS,GAEnDiL,IACDzJ,EAAWwJ,GAGRhJ,EAAAoJ,EAAA,CAAA5J,SAAGA,GACd,CCxBwB,SAAA6J,GAA2CxG,GAAA,IAAhCf,GAAEA,EAAEjC,QAAEA,KAAYpB,GAAcoE,EAC3DmD,EAAWC,IAEf,OAAOjG,EAACsJ,EAAM,IAAK7K,EAAO4H,QAAUkB,IAChCA,EAAEgC,iBACFvD,EAASlE,EAAI,CAAEjC,WAAU,GAEjC,CCVA,MAAM2J,GAAUzC,OAAmB9F,GAO7BwI,GAAQ,SAAqC5G,GAAA,IAA5B6G,QAAEA,EAAOlK,SAAEA,GAAiBqD,EAC/C,MAAM8G,OAAEA,GAAWC,EAAWF,GAE9B,OAAKC,EAIE3J,EAACwJ,GAAQvB,SAAQ,CAACH,MAAO6B,EAAMnK,SACjCA,IAJMQ,EAAC6H,EAAO,CAAAgC,SAMvB,EAEwB,SAAAC,GAAwCzE,GAAA,IAA5BqE,QAAEA,EAAOlK,SAAEA,GAAiB6F,EAC5D,MAAM0E,EAASC,IAcf,MAZuB,iBAAZN,EACPA,EAAU,CACNO,IAAKP,EAAQ7J,QAAQ,WAAW,CAACqK,EAAKC,IAC3BJ,EAAOI,IAASD,KAGxBR,EAAQO,MACfP,EAAQO,IAAMP,EAAQO,IAAIpK,QAAQ,WAAW,CAACqK,EAAKC,IACxCJ,EAAOI,IAASD,KAIxBlK,EAACyJ,GAAwB,CAAAC,QAASA,EAAUlK,SAAAA,GAAhCkK,EAAQO,IAC/B,UAEgBG,KACZ,OAAO9J,EAAWkJ,GACtB,CChCwB,SAAAa,GAA6CxH,GAAA,IAAtCyH,UAAEA,EAASC,YAAEA,GAAyB1H,EACjE,MAAM8G,OAAEA,EAAMa,MAAEA,GAAUnD,GAASC,UAC/B,IAAImD,EAEJ,MAAMC,EAASC,EAAYC,MAAMC,OAAO3E,SAAS4E,KAAKC,OAAO,IAK7D,GAJIL,EAAOM,eACPP,EAAQC,EAAOM,cAGfT,EACA,IACI,MAAMU,QAAiBV,EAAYE,GAC/BQ,IACAR,EAAQQ,EAUf,CARC,MAAO1D,GACL,GAAIC,EAAeD,GAAI,CACnB,MAAM2D,EAAO3D,EAAEE,UAAUyD,KACzB,GAAIC,EAASD,GACT,MAAM,IAAI9C,MAAM8C,EAAKE,QAE5B,CACD,MAAM7D,CACT,CAGL,OAAO+C,EAAUG,EAAM,GACxB,IAEH,OAAID,EACOxK,EAAC0E,EAAS,CAACzE,UAAW,OACzBT,SAAAQ,EAACqL,EAAI,CAAA7L,SACDQ,EAACsL,GAAO5D,OAAQ,QAAShI,MAAO8K,EAAMY,cAK9CzB,EACO3J,EAACuL,EAAS,CAAAzJ,GAAI6H,EAAQ9J,SAAO,IAGjCG,EAAC6H,EAAM,CAAA,EAClB,CC9Cc,SAAU2D,GAAgC3I,GAAA,IAAzB4I,SAAEA,GAAuB5I,EACpD,MAAMmD,EAAWC,IAOjB,OALAoB,GAASC,gBACCmE,IACNzF,EAAS,SAAU,CAAEkB,MAAO,CAAEwE,KAAM,WAAa,GAClD,IAEI1L,EAAC6H,EAAM,CAAA,EAClB,CCDc,SAAU8D,GAAgD9I,GAAA,IAA1C+I,QAAEA,EAAOtB,UAAEA,EAASC,YAAEA,GAAoB1H,EACpE,OAAO7C,EAAC0E,EAAU,CAAAzE,UAAU,mCAAkCT,SAC1DQ,EAAC6L,EAAI,CAAA5L,UAAU,YAAWT,SACtBQ,EAAC8L,EAAG,CAACC,GAAI,CAAEC,KAAM,EAAGC,OAAQ,GACxBzM,SAAAQ,EAACqL,EAAK,CAAApL,UAAU,MACXT,SAAAoM,EAAQ,CAAErB,cAAaD,qBAK5C,CCOwB,SAAA4B,GAAkBC,GACtC,MAAMC,SACFA,EAAW,IAAG7B,YACdA,EAAWkB,SACXA,EAAQG,QACRA,EAAOS,eACPA,EAAiB,QAAOC,QACxBA,EAAOrF,aACPA,GACAkF,EAEAG,IACA5C,EAAQ6C,SAASD,QAAUA,GAG/B,MAAME,EAAmBvC,IACD,CAAC1K,EAAKqE,KAAKwI,EAAU,UAAW7M,EAAKqE,KAAKwI,EAAU,YAEvDK,SAAS5B,OAAO3E,SAAS9C,WACtCsJ,aAAaC,QAAQ,eAvCjC,SAAuBvJ,EAAkBgJ,GACrC,MAAiB,MAAbA,EAAyBhJ,EAEtBA,EAASa,MAAMmI,EAASpO,OACnC,CAmCiD4O,CAAc/B,OAAO3E,SAAS9C,SAAWyH,OAAO3E,SAAS2G,OAAQT,IAG1G,MAAMU,EAAcjC,OAAO3E,SAAS6G,OAASxN,EAAKqE,KAAKwI,EAAU,WAEjEvB,OAAO3E,SAAStG,KAAO+K,EAAYqC,aAAa,CAC5C/C,MACAgD,MAAO,CAAEC,aAAcJ,IACzB,EAGAK,EAAiB1C,IACI,UAAnB4B,GAA8B5B,GAASf,EAAQ6C,SAASa,eACxDV,aAAaC,QAAQjD,EAAQ6C,SAASa,cAAe3C,GAGzD,MAAMqC,EAAcJ,aAAaW,QAAQ,gBAIzC,OAHIP,GACAJ,aAAaY,WAAW,gBAErBR,GAAe,GAAG,EAGvBS,EAAejG,UACjB,GAAImE,EACA,UACUA,GAGT,CAFC,MAAOlE,GAER,CAGkB,UAAnB8E,GACAK,aAAaY,WAAW,gBAC3B,EAGL,OAAO,SAA6BzK,GAAA,IAApB3D,OAAEA,GAAkB2D,EAChC,MAAM2K,EAASC,EACX,CACI,CACIlO,KAAM,IACNmO,QAAS1N,EAACgH,IAAaC,aAAcA,IACrCzH,SAAU0B,EAAgBhC,IAE9B,CACIK,KAAM,SACNmO,QAAS1N,EAACqK,GAAO,CAAAE,YAAaA,EAAaD,UAAW6C,KAE1D,CACI5N,KAAM,SACNmO,QAAS1N,EAACwL,IAAOC,SAAU8B,KAE/B,CACIhO,KAAM,QACNmO,QAAS1N,EAAC2L,GAAK,CAACC,QAASA,EAASrB,YAAaiC,EAAiBlC,UAAW6C,MAGnF,CACIf,aAIR,OAAO5K,EACH4H,EAAA,CAAA5J,SAAA,CAAAQ,EAAC2N,EAAc,CAACH,OAAQA,IACxBxN,EAAC4N,EAAMC,QAAO,CAAA,MAG1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topthink/common",
3
- "version": "1.3.16",
3
+ "version": "1.3.18-alpha.0+1bcf086",
4
4
  "scripts": {
5
5
  "prebuild": "rimraf lib types",
6
6
  "build": "rollup -c --environment NODE_ENV:production",
@@ -51,5 +51,5 @@
51
51
  },
52
52
  "author": "yunwuxin <tzzhangyajun@qq.com> (https://github.com/yunwuxin)",
53
53
  "license": "MIT",
54
- "gitHead": "7a8e0fec1fc3f71f9cc2a2286b915fd5cffea89c"
54
+ "gitHead": "1bcf086715feaeebe7fcb44f35817aa2f63b6067"
55
55
  }
@@ -1,9 +1,14 @@
1
1
  import React from 'react';
2
2
  import { User, UserResolver } from '../utils/types';
3
- export declare const UserContext: React.Context<[User, (user: User) => void] | null>;
3
+ type UserContextType = [User, ((user: User) => void), () => void] & {
4
+ user: User;
5
+ setUser: (user: User) => void;
6
+ refresh: () => void;
7
+ };
8
+ export declare const UserContext: React.Context<UserContextType | null>;
4
9
  interface Props {
5
10
  userResolver: UserResolver;
6
11
  }
7
12
  declare const UserProvider: ({ userResolver }: Props) => JSX.Element;
8
- export declare function useUser(): [User, (user: User) => void];
13
+ export declare function useUser(): UserContextType;
9
14
  export default UserProvider;
@@ -0,0 +1,9 @@
1
+ import { RequestConfig } from '@topthink/components';
2
+ import { ReactNode } from 'react';
3
+ interface Props {
4
+ request: RequestConfig;
5
+ children: ReactNode;
6
+ }
7
+ export default function WithRequest({ request, children }: Props): JSX.Element;
8
+ export declare function useRequestData<T = any>(): T;
9
+ export {};
package/types/index.d.ts CHANGED
@@ -27,6 +27,7 @@ export { default as Access } from './components/access';
27
27
  export { default as Content } from './components/content';
28
28
  export { default as LinkButton } from './components/link-button';
29
29
  export { useUser } from './components/user-provider';
30
+ export { default as WithRequest, useRequestData } from './components/with-request';
30
31
  export { User } from './utils/types';
31
32
  export { default as createApplication } from './utils/create-application';
32
33
  export { RouteObject, useRoutes, Link, Outlet, useLocation, useNavigate, useOutlet, useParams, Navigate, useMatches, useLoaderData, useRouteLoaderData, useRevalidator, } from 'react-router-dom';