@topthink/common 1.6.11 → 1.6.12

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