PageSourceSearch

https://www.bathroombuddy.io/_next/static/chunks/9556-5d4e31c606b44304.js

js bathroombuddy.io collected 2026-10-02 01:57:18 UTC 22,274 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9556],{1989:(e,t,r)=>{r.d(t,{f:()=>m});var a=r(7880),n=r(9524),o=r(9186);let s="bb.amplitude.device_id",i="bb.amplitude.session_id";async function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r="your-amplitude-api-key".trim()||"";if(!r)return;let a={event_type:e,user_id:t.userId||void 0,device_id:function(){let e=localStorage.getItem(s);if(e)return e;let t="undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():"".concat(Date.now(),"-").concat(Math.random().toString(16).slice(2));return localStorage.setItem(s,t),t}(),session_id:function(){let e=localStorage.getItem(i);if(e){let t=Number(e);if(Number.isFinite(t))return t}let t=Date.now();return localStorage.setItem(i,String(t)),t}(),time:Date.now(),platform:"web",event_properties:t.eventProperties||{}};try{let t=await fetch("https://api2.amplitude.com/2/httpapi",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:r,events:[a]}),keepalive:!0});t.ok||o.vF.warn("Amplitude event rejected",{eventType:e,status:t.status})}catch(t){o.vF.warn("Amplitude event failed",{eventType:e,error:t})}}var c=r(2688);let u="bb.analytics.session_id",d=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function p(e){if(e)return d.test(e)?e:void 0}function _(){let e=localStorage.getItem(u);if(e)return e;let t="undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():"".concat(Date.now(),"-").concat(Math.random().toString(16).slice(2));return localStorage.setItem(u,t),t}function h(){return{platform:navigator.platform,language:navigator.language,viewport:"".concat(window.innerWidth,"x").concat(window.innerHeight),timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function f(e,t){let r=a.A.get(n.d5.AUTH_COOKIE);if(!r)return;let s="".concat(n.i3.PUBLIC_BASE_URL.replace(/\/$/,""),"/api/analytics/collection/").concat(e);try{let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer ".concat(r),"X-App-Key":n.i3.APP_KEY},body:JSON.stringify(t),keepalive:!0});a.ok||401===a.status||o.vF.warn("Analytics collection request failed",{path:e,status:a.status})}catch(t){o.vF.warn("Analytics collection request error",{path:e,error:t})}}let m={getSessionId:_,async startSession(e){await f("session/start",{user_id:p(e),session_id:_(),platform:"web",device_info:h(),app_version:c.env.NEXT_PUBLIC_APP_VERSION||null,user_agent:"undefined"!=typeof navigator?navigator.userAgent:null}),await l("session_started",{userId:p(e),eventProperties:{session_id:_(),platform:"web"}})},async updateSession(){let e=!(arguments.length>0)||void 0===arguments[0]||arguments[0];await f("session/update",{session_id:_(),is_active:e}),await l("session_updated",{eventProperties:{session_id:_(),is_active:e}})},async endSession(){await f("session/update",{session_id:_(),is_active:!1,ended_at:new Date().toISOString()}),await l("session_ended",{eventProperties:{session_id:_()}})},async trackSearch(e){var t,r;let a=p(e.userId);await f("search",{user_id:a,session_id:_(),search_query:e.searchQuery||"nearby-search",search_filters:e.searchFilters||null,user_location:e.userLocation||null,results_count:e.resultsCount,selected_bathroom_id:p(e.selectedBathroomId),selected_position:null!=(t=e.selectedPosition)?t:null,search_source:e.searchSource||"map",platform:"web"}),await l("bathroom_search",{userId:a,eventProperties:{results_count:e.resultsCount,search_source:e.searchSource||"map",selected_position:null!=(r=e.selectedPosition)?r:null}})},async trackBathroomView(e){var t;let r=p(e.bathroomId);if(!r)return;let a=p(e.userId);await f("bathroom/view",{bathroom_id:r,user_id:a,session_id:_(),view_source:e.viewSource,view_duration_seconds:null!=(t=e.viewDurationSeconds)?t:null,referrer_url:e.referrerUrl||null,search_query:e.searchQuery||null,search_filters:e.searchFilters||null,user_location:e.userLocation||null}),await l("bathroom_viewed",{userId:a,eventProperties:{bathroom_id:r,view_source:e.viewSource}})},async trackEngagement(e){let t=p(e.userId);await f("engagement",{user_id:t,session_id:_(),event_type:e.eventType,event_name:e.eventName,event_properties:e.eventProperties||null,bathroom_id:p(e.bathroomId),screen_name:e.screenName||null,platform:"web",app_version:c.env.
1NEXT_PUBLIC_APP_VERSION||null}),await l(e.eventName||"engagement_event",{userId:t,eventProperties:{event_type:e.eventType,bathroom_id:p(e.bathroomId),screen_name:e.screenName||null,...e.eventProperties||{}}})},async trackRatingSubmission(e){var t;let r=p(e.ratingId),a=p(e.userId),n=p(e.bathroomId);r&&a&&n&&(await f("rating",{rating_id:r,user_id:a,bathroom_id:n,session_id:_(),submission_source:e.submissionSource||"web",time_to_submit_seconds:null!=(t=e.timeToSubmitSeconds)?t:null,form_interactions:e.formInteractions||null,platform:"web"}),await l("rating_submitted",{userId:a,eventProperties:{rating_id:r,bathroom_id:n,submission_source:e.submissionSource||"web"}}))},async trackPerformance(e){var t,r;let a=p(e.userId);await f("performance",{user_id:a,session_id:_(),platform:"web",app_version:c.env.NEXT_PUBLIC_APP_VERSION||null,performance_metric:e.performanceMetric,metric_value:null!=(t=e.metricValue)?t:null,additional_data:e.additionalData||null,device_info:h(),network_type:e.networkType||null}),await l("performance_metric",{userId:a,eventProperties:{performance_metric:e.performanceMetric,metric_value:null!=(r=e.metricValue)?r:null,network_type:e.networkType||null}})}}},4399:(e,t,r)=>{r.d(t,{A:()=>l});var a=r(7880),n=r(9524),o=r(9186);let s=()=>"".concat(window.location.origin,"/auth/confirm"),i={signup:async e=>{var t;let r=await fetch("/api/auth/signup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e.email,password:e.password,first_name:e.first_name,last_name:e.last_name,redirect_to:null!=(t=e.redirect_to)?t:s(),turnstile_token:e.turnstile_token})});if(!r.ok)throw Error((await r.json()).message||"Signup failed");let o=await r.json(),l=o.access_token||o.token||"",c={...o,token:l};return l&&(i.saveToken(l,c.expires_at),a.A.set(n.d5.AUTH_COOKIE,l,{expires:n.nQ.COOKIE_EXPIRES_DAYS,path:"/"}),c.refresh_token&&localStorage.setItem(n.d5.REFRESH_TOKEN,c.refresh_token)),c},login:async(e,t,r)=>{try{o.vF.apiRequest("POST","/api/auth/signin",{email:e});let s=await fetch("/api/auth/signin",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,password:t,turnstile_token:r||void 0})});if(!s.ok){let e=await s.json();throw o.vF.apiResponse("POST","/api/auth/signin",s.status,e),Error(e.message||"Login failed")}let l=await s.json(),c=l.access_token||l.token;if(!c)throw Error("Login response did not include an access token");let u={...l,token:c};return o.vF.apiResponse("POST","/api/auth/signin",s.status),i.saveToken(c,u.expires_at),a.A.set(n.d5.AUTH_COOKIE,c,{expires:n.nQ.COOKIE_EXPIRES_DAYS,path:"/"}),u.refresh_token&&localStorage.setItem(n.d5.REFRESH_TOKEN,u.refresh_token),u}catch(e){throw o.vF.apiError("POST","/api/auth/signin",e),e}},resetPassword:async(e,t)=>{let r=await fetch("/api/auth/password-reset",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,turnstile_token:t||void 0})});if(!r.ok){let e=await r.json();throw Error(e.message||e.error||"Password reset request failed")}return await r.json()},sendMagicLink:async(e,t)=>{let r=await fetch("/api/auth/magic-link",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,redirect_to:s(),turnstile_token:t||void 0})}),a=await r.json().catch(()=>({}));if(!r.ok)throw Error(a.message||a.details||"Magic link request failed");return a},signInWithProvider:async e=>{let t=await fetch("/api/auth/provider",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,redirect_to:s()})}),r=await t.json().catch(()=>({}));if(!t.ok||!r.url)throw Error(r.message||r.details||"Provider sign-in failed");window.location.assign(r.url)},saveSession:async(e,t,r)=>{i.saveToken(e,"number"==typeof r?new Date(1e3*r).toISOString():r||void 0),a.A.set(n.d5.AUTH_COOKIE,e,{expires:n.nQ.COOKIE_EXPIRES_DAYS,path:"/"}),t&&localStorage.setItem(n.d5.REFRESH_TOKEN,t)},getRefreshToken:async()=>localStorage.getItem(n.d5.REFRESH_TOKEN),saveRefreshToken:async e=>{localStorage.setItem(n.d5.REFRESH_TOKEN,e)},refreshToken:async()=>{let e=await i.getRefreshToken();if(!e)throw Error("No refresh token available");try{let t=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:e})});if(!t.ok)throw Error("Failed to refresh token");let r=await t.json();return i.saveToken(r.access_token,r.expires_at),i.saveRefreshToken(r.refresh_token),r.access_token}catch(e){throw o.vF.error("Failed to refresh token:",e),await i.logout(),Error("Authentication expired. Please log in again.")}},saveToken:async(e,t)=>{if(localStorage.setItem(n.d5.TOKEN,e),t)localStorage.setItem(n.d5.TOKEN_EXPIRY,t);else{let e=new Date;e.setHours(e.getHours()+n.nQ.DEFAULT_TOKEN_HOURS),localStorage.setItem(n.d5.TOKEN_EXPIRY,e.toISOString())}},logout:async()=>{let e=localStorage.getItem(n.d5.TOKEN);if(e)try{await fetch("".concat(n.i3.PUBLIC_BASE_URL,"/api/auth/logout"),{method:"POST",headers:{Authorization:"Bearer ".concat(e)}})}catch(e){o.vF.warn("Failed to record backend logout event",e)}localStorage.removeItem(n.d5.TOKEN),localStorage.removeItem(n.d5.TOKEN_EXPIRY),localStorage.removeItem(n.d5.REFRESH_TOKEN),a.A.remove(n.d5.AUTH_COOKIE,{path:"/"})},isTokenValid:async()=>{let e=localStorage.getItem(n.d5.TOKEN),t=localStorage.getItem(n.d5.TOKEN_EXPIRY);return!!e&&!!t&&new Date(t)>new Date}},l=i},4407:(e,t,r)=>{r.d(t,{KO:()=>l,oY:()=>c});var a=r(886),n=r(9186),o=r(1989);let s={CLS:{good:.1,poor:.25},INP:{good:200,poor:500},FCP:{good:1800,poor:3e3},LCP:{good:2500,poor:4e3},TTFB:{good:800,poor:1800}};function i(e){let t=function(e,t){let r=s[e];return t<=r.good?"good":t<=r.poor?"needs-improvement":"poor"}(e.name,e.value);n.vF.info("Performance Metric: ".concat(e.name),{value:e.value,rating:t,id:e.id,delta:e.delta,navigationType:e.navigationType}),fetch("/api/web-vitals",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metric:e.name,value:e.value,rating:t,id:e.id,delta:e.delta,navigationType:e.navigationType,timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent,sessionId:o.f.getSessionId()})}).catch(e=>{n.vF.error("Failed to send web vital to analytics:",e)})}function l(){try{(0,a.IN)(i),(0,a.rH)(i),(0,a.fK)(i),(0,a.zB)(i),(0,a.Ck)(i),n.vF.info("Web Vitals monitoring initialized")}catch(e){n.vF.error("Failed to initialize Web Vitals:",e)}}let c={markStart(e){window.performance&&performance.mark("".concat(e,"-start"))},markEnd(e){if(window.performance){performance.mark("".concat(e,"-end")),performance.measure(e,"".concat(e,"-start"),"".concat(e,"-end"));let t=performance.getEntriesByName(e,"measure")[0];t&&n.vF.info("Custom Performance: ".concat(e),{duration:t.duration,startTime:t.startTime})}},trackComponentRender(e,t){n.vF.info("Component Render: ".concat(e),{renderTime:t,rating:t<16?"good":t<100?"needs-improvement":"poor"})},trackApiCall(e,t,r){n.vF.info("API Performance: ".concat(e),{duration:t,status:r,rating:t<1e3?"good":t<3e3?"needs-improvement":"poor"}),(t>=1500||r>=500||0===r)&&o.f.trackPerformance({performanceMetric:"api_request_duration_ms",metricValue:Math.round(t),additionalData:{endpoint:e,status:r}})}}},6462:(e,t,r)=>{r.d(t,{r:()=>a});
1var a=function(e){return e.NETWORK_ERROR="NETWORK_ERROR",e.AUTHENTICATION_ERROR="AUTHENTICATION_ERROR",e.AUTHORIZATION_ERROR="AUTHORIZATION_ERROR",e.VALIDATION_ERROR="VALIDATION_ERROR",e.NOT_FOUND_ERROR="NOT_FOUND_ERROR",e.SERVER_ERROR="SERVER_ERROR",e.TIMEOUT_ERROR="TIMEOUT_ERROR",e.UNKNOWN_ERROR="UNKNOWN_ERROR",e}({})},6826:(e,t,r)=>{r.d(t,{ZQ:()=>_,gI:()=>h});var a=r(7880),n=r(6462),o=r(9524),s=r(4407),i=r(9186);let l=o.i3.PUBLIC_BASE_URL.replace(/\/$/,"");function c(e){return"object"==typeof e&&null!==e?e:void 0}class u{setupDefaultInterceptors(){this.addRequestInterceptor({onRequest:e=>{let t=a.A.get(o.d5.AUTH_COOKIE);return t&&(e.headers={...e.headers,Authorization:"Bearer ".concat(t)}),e.headers={"Content-Type":"application/json",...e.headers},e}}),this.addResponseInterceptor({onResponseError:async e=>{throw e.type===n.r.AUTHENTICATION_ERROR&&await this.handleAuthError(),i.vF.apiError("API_CLIENT",e.endpoint||"unknown",e),e}})}addRequestInterceptor(e){this.requestInterceptors.push(e)}addResponseInterceptor(e){this.responseInterceptors.push(e)}async handleAuthError(){if(!this.isRefreshingToken){this.isRefreshingToken=!0;try{let e=localStorage.getItem(o.d5.REFRESH_TOKEN);if(e){let t=await fetch("/api/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:e})});if(t.ok){let e=await t.json();a.A.set(o.d5.AUTH_COOKIE,e.token),e.refresh_token&&localStorage.setItem(o.d5.REFRESH_TOKEN,e.refresh_token),this.isRefreshingToken=!1;return}}}catch(e){i.vF.error("Token refresh failed:",e)}finally{this.isRefreshingToken=!1}a.A.remove(o.d5.AUTH_COOKIE),localStorage.removeItem(o.d5.REFRESH_TOKEN),window.location.href="/login"}}createApiError(e,t,r){let a;switch(e.status){case 401:a=n.r.AUTHENTICATION_ERROR;break;case 403:a=n.r.AUTHORIZATION_ERROR;break;case 404:a=n.r.NOT_FOUND_ERROR;break;case 422:a=n.r.VALIDATION_ERROR;break;case 500:case 502:case 503:case 504:a=n.r.SERVER_ERROR;break;default:a=n.r.UNKNOWN_ERROR}let o=c(r);return{type:a,message:function(e,t){let r=c(e),a=null==r?void 0:r.message;return"string"==typeof a?a:t}(r,e.statusText||"An error occurred"),status:e.status,details:o,timestamp:new Date().toISOString(),endpoint:t}}async executeRequest(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=performance.now(),a=e.startsWith("http")?e:"".concat(this.config.baseUrl).concat(e),o={...t};for(let e of this.requestInterceptors)if(e.onRequest){let t=e.onRequest({...o,url:a});a=t.url,o={...t},delete o.url}try{let e,t=new AbortController,n=setTimeout(()=>t.abort(),this.config.timeout);o.signal=t.signal;let i=await fetch(a,o);clearTimeout(n);let l=performance.now()-r;s.oY.trackApiCall(a,l,i.status);let c=i.headers.get("content-type");if(e=(null==c?void 0:c.includes("application/json"))?await i.json():await i.text(),!i.ok){let t=this.createApiError(i,a,e);for(let e of this.responseInterceptors)e.onResponseError&&await e.onResponseError(t);throw t}for(let t of this.responseInterceptors)t.onResponse&&(e=t.onResponse(i,e));return e}catch(t){let e=performance.now()-r;if(t instanceof Error){if("AbortError"===t.name){let t={type:n.r.TIMEOUT_ERROR,message:"Request timeout",timestamp:new Date().toISOString(),endpoint:a};throw s.oY.trackApiCall(a,e,0),t}let r={type:n.r.NETWORK_ERROR,message:t.message||"Network error",timestamp:new Date().toISOString(),endpoint:a};throw s.oY.trackApiCall(a,e,0),r}throw t}}async get(e,t){let r=e;if(t){let e=new URLSearchParams;Object.entries(t).forEach(t=>{let[r,a]=t;null!=a&&e.append(r,String(a))}),r+="?".concat(e.toString())}return this.executeRequest(r,{method:"GET"})}async post(e,t){return this.executeRequest(e,{method:"POST",body:t?JSON.stringify(t):void 0})}async put(e,t){return this.executeRequest(e,{method:"PUT",body:t?JSON.stringify(t):void 0})}async patch(e,t){return this.executeRequest(e,{method:"PATCH",body:t?JSON.stringify(t):void 0})}async delete(e){return this.executeRequest(e,{method:"DELETE"})}constructor(e){this.requestInterceptors=[],this.responseInterceptors=[],this.isRefreshingToken=!1,this.config=e,this.setupDefaultInterceptors()}}let d=new u({baseUrl:"",timeout:1e4,retryAttempts:3,retryDelay:1e3}),p=new u({baseUrl:"".concat(l,"/api"),timeout:1e4,retryAttempts:3,retryDelay:1e3}),_={getCurrentUser:async()=>d.get("/api/auth/me"),refreshToken:async e=>d.post("/api/auth/refresh",{refresh_token:e}),deleteAccount:async()=>p.delete("/users/me")},h={getMyEntitlements:async()=>p.get("/users/me/entitlements")}},9186:(e,t,r)=>{r.d(t,{vF:()=>n});class a{shouldLog(e){return!!this.isDevelopment||"error"===e||"warn"===e}debug(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];this.shouldLog("debug")}info(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];this.shouldLog("info")}warn(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];this.shouldLog("warn")}error(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];this.shouldLog("error")}
1apiRequest(e,t,r){this.debug("API ".concat(e.toUpperCase()," ").concat(t),r?{data:r}:"")}apiResponse(e,t,r,a){r>=400?this.error("API ".concat(e.toUpperCase()," ").concat(t," failed with status ").concat(r),a):this.debug("API ".concat(e.toUpperCase()," ").concat(t," success (").concat(r,")"),a)}apiError(e,t,r){this.error("API ".concat(e.toUpperCase()," ").concat(t," error:"),r)}constructor(){this.isDevelopment=!1}}let n=new a,{debug:o,info:s,warn:i,error:l}=n},9524:(e,t,r)=>{r.d(t,{bR:()=>o,cl:()=>l,d5:()=>s,i3:()=>n,nQ:()=>i});var a=r(2688);let n={BASE_URL:a.env.BASE_API_URL||"https://api.bathroombuddy.io",PUBLIC_BASE_URL:"https://api.bathroombuddy.io",APP_KEY:a.env.APP_KEY||"CXsHbehRZI"},o={PUBLIC_API_KEY:"pk.eyJ1Ijoicm9ja2hlbGxqdW1wZXIiLCJhIjoiY21iMTkzMDExMDV2ajJsb2t5cjFkZGl5biJ9.1O16uWHpKQL35cd9kYyouQ",GEOCODING_URL:a.env.MAPBOX_GEOCODING_URL||"https://api.mapbox.com/geocoding/v5/mapbox.places",MAP_STYLE:"mapbox://styles/mapbox/streets-v12"},s={TOKEN:a.env.TOKEN_STORAGE_KEY||"bathroom_buddy_token",TOKEN_EXPIRY:a.env.TOKEN_EXPIRY_KEY||"bathroom_buddy_token_expiry",REFRESH_TOKEN:a.env.REFRESH_TOKEN_KEY||"bathroom_buddy_refresh_token",AUTH_COOKIE:a.env.AUTH_COOKIE_NAME||"auth_token"},i={COOKIE_EXPIRES_DAYS:parseInt(a.env.COOKIE_EXPIRES_DAYS||"7",10),DEFAULT_TOKEN_HOURS:parseInt(a.env.DEFAULT_TOKEN_HOURS||"24",10),AUTH_CONFIRMATION_DELAY_MS:parseInt(a.env.AUTH_CONFIRMATION_DELAY_MS||"1500",10),AUTH_RETRY_DELAY_MS:parseInt(a.env.AUTH_RETRY_DELAY_MS||"1000",10),AUTH_DEEPLINK_DELAY_MS:parseInt(a.env.AUTH_DEEPLINK_DELAY_MS||"2000",10),SEARCH_DEBOUNCE_MS:parseInt(a.env.SEARCH_DEBOUNCE_MS||"300",10)},l={DEFAULT_RADIUS_METERS:parseInt(a.env.DEFAULT_SEARCH_RADIUS_METERS||"5000",10)};a.env.PRIMARY_COLOR,a.env.BACKGROUND_COLOR,a.env.BORDER_COLOR,o.PUBLIC_API_KEY},9556:(e,t,r)=>{r.d(t,{A:()=>p,AuthProvider:()=>d});var a=r(4955),n=r(7579),o=r(4399),s=r(6826),i=r(1989),l=r(6462),c=r(9186);let u=(0,n.createContext)(void 0);function d(e){let{children:t}
1=e,[r,d]=(0,n.useState)(null),[p,_]=(0,n.useState)(!0),[h,f]=(0,n.useState)(null),[m,E]=(0,n.useState)(null),[g,v]=(0,n.useState)(!1),R=null!==r,O=!!(null==m?void 0:m.can_submit_bathrooms),y=(0,n.useCallback)(()=>{f(null)},[]),I=(0,n.useCallback)(async function(){let e=!(arguments.length>0)||void 0===arguments[0]||arguments[0];if(!e)return void E(null);v(!0);try{let e=await s.gI.getMyEntitlements();E(e),c.vF.debug("Loaded user entitlements",e)}catch(e){E(null),(null==e?void 0:e.type)===l.r.AUTHENTICATION_ERROR?c.vF.debug("Entitlements request skipped: not authenticated"):(null==e?void 0:e.type)?c.vF.warn("Failed to load entitlements",e):e instanceof Error&&c.vF.warn("Failed to load entitlements",e)}finally{v(!1)}},[]),w=(0,n.useCallback)(async()=>{await I(!!r)},[I,r]),T=(0,n.useCallback)(async()=>{try{return(await s.ZQ.getCurrentUser()).user}catch(e){return e instanceof Error&&(e.type===l.r.AUTHENTICATION_ERROR?c.vF.debug("User not authenticated"):c.vF.error("Failed to fetch current user:",e)),null}},[]),S=(0,n.useCallback)(async()=>{try{f(null);let e=await T();d(e),await I(!!e)}catch(e){f(e instanceof Error?e.message:"Failed to refresh user data"),c.vF.error("Failed to refresh user:",e)}},[T,I]),A=(0,n.useCallback)(async()=>{try{if(f(null),await o.A.isTokenValid()){let e=await T();e?(d(e),await I(!0),c.vF.debug("User authenticated successfully")):(await o.A.logout(),d(null),E(null),c.vF.debug("User fetch failed, cleared auth state"))}else d(null),E(null),c.vF.debug("Token invalid, user not authenticated")}catch(e){await o.A.logout(),d(null),E(null),f(e instanceof Error?e.message:"Authentication check failed"),c.vF.error("Authentication check failed:",e)}finally{_(!1)}},[T,I]),b=(0,n.useCallback)(async(e,t,r)=>{try{_(!0),f(null),await o.A.login(e,t,r);let a=await T();if(a)d(a),await I(!0),c.vF.info("User logged in successfully");else throw Error("Failed to fetch user data after login")}catch(e){throw f(e instanceof Error?e.message:"Login failed"),d(null),E(null),c.vF.error("Login failed:",e),e}finally{_(!1)}},[T,I]),k=(0,n.useCallback)(async()=>{try{_(!0),f(null),await i.f.endSession(),await o.A.logout(),d(null),E(null),v(!1),c.vF.info("User logged out successfully")}catch(e){f(e instanceof Error?e.message:"Logout failed"),c.vF.error("Logout failed:",e),d(null),E(null),v(!1)}finally{_(!1)}},[]),N=(0,n.useCallback)(async(e,t,r,a,n)=>{try{_(!0),f(null),await o.A.signup({first_name:e,last_name:t,email:r,password:a,turnstile_token:n||void 0}),d(null),E(null),c.vF.info("User registered successfully")}catch(e){throw f(e instanceof Error?e.message:"Registration failed"),c.vF.error("Registration failed:",e),e}finally{_(!1)}},[]);return(0,n.useEffect)(()=>{A()},[A]),(0,n.useEffect)(()=>{if(!R)return;let e=setInterval(async()=>{await o.A.isTokenValid()||await k()},3e5);return()=>clearInterval(e)},[R,k]),(0,n.useEffect)(()=>{if(!r)return;i.f.startSession(r.id),i.f.trackEngagement({userId:r.id,eventType:"app_open",eventName:"session_started",screenName:"root"});let e=window.setInterval(()=>{i.f.updateSession(!0)},6e4),t=()=>{let e="visible"===document.visibilityState;i.f.updateSession(e)},a=()=>{i.f.endSession()};return document.addEventListener("visibilitychange",t),window.addEventListener("beforeunload",a),()=>{window.clearInterval(e),document.removeEventListener("visibilitychange",t),window.removeEventListener("beforeunload",a),i.f.endSession()}},[r]),(0,a.jsx)(u.Provider,{value:{user:r,loading:p,error:h,isAuthenticated:R,entitlements:m,entitlementsLoading:g,canSubmitBathrooms:O,login:b,logout:k,register:N,refreshUser:S,refreshEntitlements:w,clearError:y},children:t})}function p(){let e=(0,n.useContext)(u);if(void 0===e)throw Error("useAuth must be used within an AuthProvider");return e}}}]);

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.