Use a UITableView component for the timeline. (#349)

* Use a collection view for the timeline.
* Switch to a table view.
This commit is contained in:
Doug
2022-12-05 15:39:21 +00:00
committed by GitHub
parent 9415bd3a7a
commit 3c893ba342
27 changed files with 583 additions and 463 deletions
@@ -17,51 +17,70 @@
import SwiftUI
struct RoomScreen: View {
@ObservedObject private var settings = ElementSettings.shared
@ObservedObject var context: RoomScreenViewModel.Context
var body: some View {
ZStack {
VStack(spacing: 0.0) {
TimelineView()
.environmentObject(context)
MessageComposer(text: $context.composerText,
focused: $context.composerFocused,
sendingDisabled: context.viewState.sendButtonDisabled,
type: context.viewState.composerMode) {
sendMessage()
} replyCancellationAction: {
context.send(viewAction: .cancelReply)
} editCancellationAction: {
context.send(viewAction: .cancelEdit)
}
.padding()
}
timeline
.safeAreaInset(edge: .bottom) { messageComposer }
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
RoomHeaderView(context: context)
}
}
.toolbar { toolbar }
.overlay { loadingIndicator }
.alert(item: $context.alertInfo) { $0.alert }
.sheet(item: $context.debugInfo) { DebugScreen(info: $0) }
if context.viewState.showLoading {
ProgressView()
.progressViewStyle(.circular)
.tint(.element.primaryContent)
.padding(16)
.background(Color.element.quinaryContent)
.cornerRadius(8)
}
}
var timeline: some View {
TimelineTableView()
.environmentObject(context)
.timelineStyle(settings.timelineStyle)
.overlay(alignment: .bottomTrailing) { scrollToBottomButton }
}
var messageComposer: some View {
MessageComposer(text: $context.composerText,
focused: $context.composerFocused,
sendingDisabled: context.viewState.sendButtonDisabled,
type: context.viewState.composerMode) {
sendMessage()
} replyCancellationAction: {
context.send(viewAction: .cancelReply)
} editCancellationAction: {
context.send(viewAction: .cancelEdit)
}
.padding()
}
var scrollToBottomButton: some View {
Button { context.viewState.scrollToBottomPublisher.send(()) } label: {
Image(uiImage: Asset.Images.timelineScrollToBottom.image)
.shadow(radius: 2.0)
.padding()
}
.opacity(context.scrollToBottomButtonVisible ? 1.0 : 0.0)
.animation(.elementDefault, value: context.scrollToBottomButtonVisible)
}
@ViewBuilder
var loadingIndicator: some View {
if context.viewState.showLoading {
ProgressView()
.progressViewStyle(.circular)
.tint(.element.primaryContent)
.padding(16)
.background(Color.element.quinaryContent)
.cornerRadius(8)
}
}
var toolbar: some ToolbarContent {
ToolbarItem(placement: .navigationBarLeading) {
RoomHeaderView(context: context)
}
}
private func sendMessage() {
guard !context.viewState.sendButtonDisabled else {
return
}
guard !context.viewState.sendButtonDisabled else { return }
context.send(viewAction: .sendMessage)
}
}