summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/mui/handlers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-webextension/src/mui/handlers.ts')
-rw-r--r--packages/taler-wallet-webextension/src/mui/handlers.ts51
1 files changed, 43 insertions, 8 deletions
diff --git a/packages/taler-wallet-webextension/src/mui/handlers.ts b/packages/taler-wallet-webextension/src/mui/handlers.ts
index 655fceef9..a194bd02a 100644
--- a/packages/taler-wallet-webextension/src/mui/handlers.ts
+++ b/packages/taler-wallet-webextension/src/mui/handlers.ts
@@ -14,23 +14,58 @@
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;
+ error?: string | Error;
}
export interface AmountFieldHandler {
- onInput?: (value: AmountJson) => Promise<void>;
+ onInput?: SafeHandler<AmountJson>;
value: AmountJson;
- error?: string;
+ error?: string | Error;
}
+declare const __safe_handler: unique symbol;
+export type SafeHandler<T> = {
+ <Req extends T>(req: Req): Promise<void>;
+ (): Promise<void>;
+ [__safe_handler]: true;
+};
+
+type UnsafeHandler<T> = ((p: T) => Promise<void>) | ((p: T) => void);
+
+export function withSafe<T>(
+ handler: UnsafeHandler<T>,
+ 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>;
+
+//FIXME: UI button should required SafeHandler but
+//useStateComponent should not be required to create SafeHandlers
+//so this need to be split in two:
+// * ButtonHandlerUI => with i18n
+// * ButtonHandlerLogic => without i18n
export interface ButtonHandler {
- onClick?: () => Promise<void>;
- error?: TalerError;
+ onClick?: SafeHandler<void>;
+ // error?: TalerError;
}
export interface ToggleHandler {
@@ -39,7 +74,7 @@ export interface ToggleHandler {
}
export interface SelectFieldHandler {
- onChange?: (value: string) => Promise<void>;
+ onChange?: SafeHandler<string>;
error?: string;
value: string;
isDirty?: boolean;