aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-11-08 09:56:06 -0300
committerSebastian <sebasjm@gmail.com>2021-11-08 09:56:06 -0300
commit6ef5fd21fc365d780da42170ce85042f874ed1dc (patch)
treee9b86dc8949e1ad38d13f3b13814f3770de45675 /packages/anastasis-webui/src/pages/home/SolveScreen.tsx
parent292d647aa917ecef7fee3f1ebeee0411b4c9a0d6 (diff)
downloadwallet-core-6ef5fd21fc365d780da42170ce85042f874ed1dc.tar.xz
some solve challenge examples, WIP
Diffstat (limited to 'packages/anastasis-webui/src/pages/home/SolveScreen.tsx')
-rw-r--r--packages/anastasis-webui/src/pages/home/SolveScreen.tsx184
1 files changed, 24 insertions, 160 deletions
diff --git a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
index 35db5ead0..ec6c7735b 100644
--- a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
@@ -1,17 +1,14 @@
import { Fragment, h, VNode } from "preact";
-import { useState } from "preact/hooks";
import { AnastasisClientFrame } from ".";
import {
ChallengeFeedback,
- ChallengeFeedbackStatus,
- ChallengeInfo,
+ ChallengeFeedbackStatus
} from "../../../../anastasis-core/lib";
-import { AsyncButton } from "../../components/AsyncButton";
-import { TextInput } from "../../components/fields/TextInput";
import { Notifications } from "../../components/Notifications";
import { useAnastasisContext } from "../../context/anastasis";
+import { authMethods, AuthMethodSolveProps, KnownAuthMethods } from "./authMethod";
-function SolveOverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }): VNode {
+export function SolveOverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }): VNode {
const { feedback } = props;
if (!feedback) {
return <div />;
@@ -80,7 +77,6 @@ function SolveOverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }):
export function SolveScreen(): VNode {
const reducer = useAnastasisContext();
- const [answer, setAnswer] = useState("");
if (!reducer) {
return (
@@ -120,162 +116,30 @@ export function SolveScreen(): VNode {
</AnastasisClientFrame>
);
}
-
- const chArr = reducer.currentReducerState.recovery_information.challenges;
- const challengeFeedback =
- reducer.currentReducerState.challenge_feedback ?? {};
- const selectedUuid = reducer.currentReducerState.selected_challenge_uuid;
- const challenges: {
- [uuid: string]: ChallengeInfo;
- } = {};
- for (const ch of chArr) {
- challenges[ch.uuid] = ch;
- }
- const selectedChallenge = challenges[selectedUuid];
- const dialogMap: Record<string, (p: SolveEntryProps) => h.JSX.Element> = {
- question: SolveQuestionEntry,
- sms: SolveSmsEntry,
- email: SolveEmailEntry,
- post: SolvePostEntry,
- };
- const SolveDialog =
- selectedChallenge === undefined
- ? SolveUndefinedEntry
- : dialogMap[selectedChallenge.type] ?? SolveUnsupportedEntry;
-
- async function onNext(): Promise<void> {
- return reducer?.transition("solve_challenge", { answer });
- }
- function onCancel(): void {
- reducer?.back();
+ function SolveNotImplemented(): VNode {
+ return (
+ <AnastasisClientFrame hideNav title="Not implemented">
+ <p>
+ The challenge selected is not supported for this UI. Please update this
+ version or try using another policy.
+ </p>
+ {reducer &&
+ <div style={{ marginTop: '2em', display: 'flex', justifyContent: 'space-between' }}>
+ <button class="button" onClick={() => reducer.back()}>Back</button>
+ </div>
+ }
+ </AnastasisClientFrame>
+ );
}
- const feedback = challengeFeedback[selectedUuid]
- const shouldHideConfirm = feedback?.state === ChallengeFeedbackStatus.RateLimitExceeded
- || feedback?.state === ChallengeFeedbackStatus.Redirect
- || feedback?.state === ChallengeFeedbackStatus.Unsupported
- || feedback?.state === ChallengeFeedbackStatus.TruthUnknown
-
- return (
- <AnastasisClientFrame hideNav title="Recovery: Solve challenge">
- <SolveOverviewFeedbackDisplay
- feedback={feedback}
- />
- <SolveDialog
- id={selectedUuid}
- answer={answer}
- setAnswer={setAnswer}
- challenge={selectedChallenge}
- feedback={feedback}
- />
-
- <div
- style={{
- marginTop: "2em",
- display: "flex",
- justifyContent: "space-between",
- }}
- >
- <button class="button" onClick={onCancel}>
- Cancel
- </button>
- {!shouldHideConfirm && <AsyncButton class="button is-info" onClick={onNext}>
- Confirm
- </AsyncButton>}
- </div>
- </AnastasisClientFrame>
- );
-}
-
-export interface SolveEntryProps {
- id: string;
- challenge: ChallengeInfo;
- feedback?: ChallengeFeedback;
- answer: string;
- setAnswer: (s: string) => void;
-}
-
-function SolveSmsEntry({
- challenge,
- answer,
- setAnswer,
-}: SolveEntryProps): VNode {
- return (
- <Fragment>
-
- <p>
- An sms has been sent to "<b>{challenge.instructions}</b>". Type the code
- below
- </p>
- <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
- </Fragment>
- );
-}
-function SolveQuestionEntry({
- challenge,
- answer,
- setAnswer,
-}: SolveEntryProps): VNode {
- return (
- <Fragment>
- <p>Type the answer to the following question:</p>
- <pre>{challenge.instructions}</pre>
- <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
- </Fragment>
- );
-}
-function SolvePostEntry({
- challenge,
- answer,
- setAnswer,
-}: SolveEntryProps): VNode {
- return (
- <Fragment>
- <p>
- instruction for post type challenge "<b>{challenge.instructions}</b>"
- </p>
- <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
- </Fragment>
- );
-}
+ const chArr = reducer.currentReducerState.recovery_information.challenges;
+ const selectedUuid = reducer.currentReducerState.selected_challenge_uuid;
+ const selectedChallenge = chArr.find(ch => ch.uuid === selectedUuid)
-function SolveEmailEntry({
- challenge,
- answer,
- setAnswer,
-}: SolveEntryProps): VNode {
- return (
- <Fragment>
- <p>
- An email has been sent to "<b>{challenge.instructions}</b>". Type the
- code below
- </p>
- <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
- </Fragment>
- );
-}
+ const SolveDialog = !selectedChallenge || !authMethods[selectedChallenge.type as KnownAuthMethods] ?
+ SolveNotImplemented :
+ authMethods[selectedChallenge.type as KnownAuthMethods].solve ?? SolveNotImplemented
-function SolveUnsupportedEntry(props: SolveEntryProps): VNode {
- return (
- <Fragment>
- <p>
- The challenge selected is not supported for this UI. Please update this
- version or try using another policy.
- </p>
- <p>
- <b>Challenge type:</b> {props.challenge.type}
- </p>
- </Fragment>
- );
-}
-function SolveUndefinedEntry(props: SolveEntryProps): VNode {
- return (
- <Fragment>
- <p>
- There is no challenge information for id <b>"{props.id}"</b>. Try
- resetting the recovery session.
- </p>
- </Fragment>
- );
+ return <SolveDialog id={selectedUuid} />
}