gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated: fix #7059


From: gnunet
Subject: [taler-wallet-core] branch master updated: fix #7059
Date: Fri, 12 Nov 2021 17:12:37 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

The following commit(s) were added to refs/heads/master by this push:
     new 38b84bb8 fix #7059
38b84bb8 is described below

commit 38b84bb8051db2f03b152d66c34a1cb4c8944a12
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Fri Nov 12 13:12:27 2021 -0300

    fix #7059
---
 .../anastasis-webui/src/components/AsyncButton.tsx | 12 +++++-
 .../src/components/fields/DateInput.tsx            | 10 ++++-
 .../src/components/fields/EmailInput.tsx           |  6 +++
 .../src/components/fields/NumberInput.tsx          |  6 +++
 .../src/components/fields/TextInput.tsx            |  6 +++
 .../src/pages/home/AttributeEntryScreen.tsx        |  9 ++++
 .../src/pages/home/ConfirmModal.tsx                |  9 +++-
 .../src/pages/home/SecretEditorScreen.tsx          | 49 ++++++++++++++--------
 .../pages/home/authMethod/AuthMethodEmailSetup.tsx |  4 ++
 .../pages/home/authMethod/AuthMethodEmailSolve.tsx | 47 ++++++++++++++-------
 .../pages/home/authMethod/AuthMethodIbanSetup.tsx  |  5 +++
 .../pages/home/authMethod/AuthMethodPostSetup.tsx  | 35 +++++++++++++---
 .../pages/home/authMethod/AuthMethodPostSolve.tsx  |  7 +++-
 .../home/authMethod/AuthMethodQuestionSetup.tsx    |  5 +++
 .../home/authMethod/AuthMethodQuestionSolve.tsx    | 11 +++--
 .../pages/home/authMethod/AuthMethodSmsSetup.tsx   |  4 ++
 .../pages/home/authMethod/AuthMethodSmsSolve.tsx   | 47 ++++++++++++++-------
 .../pages/home/authMethod/AuthMethodTotpSetup.tsx  |  9 +++-
 .../pages/home/authMethod/AuthMethodTotpSolve.tsx  |  7 +++-
 .../pages/home/authMethod/AuthMethodVideoSetup.tsx |  4 ++
 20 files changed, 225 insertions(+), 67 deletions(-)

diff --git a/packages/anastasis-webui/src/components/AsyncButton.tsx 
b/packages/anastasis-webui/src/components/AsyncButton.tsx
index 33f3a725..8f855f29 100644
--- a/packages/anastasis-webui/src/components/AsyncButton.tsx
+++ b/packages/anastasis-webui/src/components/AsyncButton.tsx
@@ -20,6 +20,7 @@
  */
 
 import { ComponentChildren, h, VNode } from "preact";
+import { useLayoutEffect, useRef } from "preact/hooks";
 // import { LoadingModal } from "../modal";
 import { useAsync } from "../hooks/async";
 // import { Translate } from "../../i18n";
@@ -28,17 +29,26 @@ type Props = {
   children: ComponentChildren;
   disabled?: boolean;
   onClick?: () => Promise<void>;
+  grabFocus?: boolean;
   [rest: string]: any;
 };
 
 export function AsyncButton({
   onClick,
+  grabFocus,
   disabled,
   children,
   ...rest
 }: Props): VNode {
   const { isLoading, request } = useAsync(onClick);
 
+  const buttonRef = useRef<HTMLButtonElement>(null);
+  useLayoutEffect(() => {
+    if (grabFocus) {
+      buttonRef.current?.focus();
+    }
+  }, [grabFocus]);
+
   // if (isSlow) {
   //   return <LoadingModal onCancel={cancel} />;
   // }
@@ -48,7 +58,7 @@ export function AsyncButton({
 
   return (
     <span data-tooltip={rest["data-tooltip"]} style={{ marginLeft: 5 }}>
-      <button {...rest} onClick={request} disabled={disabled}>
+      <button {...rest} ref={buttonRef} onClick={request} disabled={disabled}>
         {children}
       </button>
     </span>
diff --git a/packages/anastasis-webui/src/components/fields/DateInput.tsx 
b/packages/anastasis-webui/src/components/fields/DateInput.tsx
index 0b6a7e31..18ef8990 100644
--- a/packages/anastasis-webui/src/components/fields/DateInput.tsx
+++ b/packages/anastasis-webui/src/components/fields/DateInput.tsx
@@ -1,4 +1,4 @@
-import { format, isAfter, parse, sub, subYears } from "date-fns";
+import { format, subYears } from "date-fns";
 import { h, VNode } from "preact";
 import { useLayoutEffect, useRef, useState } from "preact/hooks";
 import { DatePicker } from "../picker/DatePicker";
@@ -9,6 +9,7 @@ export interface DateInputProps {
   tooltip?: string;
   error?: string;
   years?: Array<number>;
+  onConfirm?: () => void;
   bind: [string, (x: string) => void];
 }
 
@@ -44,7 +45,12 @@ export function DateInput(props: DateInputProps): VNode {
               type="text"
               class={showError ? "input is-danger" : "input"}
               value={value}
-              onInput={(e) => {
+              onKeyPress={(e) => {
+                if (e.key === 'Enter' && props.onConfirm) {
+                  props.onConfirm()
+                }
+              }}
+                  onInput={(e) => {
                 const text = e.currentTarget.value;
                 setDirty(true);
                 props.bind[1](text);
diff --git a/packages/anastasis-webui/src/components/fields/EmailInput.tsx 
b/packages/anastasis-webui/src/components/fields/EmailInput.tsx
index fe676f28..4c35c068 100644
--- a/packages/anastasis-webui/src/components/fields/EmailInput.tsx
+++ b/packages/anastasis-webui/src/components/fields/EmailInput.tsx
@@ -7,6 +7,7 @@ export interface TextInputProps {
   error?: string;
   placeholder?: string;
   tooltip?: string;
+  onConfirm?: () => void;
   bind: [string, (x: string) => void];
 }
 
@@ -37,6 +38,11 @@ export function EmailInput(props: TextInputProps): VNode {
           placeholder={props.placeholder}
           type="email"
           class={showError ? "input is-danger" : "input"}
+          onKeyPress={(e) => {
+            if (e.key === 'Enter' && props.onConfirm) {
+              props.onConfirm()
+            }
+          }}
           onInput={(e) => {
             setDirty(true);
             props.bind[1]((e.target as HTMLInputElement).value);
diff --git a/packages/anastasis-webui/src/components/fields/NumberInput.tsx 
b/packages/anastasis-webui/src/components/fields/NumberInput.tsx
index e1489eaf..4856131c 100644
--- a/packages/anastasis-webui/src/components/fields/NumberInput.tsx
+++ b/packages/anastasis-webui/src/components/fields/NumberInput.tsx
@@ -7,6 +7,7 @@ export interface TextInputProps {
   error?: string;
   placeholder?: string;
   tooltip?: string;
+  onConfirm?: () => void;
   bind: [string, (x: string) => void];
 }
 
@@ -36,6 +37,11 @@ export function PhoneNumberInput(props: TextInputProps): 
VNode {
           type="tel"
           placeholder={props.placeholder}
           class={showError ? "input is-danger" : "input"}
+          onKeyPress={(e) => {
+            if (e.key === 'Enter' && props.onConfirm) {
+              props.onConfirm()
+            }
+          }}
           onInput={(e) => {
             setDirty(true);
             props.bind[1]((e.target as HTMLInputElement).value);
diff --git a/packages/anastasis-webui/src/components/fields/TextInput.tsx 
b/packages/anastasis-webui/src/components/fields/TextInput.tsx
index 4f417730..efa95d84 100644
--- a/packages/anastasis-webui/src/components/fields/TextInput.tsx
+++ b/packages/anastasis-webui/src/components/fields/TextInput.tsx
@@ -8,6 +8,7 @@ export interface TextInputProps {
   error?: string;
   placeholder?: string;
   tooltip?: string;
+  onConfirm?: () => void;
   bind: [string, (x: string) => void];
 }
 
@@ -37,6 +38,11 @@ export function TextInput(props: TextInputProps): VNode {
           disabled={props.disabled}
           placeholder={props.placeholder}
           class={showError ? "input is-danger" : "input"}
+          onKeyPress={(e) => {
+            if (e.key === 'Enter' && props.onConfirm) {
+              props.onConfirm()
+            }
+          }}
           onInput={(e) => {
             setDirty(true);
             props.bind[1]((e.target as HTMLInputElement).value);
diff --git a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx 
b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
index 4a937d85..1b50779e 100644
--- a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
@@ -44,6 +44,11 @@ export function AttributeEntryScreen(): VNode {
         setValue={(v: string) => setAttrs({ ...attrs, [spec.name]: v })}
         spec={spec}
         errorMessage={error}
+        onConfirm={() => {
+          if (!hasErrors) {
+            setAskUserIfSure(true)
+          }
+        }}
         value={value}
       />
     );
@@ -104,6 +109,7 @@ interface AttributeEntryFieldProps {
   setValue: (newValue: string) => void;
   spec: UserAttributeSpec;
   errorMessage: string | undefined;
+  onConfirm: () => void;
 }
 const possibleBirthdayYear: Array<number> = [];
 for (let i = 0; i < 100; i++) {
@@ -117,6 +123,7 @@ function AttributeEntryField(props: 
AttributeEntryFieldProps): VNode {
           grabFocus={props.isFirst}
           label={props.spec.label}
           years={possibleBirthdayYear}
+          onConfirm={props.onConfirm}
           error={props.errorMessage}
           bind={[props.value, props.setValue]}
         />
@@ -125,6 +132,7 @@ function AttributeEntryField(props: 
AttributeEntryFieldProps): VNode {
         <PhoneNumberInput
           grabFocus={props.isFirst}
           label={props.spec.label}
+          onConfirm={props.onConfirm}
           error={props.errorMessage}
           bind={[props.value, props.setValue]}
         />
@@ -133,6 +141,7 @@ function AttributeEntryField(props: 
AttributeEntryFieldProps): VNode {
         <TextInput
           grabFocus={props.isFirst}
           label={props.spec.label}
+          onConfirm={props.onConfirm}
           error={props.errorMessage}
           bind={[props.value, props.setValue]}
         />
diff --git a/packages/anastasis-webui/src/pages/home/ConfirmModal.tsx 
b/packages/anastasis-webui/src/pages/home/ConfirmModal.tsx
index e3561d89..c9c59c1b 100644
--- a/packages/anastasis-webui/src/pages/home/ConfirmModal.tsx
+++ b/packages/anastasis-webui/src/pages/home/ConfirmModal.tsx
@@ -1,4 +1,6 @@
+import { differenceInBusinessDays } from "date-fns";
 import { ComponentChildren, h, VNode } from "preact";
+import { useLayoutEffect, useRef } from "preact/hooks";
 import { AsyncButton } from "../../components/AsyncButton";
 
 export interface ConfirmModelProps {
@@ -17,7 +19,7 @@ export function ConfirmModal({
   active, description, onCancel, onConfirm, children, danger, disabled, label 
= "Confirm", cancelLabel = "Dismiss"
 }: ConfirmModelProps): VNode {
   return (
-    <div class={active ? "modal is-active" : "modal"}>
+    <div class={active ? "modal is-active" : "modal"} >
       <div class="modal-background " onClick={onCancel} />
       <div class="modal-card" style={{ maxWidth: 700 }}>
         <header class="modal-card-head">
@@ -33,8 +35,11 @@ export function ConfirmModal({
           <button class="button" onClick={onCancel}>
             {cancelLabel}
           </button>
-          <div class="buttons is-right" style={{ width: "100%" }}>
+          <div class="buttons is-right" style={{ width: "100%" }} 
onKeyDown={(e) => {
+            if (e.key === 'Escape' && onCancel) onCancel()
+          }}>
             <AsyncButton
+              grabFocus
               class={danger ? "button is-danger " : "button is-info "}
               disabled={disabled}
               onClick={onConfirm}
diff --git a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx 
b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
index 226e43dd..be8135ef 100644
--- a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
@@ -10,10 +10,12 @@ import { FileInput, FileTypeContent } from 
"../../components/fields/FileInput";
 export function SecretEditorScreen(): VNode {
   const reducer = useAnastasisContext();
   const [secretValue, setSecretValue] = useState("");
-  const [secretFile, _setSecretFile] = useState<FileTypeContent | 
undefined>(undefined);
+  const [secretFile, _setSecretFile] = useState<FileTypeContent | undefined>(
+    undefined,
+  );
   function setSecretFile(v) {
-    setSecretValue("") // reset secret value when uploading a file
-    _setSecretFile(v)
+    setSecretValue(""); // reset secret value when uploading a file
+    _setSecretFile(v);
   }
 
   const currentSecretName =
@@ -34,14 +36,16 @@ export function SecretEditorScreen(): VNode {
   }
 
   const secretNext = async (): Promise<void> => {
-    const secret = secretFile ? {
-      value: encodeCrock(stringToBytes(secretValue)),
-      filename: secretFile.name,
-      mime: secretFile.type,
-    } : {
-      value: encodeCrock(stringToBytes(secretValue)),
-      mime: "text/plain",
-    }
+    const secret = secretFile
+      ? {
+          value: encodeCrock(stringToBytes(secretValue)),
+          filename: secretFile.name,
+          mime: secretFile.type,
+        }
+      : {
+          value: encodeCrock(stringToBytes(secretValue)),
+          mime: "text/plain",
+        };
     return reducer.runTransaction(async (tx) => {
       await tx.transition("enter_secret_name", {
         name: secretName,
@@ -55,9 +59,14 @@ export function SecretEditorScreen(): VNode {
       await tx.transition("next", {});
     });
   };
-  const errors = !secretName ? 'Add a secret name' : (
-    (!secretValue && !secretFile) ? 'Add a secret value or a choose a file to 
upload' : undefined
-  )
+  const errors = !secretName
+    ? "Add a secret name"
+    : !secretValue && !secretFile
+    ? "Add a secret value or a choose a file to upload"
+    : undefined;
+  function goNextIfNoErrors(): void {
+    if (!errors) secretNext();
+  }
   return (
     <AnastasisClientFrame
       hideNext={errors}
@@ -69,12 +78,14 @@ export function SecretEditorScreen(): VNode {
           label="Secret name:"
           tooltip="The secret name allows you to identify your secret when 
restoring it. It is a label that you can choose freely."
           grabFocus
+          onConfirm={goNextIfNoErrors}
           bind={[secretName, setSecretName]}
         />
       </div>
       <div class="block">
         <TextInput
           disabled={!!secretFile}
+          onConfirm={goNextIfNoErrors}
           label="Enter the secret as text:"
           bind={[secretValue, setSecretValue]}
         />
@@ -82,10 +93,12 @@ export function SecretEditorScreen(): VNode {
       <div class="block">
         Or upload a secret file
         <FileInput label="Choose file" onChange={setSecretFile} />
-        {secretFile && <div>
-          Uploading secret file <b>{secretFile.name}</b> <a onClick={() => 
setSecretFile(undefined)}>cancel</a>
-        </div>
-        }
+        {secretFile && (
+          <div>
+            Uploading secret file <b>{secretFile.name}</b>{" "}
+            <a onClick={() => setSecretFile(undefined)}>cancel</a>
+          </div>
+        )}
       </div>
     </AnastasisClientFrame>
   );
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx
index 61c66c8c..556e3bdb 100644
--- 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx
+++ 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSetup.tsx
@@ -26,6 +26,9 @@ export function AuthMethodEmailSetup({
     : undefined;
   const errors = !email ? "Add your email" : emailError;
 
+  function goNextIfNoErrors(): void {
+    if (!errors) addEmailAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add email authentication">
       <p>
@@ -37,6 +40,7 @@ export function AuthMethodEmailSetup({
         <EmailInput
           label="Email address"
           error={emailError}
+          onConfirm={goNextIfNoErrors}
           placeholder="email@domain.com"
           bind={[email, setEmail]}
         />
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSolve.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSolve.tsx
index 1e0b6f18..89017aa6 100644
--- 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSolve.tsx
+++ 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodEmailSolve.tsx
@@ -10,7 +10,7 @@ import { AuthMethodSolveProps } from "./index";
 
 export function AuthMethodEmailSolve({ id }: AuthMethodSolveProps): VNode {
   const [answer, setAnswer] = useState("");
-  const [expanded, setExpanded] = useState(false)
+  const [expanded, setExpanded] = useState(false);
 
   const reducer = useAnastasisContext();
   if (!reducer) {
@@ -91,23 +91,38 @@ export function AuthMethodEmailSolve({ id }: 
AuthMethodSolveProps): VNode {
       <SolveOverviewFeedbackDisplay feedback={feedback} />
       <p>
         An email has been sent to "<b>{selectedChallenge.instructions}</b>". 
The
-        message has and identification code and recovery code that starts with 
"<b>A-</b>".
-        Wait the message to arrive and the enter the recovery code below.
+        message has and identification code and recovery code that starts with 
"
+        <b>A-</b>". Wait the message to arrive and the enter the recovery code
+        below.
       </p>
-      {!expanded ? <p>
-        The identification code in the email should start with 
"{selectedUuid.substring(0, 10)}"
-        <span class="icon has-tooltip-top" data-tooltip="click to expand" 
onClick={() => setExpanded(e => !e)}>
-          <i class="mdi mdi-information" />
-        </span>
-      </p>
-        : <p>
-        The identification code in the email is "{selectedUuid}"
-        <span class="icon has-tooltip-top" data-tooltip="click to show less 
code" onClick={() => setExpanded(e => !e)}>
-          <i class="mdi mdi-information" />
-        </span>
-        </p>}
-      <TextInput label="Answer"
+      {!expanded ? (
+        <p>
+          The identification code in the email should start with "
+          {selectedUuid.substring(0, 10)}"
+          <span
+            class="icon has-tooltip-top"
+            data-tooltip="click to expand"
+            onClick={() => setExpanded((e) => !e)}
+          >
+            <i class="mdi mdi-information" />
+          </span>
+        </p>
+      ) : (
+        <p>
+          The identification code in the email is "{selectedUuid}"
+          <span
+            class="icon has-tooltip-top"
+            data-tooltip="click to show less code"
+            onClick={() => setExpanded((e) => !e)}
+          >
+            <i class="mdi mdi-information" />
+          </span>
+        </p>
+      )}
+      <TextInput
+        label="Answer"
         grabFocus
+        onConfirm={onNext}
         bind={[answer, setAnswer]}
         placeholder="A-1234567812345678"
       />
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx
index dee550e5..501a4060 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodIbanSetup.tsx
@@ -36,6 +36,9 @@ export function AuthMethodIbanSetup({
     : !account
     ? "Add an account IBAN number"
     : undefined;
+  function goNextIfNoErrors(): void {
+    if (!errors) addIbanAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add bank transfer authentication">
       <p>
@@ -49,11 +52,13 @@ export function AuthMethodIbanSetup({
           label="Bank account holder name"
           grabFocus
           placeholder="John Smith"
+          onConfirm={goNextIfNoErrors}
           bind={[name, setName]}
         />
         <TextInput
           label="IBAN"
           placeholder="DE91100000000123456789"
+          onConfirm={goNextIfNoErrors}
           bind={[account, setAccount]}
         />
       </div>
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx
index 6c8d36bc..04e00500 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSetup.tsx
@@ -48,6 +48,10 @@ export function AuthMethodPostSetup({
     : !country
     ? "The country is missing"
     : undefined;
+
+  function goNextIfNoErrors(): void {
+    if (!errors) addPostAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add postal authentication">
       <p>
@@ -56,19 +60,40 @@ export function AuthMethodPostSetup({
         will receive in a letter to that address.
       </p>
       <div>
-        <TextInput grabFocus label="Full Name" bind={[fullName, setFullName]} 
/>
+        <TextInput
+          grabFocus
+          label="Full Name"
+          bind={[fullName, setFullName]}
+          onConfirm={goNextIfNoErrors}
+        />
       </div>
       <div>
-        <TextInput label="Street" bind={[street, setStreet]} />
+        <TextInput
+          onConfirm={goNextIfNoErrors}
+          label="Street"
+          bind={[street, setStreet]}
+        />
       </div>
       <div>
-        <TextInput label="City" bind={[city, setCity]} />
+        <TextInput
+          onConfirm={goNextIfNoErrors}
+          label="City"
+          bind={[city, setCity]}
+        />
       </div>
       <div>
-        <TextInput label="Postal Code" bind={[postcode, setPostcode]} />
+        <TextInput
+          onConfirm={goNextIfNoErrors}
+          label="Postal Code"
+          bind={[postcode, setPostcode]}
+        />
       </div>
       <div>
-        <TextInput label="Country" bind={[country, setCountry]} />
+        <TextInput
+          onConfirm={goNextIfNoErrors}
+          label="Country"
+          bind={[country, setCountry]}
+        />
       </div>
 
       {configured.length > 0 && (
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSolve.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSolve.tsx
index 97e768cb..bc56b9f2 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSolve.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodPostSolve.tsx
@@ -89,7 +89,12 @@ export function AuthMethodPostSolve({ id }: 
AuthMethodSolveProps): VNode {
     <AnastasisClientFrame hideNav title="Postal Challenge">
       <SolveOverviewFeedbackDisplay feedback={feedback} />
       <p>Wait for the answer</p>
-      <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
+      <TextInput
+        onConfirm={onNext}
+        label="Answer"
+        grabFocus
+        bind={[answer, setAnswer]}
+      />
 
       <div
         style={{
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx
 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx
index 03725621..19260c4f 100644
--- 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx
+++ 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSetup.tsx
@@ -26,6 +26,9 @@ export function AuthMethodQuestionSetup({
     : !answerText
     ? "Add the answer to your question"
     : undefined;
+  function goNextIfNoErrors(): void {
+    if (!errors) addQuestionAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add Security Question">
       <div>
@@ -39,6 +42,7 @@ export function AuthMethodQuestionSetup({
           <TextInput
             label="Security question"
             grabFocus
+            onConfirm={goNextIfNoErrors}
             placeholder="Your question"
             bind={[questionText, setQuestionText]}
           />
@@ -46,6 +50,7 @@ export function AuthMethodQuestionSetup({
         <div>
           <TextInput
             label="Answer"
+            onConfirm={goNextIfNoErrors}
             placeholder="Your answer"
             bind={[answerText, setAnswerText]}
           />
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.tsx
 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.tsx
index b4896eac..2636ca47 100644
--- 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.tsx
+++ 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.tsx
@@ -91,11 +91,14 @@ export function AuthMethodQuestionSolve({ id }: 
AuthMethodSolveProps): VNode {
       <p>
         In this challenge you need to provide the answer for the next question:
       </p>
-      <pre>
-        {selectedChallenge.instructions}
-      </pre>
+      <pre>{selectedChallenge.instructions}</pre>
       <p>Type the answer below</p>
-      <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
+      <TextInput
+        label="Answer"
+        onConfirm={onNext}
+        grabFocus
+        bind={[answer, setAnswer]}
+      />
 
       <div
         style={{
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx
index 056b1b17..e70b2a53 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSetup.tsx
@@ -25,6 +25,9 @@ export function AuthMethodSmsSetup({
     inputRef.current?.focus();
   }, []);
   const errors = !mobileNumber ? "Add a mobile number" : undefined;
+  function goNextIfNoErrors(): void {
+    if (!errors) addSmsAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add SMS authentication">
       <div>
@@ -37,6 +40,7 @@ export function AuthMethodSmsSetup({
           <PhoneNumberInput
             label="Mobile number"
             placeholder="Your mobile number"
+            onConfirm={goNextIfNoErrors}
             grabFocus
             bind={[mobileNumber, setMobileNumber]}
           />
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSolve.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSolve.tsx
index 67049df1..218e8c85 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSolve.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodSmsSolve.tsx
@@ -11,7 +11,7 @@ import { AuthMethodSolveProps } from "./index";
 export function AuthMethodSmsSolve({ id }: AuthMethodSolveProps): VNode {
   const [answer, setAnswer] = useState("");
 
-  const [expanded, setExpanded] = useState(false)
+  const [expanded, setExpanded] = useState(false);
   const reducer = useAnastasisContext();
   if (!reducer) {
     return (
@@ -91,23 +91,38 @@ export function AuthMethodSmsSolve({ id }: 
AuthMethodSolveProps): VNode {
       <SolveOverviewFeedbackDisplay feedback={feedback} />
       <p>
         An sms has been sent to "<b>{selectedChallenge.instructions}</b>". The
-        message has and identification code and recovery code that starts with 
"<b>A-</b>".
-        Wait the message to arrive and the enter the recovery code below.
+        message has and identification code and recovery code that starts with 
"
+        <b>A-</b>". Wait the message to arrive and the enter the recovery code
+        below.
       </p>
-      {!expanded ? <p>
-        The identification code in the SMS should start with 
"{selectedUuid.substring(0, 10)}"
-        <span class="icon has-tooltip-top" data-tooltip="click to expand" 
onClick={() => setExpanded(e => !e)}>
-          <i class="mdi mdi-information" />
-        </span>
-      </p>
-        : <p>
-        The identification code in the SMS is "{selectedUuid}"
-        <span class="icon has-tooltip-top" data-tooltip="click to show less 
code" onClick={() => setExpanded(e => !e)}>
-          <i class="mdi mdi-information" />
-        </span>
-        </p>}
-      <TextInput label="Answer"
+      {!expanded ? (
+        <p>
+          The identification code in the SMS should start with "
+          {selectedUuid.substring(0, 10)}"
+          <span
+            class="icon has-tooltip-top"
+            data-tooltip="click to expand"
+            onClick={() => setExpanded((e) => !e)}
+          >
+            <i class="mdi mdi-information" />
+          </span>
+        </p>
+      ) : (
+        <p>
+          The identification code in the SMS is "{selectedUuid}"
+          <span
+            class="icon has-tooltip-top"
+            data-tooltip="click to show less code"
+            onClick={() => setExpanded((e) => !e)}
+          >
+            <i class="mdi mdi-information" />
+          </span>
+        </p>
+      )}
+      <TextInput
+        label="Answer"
         grabFocus
+        onConfirm={onNext}
         bind={[answer, setAnswer]}
         placeholder="A-1234567812345678"
       />
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
index 1451aadc..6b0dd7a7 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSetup.tsx
@@ -38,6 +38,9 @@ export function AuthMethodTotpSetup({
     : !testCodeMatches
     ? "The test code doesnt match"
     : undefined;
+  function goNextIfNoErrors(): void {
+    if (!errors) addTotpAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add TOTP authentication">
       <p>
@@ -54,7 +57,11 @@ export function AuthMethodTotpSetup({
       <p>
         After scanning the code with your TOTP App, test it in the input below.
       </p>
-      <TextInput label="Test code" bind={[test, setTest]} />
+      <TextInput
+        label="Test code"
+        onConfirm={goNextIfNoErrors}
+        bind={[test, setTest]}
+      />
       {configured.length > 0 && (
         <section class="section">
           <div class="block">Your TOTP numbers:</div>
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSolve.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSolve.tsx
index e9fa7012..347f9bf0 100644
--- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSolve.tsx
+++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodTotpSolve.tsx
@@ -89,7 +89,12 @@ export function AuthMethodTotpSolve({ id }: 
AuthMethodSolveProps): VNode {
     <AnastasisClientFrame hideNav title="TOTP Challenge">
       <SolveOverviewFeedbackDisplay feedback={feedback} />
       <p>enter the totp solution</p>
-      <TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
+      <TextInput
+        label="Answer"
+        onConfirm={onNext}
+        grabFocus
+        bind={[answer, setAnswer]}
+      />
 
       <div
         style={{
diff --git 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx
index 672b2350..04a129c4 100644
--- 
a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx
+++ 
b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodVideoSetup.tsx
@@ -20,6 +20,9 @@ export function AuthMethodVideoSetup({
       },
     });
   };
+  function goNextIfNoErrors(): void {
+    addVideoAuth();
+  }
   return (
     <AnastasisClientFrame hideNav title="Add video authentication">
       <p>
@@ -32,6 +35,7 @@ export function AuthMethodVideoSetup({
         <ImageInput
           label="Choose photograph"
           grabFocus
+          onConfirm={goNextIfNoErrors}
           bind={[image, setImage]}
         />
       </div>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]