1import{i as e,t}from"./react-C0pe7UsM.js";import{n}from"./supabase-DjhwpKdX.js";import{c as r,u as i}from"./prefs-C0oTDw2o.js";import{t as a}from"./jsx-runtime-5-6YZypz.js";function o(e){return e?.code===`PGRST202`&&/crm_session_memberships/.test(String(e.message||``))}function s(e,t,n,r=Date.now()){if(!e?.id)return[];let i=String(e.email||``).toLowerCase(),a=t.filter(t=>t.owner_id===e.id),o=n.filter(e=>e.active!==!1&&(!e.account_expires_at||Date.parse(e.account_expires_at)>r)),s=e=>i&&String(e.email||``).toLowerCase()===i,c=new Map;for(let t of o)t.shop_id&&(s(t)||!a.length&&t.owner_id===e.id)&&(c.has(t.shop_id)||c.set(t.shop_id,{id:t.id,role:String(t.role||`tech`).trim().toLowerCase(),shop_id:t.shop_id,owner_id:t.owner_id,name:t.name}));for(let t of a){let n=o.find(e=>e.shop_id===t.id&&s(e));c.set(t.id,{id:n?.id||null,role:`owner`,shop_id:t.id,owner_id:e.id,name:n?.name||t.name})}return[...c.values()].sort((e,t)=>e.shop_id.localeCompare(t.shop_id))}async function c(e,t){let n=`id,role,shop_id,owner_id,name,email,active,account_expires_at,created_at`,[r,i,a]=await Promise.all([t(`shops`,{select:`id,owner_id,name`,owner_id:`eq.${e.id}`}),t(`employees`,{select:n,owner_id:`eq.${e.id}`,order:`created_at.asc,id.asc`}),e.email?t(`employees`,{select:n,email:`ilike.${String(e.email).replace(/[\\%_*]/g,`\\$&`)}`,order:`created_at.asc,id.asc`}):[]]);return s(e,r,[...new Map([...a,...i].map(e=>[e.id,e])).values()])}async function l(e,t){let{data:n,error:r}=await e.rpc(`crm_session_memberships`);if(!r)return n||[];if(!o(r))throw r;return c(t,async(t,n)=>{let r=e.from(t).select(n.select);for(let[e,t]of Object.entries(n)){if(e===`select`)continue;if(e===`order`){r=r.order(`created_at`).order(`id`);continue}let n=t.indexOf(`.`),i=t.slice(0,n),a=t.slice(n+1);r=i===`ilike`?r.ilike(e,a):r.eq(e,a)}let i=await r;if(i.error)throw i.error;return i.data||[]})}var u=e(t(),1),d=a(),f=(0,u.createContext)(null),p={owner:null,manager:new Set([`home`,`repair-orders`,`estimates`,`scheduling`,`customers`,`inventory`,`timeclock`,`dvi`,`fleet`,`vendors`,`warranty`,`documents`,`marketing`,`canned-jobs`,`email`,`phone`,`tasks`,`bay-board`,`tool-checkout`,`epa-log`,`labor-times`,`messages`]),advisor:new Set([`home`,`repair-orders`,`estimates`,`scheduling`,`customers`,`inventory`,`timeclock`,`dvi`,`fleet`,`vendors`,`warranty`,`documents`,`marketing`,`canned-jobs`,`email`,`phone`,`tasks`,`bay-board`,`tool-checkout`,`labor-times`,`messages`]),tech:new Set([`home`,`repair-orders`,`timeclock`,`dvi`,`tasks`,`bay-board`,`tool-checkout`,`messages`]),demo:new Set([`home`,`repair-orders`,`estimates`,`scheduling`,`customers`,`inventory`,`timeclock`,`dvi`,`fleet`,`vendors`,`warranty`,`documents`,`marketing`,`canned-jobs`,`tasks`])},m={owner:new Set([`*`]),manager:new Set(`ro:view.ro:create.ro:edit.ro:add-parts.ro:add-labor.customer:view.customer:edit.customer:create.vehicle:view.vehicle:edit.estimate:view.estimate:create.estimate:edit.inventory:view.inventory:edit.schedule:view.schedule:create.schedule:edit.reports:daily.email:view.email:send.phone:view.phone:dial.dvi:view.dvi:create.timeclock:view.timeclock:clockin`.split(`.`)),advisor:new Set(`ro:view.ro:create.ro:edit.ro:add-parts.ro:add-labor.customer:view.customer:edit.customer:create.vehicle:view.vehicle:edit.estimate:view.estimate:create.estimate:edit.inventory:view.inventory:edit.schedule:view.schedule:create.schedule:edit.reports:daily.email:view.email:send.phone:view.phone:dial.dvi:view.dvi:create.timeclock:view.timeclock:clockin`.split(`.`)),tech:new Set([`ro:view`,`ro:edit-status`,`customer:view`,`timeclock:view`,`timeclock:clockin`,`dvi:view`,`dvi:create`,`reports:daily`]),demo:new Set([`ro:view`,`customer:view`,`vehicle:view`,`estimate:view`,`inventory:view`,`schedule:view`,`reports:daily`,`dvi:view`,`timeclock:view`,`phone:view`,`email:view`])};function h(e){return e===`demo`}function g(e,t){if(!e||e===`owner`)return!0;let n=p[e];return n?n.has(t):!1}function _(e,t){if(!e||e===`owner`)return!0;let n=m[e];return n?n.has(`*`)||n.has(t):!1}function v({children:e}){let[t,a]=(0,u.useState)(null),[o,s]=(0,u.useState)(null),[c,p]=(0,u.useState)(!0),[m,v]=(0,u.useState)(`owner`),[y,b]=(0,u.useState)(null),[x,S]=(0,u.useState)(``);function C(){try{return typeof sessionStorage<`u`?sessionStorage.getItem(`admin.impersonate.shopId`):null}catch{return null}}async function w(e){if(!e){v(`owner`),b(null),S(``);return}let t=e.user_metadata?.full_name||e.email?.split(`@`)[0]||``,r=C();try{let i=null;if(r){let{data:e,error:t}=await n.rpc(`is_super_admin`);if(t||!e)throw Error(`Administrator access not verified`);let{data:a}=await n.from(`employees`).select(`id, name, role, shop_id`).eq(`shop_id`,r).eq(`role`,`owner`).order(`created_at`,{ascending:!0}).limit(1).maybeSingle();if(i=a,!i){let{data:e}=await n.from(`shops`).select(`name`).eq(`id`,r).maybeSingle();if(e?.name){v(`owner`),b(null),S(e.name);return}}}else{let t=await l(n,e),r=null;try{r=sessionStorage.getItem(`crm.activeShopId`)}catch{}i=t?.find(e=>e.shop_id===r)||t?.[0]||null}i?(v(i.role||`tech`),b(i.id),S(i.name||t)):(v(`owner`),b(null),S(t))}catch{v(`tech`),b(null),S(t)}}(0,u.useEffect)(()=>{let e=()=>{t&&w(t)};return window.addEventListener(`crm:shop-changed`,e),()=>window.removeEventListener(`crm:shop-changed`,e)},[t]),(0,u.useEffect)(()=>{n.auth.getSession().then(({data:{session:e}})=>{s(e),a(e?.user??null),e?.user&&r().catch(e=>console.warn(`[prefs hydrate]`,e.message)),w(e?.user??null).finally(()=>p(!1))});let{data:{subscription:e}}=n.auth.onAuthStateChange((e,t)=>{if(e===`TOKEN_REFRESHED`){s(t);return}s(t),a(t?.user??null),e===`SIGNED_OUT`?i():t?.user&&r().catch(e=>console.warn(`[prefs hydrate]`,e.message)),w(t?.user??null),p(!1)});return()=>e.unsubscribe()},[]);let T=async(e,t)=>{let{data:r,error:i}=await n.auth.signInWithPassword({email:e,password:t});if(i){try{n.from(`admin_failed_logins`).insert({email:String(e||``).slice(0,200),reason:String(i.message||`auth_error`).slice(0,200),user_agent:typeof navigator<`u`?navigator.userAgent:``})}catch{}throw i}let a=null;try{let{data:e}=await n.rpc(`record_user_login`);a=e||null}catch{}try{n.from(`shop_login_events`).insert({user_id:r.user?.id||null,user_email:r.user?.email||e||``,shop_id:a,event:`login`,success:!0,user_agent:typeof navigator<`u`?navigator.userAgent:``})}catch{}return r},E=async(e,t,r={})=>{let{data:i,error:a}=await n.auth.signUp({email:e,password:t,options:{data:r}});if(a)throw a;return i},D=async()=>{try{let{data:{user:e}}=await n.auth.getUser();e&&n.from(`shop_login_events`).insert({user_id:e.id,user_email:e.email||``,event:`logout`,success:!0,user_agent:typeof navigator<`u`?navigator.userAgent:``})}catch{}try{let{error:e}=await n.auth.signOut();e&&console.warn(`[signOut] supabase reported:`,e.message)}catch(e){console.warn(`[signOut] threw:`,e?.message||e)}
1try{if(typeof window<`u`){for(let e of Object.keys(localStorage))(e.startsWith(`sb-`)||e.includes(`supabase`))&&localStorage.removeItem(e);window.location.href=`/#/`}}catch{}},O=(0,u.useMemo)(()=>({user:t,session:o,loading:c,userRole:m,staffId:y,staffName:x,userName:x,isReadOnly:h(m),canAccessTab:e=>g(m,e),hasFeature:e=>_(m,e),signIn:T,signUp:E,signOut:D}),[t,o,c,m,y,x]);return(0,d.jsx)(f.Provider,{value:O,children:e})}function y(){let e=(0,u.useContext)(f);if(!e)throw Error(`useAuth must be used within AuthProvider`);return e}export{y as n,l as r,v as t};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.