import { useEffect, useState } from 'react' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Switch } from '@/components/ui/switch' import { useThreads } from '@/hooks/useThreads' import { useToolAvailable } from '@/hooks/useToolAvailable' import React from 'react' import { useAppState } from '@/hooks/useAppState' interface DropdownToolsAvailableProps { children: (isOpen: boolean, toolsCount: number) => React.ReactNode initialMessage?: boolean onOpenChange?: (isOpen: boolean) => void } export default function DropdownToolsAvailable({ children, initialMessage = false, onOpenChange, }: DropdownToolsAvailableProps) { const { tools } = useAppState() const [isOpen, setIsOpen] = useState(false) const handleOpenChange = (open: boolean) => { setIsOpen(open) onOpenChange?.(open) } const { getCurrentThread } = useThreads() const { isToolDisabled, setToolDisabledForThread, setDefaultDisabledTools, initializeThreadTools, getDisabledToolsForThread, getDefaultDisabledTools, } = useToolAvailable() const currentThread = getCurrentThread() // Separate effect for thread initialization - only when we have tools and a new thread useEffect(() => { if (tools.length > 0 && currentThread?.id) { initializeThreadTools(currentThread.id, tools) } }, [currentThread?.id, tools, initializeThreadTools]) const handleToolToggle = (toolName: string, checked: boolean) => { if (initialMessage) { // Update default tools for new threads/index page const currentDefaults = getDefaultDisabledTools() if (checked) { setDefaultDisabledTools( currentDefaults.filter((name) => name !== toolName) ) } else { setDefaultDisabledTools([...currentDefaults, toolName]) } } else if (currentThread?.id) { // Update tools for specific thread setToolDisabledForThread(currentThread.id, toolName, checked) } } const isToolChecked = (toolName: string): boolean => { if (initialMessage) { // Use default tools for index page return !getDefaultDisabledTools().includes(toolName) } else if (currentThread?.id) { // Use thread-specific tools return !isToolDisabled(currentThread.id, toolName) } return false } const getEnabledToolsCount = (): number => { const disabledTools = initialMessage ? getDefaultDisabledTools() : currentThread?.id ? getDisabledToolsForThread(currentThread.id) : [] return tools.filter((tool) => !disabledTools.includes(tool.name)).length } const renderTrigger = () => children(isOpen, getEnabledToolsCount()) if (tools.length === 0) { return ( {renderTrigger()} No tools available ) } return ( {renderTrigger()} Available Tools {tools.map((tool) => { const isChecked = isToolChecked(tool.name) return ( {tool.name} {tool.description && ( {tool.description} )} handleToolToggle(tool.name, checked) } /> ) })} ) }
{tool.description}