diff options
author | Sebastian <sebasjm@gmail.com> | 2023-01-09 20:20:09 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-01-09 20:20:09 -0300 |
commit | 4a781bd0dd8828ce152f6ab2c3f1bbd6b5e826f7 (patch) | |
tree | 5c16976f99eb973ff62d78ed64107ca01df57b99 /packages/taler-wallet-webextension/src/mui | |
parent | 8a70edb2f8e235c3462127b0aa4e1b65aa1aee0b (diff) | |
download | wallet-core-4a781bd0dd8828ce152f6ab2c3f1bbd6b5e826f7.tar.xz |
fix #7153: more error handling
if handler do not trap error then fail at compile time,
all safe handlers push alert on error
errors are typed so they render good information
Diffstat (limited to 'packages/taler-wallet-webextension/src/mui')
-rw-r--r-- | packages/taler-wallet-webextension/src/mui/handlers.ts | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/packages/taler-wallet-webextension/src/mui/handlers.ts b/packages/taler-wallet-webextension/src/mui/handlers.ts index 655fceef9..61786742f 100644 --- a/packages/taler-wallet-webextension/src/mui/handlers.ts +++ b/packages/taler-wallet-webextension/src/mui/handlers.ts @@ -14,23 +14,51 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ import { AmountJson } from "@gnu-taler/taler-util"; -import { TalerError } from "@gnu-taler/taler-wallet-core"; export interface TextFieldHandler { - onInput?: (value: string) => Promise<void>; + onInput?: SafeHandler<string>; value: string; error?: string; } export interface AmountFieldHandler { - onInput?: (value: AmountJson) => Promise<void>; + onInput?: SafeHandler<AmountJson>; value: AmountJson; error?: string; } +declare const __safe_handler: unique symbol; +export type SafeHandler<T> = { + <Req extends T>(req: Req): Promise<void>; + (): Promise<void>; + [__safe_handler]: true; +}; + +export function withSafe<T>( + handler: (p: T) => Promise<void>, + onError: (e: Error) => void, +): SafeHandler<T> { + const sh = async function (p: T): Promise<void> { + try { + await handler(p); + } catch (e) { + if (e instanceof Error) { + onError(e); + } else { + onError(new Error(String(e))); + } + } + }; + return sh as SafeHandler<T>; +} + +export const nullFunction = async function (): Promise<void> { + //do nothing +} as SafeHandler<void>; + export interface ButtonHandler { - onClick?: () => Promise<void>; - error?: TalerError; + onClick?: SafeHandler<void>; + // error?: TalerError; } export interface ToggleHandler { @@ -39,7 +67,7 @@ export interface ToggleHandler { } export interface SelectFieldHandler { - onChange?: (value: string) => Promise<void>; + onChange?: SafeHandler<string>; error?: string; value: string; isDirty?: boolean; |