import { TranslatedString } from "@gnu-taler/taler-util";
import {
notifyError,
notifyInfo,
useLocalStorage,
useMemoryStorage,
} from "@gnu-taler/web-util/browser";
import { VNode, h } from "preact";
import { useEffect, useState } from "preact/hooks";
import {
UnwrapKeyError,
createNewAccount,
createNewSessionId,
unlockAccount,
} from "../account.js";
import { createNewForm } from "../handlers/forms.js";
export function Officer() {
const password = useMemoryStorage("password");
const session = useLocalStorage("session");
const officer = useLocalStorage("officer");
const [keys, setKeys] = useState({ accountId: "", pub: "" });
useEffect(() => {
if (
officer.value === undefined ||
session.value === undefined ||
password.value === undefined
) {
return;
}
unlockAccount(session.value, officer.value, password.value)
.then((keys) => setKeys(keys ?? { accountId: "", pub: "" }))
.catch((e) => {
if (e instanceof UnwrapKeyError) {
console.log(e);
}
});
}, [officer.value, session.value, password.value]);
useEffect(() => {
if (!session.value) {
session.update(createNewSessionId());
}
}, []);
const { value: sessionId } = session;
if (!sessionId) {
return
loading...
;
}
if (officer.value === undefined) {
return (
{
password.reset();
officer.update(id);
}}
/>
);
}
console.log("pwd", password.value);
if (password.value === undefined) {
return (
{
password.update(pwd);
}}
/>
);
}
return (
Officer
{sessionId}
Public key
-----BEGIN PUBLIC KEY-----
{keys.pub}
-----END PUBLIC KEY-----
Private key
-----BEGIN PRIVATE KEY-----
{keys.accountId}
-----END PRIVATE KEY-----
);
}
function CreateAccount({
sessionId,
onNewAccount,
}: {
sessionId: string;
onNewAccount: (accountId: string) => void;
}): VNode {
const Form = createNewForm<{
email: string;
password: string;
}>();
return (
Create account
{
const keys = await createNewAccount(sessionId, v.password);
onNewAccount(keys.accountId);
}}
>
);
}
function UnlockAccount({
sessionId,
accountId,
onAccountUnlocked,
}: {
sessionId: string;
accountId: string;
onAccountUnlocked: (password: string) => void;
}): VNode {
const Form = createNewForm<{
sessionId: string;
accountId: string;
password: string;
}>();
return (
Unlock account
{
return {
accountId: {
disabled: true,
},
sessionId: {
disabled: true,
},
};
}}
onSubmit={async (v) => {
try {
// test login
await unlockAccount(sessionId, accountId, v.password);
onAccountUnlocked(v.password ?? "");
notifyInfo("Account unlocked" as TranslatedString);
} catch (e) {
if (e instanceof UnwrapKeyError) {
notifyError(
"Could not unlock account" as any,
e.message as any,
);
} else {
throw e;
}
}
}}
>
);
}