/* This file is part of GNU Anastasis (C) 2021-2022 Anastasis SARL GNU Anastasis is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Anastasis 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with GNU Anastasis; see the file COPYING. If not, see */ import { AuthenticationProviderStatusError, AuthenticationProviderStatusOk, BackupStates, RecoveryStates, ReducerState, ReducerStateRecovery, } from "@gnu-taler/anastasis-core"; import { VNode } from "preact"; const noop = async (): Promise => { return; }; const base = { continents: [ { name: "Europe", }, { name: "India", }, { name: "Asia", }, { name: "North America", }, { name: "Testcontinent", }, ], countries: [ { code: "xx", name: "Testland", continent: "Testcontinent", continent_i18n: { de_DE: "Testkontinent", }, name_i18n: { de_DE: "Testlandt", de_CH: "Testlandi", fr_FR: "Testpais", en_UK: "Testland", }, currency: "TESTKUDOS", call_code: "+00", }, { code: "xy", name: "Demoland", continent: "Testcontinent", continent_i18n: { de_DE: "Testkontinent", }, name_i18n: { de_DE: "Demolandt", de_CH: "Demolandi", fr_FR: "Demopais", en_UK: "Demoland", }, currency: "KUDOS", call_code: "+01", }, ], authentication_providers: { "http://localhost:8086/": { status: "ok", http_status: 200, annual_fee: "COL:0", business_name: "Anastasis Local", currency: "COL", liability_limit: "COL:10", methods: [ { type: "question", usage_fee: "COL:0", }, { type: "sms", usage_fee: "COL:0", }, { type: "email", usage_fee: "COL:0", }, ], provider_salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", storage_limit_in_megabytes: 16, truth_upload_fee: "COL:0", } as AuthenticationProviderStatusOk, "https://kudos.demo.anastasis.lu/": { status: "ok", http_status: 200, annual_fee: "COL:0", business_name: "Anastasis Kudo", currency: "COL", liability_limit: "COL:10", methods: [ { type: "question", usage_fee: "COL:0", }, { type: "email", usage_fee: "COL:0", }, ], provider_salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", storage_limit_in_megabytes: 16, truth_upload_fee: "COL:0", } as AuthenticationProviderStatusOk, "https://anastasis.demo.taler.net/": { status: "ok", http_status: 200, annual_fee: "COL:0", business_name: "Anastasis Demo", currency: "COL", liability_limit: "COL:10", methods: [ { type: "question", usage_fee: "COL:0", }, { type: "sms", usage_fee: "COL:0", }, { type: "totp", usage_fee: "COL:0", }, ], provider_salt: "WBMDD76BR1E90YQ5AHBMKPH7GW", storage_limit_in_megabytes: 16, truth_upload_fee: "COL:0", } 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, }, } as Partial; export const reducerStatesExample = { initial: undefined, recoverySelectCountry: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.CountrySelecting, } as ReducerState, recoverySelectContinent: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.ContinentSelecting, } as ReducerState, secretSelection: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.SecretSelecting, } as ReducerState, recoveryFinished: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.RecoveryFinished, } as ReducerState, challengeSelecting: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.ChallengeSelecting, } as ReducerState, challengeSolving: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.ChallengeSolving, } as ReducerStateRecovery, challengePaying: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.ChallengePaying, } as ReducerState, recoveryAttributeEditing: { ...base, reducer_type: "recovery", recovery_state: RecoveryStates.UserAttributesCollecting, } as ReducerState, backupSelectCountry: { ...base, reducer_type: "backup", backup_state: BackupStates.CountrySelecting, } as ReducerState, backupSelectContinent: { ...base, reducer_type: "backup", backup_state: BackupStates.ContinentSelecting, } as ReducerState, secretEdition: { ...base, reducer_type: "backup", backup_state: BackupStates.SecretEditing, } as ReducerState, policyReview: { ...base, reducer_type: "backup", backup_state: BackupStates.PoliciesReviewing, } as ReducerState, policyPay: { ...base, reducer_type: "backup", backup_state: BackupStates.PoliciesPaying, } as ReducerState, backupFinished: { ...base, reducer_type: "backup", backup_state: BackupStates.BackupFinished, } as ReducerState, authEditing: { ...base, backup_state: BackupStates.AuthenticationsEditing, reducer_type: "backup", } as ReducerState, backupAttributeEditing: { ...base, reducer_type: "backup", backup_state: BackupStates.UserAttributesCollecting, } as ReducerState, truthsPaying: { ...base, reducer_type: "backup", backup_state: BackupStates.TruthsPaying, } as ReducerState, }; export type StateFunc = (p: S) => VNode; export type StateViewMap = { [S in StateType as S["status"]]: StateFunc; }; export function compose( name: string, hook: (p: PType) => SType, vs: StateViewMap, ): (p: PType) => VNode { const Component = (p: PType): VNode => { const state = hook(p); const s = state.status as unknown as SType["status"]; const c = vs[s] as unknown as StateFunc; return c(state); }; // Component.name = `${name}`; return Component; }