Add isLoading state to ParameterComponent and DropdownComponent

This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-03-04 11:29:11 -03:00
commit ad0b0e5d5b
3 changed files with 54 additions and 26 deletions

View file

@ -69,7 +69,7 @@ export default function ParameterComponent({
const nodes = useFlowStore((state) => state.nodes); const nodes = useFlowStore((state) => state.nodes);
const edges = useFlowStore((state) => state.edges); const edges = useFlowStore((state) => state.edges);
const setNode = useFlowStore((state) => state.setNode); const setNode = useFlowStore((state) => state.setNode);
const [isLoading, setIsLoading] = useState(false);
const flow = currentFlow?.data?.nodes ?? null; const flow = currentFlow?.data?.nodes ?? null;
const groupedEdge = useRef(null); const groupedEdge = useRef(null);
@ -87,6 +87,7 @@ export default function ParameterComponent({
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot); const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
const handleUpdateValues = async (name: string, data: NodeDataType) => { const handleUpdateValues = async (name: string, data: NodeDataType) => {
setIsLoading(true);
const code = data.node?.template["code"]?.value; const code = data.node?.template["code"]?.value;
if (!code) { if (!code) {
console.error("Code not found in the template"); console.error("Code not found in the template");
@ -96,13 +97,46 @@ export default function ParameterComponent({
try { try {
const res = await postCustomComponentUpdate(code, name); const res = await postCustomComponentUpdate(code, name);
if (res.status === 200 && data.node?.template) { if (res.status === 200 && data.node?.template) {
data.node!.template[name] = res.data.template[name]; setNode(data.id, (oldNode) => {
let newNode = cloneDeep(oldNode);
newNode.data = {
...newNode.data,
};
newNode.data.node.template[name] = res.data.template[name];
return newNode;
});
} }
} catch (err) { } catch (err) {
setErrorData(err as { title: string; list?: Array<string> }); setErrorData(err as { title: string; list?: Array<string> });
} }
renderTooltips();
try {
// Wait for at least 500 milliseconds
await new Promise((resolve) => setTimeout(resolve, 500));
// Continue with the request
// If the request takes longer than 500 milliseconds, it will not wait an additional 500 milliseconds
} catch (error) {
console.error("Error occurred while waiting for refresh:", error);
} finally {
setIsLoading(false);
}
}; };
useEffect(() => {
function fetchData() {
if (data.node?.template[name]?.refresh) {
handleUpdateValues(name, data);
}
}
fetchData();
// I want this to run as soon as the component mounts
// but it is not updating the data
// the .refresh does not change
}, [data.node?.template[name]?.refresh]);
const handleOnNewValue = ( const handleOnNewValue = (
newValue: string | string[] | boolean | Object[] newValue: string | string[] | boolean | Object[]
): void => { ): void => {
@ -405,6 +439,7 @@ export default function ParameterComponent({
{data.node?.template[name].refresh && ( {data.node?.template[name].refresh && (
<div className="w-1/6"> <div className="w-1/6">
<RefreshButton <RefreshButton
isLoading={isLoading}
disabled={disabled} disabled={disabled}
name={name} name={name}
data={data} data={data}
@ -437,6 +472,7 @@ export default function ParameterComponent({
{data.node?.template[name].refresh && ( {data.node?.template[name].refresh && (
<div className="w-1/6"> <div className="w-1/6">
<RefreshButton <RefreshButton
isLoading={isLoading}
disabled={disabled} disabled={disabled}
name={name} name={name}
data={data} data={data}
@ -477,6 +513,7 @@ export default function ParameterComponent({
<div className="mt-2 flex w-full items-center"> <div className="mt-2 flex w-full items-center">
<div className="w-5/6 flex-grow"> <div className="w-5/6 flex-grow">
<Dropdown <Dropdown
isLoading={isLoading}
options={data.node.template[name].options} options={data.node.template[name].options}
onSelect={handleOnNewValue} onSelect={handleOnNewValue}
value={data.node.template[name].value ?? "Choose an option"} value={data.node.template[name].value ?? "Choose an option"}
@ -486,6 +523,7 @@ export default function ParameterComponent({
{data.node?.template[name].refresh && ( {data.node?.template[name].refresh && (
<div className="w-1/6"> <div className="w-1/6">
<RefreshButton <RefreshButton
isLoading={isLoading}
disabled={disabled} disabled={disabled}
name={name} name={name}
data={data} data={data}

View file

@ -5,6 +5,7 @@ import { classNames } from "../../utils/utils";
import IconComponent from "../genericIconComponent"; import IconComponent from "../genericIconComponent";
export default function Dropdown({ export default function Dropdown({
isLoading,
value, value,
options, options,
onSelect, onSelect,
@ -129,11 +130,17 @@ export default function Dropdown({
</> </>
) : ( ) : (
<> <>
<div> {(!isLoading && (
<span className="text-sm italic"> <div>
No parameters are available for display. <span className="text-sm italic">
</span> No parameters are available for display.
</div> </span>
</div>
)) || (
<div>
<span className="text-sm italic">Loading...</span>
</div>
)}
</> </>
)} )}
</> </>

View file

@ -1,9 +1,9 @@
import { useEffect, useState } from "react";
import IconComponent from "../../components/genericIconComponent"; import IconComponent from "../../components/genericIconComponent";
import { NodeDataType } from "../../types/flow"; import { NodeDataType } from "../../types/flow";
import { cn } from "../../utils/utils"; import { cn } from "../../utils/utils";
function RefreshButton({ function RefreshButton({
isLoading,
disabled, disabled,
name, name,
data, data,
@ -11,6 +11,7 @@ function RefreshButton({
className, className,
id, id,
}: { }: {
isLoading: boolean;
disabled: boolean; disabled: boolean;
name: string; name: string;
data: NodeDataType; data: NodeDataType;
@ -18,27 +19,9 @@ function RefreshButton({
handleUpdateValues: (name: string, data: NodeDataType) => void; handleUpdateValues: (name: string, data: NodeDataType) => void;
id: string; id: string;
}) { }) {
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
handleUpdateValues(name, data);
}, []); // Empty dependency array to run only once
const handleClick = async () => { const handleClick = async () => {
if (disabled) return; if (disabled) return;
setIsLoading(true);
console.log("refreshing");
handleUpdateValues(name, data); handleUpdateValues(name, data);
try {
// Wait for at least 500 milliseconds
await new Promise((resolve) => setTimeout(resolve, 500));
// Continue with the request
// If the request takes longer than 500 milliseconds, it will not wait an additional 500 milliseconds
} catch (error) {
console.error("Error occurred while waiting for refresh:", error);
} finally {
setIsLoading(false);
}
}; };
const classNames = cn( const classNames = cn(