{"version":3,"file":"useRobustFetch.DGAqf-Ri.mjs","names":["createClient","useRef","useState","useRef","useCallback","supabase"],"sources":["https:/framerusercontent.com/modules/JyjM5cKFSwLCr5mZgQSw/e5sVqJWby1CRVpSW7jF6/SupabaseClient.js","https:/framerusercontent.com/modules/TgIxkncn5q7D2wDnrRI0/NWpioT4qDTJkMoySbGxh/useVisibilityManager.js","https:/framerusercontent.com/modules/uChpTiFMbJNHPhRO6QYE/sDlZs6gPguwKcSCKOuKj/useRobustFetch.js"],"sourcesContent":["// Import Supabase from ESM.sh (works in Framer without package.json)\nimport{createClient}from\"https://esm.sh/@supabase/supabase-js@2\";const SUPABASE_URL=\"https://jrcheywfgvctntsqjvza.supabase.co\";const SUPABASE_PUBLISHABLE_KEY=\"sb_publishable_ZCY_TrCfd1EdN-mDJQSjjw_Zvm6xAX_\";// Create Supabase client (singleton)\nexport const supabase=createClient(SUPABASE_URL,SUPABASE_PUBLISHABLE_KEY,{auth:{persistSession:true,autoRefreshToken:true,detectSessionInUrl:true}});// Export for use in other Framer components\nexport default supabase;// =====================================================\n// PHASE 3: HELPER FUNCTIONS FOR ADMIN/BRAND SEPARATION\n// =====================================================\n/**\n * Get current user type (admin or brand)\n */export async function getUserType(){const{data:{user}}=await supabase.auth.getUser();if(!user){console.warn(\"⚠️ No authenticated user in getUserType\");return null;}// Check if admin (new table)\nconst{data:admin,error:adminError}=await supabase.from(\"admin_users\").select(\"id\").eq(\"auth_user_id\",user.id).maybeSingle();if(adminError){console.error(\"❌ Error checking admin_users:\",adminError);}if(admin)return\"admin\";// Check if brand (new table)\nconst{data:brand,error:brandError}=await supabase.from(\"brand_partners\").select(\"id\").eq(\"auth_user_id\",user.id).maybeSingle();if(brandError){console.error(\"❌ Error checking brand_partners:\",brandError);}if(brand)return\"brand\";console.warn(\"⚠️ User not found in either table - needs profile migration\");return null;}/**\n * Get current user's full profile\n */export async function getCurrentUserProfile(){const{data:{user}}=await supabase.auth.getUser();if(!user){console.warn(\"⚠️ No authenticated user found in getCurrentUserProfile\");return{type:null,profile:null};}const userType=await getUserType();if(userType===\"admin\"){const{data,error}=await supabase.from(\"admin_users\").select(\"*\").eq(\"auth_user_id\",user.id).single();if(error){console.error(\"❌ Error fetching admin profile:\",error);return{type:null,profile:null};}return{type:\"admin\",profile:data};}if(userType===\"brand\"){const{data,error}=await supabase.from(\"brand_partners\").select(\"*\").eq(\"auth_user_id\",user.id).single();if(error){console.error(\"❌ Error fetching brand profile:\",error);return{type:null,profile:null};}console.log(\"✅ Brand profile loaded:\",data?.brand_name);return{type:\"brand\",profile:data};}console.warn(\"⚠️ User type is null - user not found in admin_users or brand_partners\");return{type:null,profile:null};}/**\n * Check if current user is an admin\n */export async function isAdmin(){const userType=await getUserType();return userType===\"admin\";}/**\n * Get brand partner ID for current user\n */export async function getBrandPartnerId(){const{data:{user}}=await supabase.auth.getUser();if(!user)return null;const{data}=await supabase.from(\"brand_partners\").select(\"id\").eq(\"auth_user_id\",user.id).maybeSingle();return data?.id||null;}/**\n * Get admin user ID for current user\n */export async function getAdminUserId(){const{data:{user}}=await supabase.auth.getUser();if(!user)return null;const{data}=await supabase.from(\"admin_users\").select(\"id\").eq(\"auth_user_id\",user.id).maybeSingle();return data?.id||null;}\nexport const __FramerMetadata__ = {\"exports\":{\"getAdminUserId\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isAdmin\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getUserType\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getBrandPartnerId\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"supabase\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getCurrentUserProfile\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SupabaseClient.map","import{useEffect,useRef}from\"react\";// Singleton state - persists across all component instances\nconst globalVisibilityState={isVisible:typeof document!==\"undefined\"?!document.hidden:true,subscribers:new Map,listenerRegistered:false,debounceTimers:new Map,subscriberIdCounter:0};// ============================================================================\n// GLOBAL EVENT HANDLER\n// Single DOM listener that notifies all subscribers\n// ============================================================================\nfunction handleGlobalVisibilityChange(){const wasVisible=globalVisibilityState.isVisible;const isNowVisible=!document.hidden;// Only process if state actually changed\nif(wasVisible===isNowVisible)return;globalVisibilityState.isVisible=isNowVisible;console.log(`[useVisibilityManager] Tab ${isNowVisible?\"visible\":\"hidden\"}, notifying ${globalVisibilityState.subscribers.size} subscribers`);// Notify all subscribers\nglobalVisibilityState.subscribers.forEach((subscriber,id)=>{const debounceTimer=globalVisibilityState.debounceTimers.get(id);// Clear existing debounce timer\nif(debounceTimer){clearTimeout(debounceTimer);}// Trigger appropriate callback immediately (debouncing happens per-subscriber)\nif(isNowVisible&&subscriber.onVisible){subscriber.onVisible();}else if(!isNowVisible&&subscriber.onHidden){subscriber.onHidden();}});}export function useVisibilityManager(config={}){const{onVisible,onHidden,debounceMs=500,debug=false}=config;// Store subscriber ID in ref to maintain identity across renders\nconst subscriberIdRef=useRef(null);// Store callbacks in refs to prevent effect re-runs when they change\nconst onVisibleRef=useRef(onVisible);const onHiddenRef=useRef(onHidden);// Update refs when callbacks change (but don't re-run effect)\nuseEffect(()=>{onVisibleRef.current=onVisible;onHiddenRef.current=onHidden;},[onVisible,onHidden]);// Register global listener on first mount (only once for entire app)\nuseEffect(()=>{if(typeof document===\"undefined\")return;if(!globalVisibilityState.listenerRegistered){if(debug){console.log(\"[useVisibilityManager] Registering global visibility listener\");}document.addEventListener(\"visibilitychange\",handleGlobalVisibilityChange);globalVisibilityState.listenerRegistered=true;}// This cleanup only runs when ALL components using this hook unmount\nreturn()=>{// Don't remove listener here - let it persist\n// It will be cleaned up when the app closes\n};},[debug]);// Subscribe to visibility changes\nuseEffect(()=>{if(typeof document===\"undefined\")return;// Generate unique subscriber ID on first mount\nif(subscriberIdRef.current===null){subscriberIdRef.current=++globalVisibilityState.subscriberIdCounter;}const subscriberId=subscriberIdRef.current;// Create debounced wrapper functions\nconst debouncedOnVisible=onVisibleRef.current?()=>{const existingTimer=globalVisibilityState.debounceTimers.get(subscriberId);if(existingTimer){clearTimeout(existingTimer);}const timer=setTimeout(()=>{if(debug){console.log(`[useVisibilityManager #${subscriberId}] onVisible (debounced ${debounceMs}ms)`);}// Call current callback (from ref)\nif(onVisibleRef.current){onVisibleRef.current();}globalVisibilityState.debounceTimers.delete(subscriberId);},debounceMs);globalVisibilityState.debounceTimers.set(subscriberId,timer);}:undefined;const debouncedOnHidden=onHiddenRef.current?()=>{const existingTimer=globalVisibilityState.debounceTimers.get(subscriberId);if(existingTimer){clearTimeout(existingTimer);}const timer=setTimeout(()=>{if(debug){console.log(`[useVisibilityManager #${subscriberId}] onHidden (debounced ${debounceMs}ms)`);}// Call current callback (from ref)\nif(onHiddenRef.current){onHiddenRef.current();}globalVisibilityState.debounceTimers.delete(subscriberId);},debounceMs);globalVisibilityState.debounceTimers.set(subscriberId,timer);}:undefined;// Register subscriber\nglobalVisibilityState.subscribers.set(subscriberId,{id:subscriberId,onVisible:debouncedOnVisible,onHidden:debouncedOnHidden});if(debug){console.log(`[useVisibilityManager #${subscriberId}] Subscribed (total: ${globalVisibilityState.subscribers.size})`);}// Cleanup: Unsubscribe on unmount\nreturn()=>{// Clear any pending debounce timer\nconst timer=globalVisibilityState.debounceTimers.get(subscriberId);if(timer){clearTimeout(timer);globalVisibilityState.debounceTimers.delete(subscriberId);}// Remove subscriber\nglobalVisibilityState.subscribers.delete(subscriberId);if(debug){console.log(`[useVisibilityManager #${subscriberId}] Unsubscribed (remaining: ${globalVisibilityState.subscribers.size})`);}};},[debounceMs,debug])// Intentionally minimal dependencies\n;// Return current visibility state\nreturn{isVisible:globalVisibilityState.isVisible,subscriberCount:globalVisibilityState.subscribers.size};}// ============================================================================\n// UTILITY: Get current visibility state without subscribing\n// ============================================================================\nexport function getVisibilityState(){return globalVisibilityState.isVisible;}// ============================================================================\n// UTILITY: Get diagnostic info (for debugging)\n// ============================================================================\nexport function getVisibilityDebugInfo(){return{isVisible:globalVisibilityState.isVisible,subscriberCount:globalVisibilityState.subscribers.size,listenerRegistered:globalVisibilityState.listenerRegistered,activeTimers:globalVisibilityState.debounceTimers.size,subscribers:Array.from(globalVisibilityState.subscribers.entries()).map(([id,sub])=>({id,hasOnVisible:!!sub.onVisible,hasOnHidden:!!sub.onHidden}))};}\nexport const __FramerMetadata__ = {\"exports\":{\"getVisibilityDebugInfo\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useVisibilityManager\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getVisibilityState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useVisibilityManager.map","/**\n * ROBUST DATA FETCHING HOOKS\n * Solves: Loading state stuck, tab visibility issues, race conditions\n *\n * FIXED (Feb 2026):\n * - useRobustFetch no longer resets to loading state on tab visibility refetch\n *   (shows stale data while refreshing in background)\n * - useAuthRefresh now uses centralized useVisibilityManager (no duplicate listeners)\n * - Removed useVisibilityChange (was redundant, used raw listeners)\n * - Stale time increased to prevent unnecessary refetches on quick tab switches\n */import{useState,useEffect,useCallback,useRef}from\"react\";import{useVisibilityManager}from\"https://framerusercontent.com/modules/TgIxkncn5q7D2wDnrRI0/NWpioT4qDTJkMoySbGxh/useVisibilityManager.js\";const DEFAULT_CONFIG={refetchOnVisibilityChange:true,staleTime:6e4,retryCount:2,retryDelay:1e3,timeout:3e4,skip:false};/**\n * Custom hook for robust data fetching with:\n * - Automatic request cancellation on unmount\n * - Tab visibility-based BACKGROUND refetching (no loading spinner)\n * - Retry logic for transient failures\n * - Proper loading state management\n */export function useRobustFetch(fetchFn,deps=[],config={}){const mergedConfig={...DEFAULT_CONFIG,...config};const[state,setState]=useState({data:null,loading:!mergedConfig.skip,error:null,isStale:false,lastFetchedAt:null});// Refs for tracking\nconst abortControllerRef=useRef(null);const mountedRef=useRef(true);const fetchCountRef=useRef(0);const lastFetchTimeRef=useRef(null);// Safe state update that checks if mounted\nconst safeSetState=useCallback(updater=>{if(!mountedRef.current)return;setState(prev=>typeof updater===\"function\"?updater(prev):{...prev,...updater});},[]);// Sleep helper for retry delays\nconst sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms));// Core fetch function with retry logic\n// NOTE: No Promise.race timeout here. Timeout enforcement is handled by\n// useEnhancedAbort's wrap() inside each fetchFn. Having two timeout layers\n// caused phantom \"Request timeout\" errors because browser tab suspension\n// freezes network requests but NOT setTimeout timers.\nconst executeFetch=useCallback(async(isBackgroundRefetch=false)=>{// Skip if configured to skip\nif(mergedConfig.skip){safeSetState({loading:false});return;}// Cancel any in-flight request\nif(abortControllerRef.current){abortControllerRef.current.abort();}// Create new abort controller\nconst abortController=new AbortController;abortControllerRef.current=abortController;const fetchId=++fetchCountRef.current;// CRITICAL FIX: Only show loading spinner on initial fetch, NOT on background refetch\n// This prevents the \"Authentication Required\" flash when returning to tab\nif(!isBackgroundRefetch){safeSetState({loading:true,error:null});}else{// Mark as stale but keep showing existing data\nsafeSetState(prev=>({...prev,isStale:true}));}let lastError=null;// Retry loop\nfor(let attempt=0;attempt<=mergedConfig.retryCount;attempt++){// Check if this fetch is still current\nif(fetchId!==fetchCountRef.current||!mountedRef.current){return;}try{// Call fetchFn directly - timeout is handled by useEnhancedAbort wrap() inside fetchFn\nconst data=await fetchFn(abortController.signal);// Check if still current and mounted\nif(fetchId!==fetchCountRef.current||!mountedRef.current){return;}// Success!\nconst now=Date.now();lastFetchTimeRef.current=now;safeSetState({data,loading:false,error:null,isStale:false,lastFetchedAt:now});return;}catch(error){// Ignore abort errors (expected on cleanup)\nif(error.name===\"AbortError\"){return;}lastError=error;// If we have retries left and not aborted, wait and retry\nif(attempt<mergedConfig.retryCount&&mountedRef.current){console.warn(`Fetch attempt ${attempt+1} failed, retrying in ${mergedConfig.retryDelay}ms...`,error.message);await sleep(mergedConfig.retryDelay);}}}// All retries exhausted\nif(fetchId===fetchCountRef.current&&mountedRef.current){// On background refetch failure, keep existing data and just log\nif(isBackgroundRefetch){console.warn(\"Background refetch failed, keeping existing data:\",lastError?.message);safeSetState(prev=>({...prev,isStale:true}));}else{safeSetState({loading:false,error:lastError?.message||\"Failed to fetch data\"});}}},[fetchFn,mergedConfig,safeSetState]);// Public refetch function (always treated as background)\nconst refetch=useCallback(async()=>{await executeFetch(true);},[executeFetch]);// Reset function\nconst reset=useCallback(()=>{if(abortControllerRef.current){abortControllerRef.current.abort();}safeSetState({data:null,loading:false,error:null,isStale:false,lastFetchedAt:null});lastFetchTimeRef.current=null;},[safeSetState]);// Initial fetch effect\nuseEffect(()=>{mountedRef.current=true;executeFetch(false)// Initial fetch shows loading spinner\n;return()=>{mountedRef.current=false;if(abortControllerRef.current){abortControllerRef.current.abort();}};// eslint-disable-next-line react-hooks/exhaustive-deps\n},deps);// Visibility change effect - background refetch only\n// Uses centralized visibility manager (no duplicate listeners)\nuseVisibilityManager({onVisible:mergedConfig.refetchOnVisibilityChange?()=>{if(!mountedRef.current)return;// Check if data is stale\nconst now=Date.now();const lastFetch=lastFetchTimeRef.current;if(!lastFetch||now-lastFetch>mergedConfig.staleTime){// BACKGROUND refetch - keeps existing data visible\nexecuteFetch(true);}}:undefined,debounceMs:1e3});return{...state,refetch,reset};}export function useAbortableSubmit(config={}){const{timeout=3e4,onSuccess,onError,supabase,validateSession=!!supabase}=config;const[loading,setLoading]=useState(false);const[error,setError]=useState(null);const abortControllerRef=useRef(null);const mountedRef=useRef(true);useEffect(()=>{mountedRef.current=true;return()=>{mountedRef.current=false;if(abortControllerRef.current){abortControllerRef.current.abort();}};},[]);// Session refresh on tab visibility is now handled centrally by\n// BrandManagementSystem's visibility handler + heartbeat.\n// Removed competing useVisibilityManager subscriber here that was\n// causing redundant session checks and race conditions.\nconst submit=useCallback(async submitFn=>{// Prevent double submission\nif(loading){console.warn(\"Submit already in progress, ignoring duplicate submission\");return;}// Abort any existing request\nif(abortControllerRef.current){abortControllerRef.current.abort();}const abortController=new AbortController;abortControllerRef.current=abortController;setLoading(true);setError(null);try{// Validate session inline (not through operation coordinator to avoid complexity)\nif(validateSession&&supabase){const{data:{session},error:sessionError}=await supabase.auth.getSession();if(sessionError||!session){throw new Error(\"No active session. Please sign in again.\");}const expiresAt=session.expires_at;const now=Math.floor(Date.now()/1e3);if(!expiresAt||expiresAt<=now){throw new Error(\"Session expired. Please sign in again.\");}// Refresh if expiring within 5 minutes\nif(expiresAt-now<300){console.log(\"🔄 Session expiring soon, refreshing...\");const{error:refreshError}=await supabase.auth.refreshSession();if(refreshError){throw new Error(\"Failed to refresh session. Please sign in again.\");}}}// Create timeout\nconst timeoutId=setTimeout(()=>{console.warn(\"Request timeout, aborting...\");abortController.abort();},timeout);const result=await submitFn(abortController.signal);clearTimeout(timeoutId);if(mountedRef.current){setLoading(false);onSuccess?.(result);}return result;}catch(err){console.error(\"Submit error:\",err);if(err.name===\"AbortError\"){if(mountedRef.current){setError(\"Request was cancelled or timed out. Please try again.\");setLoading(false);}onError?.(new Error(\"Request was cancelled or timed out\"));return;}if(mountedRef.current){const errorMsg=err.message||\"An error occurred\";setError(errorMsg);setLoading(false);}onError?.(err);// Don't throw for session errors, just return\nif(err.message?.includes(\"session\")||err.message?.includes(\"Session\")){return;}throw err;}},[loading,timeout,onSuccess,onError,supabase,validateSession]);const reset=useCallback(()=>{setLoading(false);setError(null);},[]);const abort=useCallback(()=>{if(abortControllerRef.current){console.log(\"Aborting request...\");abortControllerRef.current.abort();}},[]);return{submit,loading,error,reset,abort};}// useAuthRefresh — REMOVED (was unused, added competing visibility subscribers)\n// Session refresh is now handled centrally by BrandManagementSystem's\n// visibility handler + heartbeat interval.\n/**\n * Utility function to \"wake up\" network connections\n * Useful before critical operations on mobile Safari\n */export async function wakeUpConnection(supabase){try{const{error}=await supabase.from(\"brand_partners\").select(\"count\",{count:\"exact\",head:true});if(error&&error.code!==\"PGRST116\"){return false;}return true;}catch(err){console.error(\"Connection wake-up failed:\",err);return false;}}export default useRobustFetch;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useRobustFetch\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"wakeUpConnection\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAbortableSubmit\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useRobustFetch.map"],"mappings":"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"}