* Disambiguation of the deactivation * Snapshot crackle pop * Change log context * [🙅] Add status to session state (#4269) * Add status to session state * [🙅] Add new deactivated screen (#4270) * Add new deactivated screen * Update copy, handle logout * Remove icons, adjust padding * [🙅] Add deactivate account dialog (#4290) * Deactivate dialog (cherry picked from commit 33940e2dfe0d710c0665a7f68b198b46f54db4a2) * Factor out dialog, add to delete modal too (cherry picked from commit 47d70f6b74e7d2ea7330fd172499fe91ba41062d) * Update copy, icon (cherry picked from commit e6efabbe78c3f3d9f0f8fb0a06a6a1c4fbfb70a9) * Update copy (cherry picked from commit abb0ce26f6747ab0548f6f12df0dee3c64464852) * Sizing tweaks (cherry picked from commit fc716d5716873f0fddef56496fc48af0614b2e55) * Add a11y label
37 lines
976 B
TypeScript
37 lines
976 B
TypeScript
import {jwtDecode} from 'jwt-decode'
|
|
|
|
import {hasProp} from '#/lib/type-guards'
|
|
import {logger} from '#/logger'
|
|
import * as persisted from '#/state/persisted'
|
|
import {SessionAccount} from './types'
|
|
|
|
export function readLastActiveAccount() {
|
|
const {currentAccount, accounts} = persisted.get('session')
|
|
return accounts.find(a => a.did === currentAccount?.did)
|
|
}
|
|
|
|
export function isSignupQueued(accessJwt: string | undefined) {
|
|
if (accessJwt) {
|
|
const sessData = jwtDecode(accessJwt)
|
|
return (
|
|
hasProp(sessData, 'scope') &&
|
|
sessData.scope === 'com.atproto.signupQueued'
|
|
)
|
|
}
|
|
return false
|
|
}
|
|
|
|
export function isSessionExpired(account: SessionAccount) {
|
|
try {
|
|
if (account.accessJwt) {
|
|
const decoded = jwtDecode(account.accessJwt)
|
|
if (decoded.exp) {
|
|
const didExpire = Date.now() >= decoded.exp * 1000
|
|
return didExpire
|
|
}
|
|
}
|
|
} catch (e) {
|
|
logger.error(`session: could not decode jwt`)
|
|
}
|
|
return true
|
|
}
|