diff --git a/src/components/ConfigPanel.tsx b/src/components/ConfigPanel.tsx
index b30fc13..0a47795 100644
--- a/src/components/ConfigPanel.tsx
+++ b/src/components/ConfigPanel.tsx
@@ -323,15 +323,7 @@ export function ConfigPanel({ node, onClose, onUpdateNode }: ConfigPanelProps) {
type="text"
name="path"
value={node.data.path}
- onBlur={(e) => {
- handleChange(e);
- const queryParams = extractQueryParams(e.target.value);
- onUpdateNode(node.id, {
- ...node.data,
- path: e.target.value,
- queryFields: queryParams,
- });
- }}
+ onChange={handleChange}
className="w-full p-2 border rounded"
placeholder="/api/users/:id"
/>
diff --git a/src/components/SomeComponent.tsx b/src/components/SomeComponent.tsx
new file mode 100644
index 0000000..2f74158
--- /dev/null
+++ b/src/components/SomeComponent.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { useFlowContext } from '../store/FlowContext';
+
+const SomeComponent = () => {
+ const { nodes, setNodes } = useFlowContext();
+
+ // Example usage
+ const addNode = () => {
+ setNodes([...nodes, { id: 'new-node', data: {}, position: { x: 0, y: 0 } }]);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default SomeComponent;
\ No newline at end of file
diff --git a/src/index.tsx b/src/index.tsx
new file mode 100644
index 0000000..f39bcd4
--- /dev/null
+++ b/src/index.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App';
+import { FlowProvider } from './store/FlowContext';
+
+ReactDOM.render(
+
+
+
+
+ ,
+ document.getElementById('root')
+);
\ No newline at end of file
diff --git a/src/store/FlowContext.tsx b/src/store/FlowContext.tsx
new file mode 100644
index 0000000..53e79d8
--- /dev/null
+++ b/src/store/FlowContext.tsx
@@ -0,0 +1,161 @@
+import React, { createContext, useContext, useState, ReactNode } from 'react';
+import { Node, Edge } from 'reactflow';
+
+interface Model {
+ id: string;
+ name: string;
+ fields: {
+ name: string;
+ type: string;
+ defaultValue: string;
+ validation: string;
+ mapping?: string;
+ }[];
+}
+
+interface Role {
+ id: string;
+ name: string;
+ slug: string;
+ permissions: {
+ authRequired: boolean;
+ routes: string[];
+ canCreateUsers?: boolean;
+ canEditUsers?: boolean;
+ canDeleteUsers?: boolean;
+ canManageRoles?: boolean;
+ };
+}
+
+interface Route {
+ id: string;
+ name: string;
+ method: string;
+ url: string;
+ flowData?: {
+ nodes: any[];
+ edges: any[];
+ };
+}
+
+interface Settings {
+ globalKey: string;
+ databaseType: string;
+ authType: string;
+ timezone: string;
+ dbHost: string;
+ dbPort: string;
+ dbUser: string;
+ dbPassword: string;
+ dbName: string;
+}
+
+interface FlowState {
+ nodes: Node[];
+ edges: Edge[];
+ selectedNode: Node | null;
+ models: Model[];
+ roles: Role[];
+ routes: Route[];
+ settings: Settings;
+ defaultTablesShown: boolean;
+ setNodes: (nodes: Node[] | ((prev: Node[]) => Node[])) => void;
+ setEdges: (edges: Edge[] | ((prev: Edge[]) => Edge[])) => void;
+ setSelectedNode: (node: Node | null) => void;
+ updateNodeData: (nodeId: string, newData: any) => void;
+ addModel: (model: Model) => void;
+ updateModel: (model: Model) => void;
+ addRole: (role: Role) => void;
+ updateRole: (role: Role) => void;
+ deleteRole: (roleId: string) => void;
+ addRoute: (route: Route) => void;
+ updateRoute: (route: Route) => void;
+ deleteRoute: (routeId: string) => void;
+ updateSettings: (settings: Settings) => void;
+ setDefaultTablesShown: (shown: boolean) => void;
+ updateNode: (nodeId: string, newData: any) => void;
+}
+
+const FlowContext = createContext(undefined);
+
+export const FlowProvider = ({ children }: { children: ReactNode }) => {
+ const [nodes, setNodes] = useState([]);
+ const [edges, setEdges] = useState([]);
+ const [selectedNode, setSelectedNode] = useState(null);
+ const [models, setModels] = useState([]);
+ const [roles, setRoles] = useState([]);
+ const [routes, setRoutes] = useState([]);
+ const [settings, setSettings] = useState({
+ globalKey: `key_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
+ databaseType: "mysql",
+ authType: "session",
+ timezone: "UTC",
+ dbHost: "localhost",
+ dbPort: "3306",
+ dbUser: "root",
+ dbPassword: "root",
+ dbName: `database_${new Date().toISOString().split("T")[0]}`,
+ });
+ const [defaultTablesShown, setDefaultTablesShown] = useState(false);
+
+ const updateNodeData = (nodeId: string, newData: any) => {
+ setNodes((prevNodes) =>
+ prevNodes.map((node) =>
+ node.id === nodeId ? { ...node, data: { ...node.data, ...newData } } : node
+ )
+ );
+ };
+
+ const addModel = (model: Model) => setModels((prev) => [...prev, model]);
+ const updateModel = (model: Model) => setModels((prev) => prev.map((m) => (m.id === model.id ? model : m)));
+ const addRole = (role: Role) => setRoles((prev) => [...prev, role]);
+ const updateRole = (role: Role) => setRoles((prev) => prev.map((r) => (r.id === role.id ? role : r)));
+ const deleteRole = (roleId: string) => setRoles((prev) => prev.filter((r) => r.id !== roleId));
+ const addRoute = (route: Route) => setRoutes((prev) => [...prev, route]);
+ const updateRoute = (route: Route) => setRoutes((prev) => prev.map((r) => (r.id === route.id ? route : r)));
+ const deleteRoute = (routeId: string) => setRoutes((prev) => prev.filter((r) => r.id !== routeId));
+ const updateNode = (nodeId: string, newData: any) => {
+ console.log("Updating node in store:", nodeId, newData);
+ updateNodeData(nodeId, newData);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useFlowContext = () => {
+ const context = useContext(FlowContext);
+ if (!context) {
+ throw new Error("useFlowContext must be used within a FlowProvider");
+ }
+ return context;
+};
\ No newline at end of file