104 lines
2.4 KiB
TypeScript
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>;
|