Permalink Tweaks 2 (#2766)

* Missing changelog.

* Parse bare room aliases as permalinks.

Update the SDK.

* Fix tapping the same permalink twice.

Add a test.

Don't clear the focussed item when reaching the bottom of the timeline.

* Make sure sending a message returns to live.
This commit is contained in:
Doug
2024-04-29 17:32:16 +01:00
committed by GitHub
parent aaa8af2996
commit 7c94ed98a5
18 changed files with 111 additions and 52 deletions
@@ -103,7 +103,7 @@ struct RoomScreen: View {
}
private var scrollToBottomButton: some View {
Button(action: scrollToBottom) {
Button { context.send(viewAction: .scrollToBottom) } label: {
Image(systemName: "chevron.down")
.font(.compound.bodyLG)
.fontWeight(.semibold)
@@ -121,20 +121,13 @@ struct RoomScreen: View {
.opacity(isAtBottomAndLive ? 0.0 : 1.0)
.accessibilityHidden(isAtBottomAndLive)
.animation(.elementDefault, value: isAtBottomAndLive)
.accessibilityIdentifier(A11yIdentifiers.roomScreen.scrollToBottom)
}
private var isAtBottomAndLive: Bool {
context.isScrolledToBottom && context.viewState.timelineViewState.isLive
}
private func scrollToBottom() {
if context.viewState.timelineViewState.isLive {
context.viewState.timelineViewState.scrollToBottomPublisher.send(())
} else {
context.send(viewAction: .focusLive)
}
}
@ViewBuilder
private var loadingIndicator: some View {
if context.viewState.showLoading {
@@ -76,10 +76,10 @@ class TimelineTableViewController: UIViewController {
}
/// There are pending items in `timelineItemsDictionary` that haven't been applied to the data source.
var hasPendingItems = false
private var hasPendingItems = false
/// The user is dragging the scroll view (or it is still decelerating after a drag).
var isDraggingScrollView = false {
private var isDraggingScrollView = false {
didSet {
if !isDraggingScrollView, hasPendingItems {
hasPendingItems = false
@@ -104,19 +104,17 @@ class TimelineTableViewController: UIViewController {
}
}
/// The ID of the focussed event if opening the room to an event permalink.
var focussedEventID: String? {
didSet {
guard let focussedEventID else { return }
focussedEventNeedsDisplay = true
scrollToItem(eventID: focussedEventID, animated: false)
}
}
/// The ID of the focussed event if navigating to an event permalink within the room.
var focussedEventID: String?
/// Whether the timeline should scroll to `focussedEventID` when that item is added to the data source.
/// This is necessary as the focussed event can be set before the timeline builder has built its item.
var focussedEventNeedsDisplay = false
var focussedEventNeedsDisplay = false {
didSet {
guard focussedEventNeedsDisplay, let focussedEventID else { return }
scrollToItem(eventID: focussedEventID, animated: false)
}
}
/// Used to hold an observable object that the typing indicator can use
let typingMembers = TypingMembersObservableObject(members: [])
@@ -173,10 +171,7 @@ class TimelineTableViewController: UIViewController {
scrollToBottomPublisher
.sink { [weak self] _ in
guard let self else { return }
scrollToNewestItem(animated: true)
coordinator.send(viewAction: .clearFocussedEvent)
self?.scrollToNewestItem(animated: true)
}
.store(in: &cancellables)
@@ -343,7 +338,7 @@ class TimelineTableViewController: UIViewController {
if let kvPair = timelineItemsDictionary.first(where: { $0.value.identifier.eventID == focussedEventID }),
let indexPath = dataSource?.indexPath(for: kvPair.key) {
tableView.scrollToRow(at: indexPath, at: .middle, animated: animated)
focussedEventNeedsDisplay = false
coordinator.send(viewAction: .scrolledToFocussedItem)
}
}
@@ -65,6 +65,9 @@ struct TimelineView: UIViewControllerRepresentable {
if tableViewController.focussedEventID != context.viewState.timelineViewState.focussedEventID {
tableViewController.focussedEventID = context.viewState.timelineViewState.focussedEventID
}
if tableViewController.focussedEventNeedsDisplay != context.viewState.timelineViewState.focussedEventNeedsDisplay {
tableViewController.focussedEventNeedsDisplay = context.viewState.timelineViewState.focussedEventNeedsDisplay
}
if tableViewController.typingMembers.members != context.viewState.typingMembers {
tableViewController.setTypingMembers(context.viewState.typingMembers)