damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 549cbb9bce76443aedaec9394f3926acd546667e
parent 514d9f42013d4b8e53e4c1612c7d95c31a808419
Author: Sam DuBois <sdubois@umass.edu>
Date:   Thu, 22 Dec 2022 17:23:55 -0700

Fix issue with loading view using the redacted modifier

Also tried to make some adjusmtents to the refresh subscribtion to see
if this fixes bugs people were having

Closes: #119

Changelog-Fixed: Fixed issues when refreshing global view

Diffstat:
Mdamus/Components/Shimmer.swift | 10++++++++--
Mdamus/Nostr/NostrEvent.swift | 14++++++++++++++
Mdamus/Util/Constants.swift | 16+++++++++-------
Mdamus/Views/ProfilePicView.swift | 36++++++++++++++++++++++--------------
Mdamus/Views/SearchHomeView.swift | 10+++++-----
Mdamus/Views/TimelineView.swift | 30++++--------------------------
6 files changed, 62 insertions(+), 54 deletions(-)

diff --git a/damus/Components/Shimmer.swift b/damus/Components/Shimmer.swift @@ -41,6 +41,7 @@ struct ShimmeringView<Content: View>: View { _startPoint = .init(wrappedValue: configuration.initialLocation.start) _endPoint = .init(wrappedValue: configuration.initialLocation.end) } + var body: some View { ZStack { content() @@ -71,7 +72,12 @@ public struct ShimmerModifier: ViewModifier { public extension View { - func shimmer(configuration: ShimmerConfiguration = .default) -> some View { - modifier(ShimmerModifier(configuration: configuration)) + + @ViewBuilder func shimmer(configuration: ShimmerConfiguration = .default, _ loading: Bool) -> some View { + if loading { + modifier(ShimmerModifier(configuration: configuration)) + } else { + self + } } } diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift @@ -274,6 +274,20 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable { self.tags = tags self.created_at = Int64(Date().timeIntervalSince1970) } + + /// Intiialization statement used to specificy ID + /// + /// This is mainly used for contant and testing data + init(id: String, content: String, pubkey: String, kind: Int = 1, tags: [[String]] = []) { + self.id = id + self.sig = "" + + self.content = content + self.pubkey = pubkey + self.kind = kind + self.tags = tags + self.created_at = Int64(Date().timeIntervalSince1970) + } init(from: NostrEvent, content: String? = nil) { self.id = from.id diff --git a/damus/Util/Constants.swift b/damus/Util/Constants.swift @@ -14,12 +14,14 @@ public class Constants { static let EXAMPLE_DEMOS = DamusState(pool: RelayPool(), keypair: Keypair(pubkey: PUB_KEY, privkey: "privkey"), likes: EventCounter(our_pubkey: PUB_KEY), boosts: EventCounter(our_pubkey: PUB_KEY), contacts: Contacts(), tips: TipCounter(our_pubkey: PUB_KEY), profiles: Profiles(), dms: DirectMessagesModel()) static let EXAMPLE_EVENTS = [ - NostrEvent(content: "Icecream", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "This is a test for a really long note that somebody sent because they thought they were super cool or maybe they were just really excited to share something with the world.", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "Bonjour Le Monde", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "Why am I helping on this app? Because it's fun!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "PIzza", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "Hello World! This is so cool!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), - NostrEvent(content: "Nostr - Damus... Haha get it?", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Nostr - Damus... Haha get it? Bonjour Le Monde mon Ami! C'est la tres importante", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "This is a test for a really long note that somebody sent because they thought they were super cool or maybe they were just really excited to share something with the world.", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Bonjour Le Monde", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Why am I helping on this app? Because it's fun!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Pizza and Icecream! Pizza and Icecream! Testing Testing! 1 .. 2.. 3..", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Hello World! This is so cool!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Nostr - Damus... Haha get it?", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Hello World! This is so cool!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), + NostrEvent(id: UUID().description, content: "Bonjour Le Monde", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"), ] } diff --git a/damus/Views/ProfilePicView.swift b/damus/Views/ProfilePicView.swift @@ -33,10 +33,14 @@ func pfp_line_width(_ h: Highlight) -> CGFloat { } struct ProfilePicView: View { + + @Environment(\.redactionReasons) private var reasons + let pubkey: String let size: CGFloat let highlight: Highlight let profiles: Profiles + let isPlaceholder: Bool = false @State var picture: String? = nil @@ -57,21 +61,25 @@ struct ProfilePicView: View { let pic = picture ?? profiles.lookup(id: pubkey)?.picture ?? robohash(pubkey) let url = URL(string: pic) - KFAnimatedImage(url) - .configure { view in - view.framePreloadCount = 1 - } - .placeholder { _ in - Placeholder - } - .cacheOriginalImage() - .scaleFactor(UIScreen.main.scale) - .loadDiskFileSynchronously() - .fade(duration: 0.1) - .frame(width: size, height: size) - .clipShape(Circle()) - .overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight))) + if reasons.isEmpty { + KFAnimatedImage(url) + .configure { view in + view.framePreloadCount = 1 + } + .placeholder { _ in + Placeholder + } + .cacheOriginalImage() + .scaleFactor(UIScreen.main.scale) + .loadDiskFileSynchronously() + .fade(duration: 0.1) + } else { + KFImage(url) + } } + .frame(width: size, height: size) + .clipShape(Circle()) + .overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight))) } var body: some View { diff --git a/damus/Views/SearchHomeView.swift b/damus/Views/SearchHomeView.swift @@ -42,7 +42,8 @@ struct SearchHomeView: View { var GlobalContent: some View { return TimelineView(events: $model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true, filter: { _ in true }) .refreshable { - // Fetch new information by resubscribing to the relay + // Fetch new information by unsubscribing and resubscribing to the relay + model.unsubscribe() model.subscribe() } } @@ -50,7 +51,8 @@ struct SearchHomeView: View { var SearchContent: some View { SearchResultsView(damus_state: damus_state, search: $search) .refreshable { - // Fetch new information by resubscribing to the relay + // Fetch new information by unsubscribing and resubscribing to the relay + model.unsubscribe() model.subscribe() } } @@ -68,9 +70,7 @@ struct SearchHomeView: View { @Environment(\.colorScheme) var colorScheme var body: some View { - VStack { - MainContent - } + MainContent .safeAreaInset(edge: .top) { VStack(spacing: 0) { SearchInput diff --git a/damus/Views/TimelineView.swift b/damus/Views/TimelineView.swift @@ -40,25 +40,6 @@ struct InnerTimelineView: View { } } -struct InnerTimelineRedactedView: View { - let events: [NostrEvent] - let damus: DamusState - let show_friend_icon: Bool - - var body: some View { - VStack { - ForEach(events, id: \.id) { event in - EventView(event: event, highlight: .none, has_action_bar: true, damus: damus, show_friend_icon: show_friend_icon) - .buttonStyle(PlainButtonStyle()) - } - } - .shimmer() - .redacted(reason: .placeholder) - .padding(.horizontal) - .disabled(true) - } -} - struct TimelineView: View { @Binding var events: [NostrEvent] @@ -75,13 +56,10 @@ struct TimelineView: View { var MainContent: some View { ScrollViewReader { scroller in ScrollView { - if loading { - InnerTimelineRedactedView(events: Constants.EXAMPLE_EVENTS, damus: damus, show_friend_icon: true) - ProgressView() - .progressViewStyle(.circular) - } else { - InnerTimelineView(events: $events, damus: damus, show_friend_icon: show_friend_icon, filter: filter) - } + InnerTimelineView(events: loading ? .constant(Constants.EXAMPLE_EVENTS) : $events, damus: damus, show_friend_icon: show_friend_icon, filter: loading ? { _ in true } : filter) + .redacted(reason: loading ? .placeholder : []) + .shimmer(loading) + .disabled(loading) } .onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in guard let event = events.filter(self.filter).first else {