| |
|
|
| let _currentSession = null; |
| let _authListenerUnsub = null; |
|
|
| |
| |
| |
| function getCurrentSession() { |
| return _currentSession; |
| } |
|
|
| |
| |
| |
| function setCurrentSession(session) { |
| _currentSession = session; |
| syncBayanAuthFacade(session); |
| } |
|
|
| |
| |
| |
| |
| function syncBayanAuthFacade(session) { |
| const user = session && session.user; |
| window.__bayanAuth = { |
| userId: user ? user.id : null, |
| isGuest: user ? isGuestUser(user) : false, |
| isGoogleUser: user ? isGoogleUser(user) : false, |
| isOfflineMode: window.__bayanAuth?.isOfflineMode === true, |
| getAccessToken: () => (session ? session.access_token : null) |
| }; |
| } |
|
|
| |
| |
| |
| |
| function isGuestUser(user) { |
| if (!user) return false; |
| if (user.is_anonymous === true) return true; |
| const provider = getAuthProvider(user); |
| return provider === 'anonymous'; |
| } |
|
|
| |
| |
| |
| |
| function isGoogleUser(user) { |
| if (!user) return false; |
| if (isGuestUser(user)) return false; |
| const provider = getAuthProvider(user); |
| if (provider === 'google') return true; |
| const identities = user.identities || []; |
| return identities.some((id) => id.provider === 'google'); |
| } |
|
|
| |
| |
| |
| |
| function getAuthProvider(user) { |
| if (!user) return 'anonymous'; |
| if (user.is_anonymous) return 'anonymous'; |
| const meta = user.app_metadata || {}; |
| if (meta.provider === 'google') return 'google'; |
| const identities = user.identities || []; |
| if (identities.length > 0) return identities[0].provider || 'unknown'; |
| return meta.provider || 'unknown'; |
| } |
|
|
| |
| |
| |
| |
| function getDisplayName(user) { |
| if (!user) return ''; |
| if (isGuestUser(user)) return 'ضيف'; |
| return user.user_metadata?.full_name |
| || user.user_metadata?.name |
| || user.email |
| || 'مستخدم Google'; |
| } |
|
|
| |
| |
| |
| |
| function getAvatarUrl(user) { |
| if (!user || isGuestUser(user)) return null; |
| return user.user_metadata?.avatar_url |
| || user.user_metadata?.picture |
| || null; |
| } |
|
|
| |
| |
| |
| |
| function onAuthStateChange(callback) { |
| const client = getSupabaseClient(); |
| if (!client) return; |
|
|
| if (_authListenerUnsub) { |
| _authListenerUnsub.unsubscribe(); |
| } |
|
|
| const { data } = client.auth.onAuthStateChange((event, session) => { |
| setCurrentSession(session); |
| if (typeof callback === 'function') { |
| callback(event, session); |
| } |
| }); |
|
|
| _authListenerUnsub = data.subscription; |
| } |
|
|
| |
| |
| |
| |
| async function restoreSession() { |
| const client = getSupabaseClient(); |
| if (!client) return null; |
|
|
| const { data, error } = await client.auth.getSession(); |
| if (error) { |
| console.warn('getSession error:', error); |
| return null; |
| } |
|
|
| setCurrentSession(data.session); |
| return data.session; |
| } |
|
|