Medium Engineering

Stories from the team building Medium.

Follow publication

How to do pagination in SwiftUI

3 min readApr 11, 2024

--

An infinite list of stories
struct SearchResultListView<Presenter, Content: View>: View {
@ObservedObject var datasource: SearchResultListDatasource<Presenter>
var itemsView: () -> Content

var body: some View {
switch viewModel.state {
case .loading:
loadingView
case let .empty(message):
makeMessageView(message)
default:
contentView
}
}

private var loadingView: some View {
MediumProgressView()
}

private func makeMessageView(_ message: String) -> some View {
Text(message)
}

private var contentView: some View {
List {
itemsView()
switch viewModel.state {
case .loadingNextPage:
MediumProgressView()
case .data, .nextPageData:
MediumProgressView()
.onAppear {
Task { await datasource.fetchNextPage() }
}
default:
EmptyView()
}
}
.scrollDismissesKeyboard(.immediately)
.scrollContentBackground(.hidden)
.listStyle(.plain)
}
}
struct SearchResultPostsListView: View {
@ObservedObject var datasource: SearchResultListViewModel<PostPreview.Presenter>

var body: some View {
SearchResultListView(datasource: datasource) {
ForEach(datasource.presenters) { presenter in
Post.PostPreview {
PostPreviewViewModel(preview: presenter.data,
style: .medium,
eventVitals: .init(metricsData: presenter.metricsData),
layout: .list,
sourceProvider: presenter.sourceProvider,
onSelect: presenter.viewModel.onSelect)
}
}
}
}
}

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Medium Engineering
Medium Engineering
Thomas Ricouard
Thomas Ricouard

Written by Thomas Ricouard

📱 🚀 🇫🇷 [Entrepreneur, iOS/Mac & Web dev] | Now @Medium, @Glose 📖| Past @google 🔍 | Co-founded few companies before, a movies 🎥 app and smart browser one.

Responses (2)

Write a response