diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index c61d6c7..4ec0d4e 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -253,6 +253,18 @@ export default function App() { onSessionSelect={(sessionId) => { void api.selectSession(sessionId); }} + onRenameSession={(sessionId, title) => { + void api.renameSession({ sessionId, title }); + }} + onDuplicateSession={(sessionId) => { + void api.duplicateSession({ sessionId }); + }} + onSetSessionPinned={(sessionId, isPinned) => { + void api.setSessionPinned({ sessionId, isPinned }); + }} + onSetSessionArchived={(sessionId, isArchived) => { + void api.setSessionArchived({ sessionId, isArchived }); + }} workspace={workspace} /> } @@ -266,6 +278,9 @@ export default function App() { setShowNewSession(false); void api.createSession({ projectId, patternId }); }} + onTogglePatternFavorite={(patternId, isFavorite) => { + void api.setPatternFavorite({ patternId, isFavorite }); + }} patterns={workspace.patterns} projects={workspace.projects} /> diff --git a/src/renderer/components/NewSessionModal.tsx b/src/renderer/components/NewSessionModal.tsx index 80f6194..8eb9556 100644 --- a/src/renderer/components/NewSessionModal.tsx +++ b/src/renderer/components/NewSessionModal.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from 'react'; -import { X } from 'lucide-react'; +import { Star, X } from 'lucide-react'; import type { PatternDefinition } from '@shared/domain/pattern'; import { isScratchpadProject, type ProjectRecord } from '@shared/domain/project'; @@ -10,6 +10,7 @@ interface NewSessionModalProps { defaultProjectId?: string; onClose: () => void; onCreate: (projectId: string, patternId: string) => void; + onTogglePatternFavorite?: (patternId: string, isFavorite: boolean) => void; } export function NewSessionModal({ @@ -18,15 +19,22 @@ export function NewSessionModal({ defaultProjectId, onClose, onCreate, + onTogglePatternFavorite, }: NewSessionModalProps) { const [projectId, setProjectId] = useState(defaultProjectId ?? projects[0]?.id ?? ''); const availablePatterns = useMemo( () => - patterns.filter( - (pattern) => - pattern.availability !== 'unavailable' - && (!isScratchpadProject(projectId) || pattern.mode === 'single'), - ), + patterns + .filter( + (pattern) => + pattern.availability !== 'unavailable' + && (!isScratchpadProject(projectId) || pattern.mode === 'single'), + ) + .sort((a, b) => { + if (a.isFavorite && !b.isFavorite) return -1; + if (!a.isFavorite && b.isFavorite) return 1; + return 0; + }), [patterns, projectId], ); const [patternId, setPatternId] = useState(availablePatterns[0]?.id ?? ''); @@ -79,17 +87,41 @@ export function NewSessionModal({