import { ref, readonly } from 'vue' import type { DeepReadonly, Ref } from 'vue' import { DIALOG_VARIANT } from '@/scripts/config/constants' import type { DialogVariant } from '@/scripts/config/constants' export interface DialogState { active: boolean title: string message: string variant: DialogVariant yesLabel: string noLabel: string hideNoButton: boolean data: unknown } export interface OpenConfirmOptions { title: string message: string variant?: DialogVariant yesLabel?: string noLabel?: string hideNoButton?: boolean data?: unknown } export interface UseDialogReturn { dialogState: DeepReadonly> openConfirm: (options: OpenConfirmOptions) => Promise closeDialog: () => void confirmDialog: () => void cancelDialog: () => void } const DEFAULT_STATE: DialogState = { active: false, title: '', message: '', variant: DIALOG_VARIANT.DANGER, yesLabel: 'Yes', noLabel: 'No', hideNoButton: false, data: null, } const dialogState = ref({ ...DEFAULT_STATE }) let resolvePromise: ((value: boolean) => void) | null = null /** * Composable for managing confirmation dialogs. * Returns a promise that resolves to true (confirmed) or false (cancelled). */ export function useDialog(): UseDialogReturn { /** * Open a confirmation dialog and await the user's response. * * @param options - Dialog configuration * @returns Promise that resolves to true if confirmed, false if cancelled */ function openConfirm(options: OpenConfirmOptions): Promise { dialogState.value = { active: true, title: options.title, message: options.message, variant: options.variant ?? DIALOG_VARIANT.DANGER, yesLabel: options.yesLabel ?? 'Yes', noLabel: options.noLabel ?? 'No', hideNoButton: options.hideNoButton ?? false, data: options.data ?? null, } return new Promise((resolve) => { resolvePromise = resolve }) } function confirmDialog(): void { if (resolvePromise) { resolvePromise(true) resolvePromise = null } resetDialog() } function cancelDialog(): void { if (resolvePromise) { resolvePromise(false) resolvePromise = null } resetDialog() } function closeDialog(): void { cancelDialog() } function resetDialog(): void { dialogState.value.active = false setTimeout(() => { dialogState.value = { ...DEFAULT_STATE } }, 300) } return { dialogState: readonly(dialogState), openConfirm, closeDialog, confirmDialog, cancelDialog, } }