diff --git a/packages/anastasis-core/src/reducer-types.ts b/packages/anastasis-core/src/reducer-types.ts
index f7ba9e0f1..1a443bf9b 100644
--- a/packages/anastasis-core/src/reducer-types.ts
+++ b/packages/anastasis-core/src/reducer-types.ts
@@ -23,7 +23,7 @@ export interface Policy {
authentication_method: number;
provider: string;
}[];
-}
+}
export interface PolicyProvider {
provider_url: string;
@@ -51,7 +51,7 @@ export interface ReducerStateBackup {
identity_attributes?: { [n: string]: string };
authentication_providers?: { [url: string]: AuthenticationProviderStatus };
authentication_methods?: AuthMethod[];
- required_attributes?: any;
+ required_attributes?: UserAttributeSpec[];
selected_continent?: string;
selected_country?: string;
secret_name?: string;
@@ -133,7 +133,7 @@ export interface ReducerStateRecovery {
selected_country?: string;
currencies?: string[];
- required_attributes?: any;
+ required_attributes?: UserAttributeSpec[];
/**
* Recovery information, used by the UI.
diff --git a/packages/anastasis-webui/.gitignore b/packages/anastasis-webui/.gitignore
index 5baa9defe..32d0a5057 100644
--- a/packages/anastasis-webui/.gitignore
+++ b/packages/anastasis-webui/.gitignore
@@ -2,3 +2,4 @@ node_modules
/build
/*.log
/size-plugin.json
+/storybook-static/
diff --git a/packages/anastasis-webui/.storybook/.babelrc b/packages/anastasis-webui/.storybook/.babelrc
new file mode 100644
index 000000000..610b6f339
--- /dev/null
+++ b/packages/anastasis-webui/.storybook/.babelrc
@@ -0,0 +1,25 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+ /**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+{
+ "presets": [
+ "preact-cli/babel"
+ ]
+}
\ No newline at end of file
diff --git a/packages/anastasis-webui/.storybook/main.js b/packages/anastasis-webui/.storybook/main.js
new file mode 100644
index 000000000..f8e4bbcc7
--- /dev/null
+++ b/packages/anastasis-webui/.storybook/main.js
@@ -0,0 +1,57 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+
+module.exports = {
+ "stories": [
+ "../src/**/*.stories.mdx",
+ "../src/**/*.stories.@(js|jsx|ts|tsx)"
+ ],
+ "addons": [
+ "@storybook/preset-scss",
+ "@storybook/addon-a11y",
+ "@storybook/addon-essentials" //docs, control, actions, viewpot, toolbar, background
+ ],
+ // sb does not yet support new jsx transform by default
+ // https://github.com/storybookjs/storybook/issues/12881
+ // https://github.com/storybookjs/storybook/issues/12952
+ babel: async (options) => ({
+ ...options,
+ presets: [
+ ...options.presets,
+ [
+ '@babel/preset-react', {
+ runtime: 'automatic',
+ },
+ 'preset-react-jsx-transform'
+ ],
+ ],
+ }),
+ webpackFinal: (config) => {
+ // should be removed after storybook 6.3
+ // https://github.com/storybookjs/storybook/issues/12853#issuecomment-821576113
+ config.resolve.alias = {
+ react: "preact/compat",
+ "react-dom": "preact/compat",
+ };
+ return config;
+ },
+}
\ No newline at end of file
diff --git a/packages/anastasis-webui/.storybook/preview.js b/packages/anastasis-webui/.storybook/preview.js
new file mode 100644
index 000000000..7cb9405ba
--- /dev/null
+++ b/packages/anastasis-webui/.storybook/preview.js
@@ -0,0 +1,49 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+import "../src/scss/main.scss"
+import { TranslationProvider } from '../src/context/translation'
+import { h } from 'preact';
+
+
+export const parameters = {
+ controls: { expanded: true },
+}
+
+export const globalTypes = {
+ locale: {
+ name: 'Locale',
+ description: 'Internationalization locale',
+ defaultValue: 'en',
+ toolbar: {
+ icon: 'globe',
+ items: [
+ { value: 'en', right: 'πΊπΈ', title: 'English' },
+ { value: 'es', right: 'πͺπΈ', title: 'Spanish' },
+ ],
+ },
+ },
+};
+
+export const decorators = [
+ (Story, { globals }) => {
+ document.body.parentElement.classList = "has-aside-left has-aside-mobile-transition has-navbar-fixed-top has-aside-expanded"
+ return
+ },
+ (Story, { globals }) =>
+
+ ,
+];
diff --git a/packages/anastasis-webui/package.json b/packages/anastasis-webui/package.json
index 8f7711313..57cfdd8d4 100644
--- a/packages/anastasis-webui/package.json
+++ b/packages/anastasis-webui/package.json
@@ -8,7 +8,9 @@
"serve": "sirv build --port 8080 --cors --single",
"dev": "preact watch",
"lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
- "test": "jest ./tests"
+ "test": "jest ./tests",
+ "build-storybook": "build-storybook",
+ "storybook": "start-storybook -p 6006"
},
"eslintConfig": {
"parser": "@typescript-eslint/parser",
@@ -30,6 +32,12 @@
},
"devDependencies": {
"@creativebulma/bulma-tooltip": "^1.2.0",
+ "@storybook/addon-a11y": "^6.2.9",
+ "@storybook/addon-actions": "^6.2.9",
+ "@storybook/addon-essentials": "^6.2.9",
+ "@storybook/addon-links": "^6.2.9",
+ "@storybook/preact": "^6.2.9",
+ "@storybook/preset-scss": "^1.0.3",
"@types/enzyme": "^3.10.5",
"@types/jest": "^26.0.8",
"@typescript-eslint/eslint-plugin": "^2.25.0",
diff --git a/packages/anastasis-webui/src/components/menu/SideBar.tsx b/packages/anastasis-webui/src/components/menu/SideBar.tsx
index 628adb571..df582a5d0 100644
--- a/packages/anastasis-webui/src/components/menu/SideBar.tsx
+++ b/packages/anastasis-webui/src/components/menu/SideBar.tsx
@@ -20,7 +20,9 @@
*/
-import { h, VNode } from 'preact';
+import { Fragment, h, VNode } from 'preact';
+import { BackupStates, RecoveryStates } from '../../../../anastasis-core/lib';
+import { useAnastasisContext } from '../../context/anastasis';
import { Translate } from '../../i18n';
import { LangSelector } from './LangSelector';
@@ -31,8 +33,9 @@ interface Props {
export function Sidebar({ mobile }: Props): VNode {
// const config = useConfigContext();
const config = { version: 'none' }
- const process = { env : { __VERSION__: '0.0.0'}}
-
+ const process = { env: { __VERSION__: '0.0.0' } }
+ const reducer = useAnastasisContext()!
+
return (
diff --git a/packages/anastasis-webui/src/context/anastasis.ts b/packages/anastasis-webui/src/context/anastasis.ts
new file mode 100644
index 000000000..e7f93ed43
--- /dev/null
+++ b/packages/anastasis-webui/src/context/anastasis.ts
@@ -0,0 +1,41 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createContext, h, VNode } from 'preact';
+import { useContext } from 'preact/hooks';
+import { AnastasisReducerApi } from '../hooks/use-anastasis-reducer';
+
+type Type = AnastasisReducerApi | undefined;
+
+const initial = undefined
+
+const Context = createContext(initial)
+
+interface Props {
+ value: AnastasisReducerApi;
+ children: any;
+}
+
+export const AnastasisProvider = ({ value, children }: Props): VNode => {
+ return h(Context.Provider, { value, children });
+}
+
+export const useAnastasisContext = (): Type => useContext(Context);
\ No newline at end of file
diff --git a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx
new file mode 100644
index 000000000..d28a6df43
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.stories.tsx
@@ -0,0 +1,63 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { AttributeEntryScreen as TestedComponent } from './AttributeEntryScreen';
+
+
+export default {
+ title: 'Pages/AttributeEntryScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const WithSomeAttributes = createExample(TestedComponent, {
+ ...reducerStatesExample.attributeEditing,
+ required_attributes: [{
+ name: 'first',
+ label: 'first',
+ type: 'type',
+ uuid: 'asdasdsa1',
+ widget: 'wid',
+ }, {
+ name: 'pepe',
+ label: 'second',
+ type: 'type',
+ uuid: 'asdasdsa2',
+ widget: 'wid',
+ }, {
+ name: 'pepe2',
+ label: 'third',
+ type: 'type',
+ uuid: 'asdasdsa3',
+ widget: 'calendar',
+ }]
+} as ReducerState);
+
+export const Empty = createExample(TestedComponent, {
+ ...reducerStatesExample.attributeEditing,
+ required_attributes: undefined
+} as ReducerState);
diff --git a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
index 6f87a3358..2f804f940 100644
--- a/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/AttributeEntryScreen.tsx
@@ -1,15 +1,24 @@
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import { ReducerStateRecovery, ReducerStateBackup } from "../../../../anastasis-core/lib";
+import { ReducerStateRecovery, ReducerStateBackup, UserAttributeSpec } from "anastasis-core/lib";
+import { useAnastasisContext } from "../../context/anastasis";
import { AnastasisReducerApi } from "../../hooks/use-anastasis-reducer";
import { AnastasisClientFrame, withProcessLabel, LabeledInput } from "./index";
-export function AttributeEntryScreen(props: AttributeEntryProps): VNode {
- const { reducer, reducerState: backupState } = props;
- const [attrs, setAttrs] = useState>(
- props.reducerState.identity_attributes ?? {}
- );
+export function AttributeEntryScreen(): VNode {
+ const reducer = useAnastasisContext()
+ const state = reducer?.currentReducerState
+ const currentIdentityAttributes = state && "identity_attributes" in state ? (state.identity_attributes || {}) : {}
+ const [attrs, setAttrs] = useState>(currentIdentityAttributes);
+
+ if (!reducer) {
+ return
no reducer in context
+ }
+ if (!reducer.currentReducerState || !("required_attributes" in reducer.currentReducerState)) {
+ return
invalid state
+ }
+
return (
- {backupState.required_attributes.map((x: any, i: number) => {
+ {reducer.currentReducerState.required_attributes?.map((x, i: number) => {
return (
void;
- spec: any;
+ spec: UserAttributeSpec;
}
export function AttributeEntryField(props: AttributeEntryFieldProps): VNode {
diff --git a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx
new file mode 100644
index 000000000..44d3795b2
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.stories.tsx
@@ -0,0 +1,35 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createExample, reducerStatesExample } from '../../utils';
+import { AuthenticationEditorScreen as TestedComponent } from './AuthenticationEditorScreen';
+
+
+export default {
+ title: 'Pages/AuthenticationEditorScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Example = createExample(TestedComponent, reducerStatesExample.authEditing);
diff --git a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
index fc28942aa..e9ffccbac 100644
--- a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
@@ -1,7 +1,8 @@
/* eslint-disable @typescript-eslint/camelcase */
+import { AuthMethod, ReducerStateBackup } from "anastasis-core";
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import { AuthMethod, ReducerStateBackup } from "anastasis-core";
+import { useAnastasisContext } from "../../context/anastasis";
import { AnastasisReducerApi } from "../../hooks/use-anastasis-reducer";
import { AuthMethodEmailSetup } from "./AuthMethodEmailSetup";
import { AuthMethodPostSetup } from "./AuthMethodPostSetup";
@@ -9,12 +10,18 @@ import { AuthMethodQuestionSetup } from "./AuthMethodQuestionSetup";
import { AuthMethodSmsSetup } from "./AuthMethodSmsSetup";
import { AnastasisClientFrame } from "./index";
-export function AuthenticationEditorScreen(props: AuthenticationEditorProps): VNode {
+export function AuthenticationEditorScreen(): VNode {
const [selectedMethod, setSelectedMethod] = useState(
undefined
);
- const { reducer, backupState } = props;
- const providers = backupState.authentication_providers!;
+ const reducer = useAnastasisContext()
+ if (!reducer) {
+ return
+ }
+ const providers = reducer.currentReducerState.authentication_providers!;
const authAvailableSet = new Set();
for (const provKey of Object.keys(providers)) {
const p = providers[provKey];
@@ -52,14 +59,14 @@ export function AuthenticationEditorScreen(props: AuthenticationEditorProps): VN
disabled={!authAvailableSet.has(props.method)}
onClick={() => {
setSelectedMethod(props.method);
- reducer.dismissError();
+ if (reducer) reducer.dismissError();
}}
>
{props.label}
);
}
- const configuredAuthMethods: AuthMethod[] = backupState.authentication_methods ?? [];
+ const configuredAuthMethods: AuthMethod[] = reducer.currentReducerState.authentication_methods ?? [];
const haveMethodsConfigured = configuredAuthMethods.length;
return (
diff --git a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx
new file mode 100644
index 000000000..65a2b7e13
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.stories.tsx
@@ -0,0 +1,60 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { BackupFinishedScreen as TestedComponent } from './BackupFinishedScreen';
+
+
+export default {
+ title: 'Pages/BackupFinishedScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Simple = createExample(TestedComponent, reducerStatesExample.backupFinished);
+
+export const WithName = createExample(TestedComponent, {...reducerStatesExample.backupFinished,
+ secret_name: 'super_secret',
+} as ReducerState);
+
+export const WithDetails = createExample(TestedComponent, {
+ ...reducerStatesExample.backupFinished,
+ secret_name: 'super_secret',
+ success_details: {
+ 'http://anastasis.net': {
+ policy_expiration: {
+ t_ms: 'never'
+ },
+ policy_version: 0
+ },
+ 'http://taler.net': {
+ policy_expiration: {
+ t_ms: new Date().getTime() + 60*60*24*1000
+ },
+ policy_version: 1
+ },
+ }
+} as ReducerState);
diff --git a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx
index 6c2770947..218f1d1fd 100644
--- a/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/BackupFinishedScreen.tsx
@@ -1,23 +1,33 @@
import { h, VNode } from "preact";
-import { BackupReducerProps, AnastasisClientFrame } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
-export function BackupFinishedScreen(props: BackupReducerProps): VNode {
+export function BackupFinishedScreen(): VNode {
+ const reducer = useAnastasisContext()
+ if (!reducer) {
+ return
- Your backup of secret "{props.backupState.secret_name ?? "??"}" was
+ Your backup of secret "{reducer.currentReducerState.secret_name ?? "??"}" was
successful.
}
+
);
}
diff --git a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx
new file mode 100644
index 000000000..4f186c031
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.stories.tsx
@@ -0,0 +1,83 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { ChallengeOverviewScreen as TestedComponent } from './ChallengeOverviewScreen';
+
+
+export default {
+ title: 'Pages/ChallengeOverviewScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const OneChallenge = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting,
+ recovery_information: {
+ policies: [[{uuid:'1'}]],
+ challenges: [{
+ cost: 'USD:1',
+ instructions: 'just go for it',
+ type: 'question',
+ uuid: '1',
+ }]
+ },
+} as ReducerState);
+
+export const MoreChallenges = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting,
+ recovery_information: {
+ policies: [[{uuid:'1'}, {uuid:'2'}],[{uuid:'3'}]],
+ challenges: [{
+ cost: 'USD:1',
+ instructions: 'just go for it',
+ type: 'question',
+ uuid: '1',
+ },{
+ cost: 'USD:1',
+ instructions: 'just go for it',
+ type: 'question',
+ uuid: '2',
+ },{
+ cost: 'USD:1',
+ instructions: 'just go for it',
+ type: 'question',
+ uuid: '3',
+ }]
+ },
+} as ReducerState);
+
+export const OneBadConfiguredPolicy = createExample(TestedComponent, {...reducerStatesExample.challengeSelecting,
+ recovery_information: {
+ policies: [[{uuid:'2'}]],
+ challenges: [{
+ cost: 'USD:1',
+ instructions: 'just go for it',
+ type: 'sasd',
+ uuid: '1',
+ }]
+ },
+} as ReducerState);
+
+export const NoPolicies = createExample(TestedComponent, reducerStatesExample.challengeSelecting);
diff --git a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
index 1f108ce6d..c9b52e91b 100644
--- a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
@@ -1,10 +1,21 @@
import { h, VNode } from "preact";
-import { RecoveryReducerProps, AnastasisClientFrame } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
+
+export function ChallengeOverviewScreen(): VNode {
+ const reducer = useAnastasisContext()
+
+ if (!reducer) {
+ return
reducer.transition("select_challenge", {
- uuid: x.uuid,
+ uuid: column.uuid,
})}
>
Solve
diff --git a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx
new file mode 100644
index 000000000..aad37cd7f
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.stories.tsx
@@ -0,0 +1,36 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createExample, reducerStatesExample } from '../../utils';
+import { ContinentSelectionScreen as TestedComponent } from './ContinentSelectionScreen';
+
+
+export default {
+ title: 'Pages/ContinentSelectionScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Backup = createExample(TestedComponent, reducerStatesExample.backupSelectCountry);
+export const Recovery = createExample(TestedComponent, reducerStatesExample.recoverySelectCountry);
diff --git a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
index 2fed23d4e..ad529a4a7 100644
--- a/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/ContinentSelectionScreen.tsx
@@ -1,15 +1,16 @@
import { h, VNode } from "preact";
-import { CommonReducerProps, AnastasisClientFrame, withProcessLabel } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame, withProcessLabel } from "./index";
-export function ContinentSelectionScreen(props: CommonReducerProps): VNode {
- const { reducer, reducerState } = props;
+export function ContinentSelectionScreen(): VNode {
+ const reducer = useAnastasisContext()
+ if (!reducer || !reducer.currentReducerState || !("continents" in reducer.currentReducerState)) {
+ return
+ }
const sel = (x: string): void => reducer.transition("select_continent", { continent: x });
return (
-
- {reducerState.continents.map((x: any) => (
+
+ {reducer.currentReducerState.continents.map((x: any) => (
diff --git a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx
new file mode 100644
index 000000000..adf36980f
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.stories.tsx
@@ -0,0 +1,36 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { createExample, reducerStatesExample } from '../../utils';
+import { CountrySelectionScreen as TestedComponent } from './CountrySelectionScreen';
+
+
+export default {
+ title: 'Pages/CountrySelectionScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Backup = createExample(TestedComponent, reducerStatesExample.backupSelectCountry);
+export const Recovery = createExample(TestedComponent, reducerStatesExample.recoverySelectCountry);
diff --git a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx
index dbe4b7616..555622c1d 100644
--- a/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/CountrySelectionScreen.tsx
@@ -1,19 +1,23 @@
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from "preact";
-import { CommonReducerProps, AnastasisClientFrame, withProcessLabel } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame, withProcessLabel } from "./index";
-export function CountrySelectionScreen(props: CommonReducerProps): VNode {
- const { reducer, reducerState } = props;
+export function CountrySelectionScreen(): VNode {
+ const reducer = useAnastasisContext()
+ if (!reducer) {
+ return
no reducer in context
+ }
+ if (!reducer.currentReducerState || !("countries" in reducer.currentReducerState)) {
+ return
invalid state
+ }
const sel = (x: any): void => reducer.transition("select_country", {
country_code: x.code,
currencies: [x.currency],
});
return (
-
- {reducerState.countries.map((x: any) => (
+
+ {reducer.currentReducerState.countries.map((x: any) => (
diff --git a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx
new file mode 100644
index 000000000..1a9462b88
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.stories.tsx
@@ -0,0 +1,47 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { PoliciesPayingScreen as TestedComponent } from './PoliciesPayingScreen';
+
+
+export default {
+ title: 'Pages/PoliciesPayingScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Example = createExample(TestedComponent, reducerStatesExample.policyPay);
+export const WithSomePaymentRequest = createExample(TestedComponent, {
+ ...reducerStatesExample.policyPay,
+ policy_payment_requests: [{
+ payto: 'payto://x-taler-bank/bank.taler/account-a',
+ provider: 'provider1'
+ }, {
+ payto: 'payto://x-taler-bank/bank.taler/account-b',
+ provider: 'provider2'
+ }]
+} as ReducerState);
diff --git a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx
index be74729eb..8a39cf0e4 100644
--- a/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/PoliciesPayingScreen.tsx
@@ -1,9 +1,17 @@
import { h, VNode } from "preact";
-import { BackupReducerProps, AnastasisClientFrame } from "./index";
-
-export function PoliciesPayingScreen(props: BackupReducerProps): VNode {
- const payments = props.backupState.policy_payment_requests ?? [];
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
+export function PoliciesPayingScreen(): VNode {
+ const reducer = useAnastasisContext()
+ if (!reducer) {
+ return
diff --git a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx
new file mode 100644
index 000000000..0c1842420
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.stories.tsx
@@ -0,0 +1,42 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { RecoveryFinishedScreen as TestedComponent } from './RecoveryFinishedScreen';
+
+
+export default {
+ title: 'Pages/RecoveryFinishedScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const NormalEnding = createExample(TestedComponent, {
+ ...reducerStatesExample.recoveryFinished,
+ core_secret: { mime: 'text/plain', value: 'hello' }
+} as ReducerState);
+
+export const BadEnding = createExample(TestedComponent, reducerStatesExample.recoveryFinished);
diff --git a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx
index 7ccc511ff..8c8a2c7c8 100644
--- a/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/RecoveryFinishedScreen.tsx
@@ -3,13 +3,31 @@ import {
decodeCrock
} from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
-import { RecoveryReducerProps, AnastasisClientFrame } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
-export function RecoveryFinishedScreen(props: RecoveryReducerProps): VNode {
+export function RecoveryFinishedScreen(): VNode {
+ const reducer = useAnastasisContext()
+
+ if (!reducer) {
+ return
);
diff --git a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx
new file mode 100644
index 000000000..b52699e7b
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.stories.tsx
@@ -0,0 +1,81 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { ReviewPoliciesScreen as TestedComponent } from './ReviewPoliciesScreen';
+
+
+export default {
+ title: 'Pages/ReviewPoliciesScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const HasPoliciesButMethodListIsEmpty = createExample(TestedComponent, {
+ ...reducerStatesExample.policyReview,
+ policies: [{
+ methods: [{
+ authentication_method: 0,
+ provider: 'asd'
+ },{
+ authentication_method: 1,
+ provider: 'asd'
+ }]
+ },{
+ methods: [{
+ authentication_method: 1,
+ provider: 'asd'
+ }]
+ }],
+ authentication_methods: []
+} as ReducerState);
+
+export const SomePoliciesWithMethods = createExample(TestedComponent, {
+ ...reducerStatesExample.policyReview,
+ policies: [{
+ methods: [{
+ authentication_method: 0,
+ provider: 'asd'
+ },{
+ authentication_method: 1,
+ provider: 'asd'
+ }]
+ },{
+ methods: [{
+ authentication_method: 1,
+ provider: 'asd'
+ }]
+ }],
+ authentication_methods: [{
+ challenge: 'asd',
+ instructions: 'ins',
+ type: 'type',
+ },{
+ challenge: 'asd2',
+ instructions: 'ins2',
+ type: 'type2',
+ }]
+} as ReducerState);
diff --git a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx
index 3e20538d2..b360ccaf0 100644
--- a/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/ReviewPoliciesScreen.tsx
@@ -1,35 +1,49 @@
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from "preact";
-import { BackupReducerProps, AnastasisClientFrame } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
+
+export function ReviewPoliciesScreen(): VNode {
+ const reducer = useAnastasisContext()
+ if (!reducer) {
+ return
- {m.type} ({m.instructions}) at provider {x.provider}
+ {m.type} ({m.instructions}) at provider {m.provider}
);
})}
reducer.transition("delete_policy", { policy_index: i })}
+ onClick={() => reducer.transition("delete_policy", { policy_index })}
>
Delete Policy
diff --git a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx
new file mode 100644
index 000000000..18560356a
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.stories.tsx
@@ -0,0 +1,44 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { SecretEditorScreen as TestedComponent } from './SecretEditorScreen';
+
+
+export default {
+ title: 'Pages/SecretEditorScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const WithSecretNamePreselected = createExample(TestedComponent, {
+ ...reducerStatesExample.secretEdition,
+ secret_name: 'someSecretName',
+} as ReducerState);
+
+export const WithoutName = createExample(TestedComponent, {
+ ...reducerStatesExample.secretEdition,
+} as ReducerState);
diff --git a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
index 086d4921d..a5235d66c 100644
--- a/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SecretEditorScreen.tsx
@@ -2,18 +2,29 @@
import { encodeCrock, stringToBytes } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
+import { useAnastasisContext } from "../../context/anastasis";
import {
- BackupReducerProps,
AnastasisClientFrame,
- LabeledInput,
+ LabeledInput
} from "./index";
-export function SecretEditorScreen(props: BackupReducerProps): VNode {
- const { reducer } = props;
- const [secretName, setSecretName] = useState(
- props.backupState.secret_name ?? "",
- );
+export function SecretEditorScreen(): VNode {
+ const reducer = useAnastasisContext()
const [secretValue, setSecretValue] = useState("");
+
+ const currentSecretName = reducer?.currentReducerState
+ && ("secret_name" in reducer.currentReducerState)
+ && reducer.currentReducerState.secret_name;
+
+ const [secretName, setSecretName] = useState(currentSecretName || "");
+
+ if (!reducer) {
+ return
+ }
+
const secretNext = (): void => {
reducer.runTransaction(async (tx) => {
await tx.transition("enter_secret_name", {
diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx
new file mode 100644
index 000000000..e9c597023
--- /dev/null
+++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.stories.tsx
@@ -0,0 +1,50 @@
+/* eslint-disable @typescript-eslint/camelcase */
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { ReducerState } from 'anastasis-core';
+import { createExample, reducerStatesExample } from '../../utils';
+import { SecretSelectionScreen as TestedComponent } from './SecretSelectionScreen';
+
+
+export default {
+ title: 'Pages/SecretSelectionScreen',
+ component: TestedComponent,
+ argTypes: {
+ onUpdate: { action: 'onUpdate' },
+ onBack: { action: 'onBack' },
+ },
+};
+
+export const Example = createExample(TestedComponent, {
+ ...reducerStatesExample.secretSelection,
+ recovery_document: {
+ provider_url: 'http://anastasis.url/',
+ secret_name: 'secretName',
+ version: 1,
+ },
+} as ReducerState);
+
+
+export const NoRecoveryDocumentFound = createExample(TestedComponent, {
+ ...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 7cb7fdf20..903f57868 100644
--- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx
@@ -1,17 +1,29 @@
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import { RecoveryReducerProps, AnastasisClientFrame } from "./index";
+import { useAnastasisContext } from "../../context/anastasis";
+import { AnastasisClientFrame } from "./index";
-export function SecretSelectionScreen(props: RecoveryReducerProps): VNode {
- const { reducer, recoveryState } = props;
+export function SecretSelectionScreen(): VNode {
const [selectingVersion, setSelectingVersion] = useState(false);
- const [otherVersion, setOtherVersion] = useState(
- recoveryState.recovery_document?.version ?? 0
- );
- const recoveryDocument = recoveryState.recovery_document!;
const [otherProvider, setOtherProvider] = useState("");
+ const reducer = useAnastasisContext()
+
+ const currentVersion = reducer?.currentReducerState
+ && ("recovery_document" in reducer.currentReducerState)
+ && reducer.currentReducerState.recovery_document?.version;
+
+ const [otherVersion, setOtherVersion] = useState(currentVersion || 0);
+
+ if (!reducer) {
+ return