From cf894f1dd309e48d8be380c56175219027c84fb7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 26 Aug 2022 12:59:00 -0300 Subject: fix #7065 --- .../src/components/menu/SideBar.tsx | 7 +- .../src/hooks/use-anastasis-reducer.ts | 6 +- .../src/pages/home/AddingProviderScreen/index.ts | 4 +- .../src/pages/home/AddingProviderScreen/state.ts | 5 +- .../pages/home/AddingProviderScreen/stories.tsx | 4 + .../src/pages/home/AddingProviderScreen/views.tsx | 5 +- .../pages/home/ChallengeOverviewScreen.stories.tsx | 61 ++-- .../src/pages/home/ChallengeOverviewScreen.tsx | 27 +- .../pages/home/SecretSelectionScreen.stories.tsx | 56 +++- .../src/pages/home/SecretSelectionScreen.tsx | 325 +++++++++++---------- .../anastasis-webui/src/pages/home/SolveScreen.tsx | 73 ++++- .../authMethod/AuthMethodQuestionSolve.stories.tsx | 251 +++++++++------- .../src/pages/home/index.storiesNo.tsx | 2 +- packages/anastasis-webui/src/pages/home/index.tsx | 4 +- packages/anastasis-webui/src/stories.tsx | 6 +- packages/anastasis-webui/src/utils/index.tsx | 5 +- 16 files changed, 513 insertions(+), 328 deletions(-) (limited to 'packages/anastasis-webui/src') diff --git a/packages/anastasis-webui/src/components/menu/SideBar.tsx b/packages/anastasis-webui/src/components/menu/SideBar.tsx index f83131ae1..ee394da83 100644 --- a/packages/anastasis-webui/src/components/menu/SideBar.tsx +++ b/packages/anastasis-webui/src/components/menu/SideBar.tsx @@ -28,11 +28,8 @@ interface Props { mobile?: boolean; } -// @ts-ignore -const maybeEnv = process?.env || {}; - -const VERSION: string = maybeEnv.__VERSION__ || "dev"; -const GIT_HASH: string | undefined = maybeEnv.__GIT_HASH__; +const VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "dev"; +const GIT_HASH = typeof __GIT_HASH__ !== "undefined" ? __GIT_HASH__ : undefined; const VERSION_WITH_HASH = GIT_HASH ? `${VERSION}-${GIT_HASH}` : VERSION; export function Sidebar({ mobile }: Props): VNode { diff --git a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts index f78576118..3ad563ee6 100644 --- a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts +++ b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts @@ -180,7 +180,7 @@ function getStateFromStorage(): any { state = JSON.parse(s); } } catch (e) { - console.log(e); + console.log("ERROR: getStateFromStorage ", e); } return state ?? undefined; } @@ -203,7 +203,7 @@ export function useAnastasisReducer(): AnastasisReducerApi { JSON.stringify(newState.reducerState), ); } catch (e) { - console.log(e); + console.log("ERROR setAnastasisState", e); } setAnastasisStateInternal(newState); @@ -239,7 +239,7 @@ export function useAnastasisReducer(): AnastasisReducerApi { }, }); }; - doUpdate().catch((e) => console.log(e)); + doUpdate().catch((e) => console.log("ERROR doUpdate", e)); }; tryUpdateProviders(); diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/index.ts b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/index.ts index 5d5913ffc..0ab275f54 100644 --- a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/index.ts +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/index.ts @@ -16,6 +16,7 @@ import { AuthenticationProviderStatus } from "@gnu-taler/anastasis-core"; import InvalidState from "../../../components/InvalidState.js"; import NoReducer from "../../../components/NoReducer.js"; +import { Notification } from "../../../components/Notifications.js"; import { compose, StateViewMap } from "../../../utils/index.js"; import useComponentState from "./state.js"; import { WithoutProviderType, WithProviderType } from "./views.js"; @@ -44,6 +45,7 @@ interface CommonProps { setProviderURL: (url: string) => Promise; providerURL: string; errors: string | undefined; + notifications: Notification[]; } export interface WithType extends CommonProps { @@ -90,7 +92,7 @@ export async function testProvider( } return; } catch (e) { - console.log("error", e); + console.log("ERROR testProvider", e); const error = e instanceof Error ? Error( diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/state.ts b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/state.ts index a04c7957b..009ab20a2 100644 --- a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/state.ts +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/state.ts @@ -14,6 +14,7 @@ GNU Anastasis; see the file COPYING. If not, see */ import { useEffect, useRef, useState } from "preact/hooks"; +import { Notification } from "../../../components/Notifications.js"; import { useAnastasisContext } from "../../../context/anastasis.js"; import { authMethods, KnownAuthMethods } from "../authMethod/index.jsx"; import { AuthProvByStatusMap, State, testProvider } from "./index.js"; @@ -21,9 +22,10 @@ import { AuthProvByStatusMap, State, testProvider } from "./index.js"; interface Props { providerType?: KnownAuthMethods; onCancel: () => Promise; + notifications?: Notification[]; } -export default function useComponentState({ providerType, onCancel }: Props): State { +export default function useComponentState({ providerType, onCancel, notifications = [] }: Props): State { const reducer = useAnastasisContext(); const [providerURL, setProviderURL] = useState(""); @@ -128,6 +130,7 @@ export default function useComponentState({ providerType, onCancel }: Props): St setProviderURL: async (s: string) => setProviderURL(s), errors, error, + notifications } if (!providerLabel) { diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/stories.tsx b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/stories.tsx index 7faaae4d8..dc41d9c1a 100644 --- a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/stories.tsx +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/stories.tsx @@ -53,6 +53,7 @@ export const NewProvider = createExampleWithoutAnastasis(WithoutProviderType, { disabled: [], error: [], }, + notifications: [], }); export const NewProviderWithoutProviderList = createExampleWithoutAnastasis( @@ -64,6 +65,7 @@ export const NewProviderWithoutProviderList = createExampleWithoutAnastasis( disabled: [], error: [], }, + notifications: [], }, ); @@ -75,6 +77,7 @@ export const NewSmsProvider = createExampleWithoutAnastasis(WithProviderType, { error: [], }, providerLabel: "sms", + notifications: [], }); export const NewIBANProvider = createExampleWithoutAnastasis(WithProviderType, { @@ -85,4 +88,5 @@ export const NewIBANProvider = createExampleWithoutAnastasis(WithProviderType, { error: [], }, providerLabel: "IBAN", + notifications: [], }); diff --git a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/views.tsx b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/views.tsx index bb1283a82..e397e0b65 100644 --- a/packages/anastasis-webui/src/pages/home/AddingProviderScreen/views.tsx +++ b/packages/anastasis-webui/src/pages/home/AddingProviderScreen/views.tsx @@ -20,6 +20,7 @@ import { import { h, VNode } from "preact"; import { useEffect, useState } from "preact/hooks"; import { TextInput } from "../../../components/fields/TextInput.js"; +import { Notifications } from "../../../components/Notifications.js"; import { AnastasisClientFrame } from "../index.js"; import { testProvider, WithoutType, WithType } from "./index.js"; @@ -31,6 +32,7 @@ export function WithProviderType(props: WithType): VNode { hideNext={props.errors} >
+

Add a provider url for a {props.providerLabel} service

+

Add a provider url

; } + switch (feedback.state) { case ChallengeFeedbackStatus.Solved: return
; case ChallengeFeedbackStatus.IbanInstructions: - return null; + return
Payment required.
; case ChallengeFeedbackStatus.ServerFailure: return
Server error.
; case ChallengeFeedbackStatus.RateLimitExceeded: @@ -51,12 +54,20 @@ function OverviewFeedbackDisplay(props: { feedback?: ChallengeFeedback }) { case ChallengeFeedbackStatus.TruthUnknown: return (
- Provider doesn't recognize the challenge of the policy. Contact - the provider for further information. + Provider doesn't recognize the type of challenge. Use another + version or contact the provider.
); - default: - return
; + case ChallengeFeedbackStatus.IncorrectAnswer: + return ( +
The answer was not correct.
+ ); + case ChallengeFeedbackStatus.CodeInFile: + return
code in file
; + case ChallengeFeedbackStatus.CodeSent: + return
Code sent
; + case ChallengeFeedbackStatus.TalerPayment: + return
Payment required
; } } diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx index fec1e0113..b457937f8 100644 --- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx @@ -21,29 +21,57 @@ import { ReducerState } from "@gnu-taler/anastasis-core"; import { createExample, reducerStatesExample } from "../../utils/index.js"; -import { SecretSelectionScreen as TestedComponent } from "./SecretSelectionScreen.js"; +import { + SecretSelectionScreen, + SecretSelectionScreenFound, +} from "./SecretSelectionScreen.js"; export default { - component: TestedComponent, + component: SecretSelectionScreen, args: { order: 4, }, - argTypes: { - onUpdate: { action: "onUpdate" }, - onBack: { action: "onBack" }, - }, }; -export const Example = createExample(TestedComponent, { - ...reducerStatesExample.secretSelection, - recovery_document: { - provider_url: "https://kudos.demo.anastasis.lu/", - secret_name: "secretName", - version: 1, +export const Example = createExample( + SecretSelectionScreenFound, + { + ...reducerStatesExample.secretSelection, + recovery_document: { + provider_url: "https://kudos.demo.anastasis.lu/", + secret_name: "secretName", + version: 1, + }, + } as ReducerState, + { + policies: [ + { + secret_name: "The secret name 1", + attribute_mask: 1, + policy_hash: "abcdefghijklmnopqrstuvwxyz", + providers: [ + { + url: "http://someurl", + version: 1, + }, + ], + }, + { + secret_name: "The secret name 2", + attribute_mask: 1, + policy_hash: "abcdefghijklmnopqrstuvwxyz", + providers: [ + { + url: "http://someurl", + version: 1, + }, + ], + }, + ], }, -} as ReducerState); +); -export const NoRecoveryDocumentFound = createExample(TestedComponent, { +export const NoRecoveryDocumentFound = createExample(SecretSelectionScreen, { ...reducerStatesExample.secretSelection, recovery_document: undefined, } as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx index 11271aaa5..ce44b0884 100644 --- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx @@ -14,6 +14,7 @@ GNU Anastasis; see the file COPYING. If not, see */ import { + AggregatedPolicyMetaInfo, AuthenticationProviderStatus, AuthenticationProviderStatusOk, } from "@gnu-taler/anastasis-core"; @@ -25,20 +26,16 @@ import { useAnastasisContext } from "../../context/anastasis.js"; import AddingProviderScreen from "./AddingProviderScreen/index.js"; import { AnastasisClientFrame } from "./index.js"; -export function SecretSelectionScreen(): VNode { - const [selectingVersion, setSelectingVersion] = useState(false); +export function SecretSelectionScreenFound({ + policies, + onManageProvider, + onNext, +}: { + policies: AggregatedPolicyMetaInfo[]; + onManageProvider: () => void; + onNext: (version: AggregatedPolicyMetaInfo) => void; +}): VNode { const reducer = useAnastasisContext(); - const [manageProvider, setManageProvider] = useState(false); - - useEffect(() => { - async function f() { - if (reducer) { - await reducer.discoverStart(); - } - } - f().catch((e) => console.log(e)); - }, []); - if (!reducer) { return
no reducer in context
; } @@ -49,45 +46,6 @@ export function SecretSelectionScreen(): VNode { ) { return
invalid state
; } - - const provs = reducer.currentReducerState.authentication_providers ?? {}; - const recoveryDocument = reducer.currentReducerState.recovery_document; - - if (manageProvider) { - return ( - setManageProvider(false)} /> - ); - } - - if (reducer.discoveryState.state === "none") { - // Can this even happen? - return ( - -
waiting to start discovery
-
- ); - } - - if (reducer.discoveryState.state === "active") { - return ( - -
loading secret versions
-
- ); - } - - const policies = reducer.discoveryState.aggregatedPolicies ?? []; - - if (policies.length === 0) { - return ( - null} - > - ); - } - return ( Id:  @@ -128,9 +84,7 @@ export function SecretSelectionScreen(): VNode {
- reducer.transition("select_version", version) - } + onClick={async () => onNext(version)} > Recover @@ -145,9 +99,7 @@ export function SecretSelectionScreen(): VNode { challenges solving

- setManageProvider(true)}> - Manage recovery providers - + Manage recovery providers

@@ -155,8 +107,7 @@ export function SecretSelectionScreen(): VNode { ); } -export function OldSecretSelectionScreen(): VNode { - const [selectingVersion, setSelectingVersion] = useState(false); +export function SecretSelectionScreen(): VNode { const reducer = useAnastasisContext(); const [manageProvider, setManageProvider] = useState(false); @@ -169,15 +120,10 @@ export function OldSecretSelectionScreen(): VNode { f().catch((e) => console.log(e)); }, []); - const currentVersion = - (reducer?.currentReducerState && - "recovery_document" in reducer.currentReducerState && - reducer.currentReducerState.recovery_document?.version) || - 0; - if (!reducer) { return
no reducer in context
; } + if ( !reducer.currentReducerState || reducer.currentReducerState.reducer_type !== "recovery" @@ -185,97 +131,178 @@ export function OldSecretSelectionScreen(): VNode { return
invalid state
; } - async function doSelectVersion(p: string, n: number): Promise { - if (!reducer) return Promise.resolve(); - return reducer.runTransaction(async (tx) => { - await tx.transition("select_version", { - version: n, - provider_url: p, - }); - setSelectingVersion(false); - }); - } - - const provs = reducer.currentReducerState.authentication_providers ?? {}; - const recoveryDocument = reducer.currentReducerState.recovery_document; - - if (!recoveryDocument) { + if (manageProvider) { return ( - doSelectVersion(newProv, 0)} - /> + setManageProvider(false)} /> ); } - if (selectingVersion) { - return ( - setSelectingVersion(false)} - onConfirm={doSelectVersion} - /> - ); + if ( + reducer.discoveryState.state === "none" || + reducer.discoveryState.state === "active" + ) { + // Can this even happen? + return ; } - if (manageProvider) { + const policies = reducer.discoveryState.aggregatedPolicies ?? []; + + if (policies.length === 0) { return ( - setManageProvider(false)} /> + setManageProvider(false)} + notifications={[ + { + message: "Secret not found", + type: "ERROR", + description: + "With the information you provided we could not found secret in any of the providers. You can try adding more providers if you think the data is correct.", + }, + ]} + /> ); } - const providerInfo = provs[ - recoveryDocument.provider_url - ] as AuthenticationProviderStatusOk; - return ( - -
-
-
-

{providerInfo.business_name}

-
- {currentVersion === 0 ? ( -

Set to recover the latest version

- ) : ( -

Set to recover the version number {currentVersion}

- )} -
-
- -
-
-
-
-

- Secret found, you can select another version or continue to the - challenges solving -

-

- setManageProvider(true)}> - Manage recovery providers - -

-
-
-
+ reducer.transition("select_version", version)} + onManageProvider={async () => setManageProvider(false)} + /> ); } +// export function OldSecretSelectionScreen(): VNode { +// const [selectingVersion, setSelectingVersion] = useState(false); +// const reducer = useAnastasisContext(); +// const [manageProvider, setManageProvider] = useState(false); + +// useEffect(() => { +// async function f() { +// if (reducer) { +// await reducer.discoverStart(); +// } +// } +// f().catch((e) => console.log(e)); +// }, []); + +// const currentVersion = +// (reducer?.currentReducerState && +// "recovery_document" in reducer.currentReducerState && +// reducer.currentReducerState.recovery_document?.version) || +// 0; + +// if (!reducer) { +// return
no reducer in context
; +// } +// if ( +// !reducer.currentReducerState || +// reducer.currentReducerState.reducer_type !== "recovery" +// ) { +// return
invalid state
; +// } + +// async function doSelectVersion(p: string, n: number): Promise { +// if (!reducer) return Promise.resolve(); +// return reducer.runTransaction(async (tx) => { +// await tx.transition("select_version", { +// version: n, +// provider_url: p, +// }); +// setSelectingVersion(false); +// }); +// } + +// const provs = reducer.currentReducerState.authentication_providers ?? {}; +// const recoveryDocument = reducer.currentReducerState.recovery_document; + +// if (!recoveryDocument) { +// return ( +// doSelectVersion(newProv, 0)} +// /> +// ); +// } + +// if (selectingVersion) { +// return ( +// setSelectingVersion(false)} +// onConfirm={doSelectVersion} +// /> +// ); +// } + +// if (manageProvider) { +// return ( +// setManageProvider(false)} /> +// ); +// } + +// const providerInfo = provs[ +// recoveryDocument.provider_url +// ] as AuthenticationProviderStatusOk; + +// return ( +// +//
+//
+//
+//

{providerInfo.business_name}

+//
+// {currentVersion === 0 ? ( +//

Set to recover the latest version

+// ) : ( +//

Set to recover the version number {currentVersion}

+// )} +//
+//
+// +//
+//
+//
+//
+//

+// Secret found, you can select another version or continue to the +// challenges solving +//

+//

+// setManageProvider(true)}> +// Manage recovery providers +// +//

+//
+//
+//
+// ); +// } + function ChooseAnotherProviderScreen({ - providers, - selected, onChange, }: { - selected: string; - providers: { [url: string]: AuthenticationProviderStatus }; onChange: (prov: string) => void; }): VNode { + const reducer = useAnastasisContext(); + + if (!reducer) { + return
no reducer in context
; + } + + if ( + !reducer.currentReducerState || + reducer.currentReducerState.reducer_type !== "recovery" + ) { + return
invalid state
; + } + const providers = reducer.currentReducerState.authentication_providers ?? {}; + return ( Provider
- onChange(e.currentTarget.value)} value=""> {Object.keys(providers).map((url) => { const p = providers[url]; @@ -419,3 +442,11 @@ function SelectOtherVersionProviderScreen({ ); } + +function SecretSelectionScreenWaiting(): VNode { + return ( + +
loading secret versions
+
+ ); +} diff --git a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx index 23910565e..7f4d5aa18 100644 --- a/packages/anastasis-webui/src/pages/home/SolveScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SolveScreen.tsx @@ -40,7 +40,14 @@ export function SolveOverviewFeedbackDisplay(props: { message: `Message from provider`, description: ( - To pay you can click here + To pay you can{" "} + + click here + ), }, @@ -65,8 +72,12 @@ export function SolveOverviewFeedbackDisplay(props: { notifications={[ { type: "ERROR", - message: `Server error: Code ${feedback.http_status}`, - description: feedback.error_response, + message: `Server error: response code ${feedback.http_status}`, + description: !feedback.error_response + ? undefined + : `More information: ${JSON.stringify( + feedback.error_response, + )}`, }, ]} /> @@ -77,8 +88,7 @@ export function SolveOverviewFeedbackDisplay(props: { notifications={[ { type: "ERROR", - message: `Message from provider`, - description: "There were to many failed attempts.", + message: "There were to many failed attempts.", }, ]} /> @@ -107,11 +117,56 @@ export function SolveOverviewFeedbackDisplay(props: { ]} /> ); - default: - console.warn( - `unknown challenge feedback status ${JSON.stringify(feedback)}`, + case ChallengeFeedbackStatus.CodeInFile: + return ( + + ); + case ChallengeFeedbackStatus.CodeSent: + return ( + + ); + case ChallengeFeedbackStatus.IncorrectAnswer: + return ( + + ); + case ChallengeFeedbackStatus.Solved: + return ( + ); - return
; } } diff --git a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.stories.tsx b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.stories.tsx index 038d5e897..182538775 100644 --- a/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.stories.tsx +++ b/packages/anastasis-webui/src/pages/home/authMethod/AuthMethodQuestionSolve.stories.tsx @@ -20,7 +20,6 @@ */ import { - ChallengeFeedbackBankTransferRequired, ChallengeFeedbackStatus, ReducerState, } from "@gnu-taler/anastasis-core"; @@ -61,142 +60,190 @@ export const WithoutFeedback = createExample( }, ); -export const ServerFailureFeedback = createExample( - TestedComponent[type].solve, - { - ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equal NP?", - type: "question", - uuid: "ASDASDSAD!1", - }, - ], - policies: [], +const recovery_information = { + challenges: [ + { + instructions: "does P equal NP?", + type: "question", + uuid: "ASDASDSAD!1", }, - selected_challenge_uuid: "ASDASDSAD!1", - challenge_feedback: { - "ASDASDSAD!1": { - state: ChallengeFeedbackStatus.ServerFailure, - http_status: 500, - error_response: "Couldn't connect to mysql", - }, + ], + policies: [], +}; + +export const CodeInFileFeedback = createExample(TestedComponent[type].solve, { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.CodeInFile, + filename: "asd", + display_hint: "hint", }, - } as ReducerState, -); + }, +} as ReducerState); -export const MessageRateLimitExceededFeedback = createExample( +export const CodeSentFeedback = createExample(TestedComponent[type].solve, { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.CodeSent, + address_hint: "asdasd", + display_hint: "qweqweqw", + }, + }, +} as ReducerState); + +export const SolvedFeedback = createExample(TestedComponent[type].solve, { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.Solved, + }, + }, +} as ReducerState); + +export const ServerFailureFeedback = createExample( TestedComponent[type].solve, { ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equals NP?", - type: "question", - uuid: "ASDASDSAD!1", - }, - ], - policies: [], - }, + recovery_information, selected_challenge_uuid: "ASDASDSAD!1", challenge_feedback: { "ASDASDSAD!1": { - state: ChallengeFeedbackStatus.RateLimitExceeded, + state: ChallengeFeedbackStatus.ServerFailure, + http_status: 500, }, }, } as ReducerState, ); -export const UnsupportedFeedback = createExample(TestedComponent[type].solve, { +export const TruthUnknownFeedback = createExample(TestedComponent[type].solve, { ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equals NP?", - type: "question", - uuid: "ASDASDSAD!1", - }, - ], - policies: [], - }, + recovery_information, selected_challenge_uuid: "ASDASDSAD!1", challenge_feedback: { "ASDASDSAD!1": { - state: ChallengeFeedbackStatus.Unsupported, - http_status: 500, - unsupported_method: "Question", + state: ChallengeFeedbackStatus.TruthUnknown, }, }, } as ReducerState); -export const TruthUnknownFeedback = createExample(TestedComponent[type].solve, { +export const TalerPaymentFeedback = createExample(TestedComponent[type].solve, { ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equals NP?", - type: "question", - uuid: "ASDASDSAD!1", - }, - ], - policies: [], - }, + recovery_information, selected_challenge_uuid: "ASDASDSAD!1", challenge_feedback: { "ASDASDSAD!1": { - state: ChallengeFeedbackStatus.TruthUnknown, + state: ChallengeFeedbackStatus.TalerPayment, + payment_secret: "secret", + provider: "asdasdas", + taler_pay_uri: "taler://pay/...", }, }, } as ReducerState); -const ibanFeedback: ChallengeFeedbackBankTransferRequired = { - state: ChallengeFeedbackStatus.IbanInstructions, - challenge_amount: "EUR:1", - target_iban: "DE12345789000", - target_business_name: "Data Loss Incorporated", - wire_transfer_subject: "Anastasis 987654321", - answer_code: 987654321, -}; - -export const AuthIbanFeedback = createExample(TestedComponent[type].solve, { +export const UnsupportedFeedback = createExample(TestedComponent[type].solve, { ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equals NP?", - type: "question", - uuid: "ASDASDSAD!1", - }, - ], - policies: [], - }, + recovery_information, selected_challenge_uuid: "ASDASDSAD!1", challenge_feedback: { - "ASDASDSAD!1": ibanFeedback, + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.Unsupported, + unsupported_method: "method", + }, }, } as ReducerState); -export const PaymentFeedback = createExample(TestedComponent[type].solve, { - ...reducerStatesExample.challengeSolving, - recovery_information: { - challenges: [ - { - instructions: "does P equals NP?", - type: "question", - uuid: "ASDASDSAD!1", +export const RateLimitExceededFeedback = createExample( + TestedComponent[type].solve, + { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.RateLimitExceeded, }, - ], - policies: [], - }, - selected_challenge_uuid: "ASDASDSAD!1", - challenge_feedback: { - "ASDASDSAD!1": { - state: ChallengeFeedbackStatus.TalerPayment, - taler_pay_uri: "taler://pay/...", - provider: "https://localhost:8080/", - payment_secret: "3P4561HAMHRRYEYD6CM6J7TS5VTD5SR2K2EXJDZEFSX92XKHR4KG", }, - }, -} as ReducerState); + } as ReducerState, +); + +export const IbanInstructionsFeedback = createExample( + TestedComponent[type].solve, + { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.IbanInstructions, + challenge_amount: "EUR:1", + target_iban: "DE12345789000", + target_business_name: "Data Loss Incorporated", + wire_transfer_subject: "Anastasis 987654321", + answer_code: 987654321, + }, + }, + } as ReducerState, +); + +export const IncorrectAnswerFeedback = createExample( + TestedComponent[type].solve, + { + ...reducerStatesExample.challengeSolving, + recovery_information, + selected_challenge_uuid: "ASDASDSAD!1", + challenge_feedback: { + "ASDASDSAD!1": { + state: ChallengeFeedbackStatus.IncorrectAnswer, + }, + }, + } as ReducerState, +); + +// export const AuthIbanFeedback = createExample(TestedComponent[type].solve, { +// ...reducerStatesExample.challengeSolving, +// recovery_information: { +// challenges: [ +// { +// instructions: "does P equals NP?", +// type: "question", +// uuid: "ASDASDSAD!1", +// }, +// ], +// policies: [], +// }, +// selected_challenge_uuid: "ASDASDSAD!1", +// challenge_feedback: { +// "ASDASDSAD!1": ibanFeedback, +// }, +// } as ReducerState); + +// export const PaymentFeedback = createExample(TestedComponent[type].solve, { +// ...reducerStatesExample.challengeSolving, +// recovery_information: { +// challenges: [ +// { +// instructions: "does P equals NP?", +// type: "question", +// uuid: "ASDASDSAD!1", +// }, +// ], +// policies: [], +// }, +// selected_challenge_uuid: "ASDASDSAD!1", +// challenge_feedback: { +// "ASDASDSAD!1": { +// state: ChallengeFeedbackStatus.TalerPayment, +// taler_pay_uri: "taler://pay/...", +// provider: "https://localhost:8080/", +// payment_secret: "3P4561HAMHRRYEYD6CM6J7TS5VTD5SR2K2EXJDZEFSX92XKHR4KG", +// }, +// }, +// } as ReducerState); diff --git a/packages/anastasis-webui/src/pages/home/index.storiesNo.tsx b/packages/anastasis-webui/src/pages/home/index.storiesNo.tsx index 31595111a..0dad73724 100644 --- a/packages/anastasis-webui/src/pages/home/index.storiesNo.tsx +++ b/packages/anastasis-webui/src/pages/home/index.storiesNo.tsx @@ -20,7 +20,7 @@ */ export * as AddingProviderScreen from "./AddingProviderScreen/stories.js"; -export * as algo from "./AttributeEntryScreen.stories.js"; +export * as AttributeEntryScreen from "./AttributeEntryScreen.stories.js"; export * as AuthenticationEditorScreen from "./AuthenticationEditorScreen.stories.js"; export * as authMethod_AuthMethodEmailSetup from "./authMethod/AuthMethodEmailSetup.stories.js"; diff --git a/packages/anastasis-webui/src/pages/home/index.tsx b/packages/anastasis-webui/src/pages/home/index.tsx index 25d9c63d9..44e065807 100644 --- a/packages/anastasis-webui/src/pages/home/index.tsx +++ b/packages/anastasis-webui/src/pages/home/index.tsx @@ -85,7 +85,7 @@ function ErrorBoundary(props: { children: ComponentChildren; }): VNode { const [error, resetError] = useErrorBoundary((error) => - console.log("got error", error), + console.log("ErrorBoundary got error", error), ); if (error) { return ( @@ -132,7 +132,7 @@ export function AnastasisClientFrame(props: AnastasisClientFrameProps): VNode { history.pushState({ id: nextId }, "unused", `#${nextId}`); } catch (e) { - console.log(e); + console.log("ERROR doNext ", e); } } diff --git a/packages/anastasis-webui/src/stories.tsx b/packages/anastasis-webui/src/stories.tsx index fb37cdfa5..7d22deece 100644 --- a/packages/anastasis-webui/src/stories.tsx +++ b/packages/anastasis-webui/src/stories.tsx @@ -38,7 +38,6 @@ function parseExampleImport( im: any, name?: string, ): ComponentItem { - console.log(im); const component = name || im.default.title; const order: number = im.default.args?.order || 0; return { @@ -372,9 +371,8 @@ function LiveReload({ port = 8002 }: { port?: number }): VNode { } function setupLiveReload(port: number, onReload: () => void): void { - const protocol = location.protocol === "https:" ? "wss:" : "ws:"; - const host = location.hostname; - const socketPath = `${protocol}//${host}:${port}/socket`; + const socketPath = `ws://localhost:8003/socket`; + // const socketPath = `${protocol}//${host}:${port}/socket`; const ws = new WebSocket(socketPath); ws.onmessage = (message) => { diff --git a/packages/anastasis-webui/src/utils/index.tsx b/packages/anastasis-webui/src/utils/index.tsx index 63bed9392..f87dd7f13 100644 --- a/packages/anastasis-webui/src/utils/index.tsx +++ b/packages/anastasis-webui/src/utils/index.tsx @@ -54,7 +54,7 @@ export function createExample( discoverMore: noop, discoverStart: noop, discoveryState: { - state: "none", + state: "finished", }, currentError: undefined, back: noop, @@ -204,14 +204,17 @@ const base = { } as AuthenticationProviderStatusOk, "http://localhost:8087/": { + status: "error", code: 8414, hint: "request to provider failed", } as AuthenticationProviderStatusError, "http://localhost:8088/": { + status: "error", code: 8414, hint: "request to provider failed", } as AuthenticationProviderStatusError, "http://localhost:8089/": { + status: "error", code: 8414, hint: "request to provider failed", } as AuthenticationProviderStatusError, -- cgit v1.2.3