mirror of
https://github.com/tiddly-gittly/TidGi-Desktop.git
synced 2025-12-15 15:10:31 -08:00
feat: allow stop the network
This commit is contained in:
parent
249362b16f
commit
96a835da67
4 changed files with 59 additions and 31 deletions
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -490,6 +490,7 @@
|
||||||
"FilteringExcludeClickToRemove": "正筛选不包含本标签的,点击设为不参与筛选\t",
|
"FilteringExcludeClickToRemove": "正筛选不包含本标签的,点击设为不参与筛选\t",
|
||||||
"CurrentNodeComponentType": "此节点的组件类型",
|
"CurrentNodeComponentType": "此节点的组件类型",
|
||||||
"NodeLabel": "节点名",
|
"NodeLabel": "节点名",
|
||||||
"InPort": "入口"
|
"InPort": "入口",
|
||||||
|
"StopWorkflow": "停止工作流"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 />
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue