@authduo/authduo
Version:
Free User-sovereign Authentication for the World
145 lines (120 loc) • 3.34 kB
text/typescript
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
})