aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
diff options
context:
space:
mode:
authorBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
committerBoss Marco <bossm8@bfh.ch>2021-11-05 16:57:32 +0100
commit98064f0652d8e1dff661e3bb0d8791f4af04ad6f (patch)
tree5d278fd1fab17b0c4b03cc89bcea678edd3789d3 /packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
parent8d9386ac008e9d095867433bfc789d09bd93414d (diff)
parent842cc327541ebcfc761208f42bf5f74e22c6283c (diff)
added some logging messages
Diffstat (limited to 'packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx')
-rw-r--r--packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx179
1 files changed, 129 insertions, 50 deletions
diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
index 903f57868..8aa5ed2f7 100644
--- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
@@ -1,19 +1,17 @@
-/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
+import { AsyncButton } from "../../components/AsyncButton";
+import { NumberInput } from "../../components/fields/NumberInput";
import { useAnastasisContext } from "../../context/anastasis";
import { AnastasisClientFrame } from "./index";
export function SecretSelectionScreen(): VNode {
const [selectingVersion, setSelectingVersion] = useState<boolean>(false);
- const [otherProvider, setOtherProvider] = useState<string>("");
const reducer = useAnastasisContext()
- const currentVersion = reducer?.currentReducerState
+ const currentVersion = (reducer?.currentReducerState
&& ("recovery_document" in reducer.currentReducerState)
- && reducer.currentReducerState.recovery_document?.version;
-
- const [otherVersion, setOtherVersion] = useState<number>(currentVersion || 0);
+ && reducer.currentReducerState.recovery_document?.version) || 0;
if (!reducer) {
return <div>no reducer in context</div>
@@ -22,9 +20,9 @@ export function SecretSelectionScreen(): VNode {
return <div>invalid state</div>
}
- function selectVersion(p: string, n: number): void {
- if (!reducer) return;
- reducer.runTransaction(async (tx) => {
+ async function doSelectVersion(p: string, n: number): Promise<void> {
+ if (!reducer) return Promise.resolve();
+ return reducer.runTransaction(async (tx) => {
await tx.transition("change_version", {
version: n,
provider_url: p,
@@ -33,55 +31,136 @@ export function SecretSelectionScreen(): VNode {
});
}
+ const providerList = Object.keys(reducer.currentReducerState.authentication_providers ?? {})
const recoveryDocument = reducer.currentReducerState.recovery_document
+
if (!recoveryDocument) {
- return (
- <AnastasisClientFrame hideNav title="Recovery: Problem">
- <p>No recovery document found</p>
- </AnastasisClientFrame>
- )
+ return <ChooseAnotherProviderScreen
+ providers={providerList} selected=""
+ onChange={(newProv) => doSelectVersion(newProv, 0)}
+ />
}
+
if (selectingVersion) {
- return (
- <AnastasisClientFrame hideNav title="Recovery: Select secret">
- <p>Select a different version of the secret</p>
- <select onChange={(e) => setOtherProvider((e.target as any).value)}>
- {Object.keys(reducer.currentReducerState.authentication_providers ?? {}).map(
- (x, i) => (
- <option key={i} selected={x === recoveryDocument.provider_url} value={x}>
- {x}
- </option>
- )
- )}
- </select>
- <div>
- <input
- value={otherVersion}
- onChange={(e) => setOtherVersion(Number((e.target as HTMLInputElement).value))}
- type="number" />
- <button onClick={() => selectVersion(otherProvider, otherVersion)}>
- Use this version
- </button>
+ return <SelectOtherVersionProviderScreen providers={providerList}
+ provider={recoveryDocument.provider_url} version={recoveryDocument.version}
+ onCancel={() => setSelectingVersion(false)}
+ onConfirm={doSelectVersion}
+ />
+ }
+
+ return (
+ <AnastasisClientFrame title="Recovery: Select secret">
+ <div class="columns">
+ <div class="column">
+ <div class="box" style={{ border: '2px solid green' }}>
+ <h1 class="subtitle">{recoveryDocument.provider_url}</h1>
+ <div class="block">
+ {currentVersion === 0 ? <p>
+ Set to recover the latest version
+ </p> : <p>
+ Set to recover the version number {currentVersion}
+ </p>}
+ </div>
+ <div class="buttons is-right">
+ <button class="button" onClick={(e) => setSelectingVersion(true)}>Change secret's version</button>
+ </div>
+ </div>
</div>
- <div>
- <button onClick={() => selectVersion(otherProvider, 0)}>
- Use latest version
- </button>
+ <div class="column">
+ <p>Secret found, you can select another version or continue to the challenges solving</p>
</div>
- <div>
- <button onClick={() => setSelectingVersion(false)}>Cancel</button>
+ </div>
+ </AnastasisClientFrame>
+ );
+}
+
+
+function ChooseAnotherProviderScreen({ providers, selected, onChange }: { selected: string; providers: string[]; onChange: (prov: string) => void }): VNode {
+ return (
+ <AnastasisClientFrame hideNext="Recovery document not found" title="Recovery: Problem">
+ <p>No recovery document found, try with another provider</p>
+ <div class="field">
+ <label class="label">Provider</label>
+ <div class="control is-expanded has-icons-left">
+ <div class="select is-fullwidth">
+ <select onChange={(e) => onChange(e.currentTarget.value)} value={selected}>
+ <option key="none" disabled selected value=""> Choose a provider </option>
+ {providers.map(prov => (
+ <option key={prov} value={prov}>
+ {prov}
+ </option>
+ ))}
+ </select>
+ <div class="icon is-small is-left">
+ <i class="mdi mdi-earth" />
+ </div>
+ </div>
</div>
- </AnastasisClientFrame>
- );
- }
+ </div>
+ </AnastasisClientFrame>
+ );
+}
+
+function SelectOtherVersionProviderScreen({ providers, provider, version, onConfirm, onCancel }: { onCancel: () => void; provider: string; version: number; providers: string[]; onConfirm: (prov: string, v: number) => Promise<void>; }): VNode {
+ const [otherProvider, setOtherProvider] = useState<string>(provider);
+ const [otherVersion, setOtherVersion] = useState(`${version}`);
+
return (
- <AnastasisClientFrame title="Recovery: Select secret">
- <p>Provider: {recoveryDocument.provider_url}</p>
- <p>Secret version: {recoveryDocument.version}</p>
- <p>Secret name: {recoveryDocument.secret_name}</p>
- <button onClick={() => setSelectingVersion(true)}>
- Select different secret
- </button>
+ <AnastasisClientFrame hideNav title="Recovery: Select secret">
+ <div class="columns">
+ <div class="column">
+ <div class="box">
+ <h1 class="subtitle">Provider {otherProvider}</h1>
+ <div class="block">
+ {version === 0 ? <p>
+ Set to recover the latest version
+ </p> : <p>
+ Set to recover the version number {version}
+ </p>}
+ <p>Specify other version below or use the latest</p>
+ </div>
+
+ <div class="field">
+ <label class="label">Provider</label>
+ <div class="control is-expanded has-icons-left">
+ <div class="select is-fullwidth">
+ <select onChange={(e) => setOtherProvider(e.currentTarget.value)} value={otherProvider}>
+ <option key="none" disabled selected value=""> Choose a provider </option>
+ {providers.map(prov => (
+ <option key={prov} value={prov}>
+ {prov}
+ </option>
+ ))}
+ </select>
+ <div class="icon is-small is-left">
+ <i class="mdi mdi-earth" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="container">
+ <NumberInput
+ label="Version"
+ placeholder="version number to recover"
+ grabFocus
+ bind={[otherVersion, setOtherVersion]} />
+ </div>
+ </div>
+ <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}>
+ <button class="button" onClick={onCancel}>Cancel</button>
+ <div class="buttons">
+ <AsyncButton class="button" onClick={() => onConfirm(otherProvider, 0)}>Use latest</AsyncButton>
+ <AsyncButton class="button is-info" onClick={() => onConfirm(otherProvider, parseInt(otherVersion, 10))}>Confirm</AsyncButton>
+ </div>
+ </div>
+ </div>
+ <div class="column">
+ .
+ </div>
+ </div>
+
</AnastasisClientFrame>
);
+
}