From fa5ee26bb701b816efc811c193ee55504a6efd51 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期三, 03 十二月 2025 17:51:23 +0800
Subject: [PATCH] feat: 通知

---
 packages/hooks/dialog.ts |   84 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/packages/hooks/dialog.ts b/packages/hooks/dialog.ts
new file mode 100644
index 0000000..51447c1
--- /dev/null
+++ b/packages/hooks/dialog.ts
@@ -0,0 +1,84 @@
+import { computed, reactive } from 'vue';
+import { cloneDeep } from 'lodash';
+
+type UseDialogOptions = {
+  onConfirm?: (...args: any) => Promise<any>;
+  closeAfterConfirm?: boolean;
+};
+
+export function useDialog(options: UseDialogOptions = {}) {
+  const { onConfirm, closeAfterConfirm = true } = options;
+
+  const dialogState = reactive({
+    dialogVisible: false,
+  });
+
+  function onUpdateModelValue(value: boolean) {
+    dialogState.dialogVisible = value;
+  }
+
+  async function handleConfirm(...args: any) {
+    await onConfirm?.(...args);
+    if (closeAfterConfirm) {
+      dialogState.dialogVisible = false;
+    }
+  }
+
+  const dialogProps = computed(() => ({
+    modelValue: dialogState.dialogVisible,
+    ['onUpdate:modelValue']: onUpdateModelValue,
+    onOnConfirm: handleConfirm,
+  }));
+
+  return {
+    dialogProps,
+    dialogState,
+  };
+}
+
+export type FormParams = {};
+
+type UseFormDialogOptions<TFormParams extends FormParams> = UseDialogOptions & {
+  defaultFormParams: TFormParams;
+};
+
+export function useFormDialog<TFormParams extends FormParams>(
+  options: UseFormDialogOptions<TFormParams>
+) {
+  const { onConfirm, closeAfterConfirm = true, defaultFormParams } = options;
+  const { dialogProps, dialogState } = useDialog({ onConfirm, closeAfterConfirm });
+
+  const editForm = reactive(cloneDeep(defaultFormParams));
+
+  function handleAdd(extraParams: Partial<TFormParams> = {}) {
+    Object.assign(editForm, cloneDeep(defaultFormParams), {
+      ...extraParams,
+    });
+    dialogState.dialogVisible = true;
+  }
+
+  function handleEdit(data: Omit<TFormParams, 'title'>) {
+    Object.assign(editForm, cloneDeep(defaultFormParams), {
+      ...data,
+    });
+    dialogState.dialogVisible = true;
+  }
+
+  function onUpdateForm(value: TFormParams) {
+    Object.assign(editForm, value);
+  }
+
+  const formDialogProps = computed(() => ({
+    ...dialogProps.value,
+    form: editForm,
+    ['onUpdate:form']: onUpdateForm,
+  }));
+
+  return {
+    dialogProps: formDialogProps,
+    dialogState,
+    editForm,
+    handleAdd,
+    handleEdit,
+  };
+}

--
Gitblit v1.9.1