import React, { useEffect, useState } from 'react'; import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from '@/components/ui/command'; import { LuAreaChart, LuBellDot, LuFilePieChart, LuMonitorDot, LuSearch, LuServer, LuUserCircle2, LuWifi, } from 'react-icons/lu'; import { NavigateOptions, useNavigate } from '@tanstack/react-router'; import { useEvent } from '@/hooks/useEvent'; import { useCommandState } from 'cmdk'; import { useTranslation } from '@i18next-toolkit/react'; import { trpc } from '@/api/trpc'; import { useCurrentWorkspaceId } from '@/store/user'; import { Button } from './ui/button'; export const CommandPanel: React.FC = React.memo(() => { const [open, setOpen] = useState(false); const navigate = useNavigate(); const { t } = useTranslation(); const handleJump = useEvent((options: NavigateOptions) => { return () => { setOpen(false); navigate(options); }; }); useEffect(() => { const down = (e: KeyboardEvent) => { if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { e.preventDefault(); setOpen((open) => !open); } }; document.addEventListener('keydown', down); return () => document.removeEventListener('keydown', down); }, []); return ( <> {t('No results found.')} {t('Website')} {t('Monitor')} {t('Servers')} {t('Telemetry')} {t('Pages')} {t('Profile')} {t('Notifications')} ); }); CommandPanel.displayName = 'CommandPanel'; interface CommandPanelSearchGroupProps { handleJump: (options: NavigateOptions) => () => void; } export const CommandPanelSearchGroup: React.FC = React.memo((props) => { const handleJump = props.handleJump; const search = useCommandState((state) => state.search); const workspaceId = useCurrentWorkspaceId(); const { t } = useTranslation(); const { data: websites = [] } = trpc.website.all.useQuery({ workspaceId, }); const { data: monitors = [] } = trpc.monitor.all.useQuery({ workspaceId, }); const { data: telemetryList = [] } = trpc.telemetry.all.useQuery({ workspaceId, }); const { data: pages = [] } = trpc.monitor.getAllPages.useQuery({ workspaceId, }); if (!search) { return null; } return ( {websites.map((w) => ( {w.name} ))} {monitors.map((m) => ( {m.name} ))} {telemetryList.map((t) => ( {t.name} ))} {pages.map((p) => ( {p.title} ))} ); }); CommandPanelSearchGroup.displayName = 'CommandPanelSearchGroup';