import AsyncStorage from "@react-native-async-storage/async-storage"; const ACCOUNTS_KEY = "beenvoice:accounts"; const ACTIVE_ACCOUNT_KEY = "beenvoice:active-account-id"; const DRAFT_INSTANCE_URL_KEY = "beenvoice:draft-instance-url"; export type SavedAccount = { id: string; instanceUrl: string; userId: string; email: string; name: string; lastUsedAt: number; }; function isSavedAccount(value: unknown): value is SavedAccount { if (!value || typeof value !== "object") return false; const account = value as Partial; return ( typeof account.id === "string" && account.id.length > 0 && typeof account.instanceUrl === "string" && account.instanceUrl.length > 0 && typeof account.userId === "string" && account.userId.length > 0 && typeof account.email === "string" && typeof account.name === "string" && typeof account.lastUsedAt === "number" ); } export function buildAccountId(instanceUrl: string, userId: string) { const host = instanceUrl.replace(/^https?:\/\//, "").replace(/\/$/, ""); return `${host}::${userId}`; } export function authStoragePrefix(accountId: string) { return `beenvoice:auth:${accountId}`; } export async function loadAccounts(): Promise { const raw = await AsyncStorage.getItem(ACCOUNTS_KEY); if (!raw) return []; try { const parsed = JSON.parse(raw) as unknown; return Array.isArray(parsed) ? parsed.filter(isSavedAccount) : []; } catch { return []; } } export async function saveAccounts(accounts: SavedAccount[]) { await AsyncStorage.setItem(ACCOUNTS_KEY, JSON.stringify(accounts)); } export async function loadActiveAccountId(): Promise { return AsyncStorage.getItem(ACTIVE_ACCOUNT_KEY); } export async function saveActiveAccountId(accountId: string | null) { if (accountId) { await AsyncStorage.setItem(ACTIVE_ACCOUNT_KEY, accountId); } else { await AsyncStorage.removeItem(ACTIVE_ACCOUNT_KEY); } } export async function loadDraftInstanceUrl(): Promise { return AsyncStorage.getItem(DRAFT_INSTANCE_URL_KEY); } export async function saveDraftInstanceUrl(url: string | null) { if (url) { await AsyncStorage.setItem(DRAFT_INSTANCE_URL_KEY, url); } else { await AsyncStorage.removeItem(DRAFT_INSTANCE_URL_KEY); } } export async function hasConfiguredInstanceUrl(): Promise { const [accounts, draft] = await Promise.all([loadAccounts(), loadDraftInstanceUrl()]); return accounts.length > 0 || Boolean(draft); }