AuthContext-DS-dpwJp.js 3.5 KB

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