diff options
author | Sebastian <sebasjm@gmail.com> | 2021-11-08 09:56:06 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2021-11-08 09:56:06 -0300 |
commit | 6ef5fd21fc365d780da42170ce85042f874ed1dc (patch) | |
tree | e9b86dc8949e1ad38d13f3b13814f3770de45675 /packages/anastasis-webui/src/pages/home/SolveScreen.tsx | |
parent | 292d647aa917ecef7fee3f1ebeee0411b4c9a0d6 (diff) | |
download | wallet-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.tsx | 184 |
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} /> } |