import * as odd from "@oddjs/odd"; import { getRecoil, setRecoil } from "recoil-nexus"; import { sessionStore, filesystemStore } from "../stores"; import { SESSION_ERROR } from "../lib/session"; import { getBackupStatus, type BackupStatus } from "../lib/auth/backup"; import { USERNAME_STORAGE_KEY, createDID } from "../lib/auth/account"; import { oddNamespace } from "../lib/app-info"; const initialize = async (): Promise<void> => { try { let backupStatus: BackupStatus = null; const program: odd.Program = await odd.program({ namespace: oddNamespace, debug: process.env.NODE_ENV === "development", }); if (program.session) { // Authed backupStatus = await getBackupStatus(program.session.fs); let fullUsername = (await program.components.storage.getItem( USERNAME_STORAGE_KEY )) as string; // If the user is migrating from a version odd-app-template before https://github.com/oddsdk/odd-app-template/pull/97/files#diff-a180510e798b8f833ebfdbe691c5ec4a1095076980d3e2388de29c849b2b8361R44, // their username won't contain a did, so we will need to manually append a DID and add it storage here if (!fullUsername) { const did = await createDID(program.components.crypto); fullUsername = `${program.session.username}#${did}`; await program.components.storage.setItem( USERNAME_STORAGE_KEY, fullUsername ); window.location.reload(); } setRecoil(sessionStore, { username: { full: fullUsername, hashed: program.session.username, trimmed: fullUsername.split("#")[0], }, session: program.session, authStrategy: program.auth, program, loading: false, backupCreated: backupStatus.created, }); setRecoil(filesystemStore, program.session.fs); } else { // Not authed setRecoil(sessionStore, { username: null, session: null, authStrategy: program.auth, program, loading: false, backupCreated: null, }); } } catch (error) { console.error(error) const session = getRecoil(sessionStore); switch (error) { case odd.ProgramError.InsecureContext: setRecoil(sessionStore, { ...session, loading: false, error: SESSION_ERROR.INSECURE_CONTEXT, }); break; case odd.ProgramError.UnsupportedBrowser: setRecoil(sessionStore, { ...session, loading: false, error: SESSION_ERROR.UNSUPORTED_CONTEXT, }); break; } } }; export default initialize;