Files
Dwinzo_dev/app/src/components/layout/sidebarLeft/visualization/Templates.tsx

121 lines
3.9 KiB
TypeScript
Raw Normal View History

import { useEffect } from "react";
import { useDroppedObjectsStore } from "../../../../store/useDroppedObjectsStore";
2025-03-25 11:47:41 +05:30
import useTemplateStore from "../../../../store/useTemplateStore";
import { useSelectedZoneStore } from "../../../../store/useZoneStore";
import { getTemplateData } from "../../../../services/realTimeVisulization/zoneData/getTemplate";
import { useSocketStore } from "../../../../store/store";
2025-03-25 11:47:41 +05:30
const Templates = () => {
const { templates, removeTemplate, setTemplates } = useTemplateStore();
const { setSelectedZone, selectedZone } = useSelectedZoneStore();
const { visualizationSocket } = useSocketStore();
2025-03-25 11:47:41 +05:30
useEffect(() => {
async function templateData() {
try {
const email = localStorage.getItem("email") || "";
const organization = email?.split("@")[1]?.split(".")[0];
let response = await getTemplateData(organization);
setTemplates(response);
} catch (error) {
console.error("Error fetching template data:", error);
}
}
templateData();
}, []);
const handleDeleteTemplate = async (id: string) => {
try {
const email = localStorage.getItem("email") || "";
const organization = email?.split("@")[1]?.split(".")[0];
let deleteTemplate = {
organization: organization,
templateID: id,
};
if (visualizationSocket) {
visualizationSocket.emit("v2:viz-template:deleteTemplate", deleteTemplate);
}
removeTemplate(id);
} catch (error) {
console.error("Error deleting template:", error);
}
2025-03-25 11:47:41 +05:30
};
const handleLoadTemplate = async (template: any) => {
try {
if (selectedZone.zoneName === "") return;
const email = localStorage.getItem("email") || "";
const organization = email?.split("@")[1]?.split(".")[0];
let loadingTemplate = {
organization: organization,
zoneId: selectedZone.zoneId,
templateID: template.id,
};
if (visualizationSocket) {
visualizationSocket.emit("v2:viz-template:addToZone", loadingTemplate);
}
setSelectedZone({
panelOrder: template.panelOrder,
activeSides: Array.from(new Set(template.panelOrder)), // No merging with previous `activeSides`
widgets: template.widgets,
});
useDroppedObjectsStore.getState().setZone(selectedZone.zoneName, selectedZone.zoneId);
if (Array.isArray(template.floatingWidget)) {
template.floatingWidget.forEach((val: any) => {
useDroppedObjectsStore.getState().addObject(selectedZone.zoneName, val);
});
}
} catch (error) {
console.error("Error loading template:", error);
}
2025-03-25 11:47:41 +05:30
};
return (
<div className="template-list">
2025-03-25 11:47:41 +05:30
{templates.map((template) => (
<div key={template.id} className="template-item">
{template?.snapshot && (
<div className="template-image-container">
2025-03-25 11:47:41 +05:30
<img
src={template.snapshot}
2025-03-25 11:47:41 +05:30
alt={`${template.name} preview`}
className="template-image"
2025-03-25 11:47:41 +05:30
onClick={() => handleLoadTemplate(template)}
/>
</div>
)}
<div className="template-details">
2025-03-25 11:47:41 +05:30
<div
onClick={() => handleLoadTemplate(template)}
className="template-name"
2025-03-25 11:47:41 +05:30
>
{template.name}
</div>
<button
onClick={() => handleDeleteTemplate(template.id)}
className="delete-button"
2025-03-25 11:47:41 +05:30
aria-label="Delete template"
>
Delete
</button>
</div>
</div>
))}
{templates.length === 0 && (
<div className="no-templates">
2025-03-25 11:47:41 +05:30
No saved templates yet. Create one in the visualization view!
</div>
)}
</div>
);
};
export default Templates;