import { useState, useMemo, useRef } from "react"; import { Button, IconButton, Box, Text, Flex, Grid, Dialog, Tabs, Badge, Menu, HStack } from "@chakra-ui/react"; import { Settings, Plus, LayoutGrid, Move, Save, X } from 'lucide-react'; import { useDashboardStore } from "../../store/useDashboardStore.jsx"; import { WIDGET_REGISTRY } from "../../constants/widgetRegistry.jsx"; export function SettingsButton() { // 1. ☁Store connections const isEditing = useDashboardStore(state => state.isEditing); const enterEditMode = useDashboardStore(state => state.enterEditMode); // This now handles both local UI lock AND database saving! const saveEdit = useDashboardStore(state => state.saveEdit); const cancelEdit = useDashboardStore(state => state.cancelEdit); const addWidget = useDashboardStore(state => state.addWidget); const [isLibraryOpen, setIsLibraryOpen] = useState(false); // Smart Add Handler const handleAddWidget = (widgetId, sizeKey) => { enterEditMode(); addWidget(widgetId, sizeKey); }; const categorizedWidgets = useMemo(() => { return Object.entries(WIDGET_REGISTRY).reduce((acc, [id, widget]) => { const cat = widget.category || 'General'; if (!acc[cat]) acc[cat] = []; acc[cat].push({ id, ...widget }); return acc; }, {}); }, []); const categories = Object.keys(categorizedWidgets); // use ref to capture html node for placing menu accordingly const menuRef = useRef(null); const getAnchorRect = () => { if (!menuRef.current) return null; return menuRef.current.getBoundingClientRect(); }; return ( <> {/* THE STATIC DROPDOWN MENU */} {isEditing ? ( <> {/* WIRE DIRECTLY TO saveEdit */} Save Layout Discard Changes ) : ( Edit Layout )} setIsLibraryOpen(true)} cursor="pointer" _hover={{ bg: "gray.100" }}> Widget Library {/* THE WIDGET LIBRARY MODAL (Controlled by isLibraryOpen) */} setIsLibraryOpen(e.open)} size="xl" placement="center"> Add Dashboard Widgets {categories.map(cat => ( {cat} ))} {categories.map(cat => ( {categorizedWidgets[cat].map(widget => ( {widget.name} {widget.description} Add to Grid: {Object.keys(widget.allowedSizes).map(sizeKey => ( handleAddWidget(widget.id, sizeKey)} colorScheme="gray" variant="subtle" px={3} py={1} borderRadius="full" cursor="pointer" _hover={{ bg: "blue.50", color: "blue.600", transform: "scale(1.05)" }} transition="all 0.2s" > {sizeKey.charAt(0).toUpperCase() + sizeKey.slice(1)} ))} ))} ))} ); }