This commit changes the thread view to a new UX concept where children views of the selected view are now presented as chat bubbles, and the entire tree of conversation is shown flattened. New interactions, layout, and design changes have been introduced to revamp the user experience. Testing ------- Device: A mix of iPhone physical devices and simulator iOS: A mix of iOS 17 versions Damus: A mix of versions leading up to this one. Coverage: 1. Unit tests are passing 2. A select few users have been using prototypes versions of this as their daily driver 3. Layout tested with an eclectic mix of threads 4. Posting new notes to the thread works 5. Clicking on reply quote view takes user to the mentioned message with a momentary visible highlight 6. Swipe actions work 7. Long press on chat bubbles works and shows emoji selector. Adding emoji sends the reaction 8. Clicking on notes selects them with an easy to follow transition Known issues: 1. The text on the reply quote view occasionally appears to be off-center (in about 10% of occurrences). The cause is still unknown 2. Long press will still show the emoji keyboard even if user is on "onlyzaps" mode 3. Quoted events are not rendered on chat bubbles. When user posts a quoted event with no text, that could lead to confusion Closes: https://github.com/damus-io/damus/issues/1126 Changelog-Added: Completely new threads experience that is easier and more pleasant to use Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
71 lines
2.6 KiB
Swift
71 lines
2.6 KiB
Swift
//
|
|
// ReplyQuoteView.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2022-04-19.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct ReplyQuoteView: View {
|
|
let keypair: Keypair
|
|
let quoter: NostrEvent
|
|
let event_id: NoteId
|
|
let state: DamusState
|
|
@ObservedObject var thread: ThreadModel
|
|
let options: EventViewOptions
|
|
|
|
func content(event: NdbNote) -> some View {
|
|
ZStack(alignment: .leading) {
|
|
VStack(alignment: .leading) {
|
|
HStack(alignment: .center) {
|
|
if should_show_event(event: event, damus_state: state) {
|
|
ProfilePicView(pubkey: event.pubkey, size: 14, highlight: .reply, profiles: state.profiles, disable_animation: false)
|
|
let blur_images = should_blur_images(settings: state.settings, contacts: state.contacts, ev: event, our_pubkey: state.pubkey)
|
|
NoteContentView(damus_state: state, event: event, blur_images: blur_images, size: .small, options: options)
|
|
.font(.callout)
|
|
.lineLimit(1)
|
|
.padding(.bottom, -7)
|
|
.padding(.top, -5)
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.frame(height: 20)
|
|
.clipped()
|
|
}
|
|
else {
|
|
Text("Note you've muted", comment: "Label indicating note has been muted")
|
|
.italic()
|
|
.font(.caption)
|
|
.opacity(0.5)
|
|
.padding(.bottom, -7)
|
|
.padding(.top, -5)
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.frame(height: 20)
|
|
.clipped()
|
|
}
|
|
}
|
|
}
|
|
.padding(5)
|
|
.padding(.leading, 5+3)
|
|
Rectangle()
|
|
.foregroundStyle(.accent)
|
|
.frame(width: 3)
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
Group {
|
|
if let event = state.events.lookup(event_id) {
|
|
self.content(event: event)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ReplyQuoteView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
let s = test_damus_state
|
|
let quoter = test_note
|
|
ReplyQuoteView(keypair: s.keypair, quoter: quoter, event_id: test_note.id, state: s, thread: ThreadModel(event: quoter, damus_state: s), options: [.no_previews, .no_action_bar, .truncate_content_very_short, .no_show_more, .no_translate])
|
|
}
|
|
}
|