"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4927],{41567:(e,t,r)=>{r.d(t,{$G:()=>o,Pr:()=>i,fd:()=>s});var n=r(86227),a=r(49677);async function s(){try{let e=await fetch("/api/auth/session",{credentials:"include"});if(!e.ok)return null;return await e.json()}catch{return null}}function i(e){return!!e.authenticated&&!!e.accessToken&&!!e.expiresAt&&(n.nc.getState().login(e.accessToken,e.refreshToken??"",e.expiresAt,e.user??null),a.w.getState().clear(),!0)}async function o(){let e=await s();return null!==e&&i(e)}},43351:(e,t,r)=>{r.d(t,{V:()=>a,m:()=>s});let n=["/login","/auth/","/api/auth/"];function a(e){return!!("/"===e||e.startsWith("/drive/s/")||"/demo"===e||e.startsWith("/demo/")||e.startsWith("/onboard/"))||n.some(t=>e===t||e.startsWith(t))}function s(e){return"/demo"===e||e.startsWith("/demo/")}},49677:(e,t,r)=>{r.d(t,{a:()=>a,w:()=>n});let n=(0,r(46298).v)((e,t)=>({status:"idle",setOffline:()=>{"expired"!==t().status&&e({status:"offline"})},setExpired:()=>{"expired"!==t().status&&e({status:"expired"})},clear:()=>e({status:"idle"})}));function a(){return"expired"===n.getState().status}},68917:(e,t,r)=>{r.d(t,{P:()=>u,_:()=>l});var n=r(86227),a=r(49677),s=r(62805),i=r(60112);function o(e){return!!e?.accessToken&&!!e.expiresAt&&(n.nc.getState().login(e.accessToken,e.refreshToken??"",e.expiresAt,e.user??null),a.w.getState().clear(),!0)}async function l(){return o(await (0,s.lx)())}async function u(){let e=await (0,s.lx)();if(!e)return n.nc.getState().logout(),null;if(Date.now()>=e.expiresAt-6e4&&e.refreshToken){let t=await (0,i.dW)();t&&(e=t)}return Date.now()>=e.expiresAt&&!e.refreshToken?(n.nc.getState().logout(),null):(o(e),n.nc.getState().accessToken)}},72858:(e,t,r)=>{r.d(t,{A:()=>l});var n=r(86227),a=r(41567),s=r(81887),i=r(68917);let o=null;async function l(){return o||(o=(async()=>{if((0,s.B8)())return(0,i.P)();let e=await (0,a.fd)();return e&&(0,a.Pr)(e)?n.nc.getState().accessToken:(n.nc.getState().logout(),null)})().finally(()=>{o=null})),o}},86227:(e,t,r)=>{r.d(t,{Ht:()=>o,IQ:()=>l,nc:()=>u});var n=r(46298),a=r(22029),s=r(91025),i=r(49677);let o="ulti-auth",l=["ultimail-auth","ultidrive-auth"];!function(){try{if(localStorage.getItem(o))return;for(let e of l){let t=localStorage.getItem(e);if(t)return void localStorage.setItem(o,t)}}catch{}}();let u=(0,n.v)()((0,a.Zr)((e,t)=>({accessToken:null,refreshToken:null,expiresAt:null,user:null,login:(t,r,n,a=null)=>{e({accessToken:t,refreshToken:r,expiresAt:n,user:a}),i.w.getState().clear()},logout:()=>{e({accessToken:null,refreshToken:null,expiresAt:null,user:null});try{for(let e of(localStorage.removeItem(o),l))localStorage.removeItem(e)}catch{}},isAuthenticated:()=>{let{accessToken:e,expiresAt:r,refreshToken:n}=t();return!!e&&(!!(r&&Date.now(){let t=e.state;return t&&(t.accessToken=null,t.refreshToken=null,t.expiresAt=null),e},partialize:e=>({user:e.user})}))},91025:(e,t,r)=>{r.d(t,{$:()=>i});var n=r(22029);function a(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,r)=>{e.set(t,r)},removeItem:t=>{e.delete(t)}}}function s(){try{return window.localStorage}catch{return a()}}let i=function(){let e=(0,n.KU)(s)??(0,n.KU)(()=>a());if(!e)throw Error("[debounced-json-storage] failed to create JSON storage");let t=new Map,r=new Map,i=n=>{let a=r.get(n);void 0!==a&&(globalThis.clearTimeout(a),r.delete(n));let s=t.get(n);void 0!==s&&(t.delete(n),e.setItem(n,s))},o=()=>{for(let e of[...t.keys()])i(e)};return window.addEventListener("beforeunload",o),window.addEventListener("pagehide",o),{getItem:t=>e.getItem(t),setItem:(e,n)=>{t.set(e,n);let a=r.get(e);void 0!==a&&globalThis.clearTimeout(a);let s=globalThis.setTimeout(()=>{r.delete(e),i(e)},220);r.set(e,s)},removeItem:n=>{let a=r.get(n);return void 0!==a&&(globalThis.clearTimeout(a),r.delete(n)),t.delete(n),e.removeItem(n)}}}()},94927:(e,t,r)=>{r.d(t,{UQ:()=>g,M_:()=>w,uE:()=>p});var n=r(72858),a=r(86227),s=r(41567),i=r(49677),o=r(43351);let l=null;function u(){return(0,o.m)(window.location.pathname)}function c(){u()||(a.nc.getState().logout(),i.w.getState().setExpired())}async function f(e){if(u())return"refreshed";if((0,i.a)())return"expired";if(e?.forceExpired)return c(),"expired";if("u">typeof navigator&&!navigator.onLine)return i.w.getState().setOffline(),"offline";if(await (0,s.$G)())return"refreshed";let t=await (0,s.fd)();return t?.authenticated||await (0,n.A)()?"refreshed":(c(),"expired")}function d(e){return u()?Promise.resolve("refreshed"):(0,i.a)()?Promise.resolve("expired"):e?.forceExpired?f(e):(l||(l=f().finally(()=>{l=null})),l)}var h=r(29994);class w extends Error{constructor(){super("Device is offline"),this.name="OfflineError"}}class g extends Error{constructor(e,t,r,n){super(r),this.name="ApiRequestError",this.status=e,this.code=t,this.details=n}}class m{constructor(e=h.hY){this.resolveBaseUrl=e}resolveUrl(e){let t=this.resolveBaseUrl(),r=t.startsWith("http")?t:`${window.location.origin}${t}`,n=r.endsWith("/")?r:`${r}/`;return new URL(e.startsWith("/")?e.slice(1):e,n)}async getHeaders(){let e={"Content-Type":"application/json"},t=await (0,n.A)();return t&&(e.Authorization=`Bearer ${t}`),e}async request(e,t,r){if("u">typeof navigator&&!navigator.onLine)throw new w;let n=this.resolveUrl(t);if(r?.params)for(let[e,t]of Object.entries(r.params))void 0!==t&&n.searchParams.set(e,t);let a=r?.timeout??1e4,s=r?.retries??3,o=null,l=!1;for(let t=0;t<=s;t++){if(t>0){let e=1e3*Math.pow(2,t-1);await new Promise(t=>setTimeout(t,e))}let s=new AbortController,u=setTimeout(()=>s.abort(),a);try{let t=await fetch(n.toString(),{method:e,headers:{...await this.getHeaders(),...r?.headers},body:r?.body?JSON.stringify(r.body):void 0,signal:s.signal});if(clearTimeout(u),!t.ok){let e;try{e=await t.json()}catch{}let r=new g(t.status,e?.code??"UNKNOWN",e?.message??t.statusText,e?.details);if(401===t.status){if((0,i.a)())throw r;if(l)await d({forceExpired:!0});else{l=!0;let e=await d();if("refreshed"===e)continue;if("offline"===e)throw new w}}if(t.status>=400&&t.status<500)throw r;o=r;continue}if(204===t.status)return;let a=await t.text();if(!a.trim())return;return JSON.parse(a)}catch(e){if(clearTimeout(u),e instanceof g&&e.status>=400&&e.status<500)throw e;o=e instanceof Error?e:Error(String(e)),e instanceof DOMException&&"AbortError"===e.name&&(o=Error("Request timed out"))}}throw o??Error("Request failed")}async get(e,t){return this.request("GET",e,{params:t})}async getBlob(e,t=!1){if("u">typeof navigator&&!navigator.onLine)throw new w;let r=this.resolveUrl(e),a={},s=await (0,n.A)();s&&(a.Authorization=`Bearer ${s}`);let o=await fetch(r.toString(),{method:"GET",headers:a});if(!o.ok){if(401===o.status){if((0,i.a)())throw new g(o.status,"UNKNOWN",o.statusText);if(t)await d({forceExpired:!0});else{let t=await d();if("refreshed"===t)return this.getBlob(e,!0);if("offline"===t)throw new w}}throw new g(o.status,"UNKNOWN",o.statusText)}return o.blob()}async post(e,t){return this.request("POST",e,{body:t})}async put(e,t,r){return this.request("PUT",e,{body:t,headers:r})}async patch(e,t){return this.request("PATCH",e,{body:t})}async delete(e){await this.request("DELETE",e)}}let p=new m}}]);