update build state logic (#1468)

This commit is contained in:
Cristhian Zanforlin Lousa 2024-02-26 14:26:52 -03:00 • committed by GitHub
commit 7bd113dfaf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 52 additions and 18 deletions

View file

@ -1,7 +1,6 @@
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { NodeToolbar } from "reactflow"; import { NodeToolbar } from "reactflow";
import ShadTooltip from "../../components/ShadTooltipComponent"; import ShadTooltip from "../../components/ShadTooltipComponent";
import Tooltip from "../../components/TooltipComponent";
import IconComponent from "../../components/genericIconComponent"; import IconComponent from "../../components/genericIconComponent";
import InputComponent from "../../components/inputComponent"; import InputComponent from "../../components/inputComponent";
import { Button } from "../../components/ui/button"; import { Button } from "../../components/ui/button";
@ -44,6 +43,7 @@ export default function GenericNode({
const [nodeDescription, setNodeDescription] = useState( const [nodeDescription, setNodeDescription] = useState(
data.node?.description! data.node?.description!
); );
const buildStatus = useFlowStore((state) => state.flowBuildStatus[data.id]);
const [validationStatus, setValidationStatus] = const [validationStatus, setValidationStatus] =
useState<validationStatusType | null>(null); useState<validationStatusType | null>(null);
const [handles, setHandles] = useState<number>(0); const [handles, setHandles] = useState<number>(0);
@ -280,7 +280,7 @@ export default function GenericNode({
className={getNodeBorderClassName( className={getNodeBorderClassName(
selected, selected,
showNode, showNode,
data?.buildStatus, buildStatus,
validationStatus validationStatus
)} )}
> >
@ -468,26 +468,54 @@ export default function GenericNode({
variant="secondary" variant="secondary"
className={"group h-9 px-1.5"} className={"group h-9 px-1.5"}
onClick={() => { onClick={() => {
if (data?.buildStatus === BuildStatus.BUILDING || isBuilding) if (buildStatus === BuildStatus.BUILDING || isBuilding)
return; return;
buildFlow(data.id); buildFlow(data.id);
}} }}
> >
<div> <div>
<Tooltip title={"Build"}> <ShadTooltip
styleClasses="cursor-default"
content={
buildStatus === BuildStatus.BUILDING ? (
<span>Building...</span>
) : !validationStatus ? (
<span className="flex">
Build{" "}
<IconComponent
name="Play"
className=" h-5 stroke-status-green stroke-2"
/>{" "}
flow to validate status.
</span>
) : (
<div className="max-h-96 overflow-auto">
{typeof validationStatus.params === "string"
? `${durationString}\n${validationStatus.params}`
.split("\n")
.map((line, index) => (
<div key={index}>{line}</div>
))
: durationString}
</div>
)
}
side="bottom"
>
<div className="generic-node-status-position flex items-center justify-center"> <div className="generic-node-status-position flex items-center justify-center">
{renderIconPlayOrPauseComponents( {renderIconPlayOrPauseComponents(
data?.buildStatus, buildStatus,
validationStatus validationStatus
)} )}
</div> </div>
</Tooltip> </ShadTooltip>
</div> </div>
</Button> </Button>
)} )}
<div className=""> <div className="">
<Tooltip <ShadTooltip
title={ styleClasses="cursor-default"
content={
data?.buildStatus === BuildStatus.BUILDING ? ( data?.buildStatus === BuildStatus.BUILDING ? (
<span>Building...</span> <span>Building...</span>
) : !validationStatus ? ( ) : !validationStatus ? (
@ -502,6 +530,7 @@ export default function GenericNode({
</div> </div>
) )
} }
side="bottom"
> >
<div> <div>
{renderIconStatusComponents( {renderIconStatusComponents(
@ -509,7 +538,7 @@ export default function GenericNode({
validationStatus validationStatus
)} )}
</div> </div>
</Tooltip> </ShadTooltip>
</div> </div>
</div> </div>
</div> </div>

View file

@ -35,6 +35,7 @@ import useFlowsManagerStore from "./flowsManagerStore";
// this is our useStore hook that we can use in our components to get parts of the store and call actions // this is our useStore hook that we can use in our components to get parts of the store and call actions
const useFlowStore = create<FlowStoreType>((set, get) => ({ const useFlowStore = create<FlowStoreType>((set, get) => ({
flowState: undefined, flowState: undefined,
flowBuildStatus:{},
nodes: [], nodes: [],
edges: [], edges: [],
isBuilding: false, isBuilding: false,
@ -438,21 +439,19 @@ const useFlowStore = create<FlowStoreType>((set, get) => ({
}); });
}, },
updateBuildStatus: (nodeIdList: string[], status: BuildStatus) => { updateBuildStatus: (nodeIdList: string[], status: BuildStatus) => {
const newFlowBuildStatus = { ...get().flowBuildStatus };
nodeIdList.forEach((id) => { nodeIdList.forEach((id) => {
const nodeToUpdate = get().nodes.find((node) => node.id === id); newFlowBuildStatus[id] = status;
if (nodeToUpdate) {
nodeToUpdate.data.buildStatus = status;
set({ nodes: get().nodes });
}
}); });
set({ flowBuildStatus: newFlowBuildStatus });
}, },
revertBuiltStatusFromBuilding: () => { revertBuiltStatusFromBuilding: () => {
get().nodes.forEach((node) => { const newFlowBuildStatus = { ...get().flowBuildStatus };
if (node.data.buildStatus === BuildStatus.BUILDING) { Object.keys(newFlowBuildStatus).forEach((id) => {
node.data.buildStatus = BuildStatus.TO_BUILD; if (newFlowBuildStatus[id] === BuildStatus.BUILDING) {
newFlowBuildStatus[id] = BuildStatus.BUILT;
} }
}); });
set({ nodes: get().nodes });
}, },
})); }));

View file

@ -524,6 +524,11 @@ export type chatMessagePropsType = {
chat: ChatMessageType; chat: ChatMessageType;
lockChat: boolean; lockChat: boolean;
lastMessage: boolean; lastMessage: boolean;
updateChat?: (
chat: ChatMessageType,
message: string,
stream_url: string | null
) => void;
}; };
export type formModalPropsType = { export type formModalPropsType = {

View file

@ -91,4 +91,5 @@ export type FlowStoreType = {
verticesBuild: string[]; verticesBuild: string[];
updateBuildStatus: (nodeId: string[], status: BuildStatus) => void; updateBuildStatus: (nodeId: string[], status: BuildStatus) => void;
revertBuiltStatusFromBuilding: () => void; revertBuiltStatusFromBuilding: () => void;
flowBuildStatus: { [key: string]: BuildStatus };
}; };