{"version":3,"file":"ClientPortalGuard.BoLNTKIQ.mjs","names":["React.useState"],"sources":["https:/framerusercontent.com/modules/a1Im4zmQCou8Yl5ylqAO/KBVB1kOr1bla3QRs0H1y/ClientPortalGuard.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{forwardRef}from\"react\";import{useIsStaticRenderer}from\"framer\";import{supabase}from\"https://framerusercontent.com/modules/b3l0K6Jo9apTLV4AdgOX/RzlCl9xrTRPDBj31bNSK/SupabaseClient.js\";const NH_PORTAL_TESTER_EMAIL=\"nhagency26@gmail.com\";async function getPortalState(){const{data,error}=await supabase.rpc(\"get_my_client_portal_state\");if(error)throw error;if(!data)return null;return{client_id:String(data.client_id||\"\"),status:String(data.status||\"\"),pause_reason:String(data.pause_reason||\"\"),pause_message:String(data.pause_message||\"\"),modules:Array.isArray(data.modules)?data.modules:[]};}async function getActiveReviewRequest(){const{data,error}=await supabase.from(\"client_review_requests\").select(\"id, request_type, project_name, status\").eq(\"status\",\"active\").order(\"requested_at\",{ascending:false}).limit(1).maybeSingle();if(error)throw error;if(!data)return null;return{id:String(data.id),request_type:String(data.request_type||\"\"),project_name:data.project_name?String(data.project_name):null,status:String(data.status||\"\")};}function LoadingScreen(){return /*#__PURE__*/_jsx(\"div\",{style:{position:\"fixed\",inset:0,zIndex:999999,background:\"#000000\"}});}function normalizePath(pathname){if(!pathname)return\"/\";const normalized=pathname.replace(/\\/+$/,\"\");return normalized||\"/\";}/**\n * Aplica este override al ROOT frame de todas las páginas\n * normales del portal del cliente:\n *\n * /portal\n * /meta-ads\n * /landing-page\n * /billing\n * /calendar\n * /content\n * /docs\n *\n * No lo apliques a /review.\n *\n * Si existe una solicitud de review activa, el cliente será\n * enviado automáticamente a /review.\n */export function withClientPortalGuard(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStatic=useIsStaticRenderer();const[ready,setReady]=React.useState(false);React.useEffect(()=>{if(isStatic||typeof window===\"undefined\"){setReady(true);return;}let cancelled=false;async function protect(){try{const{data:{session},error:sessionError}=await supabase.auth.getSession();if(sessionError)throw sessionError;if(cancelled)return;const user=session?.user;if(!user){window.location.replace(\"/sign-in\");return;}const{data:roleData,error:roleError}=await supabase.from(\"user_roles\").select(\"role\").eq(\"user_id\",user.id).maybeSingle();if(roleError)throw roleError;if(cancelled)return;const role=roleData?.role;const isNHPortalTester=String(user.email||\"\").trim().toLowerCase()===NH_PORTAL_TESTER_EMAIL;// El personal normal permanece dentro del dashboard.\n// La cuenta tester de NH puede acceder cuando selecciona\n// previamente un cliente en modo vista previa.\nif(!isNHPortalTester&&(role===\"admin\"||role===\"manager\"||role===\"editor\"||role===\"viewer\")){window.location.replace(\"/admin\");return;}const portal=await getPortalState();if(cancelled)return;if(!portal?.client_id){window.location.replace(isNHPortalTester?\"/admin\":\"/access\");return;}// El estado pausado tiene prioridad.\nif(portal.status===\"on_hold\"){window.location.replace(\"/paused\");return;}const activeReview=await getActiveReviewRequest();if(cancelled)return;// Si hay una solicitud activa, la encuesta se convierte\n// temporalmente en la primera pantalla del portal.\nif(activeReview?.id){const currentPath=normalizePath(window.location.pathname);if(currentPath!==\"/review\"){window.location.replace(\"/review\");return;}}setReady(true);}catch(error){console.error(\"[NH] Client portal guard error:\",error);if(!cancelled){window.location.replace(\"/sign-in\");}}}void protect();return()=>{cancelled=true;};},[isStatic]);if(!ready&&!isStatic){return /*#__PURE__*/_jsx(LoadingScreen,{});}return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}/**\n * Aplica este override únicamente al ROOT frame\n * de la nueva página /review.\n *\n * Si el cliente ya respondió o no tiene una solicitud activa,\n * será enviado automáticamente a /portal.\n */export function withClientReviewGuard(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStatic=useIsStaticRenderer();const[ready,setReady]=React.useState(false);React.useEffect(()=>{if(isStatic||typeof window===\"undefined\"){setReady(true);return;}let cancelled=false;async function protectReview(){try{const{data:{session},error:sessionError}=await supabase.auth.getSession();if(sessionError)throw sessionError;if(cancelled)return;const user=session?.user;if(!user){window.location.replace(\"/sign-in\");return;}const{data:roleData,error:roleError}=await supabase.from(\"user_roles\").select(\"role\").eq(\"user_id\",user.id).maybeSingle();if(roleError)throw roleError;if(cancelled)return;const role=roleData?.role;const isNHPortalTester=String(user.email||\"\").trim().toLowerCase()===NH_PORTAL_TESTER_EMAIL;if(!isNHPortalTester&&(role===\"admin\"||role===\"manager\"||role===\"editor\"||role===\"viewer\")){window.location.replace(\"/admin\");return;}const portal=await getPortalState();if(cancelled)return;if(!portal?.client_id){window.location.replace(isNHPortalTester?\"/admin\":\"/access\");return;}if(portal.status===\"on_hold\"){window.location.replace(\"/paused\");return;}const activeReview=await getActiveReviewRequest();if(cancelled)return;// Si ya respondió, no puede volver a abrir la encuesta.\nif(!activeReview?.id){window.location.replace(\"/portal\");return;}setReady(true);}catch(error){console.error(\"[NH] Client review guard error:\",error);if(!cancelled){window.location.replace(\"/sign-in\");}}}void protectReview();return()=>{cancelled=true;};},[isStatic]);if(!ready&&!isStatic){return /*#__PURE__*/_jsx(LoadingScreen,{});}return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withClientReviewGuard\":{\"type\":\"reactHoc\",\"name\":\"withClientReviewGuard\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withClientPortalGuard\":{\"type\":\"reactHoc\",\"name\":\"withClientPortalGuard\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}