From 6ef5fd21fc365d780da42170ce85042f874ed1dc Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 8 Nov 2021 09:56:06 -0300 Subject: some solve challenge examples, WIP --- .../anastasis-webui/src/pages/home/SolveScreen.tsx | 184 +++------------------ 1 file changed, 24 insertions(+), 160 deletions(-) (limited to 'packages/anastasis-webui/src/pages/home/SolveScreen.tsx') 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
; @@ -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 { ); } - - 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 h.JSX.Element> = { - question: SolveQuestionEntry, - sms: SolveSmsEntry, - email: SolveEmailEntry, - post: SolvePostEntry, - }; - const SolveDialog = - selectedChallenge === undefined - ? SolveUndefinedEntry - : dialogMap[selectedChallenge.type] ?? SolveUnsupportedEntry; - - async function onNext(): Promise { - return reducer?.transition("solve_challenge", { answer }); - } - function onCancel(): void { - reducer?.back(); + function SolveNotImplemented(): VNode { + return ( + +

+ The challenge selected is not supported for this UI. Please update this + version or try using another policy. +

+ {reducer && +
+ +
+ } +
+ ); } - const feedback = challengeFeedback[selectedUuid] - const shouldHideConfirm = feedback?.state === ChallengeFeedbackStatus.RateLimitExceeded - || feedback?.state === ChallengeFeedbackStatus.Redirect - || feedback?.state === ChallengeFeedbackStatus.Unsupported - || feedback?.state === ChallengeFeedbackStatus.TruthUnknown - - return ( - - - - -
- - {!shouldHideConfirm && - Confirm - } -
-
- ); -} - -export interface SolveEntryProps { - id: string; - challenge: ChallengeInfo; - feedback?: ChallengeFeedback; - answer: string; - setAnswer: (s: string) => void; -} - -function SolveSmsEntry({ - challenge, - answer, - setAnswer, -}: SolveEntryProps): VNode { - return ( - - -

- An sms has been sent to "{challenge.instructions}". Type the code - below -

- -
- ); -} -function SolveQuestionEntry({ - challenge, - answer, - setAnswer, -}: SolveEntryProps): VNode { - return ( - -

Type the answer to the following question:

-
{challenge.instructions}
- -
- ); -} -function SolvePostEntry({ - challenge, - answer, - setAnswer, -}: SolveEntryProps): VNode { - return ( - -

- instruction for post type challenge "{challenge.instructions}" -

- -
- ); -} + 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 ( - -

- An email has been sent to "{challenge.instructions}". Type the - code below -

- -
- ); -} + const SolveDialog = !selectedChallenge || !authMethods[selectedChallenge.type as KnownAuthMethods] ? + SolveNotImplemented : + authMethods[selectedChallenge.type as KnownAuthMethods].solve ?? SolveNotImplemented -function SolveUnsupportedEntry(props: SolveEntryProps): VNode { - return ( - -

- The challenge selected is not supported for this UI. Please update this - version or try using another policy. -

-

- Challenge type: {props.challenge.type} -

-
- ); -} -function SolveUndefinedEntry(props: SolveEntryProps): VNode { - return ( - -

- There is no challenge information for id "{props.id}". Try - resetting the recovery session. -

-
- ); + return } -- cgit v1.2.3