From 6ef5fd21fc365d780da42170ce85042f874ed1dc Mon Sep 17 00:00:00 2001
From: Sebastian <sebasjm@gmail.com>
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 <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} />
 }
-- 
cgit v1.2.3

