mirror of
https://github.com/Athou/commafeed.git
synced 2026-10-25 22:48:31 +00:00
don't mark as read entries that the user explicitly marked as unread (#2337)
This commit is contained in:
@@ -116,6 +116,30 @@ describe("entries", () => {
|
||||
expect(client.entry.mark).toHaveBeenCalledWith({ id: "3", read: true })
|
||||
})
|
||||
|
||||
it("flags an entry marked as unread by the user until entries are reloaded", async () => {
|
||||
vi.mocked(client.feed.getEntries).mockResolvedValue({
|
||||
data: {
|
||||
entries: [{ id: "3", read: true, markable: true } as Entry],
|
||||
hasMore: false,
|
||||
name: "my-feed",
|
||||
errorCount: 0,
|
||||
feedLink: "https://mysite.com/feed",
|
||||
timestamp: 123,
|
||||
ignoredReadStatus: false,
|
||||
},
|
||||
} as AxiosResponse<Entries>)
|
||||
|
||||
const store = configureStore({ reducer: reducers })
|
||||
await store.dispatch(loadEntries({ source: { type: "feed", id: "feed-id" }, clearSearch: true }))
|
||||
|
||||
store.dispatch(markEntry({ entry: store.getState().entries.entries[0], read: false }))
|
||||
expect(store.getState().entries.entries[0].keepUnread).toBe(true)
|
||||
|
||||
// reloading the entry list resets the flag
|
||||
await store.dispatch(loadEntries({ source: { type: "feed", id: "feed-id" }, clearSearch: false }))
|
||||
expect(store.getState().entries.entries[0].keepUnread).toBeUndefined()
|
||||
})
|
||||
|
||||
it("marks all entries as read", () => {
|
||||
const store = configureStore({
|
||||
reducer: reducers,
|
||||
|
||||
@@ -10,7 +10,11 @@ export interface EntrySource {
|
||||
id: string
|
||||
}
|
||||
|
||||
export type ExpendableEntry = Entry & { expanded?: boolean }
|
||||
export type ExpendableEntry = Entry & {
|
||||
expanded?: boolean
|
||||
/** set when the user explicitly marks the entry as unread, prevents it from being marked as read again by scrolling in expanded mode until the entry list is reloaded */
|
||||
keepUnread?: boolean
|
||||
}
|
||||
|
||||
interface EntriesState {
|
||||
/** selected source */
|
||||
@@ -71,11 +75,13 @@ export const entriesSlice = createSlice({
|
||||
builder.addCase(markEntry.pending, (state, action) => {
|
||||
for (const e of state.entries.filter(e => e.id === action.meta.arg.entry.id)) {
|
||||
e.read = action.meta.arg.read
|
||||
if (!action.meta.arg.read) e.keepUnread = true
|
||||
}
|
||||
})
|
||||
builder.addCase(markMultipleEntries.pending, (state, action) => {
|
||||
for (const e of state.entries.filter(e => action.meta.arg.entries.some(e2 => e2.id === e.id))) {
|
||||
e.read = action.meta.arg.read
|
||||
if (!action.meta.arg.read) e.keepUnread = true
|
||||
}
|
||||
})
|
||||
builder.addCase(markAllEntries.pending, (state, action) => {
|
||||
|
||||
@@ -116,7 +116,8 @@ export function FeedEntries() {
|
||||
selectEntry({
|
||||
entry: currentEntry,
|
||||
expand: false,
|
||||
markAsRead: !!scrollMarks,
|
||||
// don't mark as read entries that the user explicitly marked as unread
|
||||
markAsRead: !!scrollMarks && !currentEntry.keepUnread,
|
||||
scrollToEntry: false,
|
||||
})
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user