aura-web/src/pages/WorkflowsPage/WorkflowsPageLogic.ts

104 lines
2.4 KiB
TypeScript

import { useEffect, useMemo, useState } from 'react';
import { App as AntApp } from 'antd';
import type { Workflow } from '../../api';
import { WorkflowAPI } from '../../api';
import { SAMPLE_GRAPH } from './constants';
interface WorkflowsPageLogicOptions {
enabled?: boolean;
}
export function useWorkflowsPageLogic(options: WorkflowsPageLogicOptions = {}) {
const enabled = options.enabled ?? true;
const { message } = AntApp.useApp();
const [list, setList] = useState<Workflow[]>([]);
const [loading, setLoading] = useState(false);
const [editorOpen, setEditorOpen] = useState(false);
const [editing, setEditing] = useState<Workflow | null>(null);
const [runsOpen, setRunsOpen] = useState(false);
const [runsFor, setRunsFor] = useState<Workflow | null>(null);
const load = async () => {
if (!enabled) return;
setLoading(true);
try {
const data = await WorkflowAPI.list();
setList(data);
} catch (e: any) {
message.error('加载失败:' + (e?.message ?? e));
} finally {
setLoading(false);
}
};
useEffect(() => {
if (enabled) load();
}, [enabled]);
const onCreate = () => {
setEditing({
id: '',
name: '新工作流',
description: '',
graph: SAMPLE_GRAPH,
scheduleCron: '',
scheduleEnabled: false,
enabled: true,
lastRunAt: 0,
runCount: 0,
createdAt: 0,
updatedAt: 0
});
setEditorOpen(true);
};
const onEdit = (workflow: Workflow) => {
setEditing(workflow);
setEditorOpen(true);
};
const onDelete = async (workflow: Workflow) => {
await WorkflowAPI.remove(workflow.id);
message.success('已删除');
load();
};
const openRuns = (workflow: Workflow) => {
setRunsFor(workflow);
setRunsOpen(true);
};
const handleSaved = () => {
setEditorOpen(false);
load();
};
const stats = useMemo(
() => ({
total: list.length,
enabled: list.filter((item) => item.enabled).length,
scheduled: list.filter((item) => item.scheduleEnabled && item.scheduleCron).length
}),
[list]
);
return {
list,
loading,
editorOpen,
editing,
runsOpen,
runsFor,
stats,
setEditorOpen,
setRunsOpen,
onCreate,
onEdit,
onDelete,
openRuns,
handleSaved
};
}
export type WorkflowsPageLogic = ReturnType<typeof useWorkflowsPageLogic>;