Bluesky app fork with some witchin' additions 馃挮
at main 44 lines 1.4 kB view raw
1import {useEffect, useState} from 'react' 2import uuid from 'react-native-uuid' 3 4import {onAppStateChange} from '#/lib/appState' 5import {isSessionIdExpired} from '#/analytics/identifiers/util' 6 7const SESSION_ID_KEY = 'bsky_session_id' 8const LAST_EVENT_KEY = 'bsky_session_id_last_event_at' 9 10let sessionId = (() => { 11 const existing = window.sessionStorage.getItem(SESSION_ID_KEY) 12 const lastEventStr = window.sessionStorage.getItem(LAST_EVENT_KEY) 13 const lastEvent = lastEventStr ? Number(lastEventStr) : undefined 14 const id = existing && !isSessionIdExpired(lastEvent) ? existing : uuid.v4() 15 window.sessionStorage.setItem(SESSION_ID_KEY, id) 16 window.sessionStorage.setItem(LAST_EVENT_KEY, String(Date.now())) 17 return id 18})() 19 20export function getInitialSessionId() { 21 return sessionId 22} 23 24export function useSessionId() { 25 const [id, setId] = useState(() => sessionId) 26 27 useEffect(() => { 28 const sub = onAppStateChange(state => { 29 if (state === 'active') { 30 const lastEventStr = window.sessionStorage.getItem(LAST_EVENT_KEY) 31 const lastEvent = lastEventStr ? Number(lastEventStr) : undefined 32 if (isSessionIdExpired(lastEvent)) { 33 sessionId = uuid.v4() 34 window.sessionStorage.setItem(SESSION_ID_KEY, sessionId) 35 setId(sessionId) 36 } 37 } 38 window.sessionStorage.setItem(LAST_EVENT_KEY, String(Date.now())) 39 }) 40 return () => sub.remove() 41 }, []) 42 43 return id 44}