Skip to content

Commit ff50abb

Browse files
committed
add crud support for post response variables
1 parent 30817e2 commit ff50abb

File tree

3 files changed

+118
-24
lines changed

3 files changed

+118
-24
lines changed

src/components/molecules/flow/nodes/RequestNode.js

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,57 +14,75 @@ const RequestNode = ({ id, data }) => {
1414
const requestNodeDeletePreRequestVar = useCanvasStore((state) => state.requestNodeDeletePreRequestVar);
1515
const requestNodeChangePreRequestVar = useCanvasStore((state) => state.requestNodeChangePreRequestVar);
1616

17+
const requestNodeAddPostResponseVar = useCanvasStore((state) => state.requestNodeAddPostResponseVar);
18+
const requestNodeDeletePostResponseVar = useCanvasStore((state) => state.requestNodeDeletePostResponseVar);
19+
const requestNodeChangePostResponseVar = useCanvasStore((state) => state.requestNodeChangePostResponseVar);
20+
1721
const [variableDialogOpen, setVariableDialogOpen] = useState(false);
22+
const [modalType, setModalType] = useState('');
1823

19-
const handleAddVariable = (name, type) => {
20-
requestNodeAddPreRequestVar(id, name, type);
24+
const handleAddVariable = (vType, name, type) => {
25+
if (vType === 'pre-request') {
26+
requestNodeAddPreRequestVar(id, name, type);
27+
} else if (vType === 'post-response') {
28+
requestNodeAddPostResponseVar(id, name, type);
29+
}
2130
};
2231

23-
const handleDeleteVariable = (event, vId) => {
24-
requestNodeDeletePreRequestVar(id, vId);
32+
const handleDeleteVariable = (event, vType, vId) => {
33+
if (vType === 'pre-request') {
34+
requestNodeDeletePreRequestVar(id, vId);
35+
} else if (vType === 'post-response') {
36+
requestNodeDeletePostResponseVar(id, vId);
37+
}
2538
};
2639

27-
const handleVariableChange = (event, vId) => {
28-
requestNodeChangePreRequestVar(id, vId, event.target.value);
40+
const handleVariableChange = (event, vType, vId) => {
41+
if (vType === 'pre-request') {
42+
requestNodeChangePreRequestVar(id, vId, event.target.value);
43+
} else if (vType === 'post-response') {
44+
requestNodeChangePostResponseVar(id, vId, event.target.value);
45+
}
2946
};
3047

3148
const handleUrlInputChange = (event) => {
3249
setRequestNodeUrl(id, event.target.value);
3350
};
3451

35-
const renderVariables = () => {
52+
const renderVariables = (vType) => {
53+
const variables = vType === 'pre-request' ? data.preReqVars : data.postRespVars;
3654
return (
3755
<>
38-
{data.preReqVars &&
39-
Object.keys(data.preReqVars).map((id) => (
56+
{variables &&
57+
Object.keys(variables).map((id) => (
4058
<div className='flex items-center justify-between pb-2' key={id}>
4159
<div className='flex items-center justify-between text-sm border rounded-md border-neutral-500 text-neutral-500 outline-0 focus:ring-0'>
4260
<label className='px-4 py-2 border-r rounded-bl-md rounded-tl-md border-r-neutral-500'>{id}</label>
43-
{data.preReqVars[id].type === 'Boolean' ? (
61+
{variables[id].type === 'Boolean' ? (
4462
<select
45-
onChange={(e) => handleVariableChange(e, id)}
63+
onChange={(e) => handleVariableChange(e, vType, id)}
4664
name='boolean-val'
4765
className='nodrag h-9 w-full rounded-br-md rounded-tr-md p-2.5 px-1 '
48-
value={data.preReqVars[id].value}
66+
value={variables[id].value}
4967
>
5068
<option value='true'>True</option>
5169
<option value='false'>False</option>
5270
</select>
5371
) : (
5472
<input
55-
type={getInputType(data.preReqVars[id].type)}
73+
type={getInputType(variables[id].type)}
5674
className='nodrag nowheel block h-9 w-full rounded-bl-md rounded-tl-md p-2.5'
5775
name='variable-value'
58-
data-type={getInputType(data.preReqVars[id].type)}
59-
onChange={(e) => handleVariableChange(e, id)}
60-
value={data.preReqVars[id].value}
76+
data-type={getInputType(variables[id].type)}
77+
onChange={(e) => handleVariableChange(e, vType, id)}
78+
value={variables[id].value}
6179
/>
6280
)}
6381
<div className='px-4 py-2 border-l rounded-br-md rounded-tr-md border-l-neutral-500'>
64-
{data.preReqVars[id].type}
82+
{variables[id].type}
6583
</div>
6684
</div>
67-
<div onClick={(e) => handleDeleteVariable(e, id)} className='p-2 text-neutral-500'>
85+
<div onClick={(e) => handleDeleteVariable(e, vType, id)} className='p-2 text-neutral-500'>
6886
<TrashIcon className='w-4 h-4' />
6987
</div>
7088
</div>
@@ -99,23 +117,36 @@ const RequestNode = ({ id, data }) => {
99117
</div>
100118
<div>
101119
Pre Request
102-
<button className='p-2' onClick={() => setVariableDialogOpen(true)}>
120+
<button
121+
className='p-2'
122+
onClick={() => {
123+
setModalType('pre-request');
124+
setVariableDialogOpen(true);
125+
}}
126+
>
103127
<PlusIcon className='w-4 h-4' />
104128
</button>
105-
<div className='p-2 pt-4 border-t border-neutral-300 bg-slate-50'>{renderVariables()}</div>
129+
<div className='p-2 pt-4 border-t border-neutral-300 bg-slate-50'>{renderVariables('pre-request')}</div>
106130
</div>
107131
<div>
108132
Post Response
109-
<button className='p-2' onClick={() => setVariableDialogOpen(true)}>
133+
<button
134+
className='p-2'
135+
onClick={() => {
136+
setModalType('post-response');
137+
setVariableDialogOpen(true);
138+
}}
139+
>
110140
<PlusIcon className='w-4 h-4' />
111141
</button>
112-
<div className='p-2 pt-4 border-t border-neutral-300 bg-slate-50'>{renderVariables()}</div>
142+
<div className='p-2 pt-4 border-t border-neutral-300 bg-slate-50'>{renderVariables('post-response')}</div>
113143
</div>
114144
</div>
115145
</div>
116146
<AddVariableModal
117147
closeFn={() => setVariableDialogOpen(false)}
118148
open={variableDialogOpen}
149+
modalType={modalType}
119150
onVariableAdd={handleAddVariable}
120151
/>
121152
</FlowNode>

src/components/molecules/modals/flow/AddVariableModal.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const variableTypes = [
2222
},
2323
];
2424

25-
const AddVariableModal = ({ closeFn = () => null, open = false, onVariableAdd }) => {
25+
const AddVariableModal = ({ closeFn = () => null, open = false, modalType, onVariableAdd }) => {
2626
const [variableName, setVariableName] = useState('');
2727
const [variableType, setVariableType] = useState('String');
2828

@@ -97,7 +97,7 @@ const AddVariableModal = ({ closeFn = () => null, open = false, onVariableAdd })
9797
className='inline-flex justify-center w-full px-4 py-2 text-sm font-medium text-green-900 bg-green-100 border border-transparent rounded-md grow basis-0 hover:bg-green-400'
9898
onClick={() => {
9999
if (variableName.trim() != '') {
100-
onVariableAdd(variableName, variableType);
100+
onVariableAdd(modalType, variableName, variableType);
101101
}
102102
closeFn();
103103
}}

src/stores/CanvasStore.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,69 @@ const useCanvasStore = create((set, get) => ({
158158
}),
159159
});
160160
},
161+
requestNodeAddPostResponseVar: (nodeId, name, type) => {
162+
set({
163+
nodes: get().nodes.map((node) => {
164+
if (node.id === nodeId) {
165+
// it's important to create a new object here, to inform React Flow about the cahnges
166+
const newId = name;
167+
const newVar = {
168+
type: type,
169+
value: getDefaultValue(type),
170+
};
171+
node.data = {
172+
...node.data,
173+
postRespVars: {
174+
...node.data.postRespVars,
175+
[newId]: newVar,
176+
},
177+
};
178+
}
179+
180+
return node;
181+
}),
182+
});
183+
},
184+
requestNodeDeletePostResponseVar: (nodeId, id) => {
185+
set({
186+
nodes: get().nodes.map((node) => {
187+
if (node.id === nodeId) {
188+
// it's important to create a new object here, to inform React Flow about the cahnges
189+
const { [id]: _, ...newVariables } = node.data.postRespVars;
190+
191+
node.data = {
192+
...node.data,
193+
postRespVars: newVariables,
194+
};
195+
}
196+
197+
return node;
198+
}),
199+
});
200+
},
201+
requestNodeChangePostResponseVar: (nodeId, id, value) => {
202+
set({
203+
nodes: get().nodes.map((node) => {
204+
if (node.id === nodeId) {
205+
// it's important to create a new object here, to inform React Flow about the cahnges
206+
const updateVar = {
207+
type: node.data.postRespVars[id].type,
208+
value,
209+
};
210+
211+
node.data = {
212+
...node.data,
213+
postRespVars: {
214+
...node.data.postRespVars,
215+
[id]: updateVar,
216+
},
217+
};
218+
}
219+
220+
return node;
221+
}),
222+
});
223+
},
161224
setRequestNodeBody: (nodeId, type, data) => {
162225
set({
163226
nodes: get().nodes.map((node) => {

0 commit comments

Comments
 (0)