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
This commit is contained in:
committed by
William Casarin
parent
514d9f4201
commit
549cbb9bce
@@ -41,6 +41,7 @@ struct ShimmeringView<Content: View>: View {
|
|||||||
_startPoint = .init(wrappedValue: configuration.initialLocation.start)
|
_startPoint = .init(wrappedValue: configuration.initialLocation.start)
|
||||||
_endPoint = .init(wrappedValue: configuration.initialLocation.end)
|
_endPoint = .init(wrappedValue: configuration.initialLocation.end)
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
content()
|
content()
|
||||||
@@ -71,7 +72,12 @@ public struct ShimmerModifier: ViewModifier {
|
|||||||
|
|
||||||
|
|
||||||
public extension View {
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -274,6 +274,20 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable {
|
|||||||
self.tags = tags
|
self.tags = tags
|
||||||
self.created_at = Int64(Date().timeIntervalSince1970)
|
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) {
|
init(from: NostrEvent, content: String? = nil) {
|
||||||
self.id = from.id
|
self.id = from.id
|
||||||
|
|||||||
@@ -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_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 = [
|
static let EXAMPLE_EVENTS = [
|
||||||
NostrEvent(content: "Icecream", 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(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: "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(id: UUID().description, content: "Bonjour Le Monde", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
||||||
NostrEvent(content: "Why am I helping on this app? Because it's fun!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
NostrEvent(id: UUID().description, content: "Why am I helping on this app? Because it's fun!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
||||||
NostrEvent(content: "PIzza", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
NostrEvent(id: UUID().description, content: "Pizza and Icecream! Pizza and Icecream! Testing Testing! 1 .. 2.. 3..", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
||||||
NostrEvent(content: "Hello World! This is so cool!", pubkey: "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"),
|
NostrEvent(id: UUID().description, 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?", 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"),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,10 +33,14 @@ func pfp_line_width(_ h: Highlight) -> CGFloat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ProfilePicView: View {
|
struct ProfilePicView: View {
|
||||||
|
|
||||||
|
@Environment(\.redactionReasons) private var reasons
|
||||||
|
|
||||||
let pubkey: String
|
let pubkey: String
|
||||||
let size: CGFloat
|
let size: CGFloat
|
||||||
let highlight: Highlight
|
let highlight: Highlight
|
||||||
let profiles: Profiles
|
let profiles: Profiles
|
||||||
|
let isPlaceholder: Bool = false
|
||||||
|
|
||||||
@State var picture: String? = nil
|
@State var picture: String? = nil
|
||||||
|
|
||||||
@@ -57,21 +61,25 @@ struct ProfilePicView: View {
|
|||||||
let pic = picture ?? profiles.lookup(id: pubkey)?.picture ?? robohash(pubkey)
|
let pic = picture ?? profiles.lookup(id: pubkey)?.picture ?? robohash(pubkey)
|
||||||
let url = URL(string: pic)
|
let url = URL(string: pic)
|
||||||
|
|
||||||
KFAnimatedImage(url)
|
if reasons.isEmpty {
|
||||||
.configure { view in
|
KFAnimatedImage(url)
|
||||||
view.framePreloadCount = 1
|
.configure { view in
|
||||||
}
|
view.framePreloadCount = 1
|
||||||
.placeholder { _ in
|
}
|
||||||
Placeholder
|
.placeholder { _ in
|
||||||
}
|
Placeholder
|
||||||
.cacheOriginalImage()
|
}
|
||||||
.scaleFactor(UIScreen.main.scale)
|
.cacheOriginalImage()
|
||||||
.loadDiskFileSynchronously()
|
.scaleFactor(UIScreen.main.scale)
|
||||||
.fade(duration: 0.1)
|
.loadDiskFileSynchronously()
|
||||||
.frame(width: size, height: size)
|
.fade(duration: 0.1)
|
||||||
.clipShape(Circle())
|
} else {
|
||||||
.overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
KFImage(url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.frame(width: size, height: size)
|
||||||
|
.clipShape(Circle())
|
||||||
|
.overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ struct SearchHomeView: View {
|
|||||||
var GlobalContent: some View {
|
var GlobalContent: some View {
|
||||||
return TimelineView(events: $model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true, filter: { _ in true })
|
return TimelineView(events: $model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true, filter: { _ in true })
|
||||||
.refreshable {
|
.refreshable {
|
||||||
// Fetch new information by resubscribing to the relay
|
// Fetch new information by unsubscribing and resubscribing to the relay
|
||||||
|
model.unsubscribe()
|
||||||
model.subscribe()
|
model.subscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,7 +51,8 @@ struct SearchHomeView: View {
|
|||||||
var SearchContent: some View {
|
var SearchContent: some View {
|
||||||
SearchResultsView(damus_state: damus_state, search: $search)
|
SearchResultsView(damus_state: damus_state, search: $search)
|
||||||
.refreshable {
|
.refreshable {
|
||||||
// Fetch new information by resubscribing to the relay
|
// Fetch new information by unsubscribing and resubscribing to the relay
|
||||||
|
model.unsubscribe()
|
||||||
model.subscribe()
|
model.subscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,9 +70,7 @@ struct SearchHomeView: View {
|
|||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
MainContent
|
||||||
MainContent
|
|
||||||
}
|
|
||||||
.safeAreaInset(edge: .top) {
|
.safeAreaInset(edge: .top) {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
SearchInput
|
SearchInput
|
||||||
|
|||||||
@@ -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 {
|
struct TimelineView: View {
|
||||||
|
|
||||||
@Binding var events: [NostrEvent]
|
@Binding var events: [NostrEvent]
|
||||||
@@ -75,13 +56,10 @@ struct TimelineView: View {
|
|||||||
var MainContent: some View {
|
var MainContent: some View {
|
||||||
ScrollViewReader { scroller in
|
ScrollViewReader { scroller in
|
||||||
ScrollView {
|
ScrollView {
|
||||||
if loading {
|
InnerTimelineView(events: loading ? .constant(Constants.EXAMPLE_EVENTS) : $events, damus: damus, show_friend_icon: show_friend_icon, filter: loading ? { _ in true } : filter)
|
||||||
InnerTimelineRedactedView(events: Constants.EXAMPLE_EVENTS, damus: damus, show_friend_icon: true)
|
.redacted(reason: loading ? .placeholder : [])
|
||||||
ProgressView()
|
.shimmer(loading)
|
||||||
.progressViewStyle(.circular)
|
.disabled(loading)
|
||||||
} else {
|
|
||||||
InnerTimelineView(events: $events, damus: damus, show_friend_icon: show_friend_icon, filter: filter)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in
|
||||||
guard let event = events.filter(self.filter).first else {
|
guard let event = events.filter(self.filter).first else {
|
||||||
|
|||||||
Reference in New Issue
Block a user