diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 0779deb..5119fad 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -39,7 +39,6 @@ export function Sidebar() { const folders = useSidebarStore((state) => state.folders); const feeds = useSidebarStore((state) => state.feeds); const expandedFolderIds = useSidebarStore((state) => state.expandedFolderIds); - const isLoading = useSidebarStore((state) => state.isLoading); const error = useSidebarStore((state) => state.error); const loadSidebarData = useSidebarStore((state) => state.loadSidebarData); const toggleFolder = useSidebarStore((state) => state.toggleFolder); @@ -171,8 +170,24 @@ export function Sidebar() { setEditingFolderId(folder.id); } - async function handleCreateFeed() { + async function handleCreateFeed(folderId: string | null = null) { const feed = await createDraftFeed(); + + if (folderId) { + const nextFeeds = [ + ...feeds, + { + ...feed, + folderId, + sortOrder: feeds.filter((candidate) => candidate.folderId === folderId).length, + }, + ]; + + setSidebarStructure(folders, nextFeeds); + setFolderExpanded(folderId, true); + await persistSidebarStructure(); + } + setCreatingFeedId(feed.id); } @@ -350,10 +365,6 @@ export function Sidebar() { - {isLoading ? ( -
Loading…
- ) : null} - {error ? (
{error}
) : null} @@ -388,6 +399,7 @@ export function Sidebar() { setCurrentRoute(ROUTE.FOLDER, { folderId }) } onSelectFeed={(feedId) => setCurrentRoute(ROUTE.FEED, { feedId })} + onCreateFeed={handleCreateFeed} editingFolderId={editingFolderId} creatingFeedId={creatingFeedId} editingFeedId={editingFeedId} @@ -435,6 +447,7 @@ function SidebarTreeContext({ onToggleFolder, onSelectFolder, onSelectFeed, + onCreateFeed, editingFolderId, creatingFeedId, editingFeedId, @@ -465,6 +478,7 @@ function SidebarTreeContext({ onToggleFolder: (folderId: string) => void; onSelectFolder: (folderId: string) => void; onSelectFeed: (feedId: string) => void; + onCreateFeed: (folderId?: string | null) => void | Promise; editingFolderId: string | null; creatingFeedId: string | null; editingFeedId: string | null; @@ -513,6 +527,11 @@ function SidebarTreeContext({ onSelectFeed(node.id); } }} + onDoubleClick={() => { + if (creatingFeedId !== node.id && editingFeedId !== node.id) { + onStartFeedRename(node.id); + } + }} onCommitRename={(value) => onCommitFeedRename(node.id, value)} onCancelRename={onCancelFeedRename} onContextMenuRename={() => onStartFeedRename(node.id)} @@ -575,6 +594,7 @@ function SidebarTreeContext({ onSelectFolder(node.id); }} + onContextMenuCreateFeed={() => void onCreateFeed(node.id)} onContextMenuRename={() => onStartFolderRename(node.id)} onContextMenuDelete={() => onRequestDeleteFolder(node.id)} onCommitRename={(name) => onCommitFolderRename(node.id, name)} @@ -598,6 +618,7 @@ function SidebarTreeContext({ onToggleFolder={onToggleFolder} onSelectFolder={onSelectFolder} onSelectFeed={onSelectFeed} + onCreateFeed={onCreateFeed} editingFolderId={editingFolderId} creatingFeedId={creatingFeedId} editingFeedId={editingFeedId} diff --git a/src/components/SidebarFeedItem.tsx b/src/components/SidebarFeedItem.tsx index c26f581..5e9de8f 100644 --- a/src/components/SidebarFeedItem.tsx +++ b/src/components/SidebarFeedItem.tsx @@ -16,6 +16,7 @@ type SidebarFeedItemProps = { depth: number; isActive?: boolean; onClick?: () => void; + onDoubleClick?: () => void; isCreating?: boolean; isEditing?: boolean; onSubmitUrl?: (value: string) => void | Promise; @@ -34,6 +35,7 @@ export function SidebarFeedItem({ depth, isActive, onClick, + onDoubleClick, isCreating, isEditing, onSubmitUrl, @@ -96,6 +98,7 @@ export function SidebarFeedItem({ {...(isCreating || isEditing ? {} : attributes)} {...(isCreating || isEditing ? {} : listeners)} onClick={onClick} + onDoubleClick={onDoubleClick} >