{"version":3,"file":"userDataCache.CVRfefH6.mjs","names":[],"sources":["https:/framerusercontent.com/modules/ZrpjBiVwZx3IX8RMorYt/OVZgLRFMM1Y7BHVuC3TS/userDataCache.js"],"sourcesContent":["function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{supabase}from\"https://framerusercontent.com/modules/iDXl4p6JjHSCZfUwQVxG/aPEslV3ptTFgKwaoU3F5/supabaseClient.js\";// ============================================================================\n// CACHE KEYS\n// ============================================================================\nconst CACHE_KEYS={USER_DATA:\"shared_user_data_v2\",PROFILE_DATA:\"shared_profile_data_v2\",ALL_PROFILES:\"shared_all_profiles_v2\"};const CACHE_DURATION=24*60*60*1e3// 24 hours\n;// ============================================================================\n// STORAGE UTILITIES\n// ============================================================================\nfunction getFromStorage(key){try{const item=localStorage.getItem(key);if(!item)return null;return JSON.parse(item);}catch(e){console.warn(`[Cache] Failed to read ${key}:`,e);return null;}}function setInStorage(key,entry){try{localStorage.setItem(key,JSON.stringify(entry));}catch(e){console.warn(`[Cache] Failed to write ${key}:`,e);}}function removeFromStorage(key){try{localStorage.removeItem(key);}catch(e){console.warn(`[Cache] Failed to remove ${key}:`,e);}}// ============================================================================\n// CACHE MANAGER CLASS\n// ============================================================================\nclass UserDataCacheManager{// ========================================================================\n// INITIALIZATION\n// ========================================================================\nasync initialize(){if(this.isInitialized)return;console.log(\"[Cache] Initializing shared cache manager\");// ✅ Use getSession() — reads from localStorage, no network hit\nconst{data:{session}}=await supabase.auth.getSession();if(session?.user){this.currentUserId=session.user.id;await this.loadUserData(session.user.id,session.access_token);}// Setup global realtime subscription\nthis.setupRealtimeSubscription();// Setup auth state listener\nthis.setupAuthListener();// Setup cross-tab sync\nthis.setupCrossTabSync();this.isInitialized=true;console.log(\"[Cache] Initialization complete\");}// ========================================================================\n// USER DATA (email, username, avatar, OAuth status)\n// ========================================================================\nasync getUserData(){await this.ensureInitialized();// Try cache first\nconst cached=getFromStorage(CACHE_KEYS.USER_DATA);if(cached&&await this.isCacheValid(cached)){console.log(\"[Cache] Using cached user data\");return cached.data;}// ✅ Use getSession() instead of getUser() — no network hit\nconst{data:{session}}=await supabase.auth.getSession();if(!session?.user)return null;return await this.loadUserData(session.user.id,session.access_token);}subscribeToUserData(callback){this.userDataSubscribers.add(callback);// Immediately call with current data\nthis.getUserData().then(data=>callback(data));return()=>{this.userDataSubscribers.delete(callback);};}async loadUserData(userId,sessionToken){try{console.log(\"[Cache] Loading fresh user data\");// ✅ Use getSession() — userId already passed in, no need for getUser()\nconst{data:{session}}=await supabase.auth.getSession();if(!session?.user)return null;const{data:profile}=await supabase.from(\"profiles\").select(\"email, username, avatar_url, role, approved, provider_type\").eq(\"id\",userId).maybeSingle();// Check OAuth status from session identities (no extra network call)\nconst oauthProviders=[\"google\",\"apple\"];const isOAuthUser=session.user.identities?.some(identity=>oauthProviders.includes(identity.provider))||false;const userData={id:userId,email:profile?.email||session.user.email||\"\",username:profile?.username||\"\",avatarUrl:profile?.avatar_url||null,isOAuthUser,role:profile?.role||\"member\",approved:profile?.approved||false,provider_type:profile?.provider_type||\"Email\"};// Cache it\nconst entry={data:userData,userId,sessionToken,timestamp:Date.now()};setInStorage(CACHE_KEYS.USER_DATA,entry);// Notify subscribers\nthis.notifyUserDataSubscribers(userData);return userData;}catch(e){console.error(\"[Cache] Error loading user data:\",e);return null;}}notifyUserDataSubscribers(data){this.userDataSubscribers.forEach(callback=>callback(data));}// ========================================================================\n// PROFILE DATA (full profile for current user)\n// ========================================================================\nasync getProfileData(){await this.ensureInitialized();// Try cache first\nconst cached=getFromStorage(CACHE_KEYS.PROFILE_DATA);if(cached&&await this.isCacheValid(cached)){console.log(\"[Cache] Using cached profile data\");return cached.data;}// ✅ Use getSession() instead of getUser() — no network hit\nconst{data:{session}}=await supabase.auth.getSession();if(!session?.user)return null;return await this.loadProfileData(session.user.id,session.access_token);}subscribeToProfileData(callback){this.profileDataSubscribers.add(callback);// Immediately call with current data\nthis.getProfileData().then(data=>callback(data));return()=>{this.profileDataSubscribers.delete(callback);};}async loadProfileData(userId,sessionToken){try{console.log(\"[Cache] Loading fresh profile data\");const{data:profile}=await supabase.from(\"profiles\").select(\"*\").eq(\"id\",userId).maybeSingle();if(!profile)return null;const profileData={id:profile.id,email:profile.email||\"\",username:profile.username||\"\",avatar_url:profile.avatar_url||null,role:profile.role||\"member\",approved:profile.approved||false,provider_type:profile.provider_type||\"Email\",created_at:profile.created_at||\"\",updated_at:profile.updated_at||\"\",last_sign_in_at:profile.last_sign_in_at||null};// Cache it\nconst entry={data:profileData,userId,sessionToken,timestamp:Date.now()};setInStorage(CACHE_KEYS.PROFILE_DATA,entry);// Notify subscribers\nthis.notifyProfileDataSubscribers(profileData);return profileData;}catch(e){console.error(\"[Cache] Error loading profile data:\",e);return null;}}notifyProfileDataSubscribers(data){this.profileDataSubscribers.forEach(callback=>callback(data));}// ========================================================================\n// ALL PROFILES (for ProfilePhoto search and admin lists)\n// ========================================================================\nasync getAllProfiles(){await this.ensureInitialized();// Try cache first (no session validation needed for public data)\nconst cached=getFromStorage(CACHE_KEYS.ALL_PROFILES);if(cached&&Date.now()-cached.timestamp<CACHE_DURATION){console.log(\"[Cache] Using cached all profiles\");return cached.data;}// Fetch fresh data\nreturn await this.loadAllProfiles();}subscribeToAllProfiles(callback){this.allProfilesSubscribers.add(callback);// Immediately call with current data\nthis.getAllProfiles().then(data=>callback(data));return()=>{this.allProfilesSubscribers.delete(callback);};}async loadAllProfiles(){try{console.log(\"[Cache] Loading fresh all profiles\");const{data:profiles}=await supabase.from(\"profiles\").select(\"*\").order(\"updated_at\",{ascending:false});if(!profiles)return[];const allProfiles=profiles.map(p=>({id:p.id,email:p.email||\"\",username:p.username||\"\",avatar_url:p.avatar_url||null,role:p.role||\"member\",approved:p.approved||false,provider_type:p.provider_type||\"Email\",created_at:p.created_at||\"\",updated_at:p.updated_at||\"\",last_sign_in_at:p.last_sign_in_at||null}));// Cache it (no userId/sessionToken needed for public data)\nconst entry={data:allProfiles,userId:\"public\",sessionToken:\"public\",timestamp:Date.now()};setInStorage(CACHE_KEYS.ALL_PROFILES,entry);// Notify subscribers\nthis.notifyAllProfilesSubscribers(allProfiles);return allProfiles;}catch(e){console.error(\"[Cache] Error loading all profiles:\",e);return[];}}notifyAllProfilesSubscribers(data){this.allProfilesSubscribers.forEach(callback=>callback(data));}// ========================================================================\n// REALTIME SUBSCRIPTION (ONE for entire app)\n// ========================================================================\nsetupRealtimeSubscription(){if(this.profileChannel)return;console.log(\"[Cache] Setting up global realtime subscription\");this.profileChannel=supabase.channel(\"global-profiles\").on(\"postgres_changes\",{event:\"*\",schema:\"public\",table:\"profiles\"},async payload=>{console.log(\"[Cache] Profile changed (realtime):\",payload);// ✅ Use getSession() instead of getUser()\nconst{data:{session}}=await supabase.auth.getSession();// If current user's profile changed, reload user data\nif(payload.new?.id===this.currentUserId&&session){await this.loadUserData(this.currentUserId,session.access_token);await this.loadProfileData(this.currentUserId,session.access_token);}// Reload all profiles for lists/search\nawait this.loadAllProfiles();}).subscribe();}cleanupRealtimeSubscription(){if(this.profileChannel){console.log(\"[Cache] Cleaning up global realtime subscription\");supabase.removeChannel(this.profileChannel);this.profileChannel=null;}}// ========================================================================\n// AUTH STATE LISTENER\n// ========================================================================\nsetupAuthListener(){const{data:{subscription}}=supabase.auth.onAuthStateChange(async(event,session)=>{console.log(\"[Cache] Auth state changed:\",event);if(event===\"SIGNED_OUT\"){this.handleSignOut();}else if(event===\"SIGNED_IN\"&&session?.user){this.currentUserId=session.user.id;await this.loadUserData(session.user.id,session.access_token);await this.loadProfileData(session.user.id,session.access_token);}});this.authSubscription=subscription;}handleSignOut(){console.log(\"[Cache] Handling sign out - clearing all caches\");// Clear caches\nremoveFromStorage(CACHE_KEYS.USER_DATA);removeFromStorage(CACHE_KEYS.PROFILE_DATA);removeFromStorage(CACHE_KEYS.ALL_PROFILES);// Notify subscribers\nthis.notifyUserDataSubscribers(null);this.notifyProfileDataSubscribers(null);this.currentUserId=null;}// ========================================================================\n// CROSS-TAB SYNC\n// ========================================================================\nsetupCrossTabSync(){window.addEventListener(\"storage\",event=>{// Only respond to our cache keys\nif(!Object.values(CACHE_KEYS).includes(event.key))return;console.log(\"[Cache] Cross-tab change detected:\",event.key);// Reload from localStorage and notify subscribers\nif(event.key===CACHE_KEYS.USER_DATA){const cached=getFromStorage(CACHE_KEYS.USER_DATA);if(cached){this.notifyUserDataSubscribers(cached.data);}}else if(event.key===CACHE_KEYS.PROFILE_DATA){const cached=getFromStorage(CACHE_KEYS.PROFILE_DATA);if(cached){this.notifyProfileDataSubscribers(cached.data);}}else if(event.key===CACHE_KEYS.ALL_PROFILES){const cached=getFromStorage(CACHE_KEYS.ALL_PROFILES);if(cached){this.notifyAllProfilesSubscribers(cached.data);}}});}// ========================================================================\n// CACHE VALIDATION\n// ========================================================================\nasync isCacheValid(cached){// Check age\nif(Date.now()-cached.timestamp>CACHE_DURATION){console.log(\"[Cache] Cache expired\");return false;}// ✅ Use getSession() instead of getUser()\nconst{data:{session}}=await supabase.auth.getSession();if(!session){console.log(\"[Cache] No session\");return false;}if(session.access_token!==cached.sessionToken){console.log(\"[Cache] Session changed\");return false;}if(session.user.id!==cached.userId){console.log(\"[Cache] User changed\");return false;}return true;}// ========================================================================\n// UTILITIES\n// ========================================================================\nasync ensureInitialized(){if(!this.isInitialized){await this.initialize();}}clearAllCaches(){console.log(\"[Cache] Manually clearing all caches\");removeFromStorage(CACHE_KEYS.USER_DATA);removeFromStorage(CACHE_KEYS.PROFILE_DATA);removeFromStorage(CACHE_KEYS.ALL_PROFILES);}cleanup(){console.log(\"[Cache] Cleaning up cache manager\");this.cleanupRealtimeSubscription();if(this.authSubscription){this.authSubscription.unsubscribe();}this.userDataSubscribers.clear();this.profileDataSubscribers.clear();this.allProfilesSubscribers.clear();}constructor(){_define_property(this,\"userDataSubscribers\",new Set);_define_property(this,\"profileDataSubscribers\",new Set);_define_property(this,\"allProfilesSubscribers\",new Set);_define_property(this,\"profileChannel\",null);_define_property(this,\"authSubscription\",null);_define_property(this,\"currentUserId\",null);_define_property(this,\"isInitialized\",false);}}// ============================================================================\n// SINGLETON EXPORT\n// ============================================================================\nexport const userDataCache=new UserDataCacheManager;// Auto-initialize on first import\nuserDataCache.initialize();// Cleanup on page unload\nif(typeof window!==\"undefined\"){window.addEventListener(\"beforeunload\",()=>{userDataCache.cleanup();});}\nexport const __FramerMetadata__ = {\"exports\":{\"userDataCache\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./userDataCache.map"],"mappings":"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"}