diff --git a/space_flow/package-lock.json b/space_flow/package-lock.json
index 7d4ffaedd..f850d0ec8 100644
--- a/space_flow/package-lock.json
+++ b/space_flow/package-lock.json
@@ -23,6 +23,7 @@
"@types/react-dom": "^18.0.10",
"axios": "^1.3.2",
"react": "^18.2.0",
+ "react-cookie": "^4.1.1",
"react-dom": "^18.2.0",
"react-icons": "^4.7.1",
"react-laag": "^2.0.5",
@@ -4212,6 +4213,11 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cookie": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
+ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
+ },
"node_modules/@types/d3": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz",
@@ -4491,6 +4497,15 @@
"@types/node": "*"
}
},
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"node_modules/@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -14802,6 +14817,19 @@
"node": ">=14"
}
},
+ "node_modules/react-cookie": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz",
+ "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.0.1",
+ "hoist-non-react-statics": "^3.0.0",
+ "universal-cookie": "^4.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.3.0"
+ }
+ },
"node_modules/react-dev-utils": {
"version": "12.0.1",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
@@ -16832,6 +16860,23 @@
"node": ">=8"
}
},
+ "node_modules/universal-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz",
+ "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==",
+ "dependencies": {
+ "@types/cookie": "^0.3.3",
+ "cookie": "^0.4.0"
+ }
+ },
+ "node_modules/universal-cookie/node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
diff --git a/space_flow/package.json b/space_flow/package.json
index 28891fac9..4837d084b 100644
--- a/space_flow/package.json
+++ b/space_flow/package.json
@@ -18,6 +18,7 @@
"@types/react-dom": "^18.0.10",
"axios": "^1.3.2",
"react": "^18.2.0",
+ "react-cookie": "^4.1.1",
"react-dom": "^18.2.0",
"react-icons": "^4.7.1",
"react-laag": "^2.0.5",
diff --git a/space_flow/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/space_flow/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
index e733da1b9..1a687eb0b 100644
--- a/space_flow/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
+++ b/space_flow/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
@@ -5,10 +5,11 @@ import {
nodeColors,
snakeToNormalCase,
} from "../../../../utils";
-import { useEffect, useRef, useState } from "react";
+import { useContext, useEffect, useRef, useState } from "react";
import InputComponent from "../../../../components/inputComponent";
import ToggleComponent from "../../../../components/toggleComponent";
import InputListComponent from "../../../../components/inputListComponent";
+import { typesContext } from "../../../../contexts/typesContext";
export default function ParameterComponent({
left,
@@ -37,7 +38,8 @@ export default function ParameterComponent({
}, [data.id, position, updateNodeInternals]);
const [enabled, setEnabled] = useState(data.node.template[name]?.value ?? false);
- let disabled = data.reactFlowInstance.getEdges().some((e) => (e.sourceHandle === id));
+ const {reactFlowInstance} = useContext(typesContext);
+ let disabled = reactFlowInstance?.getEdges().some((e) => (e.sourceHandle === id)) ?? false;
return (
diff --git a/space_flow/src/contexts/index.tsx b/space_flow/src/contexts/index.tsx
index c4a22cad6..c6c94d6dc 100644
--- a/space_flow/src/contexts/index.tsx
+++ b/space_flow/src/contexts/index.tsx
@@ -1,3 +1,4 @@
+import { CookiesProvider } from "react-cookie";
import { AlertProvider } from "./alertContext";
import { LocationProvider } from "./locationContext";
import PopUpProvider from "./popUpContext";
@@ -7,15 +8,17 @@ import { TypesProvider } from "./typesContext";
export default function ContextWrapper({ children }) {
return (
<>
-
-
-
-
- {children}
-
-
-
-
+
+
+
+
+
+ {children}
+
+
+
+
+
>
);
}
diff --git a/space_flow/src/contexts/tabsContext.tsx b/space_flow/src/contexts/tabsContext.tsx
index 8884e2b56..6dcf32c47 100644
--- a/space_flow/src/contexts/tabsContext.tsx
+++ b/space_flow/src/contexts/tabsContext.tsx
@@ -1,4 +1,4 @@
-import { createContext, useState } from "react";
+import { createContext, useEffect, useState } from "react";
type flow={name:string,id:string,data:any}
@@ -7,8 +7,8 @@ type TabsContextType={
setTabIndex:(index:number)=>void;
flows:Array
removeFlow:(id:string)=>void;
- addFlow:(newFlow:flow)=>void;
- updateFlow:(newFLow:flow)=>void;
+ addFlow:()=>void;
+ updateFlow:(newFlow:flow)=>void;
}
const TabsContextInitialValue = {
@@ -16,8 +16,8 @@ const TabsContextInitialValue = {
setTabIndex:(index:number)=>{},
flows:[],
removeFlow:(id:string)=>{},
- addFlow:(newFlow:flow)=>{},
- updateFlow:(newFLow:flow)=>{}
+ addFlow:()=>{},
+ updateFlow:(newFlow:flow)=>{}
}
@@ -27,6 +27,22 @@ export const TabsContext = createContext(TabsContextInitialValu
export function TabsProvider({children}){
const [tabIndex,setTabIndex] = useState(0)
const [flows,setFlows] = useState>([])
+ const [id, setId] = useState(0);
+ useEffect(() => {
+ if(flows.length !== 0)
+ window.localStorage.setItem('tabsData', JSON.stringify({tabIndex, flows, id}));
+ }, [flows, id, tabIndex]);
+
+ useEffect(() => {
+ let cookie = window.localStorage.getItem('tabsData');
+ if(cookie){
+ let cookieObject = JSON.parse(cookie);
+ setTabIndex(cookieObject.tabIndex);
+ setFlows(cookieObject.flows)
+ setId(cookieObject.id)
+ }
+ }, [])
+
function removeFlow(id:string){
setFlows(prevState=>{
const newFlows = [...prevState];
@@ -42,14 +58,14 @@ export function TabsProvider({children}){
}
}
- window.sessionStorage.setItem('tabs', JSON.stringify(newFlows));
return newFlows;
- })
+ });
}
- function addFlow(newFlow: flow) {
+ function addFlow() {
+ let newFlow: flow = {name: "flow"+id, id: id.toString(), data:null}
+ setId((old) => old+1);
setFlows(prevState => {
const newFlows = [...prevState, newFlow];
- window.sessionStorage.setItem('tabs', JSON.stringify(newFlows));
return newFlows;
});
setTabIndex(flows.length);
@@ -62,7 +78,6 @@ export function TabsProvider({children}){
newFlows[index].data = newFlow.data
newFlows[index].name = newFlow.name
}
- window.sessionStorage.setItem('tabs', JSON.stringify(newFlows));
return newFlows;
});
}
diff --git a/space_flow/src/contexts/typesContext.tsx b/space_flow/src/contexts/typesContext.tsx
index 37f26a767..557bc474b 100644
--- a/space_flow/src/contexts/typesContext.tsx
+++ b/space_flow/src/contexts/typesContext.tsx
@@ -1,12 +1,17 @@
-import { createContext, useState } from "react";
+import { ReactEventHandler, createContext, useState } from "react";
+import { ReactFlowInstance } from "reactflow";
type typesContextType=
{
+ reactFlowInstance: ReactFlowInstance;
+ setReactFlowInstance: any;
types: {};
setTypes:(newState:{})=>void;
}
const initialValue= {
+ reactFlowInstance: null,
+ setReactFlowInstance: ()=>{},
types: {},
setTypes:()=>{},
}
@@ -15,8 +20,9 @@ export const typesContext = createContext(initialValue);
export function TypesProvider({children}){
const [types, setTypes] = useState({});
+ const [reactFlowInstance, setReactFlowInstance] = useState(null);
return (
-
+
{children}
)
diff --git a/space_flow/src/pages/FlowPage/flowManager/index.tsx b/space_flow/src/pages/FlowPage/flowManager/index.tsx
index 18e8551df..998059562 100644
--- a/space_flow/src/pages/FlowPage/flowManager/index.tsx
+++ b/space_flow/src/pages/FlowPage/flowManager/index.tsx
@@ -9,14 +9,13 @@ export function TabsManager() {
const { flows, addFlow, tabIndex, setTabIndex } = useContext(TabsContext);
useEffect(() => {
if (flows.length === 0) {
- const id = _.uniqueId();
- addFlow({ name: "flow " + id, data: null, id });
+ addFlow();
}
- }, []);
+ }, [addFlow, flows.length]);
return (
-
+
{flows.map((flow, index) => {
return (
{
- const id = _.uniqueId();
- addFlow({ name: "flow" + id, data: null, id });
+ addFlow();
}}
selected={false}
- key={0}
flow={null}
/>
-
+ {flows[tabIndex] ? (
+
+ ) : (
+ <>>
+ )}
diff --git a/space_flow/src/pages/FlowPage/index.tsx b/space_flow/src/pages/FlowPage/index.tsx
index 38544d576..43aebb370 100644
--- a/space_flow/src/pages/FlowPage/index.tsx
+++ b/space_flow/src/pages/FlowPage/index.tsx
@@ -19,6 +19,7 @@ import InputNode from "../../CustomNodes/InputNode";
import BooleanNode from "../../CustomNodes/BooleanNode";
import { alertContext } from "../../contexts/alertContext";
import { TabsContext } from "../../contexts/tabsContext";
+import { typesContext } from "../../contexts/typesContext";
const nodeTypes = {
genericNode: GenericNode,
@@ -31,9 +32,9 @@ const nodeTypes = {
var _ = require("lodash");
export default function FlowPage({flow}) {
- console.log(flow?.data)
const {updateFlow} = useContext(TabsContext)
+ const {reactFlowInstance, setReactFlowInstance} = useContext(typesContext);
const reactFlowWrapper = useRef(null);
const getId = () => `dndnode_${_.uniqueId()}`;
@@ -41,30 +42,27 @@ export default function FlowPage({flow}) {
const { setExtraComponent, setExtraNavigation } = useContext(locationContext);
const { setErrorData } = useContext(alertContext);
- const [nodes, setNodes, onNodesChange] = useNodesState(flow?.data?.nodes || []);
- const [edges, setEdges, onEdgesChange] = useEdgesState(flow?.data?.edges || []);
- const [reactFlowInstance, setReactFlowInstance] = useState(null);
- const { setViewport} = useReactFlow();
-
-
- useEffect(()=>{
- if(flow?.data && reactFlowInstance){
- setViewport(flow.data.viewport)
- }
- },[nodes, edges, flow, reactFlowInstance, setViewport])
+ const [nodes, setNodes, onNodesChange] = useNodesState(flow.data?.nodes ?? []);
+ const [edges, setEdges, onEdgesChange] = useEdgesState(flow.data?.edges ?? []);
useEffect(()=>{
if(reactFlowInstance && flow){
- flow.data =reactFlowInstance.toObject()
- updateFlow(flow)
+ flow.data = reactFlowInstance.toObject();
+ updateFlow(flow);
}
},[nodes,edges])
useEffect(()=>{
- setNodes(flow?.data?.nodes || [])
- setEdges(flow?.data?.edges || [])
+ console.log(flow);
+ setNodes(flow?.data?.nodes ?? [])
+ setEdges(flow?.data?.edges ?? [])
},[flow])
+ useEffect(() => {
+ console.log(nodes);
+ console.log(edges);
+ }, [edges, nodes])
+
useEffect(() => {
setExtraComponent(
);
setExtraNavigation({ title: "Nodes" });
@@ -133,7 +131,6 @@ export default function FlowPage({flow}) {
...data,
id: newId,
value: null,
- reactFlowInstance,
onDelete: () => {
setNodes(
reactFlowInstance.getNodes().filter((n) => n.id !== newId)
@@ -156,6 +153,7 @@ export default function FlowPage({flow}) {
updateFlow({...flow,data:reactFlowInstance.toObject()})}
edges={edges}
onNodesChange={onNodesChange}