Dwinzo_dev/app/src/modules/visualization/widgets/panel/AddButtons.tsx

355 lines
10 KiB
TypeScript
Raw Normal View History

import React from "react";
2025-03-25 06:17:41 +00:00
import {
CleanPannel,
EyeIcon,
LockIcon,
2025-04-11 12:38:47 +00:00
} from "../../../../components/icons/RealTimeVisulationIcons";
import { AddIcon } from "../../../../components/icons/ExportCommonIcons";
import { useSocketStore } from "../../../../store/builder/store";
import { useParams } from "react-router-dom";
2025-03-25 06:17:41 +00:00
// Define the type for `Side`
type Side = "top" | "bottom" | "left" | "right";
// Define the type for HiddenPanels, where keys are zone IDs and values are arrays of hidden sides
interface HiddenPanels {
[zoneUuid: string]: Side[];
}
2025-03-25 06:17:41 +00:00
// Define the type for the props passed to the Buttons component
interface ButtonsProps {
selectedZone: {
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
lockedPanels: Side[];
points: [];
zoneUuid: string;
zoneViewPortTarget: number[];
zoneViewPortPosition: number[];
2025-03-25 06:17:41 +00:00
widgets: {
id: string;
type: string;
title: string;
panel: Side;
data: any;
}[];
};
setSelectedZone: React.Dispatch<
React.SetStateAction<{
zoneName: string;
activeSides: Side[];
panelOrder: Side[];
lockedPanels: Side[];
points: [];
zoneUuid: string;
zoneViewPortTarget: number[];
zoneViewPortPosition: number[];
2025-03-25 06:17:41 +00:00
widgets: {
id: string;
type: string;
title: string;
panel: Side;
data: any;
}[];
}>
>;
hiddenPanels: HiddenPanels; // Updated prop type
setHiddenPanels: React.Dispatch<React.SetStateAction<HiddenPanels>>; // Updated prop type
waitingPanels: any;
setWaitingPanels: any;
2025-03-25 06:17:41 +00:00
}
const AddButtons: React.FC<ButtonsProps> = ({
selectedZone,
setSelectedZone,
setHiddenPanels,
hiddenPanels,
waitingPanels,
setWaitingPanels,
2025-03-25 06:17:41 +00:00
}) => {
2025-04-01 14:05:11 +00:00
const { visualizationSocket } = useSocketStore();
const { projectId } = useParams();
2025-04-01 14:05:11 +00:00
// Function to toggle visibility of a panel
const toggleVisibility = (side: Side) => {
const isHidden = hiddenPanels[selectedZone.zoneUuid]?.includes(side) ?? false;
if (isHidden) {
// If the panel is already hidden, remove it from the hiddenPanels array for this zone
setHiddenPanels((prevHiddenPanels) => ({
...prevHiddenPanels,
[selectedZone.zoneUuid]: prevHiddenPanels[selectedZone.zoneUuid].filter(
(panel) => panel !== side
),
}));
} else {
// If the panel is visible, add it to the hiddenPanels array for this zone
setHiddenPanels((prevHiddenPanels) => ({
...prevHiddenPanels,
[selectedZone.zoneUuid]: [
...(prevHiddenPanels[selectedZone.zoneUuid] || []),
side,
],
}));
}
};
2025-03-25 06:17:41 +00:00
// Function to toggle lock/unlock a panel
const toggleLockPanel = async (side: Side) => {
const email = localStorage.getItem("email") ?? "";
const organization = email?.split("@")[1]?.split(".")[0]; // Fallback value
const userId = localStorage.getItem("userId");
2025-04-07 12:29:52 +00:00
//add api
2025-03-25 06:17:41 +00:00
const newLockedPanels = selectedZone.lockedPanels.includes(side)
? selectedZone.lockedPanels.filter((panel) => panel !== side)
: [...selectedZone.lockedPanels, side];
const updatedZone = {
...selectedZone,
lockedPanels: newLockedPanels,
};
let lockedPanel = {
organization: organization,
lockedPanel: newLockedPanels,
zoneUuid: selectedZone.zoneUuid,
userId, projectId
};
if (visualizationSocket) {
visualizationSocket.emit("v1:viz-panel:locked", lockedPanel);
}
2025-03-25 06:17:41 +00:00
setSelectedZone(updatedZone);
};
// Function to clean all widgets from a panel
const cleanPanel = async (side: Side) => {
2025-04-07 12:29:52 +00:00
//add api
// console.log('side: ', side);
2025-04-14 12:39:36 +00:00
if (
hiddenPanels[selectedZone.zoneUuid]?.includes(side) ||
2025-04-14 12:39:36 +00:00
selectedZone.lockedPanels.includes(side)
)
return;
const email = localStorage.getItem("email") ?? "";
const organization = email?.split("@")[1]?.split(".")[0]; // Fallback value
const userId = localStorage.getItem("userId");
let clearPanel = {
organization: organization,
panelName: side,
zoneUuid: selectedZone.zoneUuid,
userId, projectId
};
if (visualizationSocket) {
visualizationSocket.emit("v1:viz-panel:clear", clearPanel);
}
2025-03-25 06:17:41 +00:00
const cleanedWidgets = selectedZone.widgets.filter(
(widget) => widget.panel !== side
);
const updatedZone = {
...selectedZone,
widgets: cleanedWidgets,
};
// Update the selectedZone state
setSelectedZone(updatedZone);
};
// Function to handle "+" button click
2025-04-01 06:03:10 +00:00
const handlePlusButtonClick = async (side: Side) => {
const zoneUuid = selectedZone.zoneUuid;
2025-03-25 06:17:41 +00:00
if (selectedZone.activeSides.includes(side)) {
// Already active: Schedule removal
setWaitingPanels(side); // Mark as waiting
setTimeout(() => {
console.log("Removing after wait...");
const email = localStorage.getItem("email") ?? "";
const organization = email?.split("@")[1]?.split(".")[0] ?? "";
const userId = localStorage.getItem("userId");
// Remove widgets for that side
const cleanedWidgets = selectedZone.widgets.filter(
(widget) => widget.panel !== side
);
const newActiveSides = selectedZone.activeSides.filter(
(s) => s !== side
);
const updatedZone = {
...selectedZone,
widgets: cleanedWidgets,
activeSides: newActiveSides,
panelOrder: newActiveSides,
};
const deletePanel = {
organization,
panelName: side,
zoneUuid,
projectId,
userId
};
if (visualizationSocket) {
visualizationSocket.emit("v1:viz-panel:delete", deletePanel);
}
setSelectedZone(updatedZone);
if (hiddenPanels[zoneUuid]?.includes(side)) {
setHiddenPanels((prev) => ({
...prev,
[zoneUuid]: prev[zoneUuid].filter((s) => s !== side),
}));
}
// Remove from waiting state
setWaitingPanels(null);
}, 500); // Wait for 2 seconds
2025-03-25 06:17:41 +00:00
} else {
// Panel does not exist: Add it
try {
const email = localStorage.getItem("email") ?? "";
const organization = email?.split("@")[1]?.split(".")[0] ?? "";
const userId = localStorage.getItem("userId");
2025-04-01 14:05:11 +00:00
const newActiveSides = selectedZone.activeSides.includes(side)
? [...selectedZone.activeSides]
: [...selectedZone.activeSides, side];
2025-04-01 14:05:11 +00:00
const updatedZone = {
...selectedZone,
activeSides: newActiveSides,
panelOrder: newActiveSides,
};
const addPanel = {
organization,
zoneUuid,
projectId,
userId,
2025-04-04 10:01:16 +00:00
panelOrder: newActiveSides,
};
2025-04-01 14:05:11 +00:00
if (visualizationSocket) {
visualizationSocket.emit("v1:viz-panel:add", addPanel);
2025-04-01 14:05:11 +00:00
}
2025-04-01 14:05:11 +00:00
setSelectedZone(updatedZone);
} catch (error) {
echo.error("Failed to adding panel");
console.error("Error adding panel:", error);
}
2025-03-25 06:17:41 +00:00
}
};
2025-03-25 06:17:41 +00:00
return (
<div>
{(["top", "right", "bottom", "left"] as Side[]).map((side) => (
<div key={side} className={`side-button-container ${side}`}>
{/* "+" Button */}
<button
id={`${side}-add-button`}
className={`side-button ${side}${selectedZone.activeSides.includes(side) ? " active" : ""
}`}
onClick={() => handlePlusButtonClick(side)}
title={
selectedZone.activeSides.includes(side)
? `Remove all items and close ${side} panel`
: `Activate ${side} panel`
}
>
<div className="add-icon">
<AddIcon />
</div>
</button>
{/* Extra Buttons */}
{selectedZone.activeSides.includes(side) && (
<div
className={`extra-Bs
${waitingPanels === side ? "extra-Bs-addclosing" : ""}
${!hiddenPanels[selectedZone.zoneUuid]?.includes(side) &&
waitingPanels !== side
? "extra-Bs-addopening"
: ""
}
`}
>
{/* Hide Panel */}
<button
className={`icon ${hiddenPanels[selectedZone.zoneUuid]?.includes(side)
? "active"
: ""
}`}
id={`${side}-hide-panel-visulization`}
title={
hiddenPanels[selectedZone.zoneUuid]?.includes(side)
? "Show Panel"
: "Hide Panel"
}
onClick={() => toggleVisibility(side)}
>
<EyeIcon
fill={
hiddenPanels[selectedZone.zoneUuid]?.includes(side)
? "var(--icon-default-color-active)"
: "var(--text-color)"
2025-03-25 09:11:51 +00:00
}
/>
</button>
{/* Clean Panel */}
<button
className="icon"
title="Clean Panel"
id={`${side}-clean-panel-visulization`}
onClick={() => cleanPanel(side)}
style={{
cursor:
hiddenPanels[selectedZone.zoneUuid]?.includes(side) ||
selectedZone.lockedPanels.includes(side)
? "not-allowed"
: "pointer",
}}
>
<CleanPannel />
</button>
{/* Lock/Unlock Panel */}
<button
className={`icon ${selectedZone.lockedPanels.includes(side) ? "active" : ""
}`}
id={`${side}-lock-panel-visulization`}
title={
selectedZone.lockedPanels.includes(side)
? "Unlock Panel"
: "Lock Panel"
}
onClick={() => toggleLockPanel(side)}
>
<LockIcon
fill={
2025-03-27 03:36:26 +00:00
selectedZone.lockedPanels.includes(side)
? "var(--icon-default-color-active)"
: "var(--text-color)"
2025-03-27 03:36:26 +00:00
}
/>
</button>
</div>
)}
</div>
))}
</div>
2025-03-25 06:17:41 +00:00
);
};
export default AddButtons;