diff --git a/ios/Platform/Platform/Features/Reader/Views/EntryListView.swift b/ios/Platform/Platform/Features/Reader/Views/EntryListView.swift index 68d34bb..4d9f001 100644 --- a/ios/Platform/Platform/Features/Reader/Views/EntryListView.swift +++ b/ios/Platform/Platform/Features/Reader/Views/EntryListView.swift @@ -66,6 +66,9 @@ struct EntryListView: View { } } .refreshable { + // Flush any deferred read marks before refreshing + flushDeferredReads() + markedByScroll.removeAll() await vm.refresh() } .navigationDestination(for: ReaderEntry.self) { entry in @@ -176,6 +179,7 @@ struct EntryListView: View { entryContextMenu(entry: entry, vm: vm) } ) + .onAppear { loadMoreIfNeeded(for: entry) } } loadMoreTrigger @@ -201,6 +205,7 @@ struct EntryListView: View { entryContextMenu(entry: entry, vm: vm) } ) + .onAppear { loadMoreIfNeeded(for: entry) } Divider() .padding(.leading, 36) @@ -212,14 +217,25 @@ struct EntryListView: View { } } + // Trigger loadMore when an entry near the bottom appears + private func loadMoreIfNeeded(for entry: ReaderEntry) { + let entries = vm.entries + guard entries.count >= 5 else { return } + let threshold = entries[entries.count - 5].id + if entry.id == threshold { + Task { await vm.loadMore() } + } + } + private var loadMoreTrigger: some View { Group { if vm.isLoadingMore { ProgressView() .padding() - } else { + } else if vm.entries.count > 0 { + // Fallback trigger at the very bottom Color.clear - .frame(height: 1) + .frame(height: 40) .onAppear { Task { await vm.loadMore() } } @@ -242,6 +258,7 @@ struct EntryCardView: View { image .resizable() .aspectRatio(contentMode: .fill) + .frame(maxWidth: .infinity) .frame(height: 180) .clipped() default: