import { useSortable } from "@dnd-kit/sortable"; import ChartComponent from "../../components/ui/sideBar/realTimeViz/chartComponent"; import { ProgressCard } from "./progressCard"; import { useWidgetStore } from "../../store/store"; import { useMemo, useState } from "react"; export const DraggableWidget = ({ widget }: { widget: any }) => { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id: widget.id }); const { selectedChartId, setSelectedChartId } = useWidgetStore(); // State for managing the popup visibility and customization options const [isPopupOpen, setIsPopupOpen] = useState(false); const [customizationOptions, setCustomizationOptions] = useState({ templateBackground: "#ffffff", cardBackground: "#ffffff", cardOpacity: 1, cardBlur: 0, font: "Arial", margin: 0, radius: 5, shadow: "Low", }); const style = useMemo( () => ({ transform: transform ? `translate3d(${transform.x}px, ${transform.y}px, 0)` : undefined, transition: transition || "transform 200ms ease", }), [transform, transition] ); const handlePointerDown = () => { if (!isDragging) { setSelectedChartId(widget); } }; // Handle double-click to open the popup const handleDoubleClick = () => { setIsPopupOpen(true); }; // Close the popup const handleClosePopup = () => { setIsPopupOpen(false); }; // Save the changes made in the popup const handleSaveChanges = () => { // Here you can save the customizationOptions to your store or API console.log("Saved Customization Options:", customizationOptions); setIsPopupOpen(false); }; // Compute dynamic card styles based on customizationOptions const cardStyle = useMemo(() => { const shadowLevels = { Low: "0px 2px 4px rgba(0, 0, 0, 0.1)", Medium: "0px 4px 8px rgba(0, 0, 0, 0.2)", High: "0px 8px 16px rgba(0, 0, 0, 0.3)", }; return { backgroundColor: customizationOptions.cardBackground, opacity: customizationOptions.cardOpacity, filter: `blur(${customizationOptions.cardBlur}px)`, fontFamily: customizationOptions.font, margin: `${customizationOptions.margin}px`, borderRadius: `${customizationOptions.radius}px`, // boxShadow: shadowLevels[customizationOptions.shadow], }; }, [customizationOptions]); return ( <> <div key={widget.id} className={`chart-container ${ selectedChartId?.id === widget.id && "activeChart" }`} ref={setNodeRef} {...attributes} {...listeners} style={{ ...style, ...cardStyle }} // Apply dynamic card styles here onPointerDown={handlePointerDown} onDoubleClick={handleDoubleClick} // Add double-click event > {widget.type === "progress" ? ( <ProgressCard title={widget.title} data={widget.data} /> ) : ( <ChartComponent type={widget.type} title={widget.title} fontFamily={customizationOptions.font} // Pass font customization to ChartComponent fontSize={widget.fontSize} fontWeight={widget.fontWeight} data={widget.data} /> )} </div> {/* Popup for Customizing Template Theme */} {/* {isPopupOpen && ( <div className="popup-overlay"> <div className="popup-content"> <h2>Customize Template Theme</h2> <div className="form-group"> <label>Template Background</label> <input type="color" value={customizationOptions.templateBackground} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, templateBackground: e.target.value, })) } /> </div> <div className="form-group"> <label>Card Background</label> <input type="color" value={customizationOptions.cardBackground} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, cardBackground: e.target.value, })) } /> </div> <div className="form-group"> <label>Card Opacity</label> <input type="range" min="0" max="1" step="0.1" value={customizationOptions.cardOpacity} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, cardOpacity: parseFloat(e.target.value), })) } /> </div> <div className="form-group"> <label>Card Blur</label> <input type="range" min="0" max="10" value={customizationOptions.cardBlur} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, cardBlur: parseInt(e.target.value), })) } /> </div> <div className="form-group"> <label>Font</label> <select value={customizationOptions.font} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, font: e.target.value, })) } > <option value="Arial">Arial</option> <option value="Times New Roman">Times New Roman</option> <option value="Courier New">Courier New</option> </select> </div> <div className="form-group"> <label>Margin</label> <input type="number" value={customizationOptions.margin} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, margin: parseInt(e.target.value), })) } /> </div> <div className="form-group"> <label>Radius</label> <input type="number" value={customizationOptions.radius} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, radius: parseInt(e.target.value), })) } /> </div> <div className="form-group"> <label>Shadow</label> <select value={customizationOptions.shadow} onChange={(e) => setCustomizationOptions((prev) => ({ ...prev, shadow: e.target.value, })) } > <option value="Low">Low</option> <option value="Medium">Medium</option> <option value="High">High</option> </select> </div> <div className="popup-actions"> <button onClick={handleClosePopup}>Cancel</button> <button onClick={handleSaveChanges}>Save Changes</button> </div> </div> </div> )} */} </> ); };