diff --git a/commafeed-client/src/app/tree/thunks.ts b/commafeed-client/src/app/tree/thunks.ts index 69276bf4..0c15ac62 100644 --- a/commafeed-client/src/app/tree/thunks.ts +++ b/commafeed-client/src/app/tree/thunks.ts @@ -12,71 +12,49 @@ export const collapseTreeCategory = createAppAsyncThunk( async (req: CollapseRequest) => await client.category.collapse(req) ) -export const selectNextUnreadTreeItem = createAppAsyncThunk("tree/selectNextUnreadItem", (_, thunkApi) => { - const state = thunkApi.getState() - const root = state.tree.rootCategory - if (!root) return +export const selectNextUnreadTreeItem = createAppAsyncThunk( + "tree/selectNextUnreadItem", + ( + arg: { + direction: "forward" | "backward" + }, + thunkApi + ) => { + const state = thunkApi.getState() + const root = state.tree.rootCategory + if (!root) return - const { source } = state.entries - if (source.type === "category") { - const categories = flattenCategoryTree(root) - const index = categories.findIndex(c => c.id === source.id) - if (index === -1) return + const { source } = state.entries + if (source.type === "category") { + const categories = flattenCategoryTree(root) + if (arg.direction === "backward") categories.reverse() - for (let i = index + 1; i < categories.length; i++) { - const c = categories[i] - if (c.feeds.some(f => f.unread > 0)) { - return thunkApi.dispatch(redirectToCategory(String(c.id))) + const index = categories.findIndex(c => c.id === source.id) + if (index === -1) return + + for (let i = index + 1; i < categories.length; i++) { + const c = categories[i] + if (c.feeds.some(f => f.unread > 0)) { + return thunkApi.dispatch(redirectToCategory(String(c.id))) + } } - } - } else if (source.type === "feed") { - const feeds: Subscription[] = [] - visitCategoryTree(root, c => feeds.push(...c.feeds), { childrenFirst: true }) + } else if (source.type === "feed") { + const feeds: Subscription[] = [] + visitCategoryTree(root, c => feeds.push(...c.feeds), { childrenFirst: true }) + if (arg.direction === "backward") feeds.reverse() - const index = feeds.findIndex(f => f.id === +source.id) - if (index === -1) return + const index = feeds.findIndex(f => f.id === +source.id) + if (index === -1) return - for (let i = index + 1; i < feeds.length; i++) { - const f = feeds[i] - if (f.unread > 0) { - return thunkApi.dispatch(redirectToFeed(String(f.id))) + for (let i = index + 1; i < feeds.length; i++) { + const f = feeds[i] + if (f.unread > 0) { + return thunkApi.dispatch(redirectToFeed(String(f.id))) + } } } } -}) - -export const selectPreviousUnreadTreeItem = createAppAsyncThunk("tree/selectPreviousUnreadItem", (_, thunkApi) => { - const state = thunkApi.getState() - const root = state.tree.rootCategory - if (!root) return - - const { source } = state.entries - if (source.type === "category") { - const categories = flattenCategoryTree(root) - const index = categories.findIndex(c => c.id === source.id) - if (index === -1) return - - for (let i = index - 1; i >= 0; i--) { - const c = categories[i] - if (c.feeds.some(f => f.unread > 0)) { - return thunkApi.dispatch(redirectToCategory(String(c.id))) - } - } - } else if (source.type === "feed") { - const feeds: Subscription[] = [] - visitCategoryTree(root, c => feeds.push(...c.feeds), { childrenFirst: true }) - - const index = feeds.findIndex(f => f.id === +source.id) - if (index === -1) return - - for (let i = index - 1; i >= 0; i--) { - const f = feeds[i] - if (f.unread > 0) { - return thunkApi.dispatch(redirectToFeed(String(f.id))) - } - } - } -}) +) export const newFeedEntriesDiscovered = createAppAsyncThunk( "tree/new-feed-entries-discovered", diff --git a/commafeed-client/src/components/content/FeedEntries.tsx b/commafeed-client/src/components/content/FeedEntries.tsx index ea8ffff0..b6d38bb4 100644 --- a/commafeed-client/src/components/content/FeedEntries.tsx +++ b/commafeed-client/src/components/content/FeedEntries.tsx @@ -16,7 +16,7 @@ import { import { redirectToRootCategory } from "app/redirect/thunks" import { useAppDispatch, useAppSelector } from "app/store" import { toggleSidebar } from "app/tree/slice" -import { selectNextUnreadTreeItem, selectPreviousUnreadTreeItem } from "app/tree/thunks" +import { selectNextUnreadTreeItem } from "app/tree/thunks" import { KeyboardShortcutsHelp } from "components/KeyboardShortcutsHelp" import { Loader } from "components/Loader" import { useBrowserExtension } from "hooks/useBrowserExtension" @@ -173,8 +173,8 @@ export function FeedEntries() { }) ) ) - useMousetrap("shift+j", async () => await dispatch(selectNextUnreadTreeItem())) - useMousetrap("shift+k", async () => await dispatch(selectPreviousUnreadTreeItem())) + useMousetrap("shift+j", async () => await dispatch(selectNextUnreadTreeItem({ direction: "forward" }))) + useMousetrap("shift+k", async () => await dispatch(selectNextUnreadTreeItem({ direction: "backward" }))) useMousetrap("space", () => { if (selectedEntry) { if (selectedEntry.expanded) {