diff --git a/commafeed-client/src/app/entries/thunks.ts b/commafeed-client/src/app/entries/thunks.ts index 88c5abd1..e7849f93 100644 --- a/commafeed-client/src/app/entries/thunks.ts +++ b/commafeed-client/src/app/entries/thunks.ts @@ -3,6 +3,7 @@ import { client } from "app/client" import { Constants } from "app/constants" import { type EntrySource, type EntrySourceType, entriesSlice, setMarkAllAsReadConfirmationDialogOpen, setSearch } from "app/entries/slice" import type { RootState } from "app/store" +import { setHasNewEntries } from "app/tree/slice" import { reloadTree } from "app/tree/thunks" import type { Entry, MarkRequest, TagRequest } from "app/types" import { reloadTags } from "app/user/thunks" @@ -26,6 +27,11 @@ export const loadEntries = createAppAsyncThunk( const state = thunkApi.getState() const endpoint = getEndpoint(arg.source.type) const result = await endpoint(buildGetEntriesPaginatedRequest(state, arg.source, 0)) + console.log(arg.source.id) + + if (arg.source.type === "feed") { + thunkApi.dispatch(setHasNewEntries({ feedId: +arg.source.id, value: false })) + } return result.data } ) diff --git a/commafeed-client/src/app/tree/slice.ts b/commafeed-client/src/app/tree/slice.ts index c9a0d5e8..4cf942ef 100644 --- a/commafeed-client/src/app/tree/slice.ts +++ b/commafeed-client/src/app/tree/slice.ts @@ -40,29 +40,18 @@ export const treeSlice = createSlice({ } }) }, + setHasNewEntries: (state, action: PayloadAction<{ feedId: number; value: boolean }>) => { + if (!state.rootCategory) return + + visitCategoryTree(state.rootCategory, category => { + category.feeds = category.feeds.map(feed => + feed.id === action.payload.feedId ? { ...feed, hasNewEntries: action.payload.value } : feed + ) + }) + }, }, extraReducers: builder => { builder.addCase(reloadTree.fulfilled, (state, action) => { - visitCategoryTree(action.payload, category => { - category.feeds = category.feeds.map(feed => { - const storageKey = `feed-${feed.id}-unread` - const existing = localStorage.getItem(storageKey) - const prevUnread = Number.parseInt(existing || "0", 10) - const isNewFeed = existing === null - - const hasNewEntries = isNewFeed ? true : feed.unread > prevUnread - - if (!isNewFeed) { - localStorage.setItem(storageKey, feed.unread.toString()) - } - - return { - ...feed, - hasNewEntries, - } - }) - }) - state.rootCategory = action.payload }) builder.addCase(collapseTreeCategory.pending, (state, action) => { @@ -85,4 +74,4 @@ export const treeSlice = createSlice({ }, }) -export const { setMobileMenuOpen, toggleSidebar, incrementUnreadCount } = treeSlice.actions +export const { setMobileMenuOpen, toggleSidebar, incrementUnreadCount, setHasNewEntries } = treeSlice.actions diff --git a/commafeed-client/src/app/tree/thunks.ts b/commafeed-client/src/app/tree/thunks.ts index ac0d7a33..22ef4b8d 100644 --- a/commafeed-client/src/app/tree/thunks.ts +++ b/commafeed-client/src/app/tree/thunks.ts @@ -1,7 +1,7 @@ import { createAppAsyncThunk } from "app/async-thunk" import { client } from "app/client" import { redirectToCategory, redirectToFeed } from "app/redirect/thunks" -import { incrementUnreadCount } from "app/tree/slice" +import { incrementUnreadCount, setHasNewEntries } from "app/tree/slice" import type { CollapseRequest, Subscription } from "app/types" import { flattenCategoryTree, visitCategoryTree } from "app/utils" @@ -11,7 +11,6 @@ export const collapseTreeCategory = createAppAsyncThunk( "tree/category/collapse", async (req: CollapseRequest) => await client.category.collapse(req).then(r => r.data) ) - export const selectNextUnreadTreeItem = createAppAsyncThunk( "tree/selectNextUnreadItem", ( @@ -75,6 +74,7 @@ export const newFeedEntriesDiscovered = createAppAsyncThunk( amount, }) ) + thunkApi.dispatch(setHasNewEntries({ feedId, value: true })) } } ) diff --git a/commafeed-client/src/components/sidebar/TreeNode.tsx b/commafeed-client/src/components/sidebar/TreeNode.tsx index 56baa1c1..f61b6eb1 100644 --- a/commafeed-client/src/components/sidebar/TreeNode.tsx +++ b/commafeed-client/src/components/sidebar/TreeNode.tsx @@ -71,10 +71,6 @@ export function TreeNode(props: TreeNodeProps) { py={1} pl={props.level * 20} className={`${classes.node} cf-treenode cf-treenode-${props.type}`} - onClick={e => { - props.onClick(e, props.id) - props.type === "feed" && localStorage.setItem(`feed-${props.id}-unread`, props.unread.toString()) - }} data-id={props.id} data-type={props.type} data-unread-count={props.unread}