forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}