33b4c734aa
后端: - 新增认证(auth)、任务(tasks)、映射(mappings)、对账(reconciliation)、异常(exceptions)、导出(exports) API - 新增核心模块: database, security, permissions, tenant, exceptions, error_handlers - 新增数据模型: user, company, reconciliation_task, field_mapping, uploaded_file 等 - 新增服务层: ai_recognizer, file_parser, file_storage, mapping, reconciliation 等 - 添加数据库迁移脚本 前端: - 新增登录页面和仪表盘页面 - 新增任务列表、任务详情、字段映射页面 - 新增异常处理页面和规则设置页面 - 新增 API 代理路由 /api/[...path] - 新增 UI 组件库 (button, card, dialog, input, table 等) - 新增 auth 组件 (ProtectedRoute, PermissionGate) - 新增 layout 组件 (Header, Sidebar) - 新增 mapping 组件 (FieldMappingTable, AISuggestionPanel) - 新增 API 客户端和 hooks (useAsync, useToast, usePermission 等) - 新增状态管理 (auth-store, company-store, ui-store) - 集成 Tailwind CSS 和 shadcn/ui 组件库 其他: - 添加 Alembic 数据库迁移配置 - 添加初始化示例数据脚本 - 更新项目文档
77 lines
1.6 KiB
TypeScript
77 lines
1.6 KiB
TypeScript
'use client';
|
|
|
|
import { useCallback, useState } from 'react';
|
|
|
|
/**
|
|
* 确认对话框配置
|
|
*/
|
|
export interface ConfirmOptions {
|
|
title?: string;
|
|
message: string;
|
|
confirmText?: string;
|
|
cancelText?: string;
|
|
type?: 'info' | 'warning' | 'danger';
|
|
}
|
|
|
|
/**
|
|
* 确认对话框状态
|
|
*/
|
|
interface ConfirmState {
|
|
isOpen: boolean;
|
|
options: ConfirmOptions | null;
|
|
resolve: ((value: boolean) => void) | null;
|
|
}
|
|
|
|
/**
|
|
* 确认对话框 Hook
|
|
* 用于显示确认对话框并等待用户响应
|
|
*/
|
|
export function useConfirm() {
|
|
const [state, setState] = useState<ConfirmState>({
|
|
isOpen: false,
|
|
options: null,
|
|
resolve: null,
|
|
});
|
|
|
|
const confirm = useCallback((options: ConfirmOptions): Promise<boolean> => {
|
|
return new Promise((resolve) => {
|
|
setState({
|
|
isOpen: true,
|
|
options: {
|
|
title: '确认',
|
|
confirmText: '确定',
|
|
cancelText: '取消',
|
|
type: 'info',
|
|
...options,
|
|
},
|
|
resolve,
|
|
});
|
|
});
|
|
}, []);
|
|
|
|
const handleConfirm = useCallback(() => {
|
|
if (state.resolve) {
|
|
state.resolve(true);
|
|
}
|
|
setState({ isOpen: false, options: null, resolve: null });
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [state.resolve]);
|
|
|
|
const handleCancel = useCallback(() => {
|
|
if (state.resolve) {
|
|
state.resolve(false);
|
|
}
|
|
setState({ isOpen: false, options: null, resolve: null });
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [state.resolve]);
|
|
|
|
return {
|
|
confirm,
|
|
isOpen: state.isOpen,
|
|
options: state.options,
|
|
handleConfirm,
|
|
handleCancel,
|
|
};
|
|
}
|
|
|
|
export default useConfirm; |