"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[601],{22639:(t,e,n)=>{function o(t){return t&&"object"==typeof t&&"message"in t&&!("status"in t)?(console.log("Detected simple message response, treating as success"),!0):!!t&&"object"==typeof t&&"status"in t&&!!t.status&&"object"==typeof t.status&&"isSuccess"in t.status&&!0===t.status.isSuccess&&"data"in t}function a(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Success",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"200";return{status:{isSuccess:!0,code:n,message:e,parameters:null},data:t}}function s(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"500",n=arguments.length>2?arguments[2]:void 0;return{status:{isSuccess:!1,code:e,message:t,parameters:null},errors:n}}n.d(e,{$y:()=>a,WX:()=>s,ny:()=>o})},60028:(t,e,n)=>{n.d(e,{yS:()=>k,$:()=>v});var o=n(12108);n(94274);var a=n(25943),s=n(71153),r=n(49509);let c=s.z.object({email:s.z.string().email(),password:s.z.string().min(6)});async function i(t,e){let n="".concat(r.env.API_URL,"/auth/login");try{let r=await fetch(n,{method:"POST",body:JSON.stringify({email:t,password:e}),headers:{"Content-Type":"application/json"}});if(!r.ok)throw Error("Authentication failed with status ".concat(r.status));let c=await r.text(),i=JSON.parse(c).data;if(null==i?void 0:i.token){var o,a,s;return{id:(null==(o=i.user)?void 0:o.id)||t,name:(null==(a=i.user)?void 0:a.name)||t,email:t,token:i.token,roles:(null==(s=i.user)?void 0:s.roles)||[]}}throw Error("Authentication failed - no token received")}catch(t){throw t}}async function l(t){let e={Accept:"application/json"};t.headers&&Object.assign(e,t.headers),t.body instanceof FormData||(e["Content-Type"]="application/json");let n=await (0,o.getSession)();return(null==n?void 0:n.accessToken)&&(e.Authorization="Bearer ".concat(n.accessToken)),e}async function u(t){let e=t.headers.get("content-type");if(e&&e.includes("application/json"))return await t.json();if(!t.ok){let e=await t.text();return{status:{isSuccess:!1,code:String(t.status),message:e||"An unknown error occurred",parameters:null}}}return{status:{isSuccess:!0,code:String(t.status),message:"Success",parameters:null},data:await t.text()}}async function d(){console.log("handleUnauthorized - Starting unauthorized handling"),console.log("handleUnauthorized - Client-side, checking token validity");try{let t=await fetch("/api/auth/validate-token",{method:"GET",headers:{"Content-Type":"application/json"}});if((await t.json()).valid)console.log("handleUnauthorized - Token is still valid, might be a temporary API issue");else{console.log("handleUnauthorized - Token is invalid, clearing session"),localStorage.removeItem("auth-token");let{signOut:t}=await Promise.resolve().then(n.t.bind(n,12108,23));console.log("handleUnauthorized - Signing out from NextAuth"),await t({redirect:!1});let e=window.location.pathname+window.location.search;if(e.includes("/biocodes/enrollment"))console.log("handleUnauthorized - Enrollment page, redirecting without callback"),window.location.href="/authentication/sign-in?error=SessionExpired";else{let t="/authentication/sign-in?callbackUrl=".concat(encodeURIComponent(e),"&error=SessionExpired");console.log("handleUnauthorized - Redirecting to:",t),window.location.href=t}}}catch(e){console.error("handleUnauthorized - Error validating token:",e),localStorage.removeItem("auth-token");let{signOut:t}=await Promise.resolve().then(n.t.bind(n,12108,23));await t({redirect:!1}),window.location.href="/authentication/sign-in?error=SessionExpired"}return{status:{isSuccess:!1,code:"401",message:"Authentication required",parameters:null}}}(0,a.A)({name:"Credentials",credentials:{email:{label:"Email",type:"email"},password:{label:"Password",type:"password"}},authorize:async t=>{try{if(!(null==t?void 0:t.email)||!(null==t?void 0:t.password))return null;if(!c.safeParse(t).success)throw Error("Invalid credentials format");return await i(t.email,t.password)}catch(t){throw console.error("Auth error:",t),t}}});var h=n(49509);class g extends Error{constructor(t,e=500,n,o){super(t),this.name="InternalHttpError",this.status=e,this.code=n,this.errors=o}}let p=()=>{let t=h.env.INTERNAL_API_URL||"";return t.endsWith("/")?t.slice(0,-1):t},f=()=>h.env.INTERNAL_API_KEY||"";async function m(t){let e={Accept:"application/json","X-API-Key":f()};t.headers&&Object.assign(e,t.headers),t.body instanceof FormData||(e["Content-Type"]="application/json");try{let t;(null==(t=await (0,o.getSession)())?void 0:t.accessToken)&&(e.Authorization="Bearer ".concat(t.accessToken))}catch(t){console.warn("Could not get session for internal API call:",t)}return e}async function y(t){let e=t.headers.get("content-type")||"";return e.includes("application/json")?await t.json():e.includes("text/")?await t.text():await t.blob()}async function w(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};console.log("\uD83D\uDE80 Making internal API request:"),console.log(" URL:",t),console.log(" Method:",e.method||"GET"),console.log(" Options:",e);try{let n=await m(e);console.log(" Headers:",n);let o=await fetch(t,{...e,headers:n});console.log("\uD83D\uDCE1 Internal API response:"),console.log(" Status:",o.status),console.log(" StatusText:",o.statusText),console.log(" URL:",o.url);let a=await y(o);if(console.log(" Response body:",a),!o.ok){let t;console.error("❌ Internal API request failed:"),console.error(" Status:",o.status),console.error(" Response:",a);let e=o.status,n="Internal API request failed with status ".concat(e);throw a&&"object"==typeof a&&(a.message?n=a.message:a.error&&(n=a.error),t=a.errors||a.details),new g(n,e,String(e),t)}return console.log("✅ Internal API request successful"),a}catch(t){if(console.error("\uD83D\uDCA5 Internal API request error:",t),t instanceof g)throw t;throw new g("Internal API network error: ".concat(t instanceof Error?t.message:"Unknown error"),0,"NETWORK_ERROR")}}function v(t){let e="".concat(p(),"/").concat(t);return{async get(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,o="".concat(e).concat(t?"/".concat(t):"");if(n&&Object.keys(n).length>0){let t=new URLSearchParams;Object.entries(n).forEach(e=>{let[n,o]=e;null!=o&&t.append(n,String(o))}),o+="?".concat(t.toString())}return w(o)},async post(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,o="".concat(e).concat(t?"/".concat(t):"");return console.log("Internal API client making POST request to:",o),console.log("With data:",n),w(o,{method:"POST",body:n?JSON.stringify(n):void 0})},patch:async(t,n)=>w("".concat(e,"/").concat(t),{method:"PATCH",body:JSON.stringify(n)}),put:async(t,n)=>w("".concat(e,"/").concat(t),{method:"PUT",body:JSON.stringify(n)}),delete:async t=>w("".concat(e,"/").concat(t),{method:"DELETE"}),async upload(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0;return w("".concat(e).concat(t?"/".concat(t):""),{method:"POST",body:n})}}}n(49509);class S extends Error{constructor(t,e){super(t),this.name="HttpError",this.status=e,Object.setPrototypeOf(this,S.prototype)}}let b=()=>"/api/proxy";function k(t){let e="".concat(b(),"/").concat(t);return{async get(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,o="".concat(e).concat(t?"/".concat(t):"");if(n&&Object.keys(n).length>0){let t=new URLSearchParams;Object.entries(n).forEach(e=>{let[n,o]=e;null!=o&&t.append(n,String(o))}),o+="?".concat(t.toString())}return A(o)},async post(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0;return A("".concat(e).concat(t?"/".concat(t):""),{method:"POST",body:n?JSON.stringify(n):void 0})},patch:async(t,n)=>A("".concat(e,"/").concat(t),{method:"PATCH",body:JSON.stringify(n)}),put:async(t,n)=>A("".concat(e,"/").concat(t),{method:"PUT",body:JSON.stringify(n)}),delete:async t=>A("".concat(e,"/").concat(t),{method:"DELETE"}),async upload(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0;return A("".concat(e).concat(t?"/".concat(t):""),{method:"POST",body:n,headers:{}})}}}async function A(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};try{let n=await l(e),o=await fetch(t,{...e,headers:n});if(401===o.status)return console.error("Authentication error: Session expired or invalid token"),await d();let a=await u(o);if(!o.ok||a.status&&!1===a.status.isSuccess){if(a.status&&"401"===a.status.code)return console.error("Authentication error: Session expired or invalid token"),await d();throw!function(t,e){var n,o,a;let s=!t.ok,r=(null==e||null==(n=e.status)?void 0:n.isSuccess)===!1;if(s||r){let n=s?t.status:(null==e||null==(o=e.status)?void 0:o.code)?parseInt(e.status.code):400,r="API Error (".concat(n,"): ");if(e)if(null==(a=e.status)?void 0:a.message)r+=e.status.message;else if(e.message)r+=e.message;else if(e.title){if(r+=e.title,e.errors)try{let t=Object.entries(e.errors).map(t=>{let[e,n]=t,o=Array.isArray(n)?n.join(", "):String(n);return"".concat(e,": ").concat(o)}).join("; ");t&&(r+=" - ".concat(t))}catch(t){console.error("Failed to format error details:",t)}}else r+="Unknown error";let c=Error(r);throw c.status=n,c}}(o,a),Error("API Error: handleApiErrorResponse did not throw as expected")}return a}catch(e){return console.error("API request failed for ".concat(t,":"),e),{status:{isSuccess:!1,code:e instanceof S?String(e.status):"500",message:e instanceof Error?e.message:"Unknown error occurred",parameters:null}}}}},92490:(t,e,n)=>{n.d(e,{D:()=>o});function o(t){if(!t)return"";let e=[];for(let[n,o]of Object.entries(t))if(null!=o&&""!==o)if("filters"===n&&"object"==typeof o)for(let[t,n]of Object.entries(o)){if(null==n||""===n)continue;let o=t.match(/^(\w+)(\[(\w+)\])?$/);if(o){let t=o[1],a=o[3];a?e.push("filter[".concat(t,"][").concat(a,"]=").concat(encodeURIComponent(n))):e.push("filter[".concat(t,"]=").concat(encodeURIComponent(n)))}}else e.push("".concat(encodeURIComponent(n),"=").concat(encodeURIComponent(o)));return e.length?e.join("&"):""}}}]);