cutt/src/Analysis.tsx

135 lines
3.6 KiB
TypeScript
Raw Normal View History

2025-02-10 16:40:19 +01:00
import { useEffect, useState } from "react";
import { baseUrl } from "./api";
2025-02-11 14:14:01 +01:00
interface Prop {
name: string;
min: string;
max: string;
step: string;
value: string;
}
2025-02-10 16:40:19 +01:00
interface Params {
nodeSize: number;
edgeWidth: number;
arrowSize: number;
fontSize: number;
2025-02-11 14:14:01 +01:00
distance: number;
2025-02-10 16:40:19 +01:00
}
export default function Analysis() {
const [image, setImage] = useState("");
const [params, setParams] = useState<Params>({
2025-02-11 14:14:01 +01:00
nodeSize: 2000,
2025-02-10 16:40:19 +01:00
edgeWidth: 1,
arrowSize: 20,
fontSize: 10,
2025-02-11 14:14:01 +01:00
distance: 0.2,
2025-02-10 16:40:19 +01:00
});
const [showControlPanel, setShowControlPanel] = useState(false);
const [loading, setLoading] = useState(false);
// Function to generate and fetch the graph image
async function loadImage() {
setLoading(true);
2025-02-11 14:14:01 +01:00
await fetch(`${baseUrl}api/analysis/image`, {
2025-02-10 16:40:19 +01:00
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(params)
})
.then((resp) => resp.json())
.then((data) => {
setImage(data.image);
setLoading(false);
});
}
useEffect(() => {
loadImage();
}, []);
return (
<div className="stack column dropdown">
<button onClick={() => setShowControlPanel(!showControlPanel)}>
2025-02-11 14:19:21 +01:00
Parameters {showControlPanel ? "🞁" : "🞃"}
2025-02-10 16:40:19 +01:00
</button>
2025-02-11 14:14:01 +01:00
<div id="control-panel" className={showControlPanel ? "opened" : "closed"}>
<div className="control">
<label>distance between nodes</label>
<input
type="range"
min="0.01"
max="3.001"
step="0.05"
value={params.distance}
onChange={(evt) => setParams({ ...params, distance: Number(evt.target.value) })}
onMouseUp={() => loadImage()}
/>
<span>{params.distance}</span></div>
2025-02-10 16:40:19 +01:00
2025-02-11 14:14:01 +01:00
<div className="control">
<label>node size</label>
2025-02-10 16:40:19 +01:00
<input
type="range"
min="500"
max="3000"
value={params.nodeSize}
onChange={(evt) => setParams({ ...params, nodeSize: Number(evt.target.value) })}
onMouseUp={() => loadImage()}
/>
<span>{params.nodeSize}</span>
2025-02-11 14:14:01 +01:00
</div>
2025-02-10 16:40:19 +01:00
2025-02-11 14:14:01 +01:00
<div className="control">
<label>font size</label>
2025-02-10 16:40:19 +01:00
<input
type="range"
min="4"
max="24"
value={params.fontSize}
onChange={(evt) => setParams({ ...params, fontSize: Number(evt.target.value) })}
onMouseUp={() => loadImage()}
/>
<span>{params.fontSize}</span>
2025-02-11 14:14:01 +01:00
</div>
2025-02-10 16:40:19 +01:00
2025-02-11 14:14:01 +01:00
<div className="control">
<label>edge width</label>
2025-02-10 16:40:19 +01:00
<input
type="range"
min="1"
max="5"
step="0.1"
value={params.edgeWidth}
onChange={(evt) => setParams({ ...params, edgeWidth: Number(evt.target.value) })}
onMouseUp={() => loadImage()}
/>
<span>{params.edgeWidth}</span>
2025-02-11 14:14:01 +01:00
</div>
2025-02-10 16:40:19 +01:00
2025-02-11 14:14:01 +01:00
<div className="control">
<label>arrow size</label>
2025-02-10 16:40:19 +01:00
<input
type="range"
min="10"
max="50"
value={params.arrowSize}
onChange={(evt) => setParams({ ...params, arrowSize: Number(evt.target.value) })}
onMouseUp={() => loadImage()}
/>
<span>{params.arrowSize}</span>
</div>
2025-02-11 14:14:01 +01:00
</div>
<button onClick={() => loadImage()}>reload </button>
2025-02-10 16:40:19 +01:00
{loading ? (
<span className="loader"></span>
) : (
<img src={"data:image/png;base64," + image} width="86%" />
)}
</div>
);
}