From 31bb78bfca5369790054860f1bb1985fbd38fa44 Mon Sep 17 00:00:00 2001 From: Abdullah Atta Date: Mon, 4 Aug 2025 11:54:38 +0500 Subject: [PATCH] web: add `onBeforeOpen` hook to dialog manager --- apps/web/src/common/dialog-manager.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/web/src/common/dialog-manager.tsx b/apps/web/src/common/dialog-manager.tsx index ff9ecec77..e9aa12003 100644 --- a/apps/web/src/common/dialog-manager.tsx +++ b/apps/web/src/common/dialog-manager.tsx @@ -24,6 +24,17 @@ export interface BaseDialogProps { onClose: (result: T) => void; } +type PropsWithoutOnClose> = Omit< + Props, + "onClose" +>; + +type DialogOptions> = { + onBeforeOpen?: ( + props: PropsWithoutOnClose + ) => boolean | Promise; +}; + class _DialogManager { private openedDialogs: Map, () => void> = new Map(); @@ -83,10 +94,15 @@ class _DialogManager { } register>( - component: React.ComponentType + component: React.ComponentType, + options?: DialogOptions ) { return { - show: (props: Omit) => this.open(component, props), + show: async (props: PropsWithoutOnClose) => { + if (options?.onBeforeOpen && !(await options?.onBeforeOpen?.(props))) + return false; + return await this.open(component, props); + }, close: () => { const dialog = this.openedDialogs.get(component); if (!dialog) return;