Files
react_day_1c/src/store/flowStore.ts
T

141 lines
3.3 KiB
TypeScript
Raw Normal View History

2024-11-15 04:44:20 -05:00
import { create } from 'zustand';
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;
url: string;
method: string;
flowData?: {
nodes: Node[];
edges: Edge[];
};
}
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;
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;
}
export const useFlowStore = create<FlowState>((set) => ({
nodes: [],
edges: [],
selectedNode: null,
models: [],
roles: [],
routes: [],
settings: {
globalKey: '',
databaseType: '',
authType: 'session',
timezone: 'UTC',
dbHost: '',
dbPort: '',
dbUser: '',
dbPassword: '',
dbName: '',
},
setNodes: (nodes) => set((state) => ({
nodes: typeof nodes === 'function' ? nodes(state.nodes) : nodes
})),
setEdges: (edges) => set((state) => ({
edges: typeof edges === 'function' ? edges(state.edges) : edges
})),
setSelectedNode: (node) => set({ selectedNode: node }),
updateNodeData: (nodeId, newData) =>
set((state) => ({
nodes: state.nodes.map((node) =>
node.id === nodeId ? { ...node, data: { ...node.data, ...newData } } : node
),
})),
addModel: (model) =>
set((state) => ({
models: [...state.models, model],
})),
updateModel: (model) =>
set((state) => ({
models: state.models.map((m) => (m.id === model.id ? model : m)),
})),
addRole: (role) =>
set((state) => ({
roles: [...state.roles, role],
})),
updateRole: (role) =>
set((state) => ({
roles: state.roles.map((r) => (r.id === role.id ? role : r)),
})),
deleteRole: (roleId) =>
set((state) => ({
roles: state.roles.filter((r) => r.id !== roleId),
})),
addRoute: (route) =>
set((state) => ({
routes: [...state.routes, route],
})),
updateRoute: (route) =>
set((state) => ({
routes: state.routes.map((r) => (r.id === route.id ? route : r)),
})),
deleteRoute: (routeId) =>
set((state) => ({
routes: state.routes.filter((r) => r.id !== routeId),
})),
updateSettings: (settings) =>
set({ settings }),
}));