AuthContext-XuzzSfKE.js 3.6 KB

1
  1. import{i as e}from"./rolldown-runtime-aKtaBQYM.js";import{a as t,k as n,l as r,m as i,t as a,w as o}from"./client-DSw2TdH4.js";var s=e(n(),1),c=o(),l=(0,s.createContext)(void 0);function u({children:e}){let[n,o]=(0,s.useState)(null),[u,d]=(0,s.useState)(!1),[f,p]=(0,s.useState)(!1),[m,h]=(0,s.useState)(!0),[g,_]=(0,s.useState)(!1),v=(0,s.useRef)(null),y=(0,s.useRef)(!1),b=(0,s.useRef)(!0),x=async()=>{let e=!1;try{let n=new URLSearchParams(window.location.search),s=/^\/(?:overlay\/[^/]+|camwall)\/?$/i.test(window.location.pathname)?null:n.get(`token`);if(s){i(s,`session`),v.current=s,n.delete(`token`);let e=n.toString(),t=window.location.pathname+(e?`?${e}`:``)+window.location.hash;window.history.replaceState({},``,t)}e=!!r();let c=await t.getAuthStatus();if(!b.current)return;if(d(c.auth_enabled),p(c.requires_setup),c.auth_enabled){let e=r();if(e){let n=null,r=!1;for(let e=1;e<=3;e++)try{n=await t.getCurrentUser();break}catch(t){if(!b.current)return;if(t instanceof a&&t.status===401){r=!0;break}e<3&&await new Promise(t=>setTimeout(t,400*e))}if(!b.current)return;n?(o(n),_(!1),s&&e===s&&(i(s,`persistent`),v.current=null)):(o(null),r?(i(null),_(!1)):(_(!0),E.current()))}else o(null),_(!1)}else o(null),_(!1)}catch{if(!b.current)return;o(null),e?(_(!0),E.current()):d(!1)}finally{b.current&&h(!1)}},S=async()=>{let e;try{e=await t.getAuthStatus()}catch{return!1}if(!b.current)return!0;if(d(e.auth_enabled),p(e.requires_setup),!e.auth_enabled||!r())return o(null),!0;try{let e=await t.getCurrentUser();if(b.current){o(e);let t=v.current;t&&r()===t&&(i(t,`persistent`),v.current=null)}return!0}catch(e){return!(e instanceof a)||e.status!==401&&e.status!==403?!1:(b.current&&(e.status===401&&i(null),o(null)),!0)}},C=(0,s.useRef)(null),w=(0,s.useRef)(0),T=async()=>{C.current!==null&&(clearTimeout(C.current),C.current=null);let e=await S();if(!b.current)return;if(e){w.current=0,_(!1);return}let t=w.current?Math.min(w.current*2,6e4):2e3;w.current=t,C.current=window.setTimeout(()=>{C.current=null,T()},t)},E=(0,s.useRef)(T);E.current=T,(0,s.useEffect)(()=>{b.current=!0,x();let e=()=>{b.current&&o(null)};window.addEventListener(`auth:expired`,e);let t=()=>{b.current&&E.current()};return window.addEventListener(`auth:recheck`,t),()=>{b.current=!1,window.removeEventListener(`auth:expired`,e),window.removeEventListener(`auth:recheck`,t),C.current!==null&&clearTimeout(C.current)}},[]),(0,s.useEffect)(()=>{if(!m&&f&&!u){let e=window.location.pathname;e!==`/setup`&&!e.startsWith(`/camera/`)&&!y.current&&(y.current=!0,window.location.href=`/setup`)}else f||(y.current=!1)},[m,f,u]);let D=async(e,n,r=`session`)=>{let a=await t.login({username:e,password:n});return!a.requires_2fa&&a.access_token&&(i(a.access_token,r),await x()),a},O=(e,t,n=`session`)=>{i(e,n),o(t),d(!0),_(!1)},k=()=>{i(null),o(null),t.logout().catch(()=>{}),window.location.href=`/login`},A=async()=>{await x()},j=(0,s.useMemo)(()=>new Set(n?.permissions??[]),[n?.permissions]),M=(0,s.useMemo)(()=>u?n?.is_admin??!1:!0,[u,n?.is_admin]),N=(0,s.useCallback)(e=>!u||M?!0:j.has(e),[u,M,j]),P=(0,s.useCallback)((...e)=>!u||M?!0:e.some(e=>j.has(e)),[u,M,j]),F=(0,s.useCallback)((e,t,r)=>{if(!u||M)return!0;let i=`${e}:${t}_all`,a=`${e}:${t}_own`;return j.has(i)?!0:j.has(a)?r!=null&&r===n?.id:!1},[u,M,j,n?.id]);return(0,c.jsx)(l.Provider,{value:{user:n,authEnabled:u,loading:m,authUnconfirmed:g,isAdmin:M,login:D,loginWithToken:O,logout:k,refreshAuth:A,hasPermission:N,hasAnyPermission:P,canModify:F},children:e})}function d(){let e=(0,s.useContext)(l);if(e===void 0)throw Error(`useAuth must be used within an AuthProvider`);return e}export{d as n,u as t};