/** * DashboardView - Main dashboard shell. * Keeps only screen composition and delegates recent-projects logic to the feature slice. */ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { RecentProjectsSection } from '@features/recent-projects/renderer'; import { useStore } from '@renderer/store'; import { formatShortcut } from '@renderer/utils/stringUtils'; import { Command, Search, Users } from 'lucide-react'; import { useShallow } from 'zustand/react/shallow'; import { CliStatusBanner } from './CliStatusBanner'; import { DashboardUpdateBanner } from './DashboardUpdateBanner'; import { TmuxStatusBanner } from './TmuxStatusBanner'; import { WebPreviewBanner } from './WebPreviewBanner'; interface CommandSearchProps { value: string; onChange: (value: string) => void; } const CommandSearch = ({ value, onChange }: Readonly): React.JSX.Element => { const [isFocused, setIsFocused] = useState(false); const inputRef = useRef(null); const { openCommandPalette, selectedProjectId } = useStore( useShallow((state) => ({ openCommandPalette: state.openCommandPalette, selectedProjectId: state.selectedProjectId, })) ); useEffect(() => { const handleKeyDown = (event: KeyboardEvent): void => { if ((event.metaKey || event.ctrlKey) && event.code === 'KeyK') { event.preventDefault(); openCommandPalette(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [openCommandPalette]); useLayoutEffect(() => { const input = inputRef.current; if (!input) { return; } input.focus({ preventScroll: true }); const timeoutId = window.setTimeout(() => { if (document.activeElement !== input) { input.focus({ preventScroll: true }); } }, 50); return () => window.clearTimeout(timeoutId); }, []); return (
onChange(event.target.value)} placeholder="Search projects..." className="flex-1 bg-transparent text-sm text-text outline-none placeholder:text-text-muted" onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} />
); }; export const DashboardView = (): React.JSX.Element => { const [searchQuery, setSearchQuery] = useState(''); const openTeamsTab = useStore((state) => state.openTeamsTab); return (
); };