feat: allow stop the network

This commit is contained in:
linonetwo 2023-08-14 16:58:41 +08:00
parent 249362b16f
commit 96a835da67
4 changed files with 59 additions and 31 deletions

View file

@ -485,7 +485,8 @@
"SearchWorkflows": "Search Workflows", "SearchWorkflows": "Search Workflows",
"CurrentNodeComponentType": "Component type of this node", "CurrentNodeComponentType": "Component type of this node",
"NodeLabel": "Label", "NodeLabel": "Label",
"InPort": "In Ports" "InPort": "In Ports",
"StopWorkflow": "Stop Workflow"
}, },
"Description": "Description", "Description": "Description",
"Tags": "Tags", "Tags": "Tags",

View file

@ -490,6 +490,7 @@
"FilteringExcludeClickToRemove": "正筛选不包含本标签的,点击设为不参与筛选\t", "FilteringExcludeClickToRemove": "正筛选不包含本标签的,点击设为不参与筛选\t",
"CurrentNodeComponentType": "此节点的组件类型", "CurrentNodeComponentType": "此节点的组件类型",
"NodeLabel": "节点名", "NodeLabel": "节点名",
"InPort": "入口" "InPort": "入口",
"StopWorkflow": "停止工作流"
} }
} }

View file

@ -5,6 +5,7 @@ import EditOffIcon from '@mui/icons-material/EditOff';
import HomeIcon from '@mui/icons-material/Home'; import HomeIcon from '@mui/icons-material/Home';
import InfoIcon from '@mui/icons-material/Info'; import InfoIcon from '@mui/icons-material/Info';
import PlayArrowIcon from '@mui/icons-material/PlayArrow'; import PlayArrowIcon from '@mui/icons-material/PlayArrow';
import StopIcon from '@mui/icons-material/Stop';
import ZoomOutMapIcon from '@mui/icons-material/ZoomOutMap'; import ZoomOutMapIcon from '@mui/icons-material/ZoomOutMap';
import { IconButton, Toolbar, Tooltip } from '@mui/material'; import { IconButton, Toolbar, Tooltip } from '@mui/material';
import { PageType } from '@services/pages/interface'; import { PageType } from '@services/pages/interface';
@ -19,10 +20,10 @@ import styled from 'styled-components';
import type { ITheGraphEditor } from 'the-graph'; import type { ITheGraphEditor } from 'the-graph';
import autoLayout from 'the-graph/the-graph/the-graph-autolayout'; import autoLayout from 'the-graph/the-graph/the-graph-autolayout';
import { useLocation } from 'wouter'; import { useLocation } from 'wouter';
import { IWorkflowContext } from '../hooks/useContext';
import { AddItemDialog } from '../../WorkflowManage/AddItemDialog'; import { AddItemDialog } from '../../WorkflowManage/AddItemDialog';
import { addWorkflowToWiki, useAvailableFilterTags } from '../../WorkflowManage/useWorkflowDataSource'; import { addWorkflowToWiki, useAvailableFilterTags } from '../../WorkflowManage/useWorkflowDataSource';
import { IWorkflowListItem } from '../../WorkflowManage/WorkflowList'; import { IWorkflowListItem } from '../../WorkflowManage/WorkflowList';
import { IWorkflowContext } from '../hooks/useContext';
import { useRunGraph } from '../hooks/useRunGraph'; import { useRunGraph } from '../hooks/useRunGraph';
const ToolbarContainer = styled(Toolbar)` const ToolbarContainer = styled(Toolbar)`
@ -58,7 +59,7 @@ export const GraphTopToolbar = (props: IGraphTopToolbarProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [, setLocation] = useLocation(); const [, setLocation] = useLocation();
const runWorkflow = useRunGraph(graph, libraryLoader); const [runGraph, stopGraph, graphIsRunning] = useRunGraph(graph, libraryLoader);
const backToHome = useCallback(() => { const backToHome = useCallback(() => {
// don't need to save here, because we already debouncedSave after all operations // don't need to save here, because we already debouncedSave after all operations
@ -134,11 +135,21 @@ export const GraphTopToolbar = (props: IGraphTopToolbarProps) => {
return ( return (
<> <>
<ToolbarContainer> <ToolbarContainer>
{graphIsRunning
? (
<Tooltip title={t('Workflow.StopWorkflow')}>
<IconButton onClick={stopGraph}>
<StopIcon />
</IconButton>
</Tooltip>
)
: (
<Tooltip title={t('Workflow.RunWorkflow')}> <Tooltip title={t('Workflow.RunWorkflow')}>
<IconButton onClick={runWorkflow}> <IconButton onClick={runGraph}>
<PlayArrowIcon /> <PlayArrowIcon />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
)}
<Tooltip title={t('Workflow.BackToHome')}> <Tooltip title={t('Workflow.BackToHome')}>
<IconButton onClick={backToHome}> <IconButton onClick={backToHome}>
<HomeIcon /> <HomeIcon />

View file

@ -1,11 +1,14 @@
import { Graph as FbpGraph } from 'fbp-graph'; import { Graph as FbpGraph } from 'fbp-graph';
import { /* Graph as NofloGraph, */ type ComponentLoader, createNetwork } from 'noflo'; import { /* Graph as NofloGraph, */ type ComponentLoader, createNetwork } from 'noflo';
import type { Network } from 'noflo/lib/Network'; import type { Network } from 'noflo/lib/Network';
import { useEffect, useRef } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react';
export function useRunGraph(fbpGraph: FbpGraph, libraryLoader?: ComponentLoader) { export function useRunGraph(fbpGraph: FbpGraph, libraryLoader?: ComponentLoader) {
const currentNetworkReference = useRef<Network | undefined>(); const currentNetworkReference = useRef<Network | undefined>();
async function runGraph() { const [graphIsRunning, setGraphIsRunning] = useState(false);
const runGraph = useCallback(async () => {
setGraphIsRunning(true);
try {
/** /**
* Similar to noflo-runtime-base's `src/protocol/Network.js`, transform FbpGraph to ~~NofloGraph~~ Network * Similar to noflo-runtime-base's `src/protocol/Network.js`, transform FbpGraph to ~~NofloGraph~~ Network
*/ */
@ -24,11 +27,23 @@ export function useRunGraph(fbpGraph: FbpGraph, libraryLoader?: ComponentLoader)
}); });
await nofloNetwork.connect(); await nofloNetwork.connect();
await nofloNetwork.start(); await nofloNetwork.start();
nofloNetwork.once('end', () => {
setGraphIsRunning(false);
})
} catch (error) {
// TODO: show error on a debugger panel
// network.once('process-error', onError);
console.error(error);
setGraphIsRunning(false);
} }
}, [fbpGraph, libraryLoader]);
const stopGraph = useCallback(async () => {
await currentNetworkReference.current?.stop();
}, []);
useEffect(() => { useEffect(() => {
return () => { return () => {
void currentNetworkReference.current?.stop(); void currentNetworkReference.current?.stop();
}; };
}, [currentNetworkReference]); }, [currentNetworkReference]);
return runGraph; return [runGraph, stopGraph, graphIsRunning] as const;
} }