UNPKG

@authduo/authduo

Version:

Free User-sovereign Authentication for the World

145 lines (120 loc) 3.34 kB
import {shadowComponent, loading} from "@benev/slate" import {manager} from "../../context.js" import {Passport} from "../../../auth/passport.js" import {EgressPage} from "../pages/egress/view.js" import {IngressPage} from "../pages/ingress/view.js" import {OnboardPage} from "../pages/onboard/view.js" import {ListPage} from "../../views/pages/list/view.js" import {EditPage} from "../../views/pages/edit/view.js" import {CreatePage} from "../../views/pages/create/view.js" import {DeletePage} from "../../views/pages/delete/view.js" import {PassportsFile} from "../../../auth/passports-file.js" import stylesCss from "./styles.css.js" import themeCss from "../../../common/theme.css.js" export const AuthManager = shadowComponent(use => { use.styles([themeCss, stylesCss]) const {passportStore, storagePersistence, situationOp} = manager use.once(() => storagePersistence.check()) function gotoHome() { if (passportStore.list().length === 0) gotoOnboard() else gotoList() } function gotoList() { situationOp.load(async() => ({ kind: "list", passportStore, onEdit: gotoEdit, onCreate: gotoCreate, onEgress: passports => gotoEgress(passports, gotoHome), onIngress: () => gotoIngress(undefined, gotoHome), })) } async function gotoOnboard() { const passport = await Passport.generate() situationOp.load(async() => ({ kind: "onboard", passport, onDone: gotoHome, onIngress: () => gotoIngress(undefined, gotoHome), onSaveNewPassport: passport => { passportStore.add(passport) storagePersistence.request() }, })) } async function gotoCreate() { const passport = await Passport.generate() situationOp.load(async() => ({ kind: "create", passport, onCancel: gotoHome, onComplete: passport => { passportStore.add(passport) storagePersistence.request() gotoHome() }, })) } function gotoEdit(passport: Passport) { situationOp.load(async() => ({ kind: "edit", passport, onCancel: gotoHome, onDelete: gotoDelete, onComplete: passport => { passportStore.add(passport) storagePersistence.request() gotoHome() }, })) } function gotoDelete(passport: Passport) { situationOp.load(async() => ({ kind: "delete", passport, onCancel: gotoHome, onComplete: passport => { passportStore.delete(passport) storagePersistence.request() gotoHome() }, })) } function gotoEgress(passports: Passport[], onBack: () => void) { situationOp.load(async() => ({ kind: "egress", passports, onBack, })) } function gotoIngress(passports: PassportsFile | undefined, onBack: () => void) { situationOp.load(async() => ({ kind: "ingress", passports, onBack, onAddPassports: passports => passportStore.add(...passports), })) } use.once(gotoHome) const page = loading.braille(situationOp, situation => {switch (situation.kind) { case "list": return ListPage([situation]) case "onboard": return OnboardPage([situation]) case "create": return CreatePage([situation]) case "edit": return EditPage([situation]) case "delete": return DeletePage([situation]) case "egress": return EgressPage([situation]) case "ingress": return IngressPage([situation]) default: throw new Error("unknown situation") }}) return page })