Add isLoading state to ParameterComponent and DropdownComponent
This commit is contained in:
parent
12459dbdb9
commit
ad0b0e5d5b
3 changed files with 54 additions and 26 deletions
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue