import {useState, useMemo, useRef} from "react"; import { Button, Box, Text, Flex, Grid, Dialog, Tabs, Badge, Menu, HStack, useRecipe, useSlotRecipe } 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); const saveEdit = useDashboardStore(state => state.saveEdit); const cancelEdit = useDashboardStore(state => state.cancelEdit); const addWidget = useDashboardStore(state => state.addWidget); const recipe = useRecipe({key: "glassTab"}); const tabStyles = recipe(); // Pull the glass container styles for the dropdown const panelRecipe = useSlotRecipe({key: "glassPanel"}); const panelStyles = panelRecipe({layout: "dropdown"}); 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 */} {/* size increased to 24 to match tabs. flexShrink: 0 is CRITICAL */} {/* Dynamic text based on editing state! */} {isEditing ? "Editing Layout..." : "Dashboard Settings"} {isEditing ? ( <> Save Layout Discard Changes ) : ( Edit Layout )} setIsLibraryOpen(true)} cursor="pointer" _hover={{WebkitTextStroke: "0.5px currentColor"}}> Widget Library {/* THE WIDGET LIBRARY MODAL (Controlled by isLibraryOpen) */} setIsLibraryOpen(e.open)} size="xl" placement="center" closeOnInteractOutside={true} closeOnEscapeKeyDown={true} > 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)} ))} ))} ))} ); }