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}
>
diff --git a/src/components/SidebarFolderItem.tsx b/src/components/SidebarFolderItem.tsx
index c175ddf..0f70059 100644
--- a/src/components/SidebarFolderItem.tsx
+++ b/src/components/SidebarFolderItem.tsx
@@ -1,6 +1,7 @@
import {
ChevronDownIcon,
ChevronRightIcon,
+ PlusIcon,
FolderIcon,
FolderOpenIcon,
TextCursorInputIcon,
@@ -28,6 +29,7 @@ type SidebarFolderItemProps = {
dropInsideZoneId?: string;
isEditing?: boolean;
onClick?: (event: React.MouseEvent) => void;
+ onContextMenuCreateFeed?: () => void;
onContextMenuRename?: () => void;
onContextMenuDelete?: () => void;
onToggle?: () => void;
@@ -48,6 +50,7 @@ export function SidebarFolderItem({
dropInsideZoneId,
isEditing,
onClick,
+ onContextMenuCreateFeed,
onContextMenuRename,
onContextMenuDelete,
onToggle,
@@ -155,6 +158,14 @@ export function SidebarFolderItem({
+ {
+ window.setTimeout(() => onContextMenuCreateFeed?.(), 0);
+ }}
+ >
+
+ New feed
+
{
window.setTimeout(() => onContextMenuRename?.(), 0);
diff --git a/src/stores/articleStore.ts b/src/stores/articleStore.ts
index 11eb5b9..33ceef2 100644
--- a/src/stores/articleStore.ts
+++ b/src/stores/articleStore.ts
@@ -42,7 +42,7 @@ export const useArticleStore = create((set, get) => ({
...(state.feedViews[feedId] ?? emptyFeedState),
isLoading: true,
error: null,
- ...(reset ? { items: [], nextCursor: null } : {}),
+ ...(reset ? { nextCursor: null } : {}),
},
},
}));