Skip to content

Commit

Permalink
sync function name with definition block
Browse files Browse the repository at this point in the history
  • Loading branch information
39bytes committed Dec 18, 2023
1 parent 47992fc commit d7f34cf
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
import { Handle, Position } from 'reactflow';
import { BlockProps } from '@/types/block';
import { Input } from '@/components/ui/Input';
import { useBlockUpdate } from '@/stores/flowchart';
import { useBlockUpdate, useFlowchartStore } from '@/stores/flowchart';

const FunctionDefinitionBlock = ({ id, data }: BlockProps) => {
const ins = Object.entries(data.inputs);
const outs = Object.entries(data.outputs);

const updateBlock = useBlockUpdate(id);

const { saveDefinition, functionDefinitions } = useFlowchartStore((state) => ({
saveDefinition: state.saveDefinition,
functionDefinitions: state.functionDefinitionBlocks
}));

return (
<>
<div className="relative h-64 w-[512px] border">
<Input
className="mx-auto w-fit"
value={data.label}
onBlur={() => {
if (data.label !== functionDefinitions[id].data.label) {
saveDefinition(id);
}
}}
onChange={(e) =>
updateBlock((block) => {
block.data.label = e.target.value;
Expand Down
12 changes: 7 additions & 5 deletions src/renderer/src/components/flow/BlockFunctionCard.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { BlockAddPayload } from '@/types/block';
import { BlockAddPayload, BlockData } from '@/types/block';
import { Button } from '../ui/Button';
import { DragEventHandler } from 'react';
import { Node } from 'reactflow';

type Props = {
name: string;
definitionBlock: Node<BlockData>;
};

const BlockFunctionCard = ({ name }: Props): JSX.Element => {
const BlockFunctionCard = ({ definitionBlock }: Props): JSX.Element => {
const onDragStart: DragEventHandler<HTMLButtonElement> = (event) => {
const payload: BlockAddPayload = {
variant: 'function_instance',
name
definition_block_id: definitionBlock.id
};

event.dataTransfer.setData('application/reactflow', JSON.stringify(payload));
Expand All @@ -19,10 +20,11 @@ const BlockFunctionCard = ({ name }: Props): JSX.Element => {
// actual block is going to look like!
event.dataTransfer.setDragImage(event.target as HTMLButtonElement, 0, 0);
};
console.log(definitionBlock);

return (
<Button variant="secondary" draggable onDragStart={onDragStart}>
<div>{name}</div>
<div>{definitionBlock.data.label}</div>
</Button>
);
};
Expand Down
10 changes: 6 additions & 4 deletions src/renderer/src/components/flow/BlocksLibrary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ const BlocksLibrary = () => {
removeDefinition: state.removeDefinition
}));

console.log(functionDefinitions);

return (
<div className="grow flex-col rounded-lg bg-background p-4">
<div className="flex items-center">
Expand Down Expand Up @@ -69,13 +71,13 @@ const BlocksLibrary = () => {
Custom functions are listed here. Try defining one using the &quot;Function
definition&quot; block.
</div>
{Object.keys(functionDefinitions).map((functionName) => (
<div key={functionName} className="flex items-center gap-2">
<BlockFunctionCard name={functionName} />
{Object.entries(functionDefinitions).map(([blockId, block]) => (
<div key={blockId} className="flex items-center gap-2">
<BlockFunctionCard definitionBlock={block} />
<X
className="cursor-pointer duration-200 hover:text-muted-foreground"
size={20}
onClick={() => removeDefinition(functionName)}
onClick={() => removeDefinition(blockId)}
/>
</div>
))}
Expand Down
20 changes: 10 additions & 10 deletions src/renderer/src/stores/flowchart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
applyEdgeChanges,
XYPosition
} from 'reactflow';
import { BlockData, Name } from '@/types/block';
import { BlockData, BlockId } from '@/types/block';

import { v4 as uuidv4 } from 'uuid';
import { createJSONStorage, persist } from 'zustand/middleware';
Expand All @@ -31,7 +31,7 @@ interface FlowchartState {
edges: Edge[];
controls: Node[];

functionDefinitionBlocks: Record<Name, Node<BlockData>>;
functionDefinitionBlocks: Record<BlockId, Node<BlockData>>;

setNodes: (nodes: Node<BlockData>[]) => void;
setEdges: (edges: Edge[]) => void;
Expand Down Expand Up @@ -77,20 +77,20 @@ export const useFlowchartStore = create<FlowchartState>()(
});
},

saveDefinition: (definitionBlockId: string) => {
saveDefinition: (definitionBlockId: BlockId) => {
set((state) => {
const node = state.nodes.find((n) => n.id === definitionBlockId);
if (node?.data.block_type !== 'flojoy.intrinsics.function') {
return;
}

state.functionDefinitionBlocks[node.data.label] = node;
state.functionDefinitionBlocks[node.id] = node;
});
},

removeDefinition: (name: string) => {
removeDefinition: (definitionBlockId: BlockId) => {
set((state) => {
delete state.functionDefinitionBlocks[name];
delete state.functionDefinitionBlocks[definitionBlockId];
});
},

Expand Down Expand Up @@ -160,15 +160,15 @@ export const useFlowchartStore = create<FlowchartState>()(
break;
case 'function_instance': {
const definitions = get().functionDefinitionBlocks;
if (!(payload.name in definitions)) {
throw new Error(`Undefined function block ${payload.name}`);
if (!(payload.definition_block_id in definitions)) {
throw new Error(`Undefined function block ${payload.definition_block_id}`);
}

const definition = definitions[payload.name];
const definition = definitions[payload.definition_block_id];

data = {
block_type: 'function_instance',
label: payload.name,
label: definition.data.label,
intrinsic_parameters: {},
inputs: definition.data.inputs,
outputs: definition.data.outputs
Expand Down
3 changes: 2 additions & 1 deletion src/renderer/src/types/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export type BlockType =
export type IntrinsicParameterValue = number | string;

export type Name = string;
export type BlockId = string;
type FlojoyType = 'str' | 'int' | 'bool';

export type BlockData = {
Expand All @@ -41,7 +42,7 @@ type RegularBlockAddPayload = {

type FunctionBlockAddPayload = {
variant: 'function_instance';
name: string;
definition_block_id: string;
};

export type BlockAddPayload = RegularBlockAddPayload | FunctionBlockAddPayload;
Expand Down

0 comments on commit d7f34cf

Please sign in to comment.