[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-wallet-core] branch master updated: anastasis-webui: show feedbac
From: |
gnunet |
Subject: |
[taler-wallet-core] branch master updated: anastasis-webui: show feedback in solution screen |
Date: |
Wed, 03 Nov 2021 18:56:41 +0100 |
This is an automated email from the git hooks/post-receive script.
dold pushed a commit to branch master
in repository wallet-core.
The following commit(s) were added to refs/heads/master by this push:
new 9fb6536f anastasis-webui: show feedback in solution screen
9fb6536f is described below
commit 9fb6536fbc91adaf7a8a80860fcef5e1f80bfb3b
Author: Florian Dold <florian@dold.me>
AuthorDate: Wed Nov 3 18:56:19 2021 +0100
anastasis-webui: show feedback in solution screen
---
.../src/pages/home/ChallengeOverviewScreen.tsx | 4 +-
.../anastasis-webui/src/pages/home/SolveScreen.tsx | 177 ++++++++++++++++-----
2 files changed, 135 insertions(+), 46 deletions(-)
diff --git
a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
index 69dbce03..7bafbe06 100644
--- a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
@@ -5,7 +5,7 @@ import { useAnastasisContext } from "../../context/anastasis";
import { AnastasisClientFrame } from "./index";
import { authMethods, KnownAuthMethods } from "./authMethod";
-function FeedbackDisplay(props: { feedback?: ChallengeFeedback }) {
+function OverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }) {
const { feedback } = props;
if (!feedback) {
return null;
@@ -130,7 +130,7 @@ export function ChallengeOverviewScreen(): VNode {
<span class="icon">{method?.icon}</span>
<span>{info.instructions}</span>
</div>
- <FeedbackDisplay feedback={info.feedback} />
+ <OverviewFeedbackDisplay feedback={info.feedback} />
</div>
<div>
{method && info.feedback?.state !== "solved" ? (
diff --git a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
index b0cfa9bb..d4d9271b 100644
--- a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx
@@ -1,38 +1,89 @@
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { AnastasisClientFrame } from ".";
-import { ChallengeFeedback, ChallengeInfo } from
"../../../../anastasis-core/lib";
+import {
+ ChallengeFeedback,
+ ChallengeFeedbackStatus,
+ ChallengeInfo,
+} from "../../../../anastasis-core/lib";
import { TextInput } from "../../components/fields/TextInput";
import { useAnastasisContext } from "../../context/anastasis";
+function SolveOverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback })
{
+ const { feedback } = props;
+ if (!feedback) {
+ return null;
+ }
+ switch (feedback.state) {
+ case ChallengeFeedbackStatus.Message:
+ return (
+ <div>
+ <p>{feedback.message}</p>
+ </div>
+ );
+ case ChallengeFeedbackStatus.Pending:
+ case ChallengeFeedbackStatus.AuthIban:
+ return null;
+ case ChallengeFeedbackStatus.RateLimitExceeded:
+ return <div>Rate limit exceeded.</div>;
+ case ChallengeFeedbackStatus.Redirect:
+ return <div>Redirect (FIXME: not supported)</div>;
+ case ChallengeFeedbackStatus.Unsupported:
+ return <div>Challenge not supported by client.</div>;
+ case ChallengeFeedbackStatus.TruthUnknown:
+ return <div>Truth unknown</div>;
+ default:
+ return (
+ <div>
+ <pre>{JSON.stringify(feedback)}</pre>
+ </div>
+ );
+ }
+}
+
export function SolveScreen(): VNode {
- const reducer = useAnastasisContext()
+ const reducer = useAnastasisContext();
const [answer, setAnswer] = useState("");
if (!reducer) {
- return <AnastasisClientFrame hideNav title="Recovery problem">
- <div>no reducer in context</div>
- </AnastasisClientFrame>
+ return (
+ <AnastasisClientFrame hideNav title="Recovery problem">
+ <div>no reducer in context</div>
+ </AnastasisClientFrame>
+ );
}
- if (!reducer.currentReducerState ||
reducer.currentReducerState.recovery_state === undefined) {
- return <AnastasisClientFrame hideNav title="Recovery problem">
- <div>invalid state</div>
- </AnastasisClientFrame>
+ if (
+ !reducer.currentReducerState ||
+ reducer.currentReducerState.recovery_state === undefined
+ ) {
+ return (
+ <AnastasisClientFrame hideNav title="Recovery problem">
+ <div>invalid state</div>
+ </AnastasisClientFrame>
+ );
}
if (!reducer.currentReducerState.recovery_information) {
- return <AnastasisClientFrame hideNext="Recovery document not found"
title="Recovery problem">
- <div>no recovery information found</div>
- </AnastasisClientFrame>
+ return (
+ <AnastasisClientFrame
+ hideNext="Recovery document not found"
+ title="Recovery problem"
+ >
+ <div>no recovery information found</div>
+ </AnastasisClientFrame>
+ );
}
if (!reducer.currentReducerState.selected_challenge_uuid) {
- return <AnastasisClientFrame hideNav title="Recovery problem">
- <div>invalid state</div>
- </AnastasisClientFrame>
+ return (
+ <AnastasisClientFrame hideNav title="Recovery problem">
+ <div>invalid state</div>
+ </AnastasisClientFrame>
+ );
}
const chArr = reducer.currentReducerState.recovery_information.challenges;
- const challengeFeedback = reducer.currentReducerState.challenge_feedback ??
{};
+ const challengeFeedback =
+ reducer.currentReducerState.challenge_feedback ?? {};
const selectedUuid = reducer.currentReducerState.selected_challenge_uuid;
const challenges: {
[uuid: string]: ChallengeInfo;
@@ -47,31 +98,44 @@ export function SolveScreen(): VNode {
email: SolveEmailEntry,
post: SolvePostEntry,
};
- const SolveDialog = selectedChallenge === undefined ? SolveUndefinedEntry :
dialogMap[selectedChallenge.type] ?? SolveUnsupportedEntry;
+ const SolveDialog =
+ selectedChallenge === undefined
+ ? SolveUndefinedEntry
+ : dialogMap[selectedChallenge.type] ?? SolveUnsupportedEntry;
function onNext(): void {
- reducer?.transition("solve_challenge", { answer })
+ reducer?.transition("solve_challenge", { answer });
}
function onCancel(): void {
- reducer?.back()
+ reducer?.back();
}
-
return (
- <AnastasisClientFrame
- hideNav
- title="Recovery: Solve challenge"
- >
+ <AnastasisClientFrame hideNav title="Recovery: Solve challenge">
+ <SolveOverviewFeedbackDisplay
+ feedback={challengeFeedback[selectedUuid]}
+ />
<SolveDialog
id={selectedUuid}
answer={answer}
setAnswer={setAnswer}
challenge={selectedChallenge}
- feedback={challengeFeedback[selectedUuid]} />
+ feedback={challengeFeedback[selectedUuid]}
+ />
- <div style={{ marginTop: '2em', display: 'flex', justifyContent:
'space-between' }}>
- <button class="button" onClick={onCancel}>Cancel</button>
- <button class="button is-info" onClick={onNext} >Confirm</button>
+ <div
+ style={{
+ marginTop: "2em",
+ display: "flex",
+ justifyContent: "space-between",
+ }}
+ >
+ <button class="button" onClick={onCancel}>
+ Cancel
+ </button>
+ <button class="button is-info" onClick={onNext}>
+ Confirm
+ </button>
</div>
</AnastasisClientFrame>
);
@@ -85,38 +149,61 @@ export interface SolveEntryProps {
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 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 {
+function SolveQuestionEntry({
+ challenge,
+ answer,
+ setAnswer,
+}: SolveEntryProps): VNode {
return (
<Fragment>
<p>Type the answer to the following question:</p>
- <pre>
- {challenge.instructions}
- </pre>
+ <pre>{challenge.instructions}</pre>
<TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
</Fragment>
);
}
-function SolvePostEntry({ challenge, answer, setAnswer }: SolveEntryProps):
VNode {
+function SolvePostEntry({
+ challenge,
+ answer,
+ setAnswer,
+}: SolveEntryProps): VNode {
return (
<Fragment>
- <p>instruction for post type challenge
"<b>{challenge.instructions}</b>"</p>
+ <p>
+ instruction for post type challenge "<b>{challenge.instructions}</b>"
+ </p>
<TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
</Fragment>
);
}
-function SolveEmailEntry({ challenge, answer, setAnswer }: SolveEntryProps):
VNode {
+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>
+ <p>
+ An email has been sent to "<b>{challenge.instructions}</b>". Type the
+ code below
+ </p>
<TextInput label="Answer" grabFocus bind={[answer, setAnswer]} />
</Fragment>
);
@@ -126,7 +213,8 @@ 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.
+ 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}
@@ -136,9 +224,10 @@ function SolveUnsupportedEntry(props: SolveEntryProps):
VNode {
}
function SolveUndefinedEntry(props: SolveEntryProps): VNode {
return (
- <Fragment >
+ <Fragment>
<p>
- There is no challenge information for id <b>"{props.id}"</b>. Try
resetting the recovery session.
+ There is no challenge information for id <b>"{props.id}"</b>. Try
+ resetting the recovery session.
</p>
</Fragment>
);
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-wallet-core] branch master updated: anastasis-webui: show feedback in solution screen,
gnunet <=