1
0
mirror of git://jb55.com/damus synced 2024-09-30 00:40:45 +00:00

notify: switch over to new typesafe notifications

This commit is contained in:
William Casarin 2023-07-30 10:50:41 -07:00
parent 80063af19a
commit b40c595a7c
39 changed files with 129 additions and 289 deletions

View File

@ -292,7 +292,6 @@
4CE4F0F229D4FCFA005914DB /* DebouncedOnChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F129D4FCFA005914DB /* DebouncedOnChange.swift */; }; 4CE4F0F229D4FCFA005914DB /* DebouncedOnChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F129D4FCFA005914DB /* DebouncedOnChange.swift */; };
4CE4F0F429D779B5005914DB /* PostBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F329D779B5005914DB /* PostBox.swift */; }; 4CE4F0F429D779B5005914DB /* PostBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F329D779B5005914DB /* PostBox.swift */; };
4CE4F0F829DB7399005914DB /* ThiccDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F729DB7399005914DB /* ThiccDivider.swift */; }; 4CE4F0F829DB7399005914DB /* ThiccDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F729DB7399005914DB /* ThiccDivider.swift */; };
4CE4F8CD281352B30009DFBB /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F8CC281352B30009DFBB /* Notifications.swift */; };
4CE4F9DE2852768D00C00DD9 /* ConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */; }; 4CE4F9DE2852768D00C00DD9 /* ConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */; };
4CE4F9E328528C5200C00DD9 /* AddRelayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */; }; 4CE4F9E328528C5200C00DD9 /* AddRelayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */; };
4CE6DEE727F7A08100C66700 /* damusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DEE627F7A08100C66700 /* damusApp.swift */; }; 4CE6DEE727F7A08100C66700 /* damusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DEE627F7A08100C66700 /* damusApp.swift */; };
@ -829,7 +828,6 @@
4CE4F0F129D4FCFA005914DB /* DebouncedOnChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebouncedOnChange.swift; sourceTree = "<group>"; }; 4CE4F0F129D4FCFA005914DB /* DebouncedOnChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebouncedOnChange.swift; sourceTree = "<group>"; };
4CE4F0F329D779B5005914DB /* PostBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostBox.swift; sourceTree = "<group>"; }; 4CE4F0F329D779B5005914DB /* PostBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostBox.swift; sourceTree = "<group>"; };
4CE4F0F729DB7399005914DB /* ThiccDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThiccDivider.swift; sourceTree = "<group>"; }; 4CE4F0F729DB7399005914DB /* ThiccDivider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThiccDivider.swift; sourceTree = "<group>"; };
4CE4F8CC281352B30009DFBB /* Notifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = "<group>"; };
4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigView.swift; sourceTree = "<group>"; }; 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigView.swift; sourceTree = "<group>"; };
4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddRelayView.swift; sourceTree = "<group>"; }; 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddRelayView.swift; sourceTree = "<group>"; };
4CE6DEE327F7A08100C66700 /* damus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = damus.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4CE6DEE327F7A08100C66700 /* damus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = damus.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -1355,7 +1353,6 @@
4CC7AAE6297EFA7B00430951 /* Zap.swift */, 4CC7AAE6297EFA7B00430951 /* Zap.swift */,
F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */, F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */,
4CEE2AF4280B29E600AB5EEF /* TimeAgo.swift */, 4CEE2AF4280B29E600AB5EEF /* TimeAgo.swift */,
4CE4F8CC281352B30009DFBB /* Notifications.swift */,
4C363A8328233689006E126D /* Parser.swift */, 4C363A8328233689006E126D /* Parser.swift */,
4C363AA728297703006E126D /* InsertSort.swift */, 4C363AA728297703006E126D /* InsertSort.swift */,
4C285C8B28398BC6008A31F1 /* Keys.swift */, 4C285C8B28398BC6008A31F1 /* Keys.swift */,
@ -2028,7 +2025,6 @@
4C3AC79D2833036D00E1F516 /* FollowingView.swift in Sources */, 4C3AC79D2833036D00E1F516 /* FollowingView.swift in Sources */,
5CF72FC229B9142F00124A13 /* ShareAction.swift in Sources */, 5CF72FC229B9142F00124A13 /* ShareAction.swift in Sources */,
4C8D1A6C29F1DFC200ACDF75 /* FriendIcon.swift in Sources */, 4C8D1A6C29F1DFC200ACDF75 /* FriendIcon.swift in Sources */,
4CE4F8CD281352B30009DFBB /* Notifications.swift in Sources */,
4C30AC7829A577AB00E2BD5A /* EventCache.swift in Sources */, 4C30AC7829A577AB00E2BD5A /* EventCache.swift in Sources */,
4C285C8428385690008A31F1 /* CreateAccountView.swift in Sources */, 4C285C8428385690008A31F1 /* CreateAccountView.swift in Sources */,
4CDD1AE22A6B3074001CD4DF /* NdbTagsIterator.swift in Sources */, 4CDD1AE22A6B3074001CD4DF /* NdbTagsIterator.swift in Sources */,

View File

@ -115,5 +115,5 @@ struct InvoiceView_Previews: PreviewProvider {
func present_sheet(_ sheet: Sheets) { func present_sheet(_ sheet: Sheets) {
notify(.present_sheet, sheet) notify(.present_sheet(sheet))
} }

View File

@ -93,13 +93,11 @@ struct SearchHeaderView: View {
} }
} }
} }
.onReceive(handle_notify(.followed)) { notif in .onReceive(handle_notify(.followed)) { ref in
let ref = notif.object as! ReferencedId
guard hashtag_matches_search(desc: self.described, ref: ref) else { return } guard hashtag_matches_search(desc: self.described, ref: ref) else { return }
self.is_following = true self.is_following = true
} }
.onReceive(handle_notify(.unfollowed)) { notif in .onReceive(handle_notify(.unfollowed)) { ref in
let ref = notif.object as! ReferencedId
guard hashtag_matches_search(desc: self.described, ref: ref) else { return } guard hashtag_matches_search(desc: self.described, ref: ref) else { return }
self.is_following = false self.is_following = false
} }

View File

@ -189,7 +189,7 @@ func send_zap(damus_state: DamusState, target: ZapTarget, lnurl: String, is_cust
remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events) remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events)
let typ = ZappingEventType.failed(.bad_lnurl) let typ = ZappingEventType.failed(.bad_lnurl)
let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target) let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target)
notify(.zapping, ev) notify(.zapping(ev))
return return
} }
@ -197,7 +197,7 @@ func send_zap(damus_state: DamusState, target: ZapTarget, lnurl: String, is_cust
remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events) remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events)
let typ = ZappingEventType.failed(.fetching_invoice) let typ = ZappingEventType.failed(.fetching_invoice)
let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target) let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target)
notify(.zapping, ev) notify(.zapping(ev))
return return
} }
@ -208,7 +208,7 @@ func send_zap(damus_state: DamusState, target: ZapTarget, lnurl: String, is_cust
remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events) remove_zap(reqid: reqid, zapcache: damus_state.zaps, evcache: damus_state.events)
let typ = ZappingEventType.failed(.canceled) let typ = ZappingEventType.failed(.canceled)
let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target) let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target)
notify(.zapping, ev) notify(.zapping(ev))
return return
} }
@ -234,7 +234,7 @@ func send_zap(damus_state: DamusState, target: ZapTarget, lnurl: String, is_cust
let typ = ZappingEventType.failed(.send_failed) let typ = ZappingEventType.failed(.send_failed)
let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target) let ev = ZappingEvent(is_custom: is_custom, type: typ, target: target)
notify(.zapping, ev) notify(.zapping(ev))
return return
} }
@ -245,12 +245,12 @@ func send_zap(damus_state: DamusState, target: ZapTarget, lnurl: String, is_cust
} }
let ev = ZappingEvent(is_custom: is_custom, type: .sent_from_nwc, target: target) let ev = ZappingEvent(is_custom: is_custom, type: .sent_from_nwc, target: target)
notify(.zapping, ev) notify(.zapping(ev))
case .external(let pending_ext): case .external(let pending_ext):
pending_ext.state = .done pending_ext.state = .done
let ev = ZappingEvent(is_custom: is_custom, type: .got_zap_invoice(inv), target: target) let ev = ZappingEvent(is_custom: is_custom, type: .got_zap_invoice(inv), target: target)
notify(.zapping, ev) notify(.zapping(ev))
} }
} }

View File

@ -349,26 +349,22 @@ struct ContentView: View {
} }
} }
} }
.onReceive(handle_notify(.compose)) { notif in .onReceive(handle_notify(.compose)) { action in
let action = notif.object as! PostAction
self.active_sheet = .post(action) self.active_sheet = .post(action)
} }
.onReceive(timer) { n in .onReceive(timer) { n in
self.damus_state?.postbox.try_flushing_events() self.damus_state?.postbox.try_flushing_events()
} }
.onReceive(handle_notify(.report)) { notif in .onReceive(handle_notify(.report)) { target in
let target = notif.object as! ReportTarget
self.active_sheet = .report(target) self.active_sheet = .report(target)
} }
.onReceive(handle_notify(.mute)) { notif in .onReceive(handle_notify(.mute)) { pubkey in
let pubkey = notif.object as! String
self.muting = pubkey self.muting = pubkey
self.confirm_mute = true self.confirm_mute = true
} }
.onReceive(handle_notify(.attached_wallet)) { notif in .onReceive(handle_notify(.attached_wallet)) { nwc in
// update the lightning address on our profile when we attach a // update the lightning address on our profile when we attach a
// wallet with an associated // wallet with an associated
let nwc = notif.object as! WalletConnectURL
guard let ds = self.damus_state, guard let ds = self.damus_state,
let lud16 = nwc.lud16, let lud16 = nwc.lud16,
let keypair = ds.keypair.to_full(), let keypair = ds.keypair.to_full(),
@ -390,8 +386,7 @@ struct ContentView: View {
} }
ds.postbox.send(ev) ds.postbox.send(ev)
} }
.onReceive(handle_notify(.broadcast_event)) { obj in .onReceive(handle_notify(.broadcast)) { ev in
let ev = obj.object as! NostrEvent
guard let ds = self.damus_state else { guard let ds = self.damus_state else {
return return
} }
@ -400,47 +395,43 @@ struct ContentView: View {
ds.postbox.send(profile.event) ds.postbox.send(profile.event)
} }
} }
.onReceive(handle_notify(.unfollow)) { notif in .onReceive(handle_notify(.unfollow)) { target in
guard let state = self.damus_state else { return } guard let state = self.damus_state else { return }
_ = handle_unfollow_notif(state: state, notif: notif) _ = handle_unfollow_notif(state: state, target: target)
} }
.onReceive(handle_notify(.unfollowed)) { notif in .onReceive(handle_notify(.unfollowed)) { unfollow in
let unfollow = notif.object as! ReferencedId
home.resubscribe(.unfollowing(unfollow)) home.resubscribe(.unfollowing(unfollow))
} }
.onReceive(handle_notify(.follow)) { notif in .onReceive(handle_notify(.follow)) { target in
guard let state = self.damus_state else { return } guard let state = self.damus_state else { return }
guard handle_follow_notif(state: state, notif: notif) else { return } guard handle_follow_notif(state: state, target: target) else { return }
} }
.onReceive(handle_notify(.followed)) { notif in .onReceive(handle_notify(.followed)) { _ in
home.resubscribe(.following) home.resubscribe(.following)
} }
.onReceive(handle_notify(.post)) { notif in .onReceive(handle_notify(.post)) { post in
guard let state = self.damus_state, guard let state = self.damus_state,
let keypair = state.keypair.to_full() else { let keypair = state.keypair.to_full() else {
return return
} }
if !handle_post_notification(keypair: keypair, postbox: state.postbox, events: state.events, notif: notif) { if !handle_post_notification(keypair: keypair, postbox: state.postbox, events: state.events, post: post) {
self.active_sheet = nil self.active_sheet = nil
} }
} }
.onReceive(handle_notify(.new_mutes)) { notif in .onReceive(handle_notify(.new_mutes)) { _ in
home.filter_events() home.filter_events()
} }
.onReceive(handle_notify(.mute_thread)) { notif in .onReceive(handle_notify(.mute_thread)) { _ in
home.filter_events() home.filter_events()
} }
.onReceive(handle_notify(.unmute_thread)) { notif in .onReceive(handle_notify(.unmute_thread)) { _ in
home.filter_events() home.filter_events()
} }
.onReceive(handle_notify(.present_sheet)) { notif in .onReceive(handle_notify(.present_sheet)) { sheet in
let sheet = notif.object as! Sheets
self.active_sheet = sheet self.active_sheet = sheet
} }
.onReceive(handle_notify(.zapping)) { notif in .onReceive(handle_notify(.zapping)) { zap_ev in
let zap_ev = notif.object as! ZappingEvent
guard !zap_ev.is_custom else { guard !zap_ev.is_custom else {
return return
} }
@ -475,12 +466,8 @@ struct ContentView: View {
break break
} }
} }
.onReceive(handle_notify(.local_notification)) { notif in .onReceive(handle_notify(.local_notification)) { local in
guard let damus_state else { return }
guard let local = notif.object as? LossyLocalNotification,
let damus_state else {
return
}
if local.type == .profile_zap { if local.type == .profile_zap {
open_profile(id: local.event_id) open_profile(id: local.event_id)
@ -503,8 +490,7 @@ struct ContentView: View {
break break
} }
} }
.onReceive(handle_notify(.onlyzaps_mode)) { notif in .onReceive(handle_notify(.onlyzaps_mode)) { hide in
let hide = notif.object as! Bool
home.filter_events() home.filter_events()
guard let damus_state, guard let damus_state,
@ -597,12 +583,12 @@ struct ContentView: View {
func switch_timeline(_ timeline: Timeline) { func switch_timeline(_ timeline: Timeline) {
self.isSideBarOpened = false self.isSideBarOpened = false
self.popToRoot() self.popToRoot()
NotificationCenter.default.post(name: .switched_timeline, object: timeline)
notify(.switched_timeline(timeline))
if timeline == self.selected_timeline { if timeline == self.selected_timeline {
NotificationCenter.default.post(name: .scroll_to_top, object: nil) notify(.scroll_to_top)
return return
} }
@ -894,7 +880,7 @@ func handle_unfollow(state: DamusState, unfollow: ReferencedId) -> Bool {
return false return false
} }
notify(.unfollowed, unfollow) notify(.unfollowed(unfollow))
state.contacts.event = ev state.contacts.event = ev
@ -906,8 +892,7 @@ func handle_unfollow(state: DamusState, unfollow: ReferencedId) -> Bool {
return true return true
} }
func handle_unfollow_notif(state: DamusState, notif: Notification) -> ReferencedId? { func handle_unfollow_notif(state: DamusState, target: FollowTarget) -> ReferencedId? {
let target = notif.object as! FollowTarget
let pk = target.pubkey let pk = target.pubkey
let ref = ReferencedId.p(pk) let ref = ReferencedId.p(pk)
@ -929,7 +914,7 @@ func handle_follow(state: DamusState, follow: ReferencedId) -> Bool {
return false return false
} }
notify(.followed, follow) notify(.followed(follow))
state.contacts.event = ev state.contacts.event = ev
if follow.key == "p" { if follow.key == "p" {
@ -940,21 +925,19 @@ func handle_follow(state: DamusState, follow: ReferencedId) -> Bool {
} }
@discardableResult @discardableResult
func handle_follow_notif(state: DamusState, notif: Notification) -> Bool { func handle_follow_notif(state: DamusState, target: FollowTarget) -> Bool {
let fnotify = notif.object as! FollowTarget switch target {
switch fnotify {
case .pubkey(let pk): case .pubkey(let pk):
state.contacts.add_friend_pubkey(pk) state.contacts.add_friend_pubkey(pk)
case .contact(let ev): case .contact(let ev):
state.contacts.add_friend_contact(ev) state.contacts.add_friend_contact(ev)
} }
return handle_follow(state: state, follow: .p(fnotify.pubkey)) return handle_follow(state: state, follow: .p(target.pubkey))
} }
func handle_post_notification(keypair: FullKeypair, postbox: PostBox, events: EventCache, notif: Notification) -> Bool { func handle_post_notification(keypair: FullKeypair, postbox: PostBox, events: EventCache, post: NostrPostResult) -> Bool {
let post_res = notif.object as! NostrPostResult switch post {
switch post_res {
case .post(let post): case .post(let post):
//let post = tup.0 //let post = tup.0
//let to_relays = tup.1 //let to_relays = tup.1

View File

@ -35,14 +35,14 @@ class Contacts {
let new = Set(ev.referenced_pubkeys.map({ $0.ref_id })) let new = Set(ev.referenced_pubkeys.map({ $0.ref_id }))
let diff = old.symmetricDifference(new) let diff = old.symmetricDifference(new)
var new_mutes = Array<String>() var new_mutes = Set<Pubkey>()
var new_unmutes = Array<String>() var new_unmutes = Set<Pubkey>()
for d in diff { for d in diff {
if new.contains(d) { if new.contains(d) {
new_mutes.append(d.string()) new_mutes.insert(d.string())
} else { } else {
new_unmutes.append(d.string()) new_unmutes.insert(d.string())
} }
} }
@ -50,11 +50,11 @@ class Contacts {
self.muted = Set(ev.referenced_pubkeys.map({ $0.ref_id.string() })) self.muted = Set(ev.referenced_pubkeys.map({ $0.ref_id.string() }))
if new_mutes.count > 0 { if new_mutes.count > 0 {
notify(.new_mutes, new_mutes) notify(.new_mutes(new_mutes))
} }
if new_unmutes.count > 0 { if new_unmutes.count > 0 {
notify(.new_unmutes, new_unmutes) notify(.new_unmutes(new_unmutes))
} }
} }

View File

@ -7,17 +7,14 @@
import Foundation import Foundation
enum FollowTarget { enum FollowTarget {
case pubkey(String) case pubkey(Pubkey)
case contact(NostrEvent) case contact(NostrEvent)
var pubkey: String { var pubkey: Pubkey {
switch self { switch self {
case .pubkey(let pk): case .pubkey(let pk): return pk
return pk case .contact(let ev): return ev.pubkey
case .contact(let ev):
return ev.pubkey
} }
} }
} }

View File

@ -328,8 +328,8 @@ class HomeModel {
break break
case .success(let n): case .success(let n):
let boosted = Counted(event: ev, id: e, total: n) let boosted = Counted(event: ev, id: e, total: n)
notify(.boosted, boosted) notify(.reposted(boosted))
notify(.update_stats, e) notify(.update_stats(note_id: e))
} }
} }
@ -349,8 +349,8 @@ class HomeModel {
case .success(let n): case .success(let n):
handle_notification(ev: ev) handle_notification(ev: ev)
let liked = Counted(event: ev, id: e.ref_id, total: n) let liked = Counted(event: ev, id: e.ref_id, total: n)
notify(.liked, liked) notify(.liked(liked))
notify(.update_stats, e.ref_id) notify(.update_stats(note_id: e.ref_id))
} }
} }
@ -716,12 +716,12 @@ func load_our_contacts(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent)
let diff = new_refs.symmetricDifference(old_refs) let diff = new_refs.symmetricDifference(old_refs)
for ref in diff { for ref in diff {
if new_refs.contains(ref) { if new_refs.contains(ref) {
notify(.followed, ref) notify(.followed(ref))
if ref.key == "p" { if ref.key == "p" {
contacts.add_friend_pubkey(ref.ref_id) contacts.add_friend_pubkey(ref.ref_id)
} }
} else { } else {
notify(.unfollowed, ref) notify(.unfollowed(ref))
if ref.key == "p" { if ref.key == "p" {
contacts.remove_friend(ref.ref_id) contacts.remove_friend(ref.ref_id)
} }
@ -817,7 +817,7 @@ func process_metadata_profile(our_pubkey: String, profiles: Profiles, profile: P
} }
if changed { if changed {
notify(.profile_updated, ProfileUpdate(pubkey: ev.pubkey, profile: profile)) notify(.profile_updated(pubkey: ev.pubkey, profile: profile))
} }
} }
@ -933,7 +933,7 @@ func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) {
if changed { if changed {
save_bootstrap_relays(pubkey: state.pubkey, relays: Array(new)) save_bootstrap_relays(pubkey: state.pubkey, relays: Array(new))
state.pool.connect() state.pool.connect()
notify(.relays_changed, ()) notify(.relays_changed)
} }
} }

View File

@ -60,11 +60,11 @@ class MutedThreadsManager: ObservableObject {
if isMutedThread(ev, privkey: keypair.privkey) { if isMutedThread(ev, privkey: keypair.privkey) {
mutedThreads = mutedThreads.filter { $0 != threadId } mutedThreads = mutedThreads.filter { $0 != threadId }
_mutedThreadsSet.remove(threadId) _mutedThreadsSet.remove(threadId)
notify(.unmute_thread, ev) notify(.unmute_thread(ev))
} else { } else {
mutedThreads.append(threadId) mutedThreads.append(threadId)
_mutedThreadsSet.insert(threadId) _mutedThreadsSet.insert(threadId)
notify(.mute_thread, ev) notify(.mute_thread(ev))
} }
} }
} }

View File

@ -38,12 +38,17 @@ struct ReportNoteTarget {
enum ReportTarget { enum ReportTarget {
case user(String) case user(String)
case note(ReportNoteTarget) case note(ReportNoteTarget)
static func note(pubkey: Pubkey, note_id: NoteId) -> ReportTarget {
return .note(ReportNoteTarget(pubkey: pubkey, note_id: note_id))
}
} }
struct Report { struct Report {
let type: ReportType let type: ReportType
let target: ReportTarget let target: ReportTarget
let message: String let message: String
} }
func create_report_tags(target: ReportTarget, type: ReportType) -> [[String]] { func create_report_tags(target: ReportTarget, type: ReportType) -> [[String]] {

View File

@ -57,7 +57,7 @@ class WalletModel: ObservableObject {
func connect(_ nwc: WalletConnectURL) { func connect(_ nwc: WalletConnectURL) {
self.settings.nostr_wallet_connect = nwc.to_url().absoluteString self.settings.nostr_wallet_connect = nwc.to_url().absoluteString
notify(.attached_wallet, nwc) notify(.attached_wallet(nwc))
self.connect_state = .existing(nwc) self.connect_state = .existing(nwc)
self.previous_state = .existing(nwc) self.previous_state = .existing(nwc)
} }

View File

@ -31,12 +31,12 @@ struct Notifications<T: Notify> {
struct NotifyHandler<T> { } struct NotifyHandler<T> { }
func notify_safe<T: Notify>(_ notify: Notifications<T>) { func notify<T: Notify>(_ notify: Notifications<T>) {
let notify = notify.notify let notify = notify.notify
NotificationCenter.default.post(name: T.name, object: notify.payload) NotificationCenter.default.post(name: T.name, object: notify.payload)
} }
func handle_notify_safe<T: Notify>(_ handler: NotifyHandler<T>) -> AnyPublisher<T.Payload, Never> { func handle_notify<T: Notify>(_ handler: NotifyHandler<T>) -> AnyPublisher<T.Payload, Never> {
return NotificationCenter.default.publisher(for: T.name) return NotificationCenter.default.publisher(for: T.name)
//.compactMap { notification in notification.object as? T.Payload } //.compactMap { notification in notification.object as? T.Payload }
.map { notification in notification.object as! T.Payload } .map { notification in notification.object as! T.Payload }

View File

@ -1,109 +0,0 @@
//
// Notifications.swift
// damus
//
// Created by William Casarin on 2022-04-22.
//
import Foundation
extension Notification.Name {
static var relays_changed: Notification.Name {
return Notification.Name("relays_changed")
}
static var profile_updated: Notification.Name {
return Notification.Name("profile_updated")
}
static var switched_timeline: Notification.Name {
return Notification.Name("switched_timeline")
}
static var liked: Notification.Name {
return Notification.Name("liked")
}
static var scroll_to_top: Notification.Name {
return Notification.Name("scroll_to_to")
}
static var broadcast_event: Notification.Name {
return Notification.Name("broadcast event")
}
static var notice: Notification.Name {
return Notification.Name("notice")
}
static var delete: Notification.Name {
return Notification.Name("delete note")
}
static var post: Notification.Name {
return Notification.Name("send post")
}
static var compose: Notification.Name {
return Notification.Name("compose")
}
static var boosted: Notification.Name {
return Notification.Name("boosted")
}
static var follow: Notification.Name {
return Notification.Name("follow")
}
static var unfollow: Notification.Name {
return Notification.Name("unfollow")
}
static var login: Notification.Name {
return Notification.Name("login")
}
static var logout: Notification.Name {
return Notification.Name("logout")
}
static var followed: Notification.Name {
return Notification.Name("followed")
}
static var unfollowed: Notification.Name {
return Notification.Name("unfollowed")
}
static var report: Notification.Name {
return Notification.Name("report")
}
static var mute: Notification.Name {
return Notification.Name("mute")
}
static var new_mutes: Notification.Name {
return Notification.Name("new_mutes")
}
static var new_unmutes: Notification.Name {
return Notification.Name("new_unmutes")
}
static var deleted_account: Notification.Name {
return Notification.Name("deleted_account")
}
static var update_stats: Notification.Name {
return Notification.Name("update_stats")
}
static var present_sheet: Notification.Name {
return Notification.Name("present_sheet")
}
static var zapping: Notification.Name {
return Notification.Name("zapping")
}
static var mute_thread: Notification.Name {
return Notification.Name("mute_thread")
}
static var unmute_thread: Notification.Name {
return Notification.Name("unmute_thread")
}
static var local_notification: Notification.Name {
return Notification.Name("local_notification")
}
static var onlyzaps_mode: Notification.Name {
return Notification.Name("hide_reactions")
}
static var attached_wallet: Notification.Name {
return Notification.Name("attached_wallet")
}
}
func handle_notify(_ name: Notification.Name) -> NotificationCenter.Publisher {
return NotificationCenter.default.publisher(for: name)
}
func notify(_ name: NSNotification.Name, _ object: Any?) {
NotificationCenter.default.post(name: name, object: object)
}

View File

@ -89,8 +89,8 @@ class Zaps {
event_counts[id] = event_counts[id]! + 1 event_counts[id] = event_counts[id]! + 1
event_totals[id] = event_totals[id]! + zap.amount event_totals[id] = event_totals[id]! + zap.amount
notify(.update_stats, zap.target.id) notify(.update_stats(note_id: zap.target.id))
} }
} }

View File

@ -44,7 +44,7 @@ struct EventActionBar: View {
if damus_state.keypair.privkey != nil { if damus_state.keypair.privkey != nil {
HStack(spacing: 4) { HStack(spacing: 4) {
EventActionButton(img: "bubble2", col: bar.replied ? DamusColors.purple : Color.gray) { EventActionButton(img: "bubble2", col: bar.replied ? DamusColors.purple : Color.gray) {
notify(.compose, PostAction.replying_to(event)) notify(.compose(.replying_to(event)))
} }
.accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button")) .accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button"))
Text(verbatim: "\(bar.replies > 0 ? "\(bar.replies)" : "")") Text(verbatim: "\(bar.replies > 0 ? "\(bar.replies)" : "")")
@ -70,7 +70,7 @@ struct EventActionBar: View {
HStack(spacing: 4) { HStack(spacing: 4) {
LikeButton(damus_state: damus_state, liked: bar.liked, liked_emoji: bar.our_like != nil ? to_reaction_emoji(ev: bar.our_like!) : nil) { emoji in LikeButton(damus_state: damus_state, liked: bar.liked, liked_emoji: bar.our_like != nil ? to_reaction_emoji(ev: bar.our_like!) : nil) { emoji in
if bar.liked { if bar.liked {
notify(.delete, bar.our_like) //notify(.delete, bar.our_like)
} else { } else {
send_like(emoji: emoji) send_like(emoji: emoji)
} }
@ -122,13 +122,11 @@ struct EventActionBar: View {
RepostAction(damus_state: self.damus_state, event: event) RepostAction(damus_state: self.damus_state, event: event)
} }
} }
.onReceive(handle_notify(.update_stats)) { n in .onReceive(handle_notify(.update_stats)) { target in
let target = n.object as! String
guard target == self.event.id else { return } guard target == self.event.id else { return }
self.bar.update(damus: self.damus_state, evid: target) self.bar.update(damus: self.damus_state, evid: target)
} }
.onReceive(handle_notify(.liked)) { n in .onReceive(handle_notify(.liked)) { liked in
let liked = n.object as! Counted
if liked.id != event.id { if liked.id != event.id {
return return
} }

View File

@ -38,7 +38,7 @@ struct RepostAction: View {
Button { Button {
dismiss() dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
notify(.compose, PostAction.quoting(self.event)) notify(.compose(.quoting(self.event)))
} }
} label: { } label: {

View File

@ -51,7 +51,7 @@ struct ShareAction: View {
ShareActionButton(img: "globe", text: NSLocalizedString("Broadcast", comment: "Button to broadcast note to all your relays")) { ShareActionButton(img: "globe", text: NSLocalizedString("Broadcast", comment: "Button to broadcast note to all your relays")) {
dismiss() dismiss()
NotificationCenter.default.post(name: .broadcast_event, object: event) notify(.broadcast(event))
} }
ShareActionButton(img: "upload", text: NSLocalizedString("Share Via...", comment: "Button to present iOS share sheet")) { ShareActionButton(img: "upload", text: NSLocalizedString("Share Via...", comment: "Button to present iOS share sheet")) {

View File

@ -77,9 +77,7 @@ struct BannerImageView: View {
var body: some View { var body: some View {
InnerBannerImageView(disable_animation: disable_animation, url: get_banner_url(banner: banner, pubkey: pubkey, profiles: profiles)) InnerBannerImageView(disable_animation: disable_animation, url: get_banner_url(banner: banner, pubkey: pubkey, profiles: profiles))
.onReceive(handle_notify(.profile_updated)) { notif in .onReceive(handle_notify(.profile_updated)) { updated in
let updated = notif.object as! ProfileUpdate
guard updated.pubkey == self.pubkey else { guard updated.pubkey == self.pubkey else {
return return
} }

View File

@ -35,20 +35,12 @@ struct GradientFollowButton: View {
.stroke(grayBorder, lineWidth: follow_state == .unfollows ? 0 : 1) .stroke(grayBorder, lineWidth: follow_state == .unfollows ? 0 : 1)
) )
} }
.onReceive(handle_notify(.followed)) { notif in .onReceive(handle_notify(.followed)) { ref in
let pk = notif.object as? ReferencedId guard target.pubkey == ref.ref_id else { return }
if pk?.ref_id != target.pubkey {
return
}
self.follow_state = .follows self.follow_state = .follows
} }
.onReceive(handle_notify(.unfollowed)) { notif in .onReceive(handle_notify(.unfollowed)) { ref in
let pk = notif.object as? ReferencedId guard target.pubkey == ref.ref_id else { return }
if pk?.ref_id != target.pubkey {
return
}
self.follow_state = .unfollows self.follow_state = .unfollows
} }
} }

View File

@ -72,7 +72,7 @@ struct ConfigView: View {
Section(NSLocalizedString("Sign Out", comment: "Section title for signing out")) { Section(NSLocalizedString("Sign Out", comment: "Section title for signing out")) {
Button(action: { Button(action: {
if state.keypair.privkey == nil { if state.keypair.privkey == nil {
notify(.logout, ()) notify(.logout)
} else { } else {
confirm_logout = true confirm_logout = true
} }
@ -126,7 +126,7 @@ struct ConfigView: View {
return return
} }
state.postbox.send(ev) state.postbox.send(ev)
notify(.logout, ()) notify(.logout)
} }
} }
.alert(NSLocalizedString("Logout", comment: "Alert for logging out the user."), isPresented: $confirm_logout) { .alert(NSLocalizedString("Logout", comment: "Alert for logging out the user."), isPresented: $confirm_logout) {
@ -134,7 +134,7 @@ struct ConfigView: View {
confirm_logout = false confirm_logout = false
} }
Button(NSLocalizedString("Logout", comment: "Button for logging out the user."), role: .destructive) { Button(NSLocalizedString("Logout", comment: "Button for logging out the user."), role: .destructive) {
notify(.logout, ()) notify(.logout)
} }
} message: { } message: {
Text("Make sure your nsec account key is saved before you logout or you will lose access to this account", comment: "Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out.") Text("Make sure your nsec account key is saved before you logout or you will lose access to this account", comment: "Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out.")

View File

@ -120,7 +120,7 @@ struct MenuItems: View {
} }
Button { Button {
NotificationCenter.default.post(name: .broadcast_event, object: event) notify(.broadcast(event))
} label: { } label: {
Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), image: "globe") Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), image: "globe")
} }
@ -128,14 +128,13 @@ struct MenuItems: View {
// Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile. // Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile.
if keypair.pubkey != target_pubkey && keypair.privkey != nil { if keypair.pubkey != target_pubkey && keypair.privkey != nil {
Button(role: .destructive) { Button(role: .destructive) {
let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id)) notify(.report(.note(pubkey: target_pubkey, note_id: event.id)))
notify(.report, target)
} label: { } label: {
Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), image: "raising-hand") Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), image: "raising-hand")
} }
Button(role: .destructive) { Button(role: .destructive) {
notify(.mute, target_pubkey) notify(.mute(target_pubkey))
} label: { } label: {
Label(NSLocalizedString("Mute user", comment: "Context menu option for muting users."), image: "mute") Label(NSLocalizedString("Mute user", comment: "Context menu option for muting users."), image: "mute")
} }

View File

@ -60,20 +60,12 @@ struct MutedEventView: View {
Event Event
} }
} }
.onReceive(handle_notify(.new_mutes)) { notif in .onReceive(handle_notify(.new_mutes)) { mutes in
guard let mutes = notif.object as? [String] else {
return
}
if mutes.contains(event.pubkey) { if mutes.contains(event.pubkey) {
shown = false shown = false
} }
} }
.onReceive(handle_notify(.new_unmutes)) { notif in .onReceive(handle_notify(.new_unmutes)) { unmutes in
guard let unmutes = notif.object as? [String] else {
return
}
if unmutes.contains(event.pubkey) { if unmutes.contains(event.pubkey) {
shown = true shown = true
} }

View File

@ -75,8 +75,7 @@ struct SelectedEventView: View {
Divider() Divider()
.padding([.top], 4) .padding([.top], 4)
} }
.onReceive(handle_notify(.update_stats)) { n in .onReceive(handle_notify(.update_stats)) { target in
let target = n.object as! String
guard target == self.event.id else { return } guard target == self.event.id else { return }
self.bar.update(damus: self.damus, evid: target) self.bar.update(damus: self.damus, evid: target)
} }

View File

@ -31,17 +31,15 @@ struct FollowButtonView: View {
.stroke(follow_state == .unfollows ? .clear : borderColor(), lineWidth: 1) .stroke(follow_state == .unfollows ? .clear : borderColor(), lineWidth: 1)
} }
} }
.onReceive(handle_notify(.followed)) { notif in .onReceive(handle_notify(.followed)) { pk in
let pk = notif.object as! ReferencedId guard pk.key == "p", target.pubkey == pk.ref_id else {
if pk.key == "p", pk.ref_id != target.pubkey {
return return
} }
self.follow_state = .follows self.follow_state = .follows
} }
.onReceive(handle_notify(.unfollowed)) { notif in .onReceive(handle_notify(.unfollowed)) { pk in
let pk = notif.object as! ReferencedId guard pk.key == "p", target.pubkey == pk.ref_id else {
if pk.key == "p", pk.ref_id != target.pubkey {
return return
} }
@ -97,14 +95,14 @@ struct FollowButtonView_Previews: PreviewProvider {
func perform_follow_btn_action(_ fs: FollowState, target: FollowTarget) -> FollowState { func perform_follow_btn_action(_ fs: FollowState, target: FollowTarget) -> FollowState {
switch fs { switch fs {
case .follows: case .follows:
notify(.unfollow, target) notify(.unfollow(target))
return .following return .following
case .following: case .following:
return .following return .following
case .unfollowing: case .unfollowing:
return .following return .following
case .unfollows: case .unfollows:
notify(.follow, target) notify(.follow(target))
return .unfollowing return .unfollowing
} }
} }

View File

@ -215,9 +215,13 @@ func process_login(_ key: ParsedKey, is_pubkey: Bool) async throws {
} }
save_pubkey(pubkey: pk) save_pubkey(pubkey: pk)
} }
guard let keypair = get_saved_keypair() else {
return
}
await MainActor.run { await MainActor.run {
notify(.login, ()) notify(.login(keypair))
} }
} }

View File

@ -225,8 +225,7 @@ struct NoteContentView: View {
var body: some View { var body: some View {
ArtifactContent ArtifactContent
.onReceive(handle_notify(.profile_updated)) { notif in .onReceive(handle_notify(.profile_updated)) { profile in
let profile = notif.object as! ProfileUpdate
let blocks = event.blocks(damus_state.keypair.privkey) let blocks = event.blocks(damus_state.keypair.privkey)
for block in blocks.blocks { for block in blocks.blocks {
switch block { switch block {

View File

@ -44,7 +44,7 @@ class SuggestedUsersViewModel: ObservableObject {
func follow(pubkeys: [String]) { func follow(pubkeys: [String]) {
for pubkey in pubkeys { for pubkey in pubkeys {
notify(.follow, FollowTarget.pubkey(pubkey)) notify(.follow(.pubkey(pubkey)))
} }
} }

View File

@ -67,7 +67,7 @@ struct PostView: View {
@Environment(\.presentationMode) var presentationMode @Environment(\.presentationMode) var presentationMode
func cancel() { func cancel() {
NotificationCenter.default.post(name: .post, object: NostrPostResult.cancel) notify(.post(.cancel))
dismiss() dismiss()
} }
@ -78,7 +78,7 @@ struct PostView: View {
func send_post() { func send_post() {
let new_post = build_post(post: self.post, action: action, uploadedMedias: uploadedMedias, references: references) let new_post = build_post(post: self.post, action: action, uploadedMedias: uploadedMedias, references: references)
NotificationCenter.default.post(name: .post, object: NostrPostResult.post(new_post)) notify(.post(.post(new_post)))
clear_draft() clear_draft()

View File

@ -92,8 +92,7 @@ struct EventProfileName: View {
SupporterBadge(percent: supporter) SupporterBadge(percent: supporter)
} }
} }
.onReceive(handle_notify(.profile_updated)) { notif in .onReceive(handle_notify(.profile_updated)) { update in
let update = notif.object as! ProfileUpdate
if update.pubkey != pubkey { if update.pubkey != pubkey {
return return
} }

View File

@ -98,8 +98,7 @@ struct ProfileName: View {
SupporterBadge(percent: supporter) SupporterBadge(percent: supporter)
} }
} }
.onReceive(handle_notify(.profile_updated)) { notif in .onReceive(handle_notify(.profile_updated)) { update in
let update = notif.object as! ProfileUpdate
if update.pubkey != pubkey { if update.pubkey != pubkey {
return return
} }

View File

@ -86,9 +86,7 @@ struct ProfilePicView: View {
var body: some View { var body: some View {
InnerProfilePicView(url: get_profile_url(picture: picture, pubkey: pubkey, profiles: profiles), fallbackUrl: URL(string: robohash(pubkey)), pubkey: pubkey, size: size, highlight: highlight, disable_animation: disable_animation) InnerProfilePicView(url: get_profile_url(picture: picture, pubkey: pubkey, profiles: profiles), fallbackUrl: URL(string: robohash(pubkey)), pubkey: pubkey, size: size, highlight: highlight, disable_animation: disable_animation)
.onReceive(handle_notify(.profile_updated)) { notif in .onReceive(handle_notify(.profile_updated)) { updated in
let updated = notif.object as! ProfileUpdate
guard updated.pubkey == self.pubkey else { guard updated.pubkey == self.pubkey else {
return return
} }

View File

@ -178,8 +178,7 @@ struct ProfileView: View {
// Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile. // Only allow reporting if logged in with private key and the currently viewed profile is not the logged in profile.
if profile.pubkey != damus_state.pubkey && damus_state.is_privkey_user { if profile.pubkey != damus_state.pubkey && damus_state.is_privkey_user {
Button(NSLocalizedString("Report", comment: "Button to report a profile."), role: .destructive) { Button(NSLocalizedString("Report", comment: "Button to report a profile."), role: .destructive) {
let target: ReportTarget = .user(profile.pubkey) notify(.report(.user(profile.pubkey)))
notify(.report, target)
} }
if damus_state.contacts.is_muted(profile.pubkey) { if damus_state.contacts.is_muted(profile.pubkey) {
@ -200,7 +199,7 @@ struct ProfileView: View {
} }
} else { } else {
Button(NSLocalizedString("Mute", comment: "Button to mute a profile."), role: .destructive) { Button(NSLocalizedString("Mute", comment: "Button to mute a profile."), role: .destructive) {
notify(.mute, profile.pubkey) notify(.mute(profile.pubkey))
} }
} }
} }
@ -479,7 +478,7 @@ struct ProfileView: View {
if damus_state.is_privkey_user { if damus_state.is_privkey_user {
PostButtonContainer(is_left_handed: damus_state.settings.left_handed) { PostButtonContainer(is_left_handed: damus_state.settings.left_handed) {
notify(.compose, PostAction.posting(.user(profile.pubkey))) notify(.compose(.posting(.user(profile.pubkey))))
} }
} }
} }
@ -584,7 +583,7 @@ func check_nip05_validity(pubkey: String, profiles: Profiles) {
Task { @MainActor in Task { @MainActor in
profiles.set_validated(pubkey, nip05: validated) profiles.set_validated(pubkey, nip05: validated)
profiles.nip05_pubkey[nip05] = pubkey profiles.nip05_pubkey[nip05] = pubkey
notify(.profile_updated, ProfileUpdate(pubkey: pubkey, profile: profile)) notify(.profile_updated(pubkey: pubkey, profile: profile))
} }
} }
} }

View File

@ -141,7 +141,7 @@ struct SaveKeysView: View {
do { do {
try save_keypair(pubkey: account.pubkey, privkey: account.privkey) try save_keypair(pubkey: account.pubkey, privkey: account.privkey)
notify(.login, account.keypair) notify(.login(account.keypair))
} catch { } catch {
self.error = "Failed to save keys" self.error = "Failed to save keys"
} }

View File

@ -29,7 +29,7 @@ struct ZapSettingsView: View {
Toggle(NSLocalizedString("OnlyZaps mode", comment: "Setting toggle to hide reactions."), isOn: $settings.onlyzaps_mode) Toggle(NSLocalizedString("OnlyZaps mode", comment: "Setting toggle to hide reactions."), isOn: $settings.onlyzaps_mode)
.toggleStyle(.switch) .toggleStyle(.switch)
.onChange(of: settings.onlyzaps_mode) { newVal in .onChange(of: settings.onlyzaps_mode) { newVal in
notify(.onlyzaps_mode, newVal) notify(.onlyzaps_mode(newVal))
} }
} }

View File

@ -137,7 +137,7 @@ struct SideMenuView: View {
Button(action: { Button(action: {
//ConfigView(state: damus_state) //ConfigView(state: damus_state)
if damus_state.keypair.privkey == nil { if damus_state.keypair.privkey == nil {
notify(.logout, ()) notify(.logout)
} else { } else {
confirm_logout = true confirm_logout = true
} }
@ -175,7 +175,7 @@ struct SideMenuView: View {
confirm_logout = false confirm_logout = false
} }
Button(NSLocalizedString("Logout", comment: "Button for logging out the user."), role: .destructive) { Button(NSLocalizedString("Logout", comment: "Button for logging out the user."), role: .destructive) {
notify(.logout, ()) notify(.logout)
} }
} message: { } message: {
Text("Make sure your nsec account key is saved before you logout or you will lose access to this account", comment: "Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out.") Text("Make sure your nsec account key is saved before you logout or you will lose access to this account", comment: "Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out.")

View File

@ -51,7 +51,7 @@ struct TimelineView<Content: View>: View {
} }
.buttonStyle(BorderlessButtonStyle()) .buttonStyle(BorderlessButtonStyle())
.coordinateSpace(name: "scroll") .coordinateSpace(name: "scroll")
.onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in .onReceive(handle_notify(.scroll_to_top)) { () in
events.flush() events.flush()
self.events.should_queue = false self.events.should_queue = false
scroll_to_event(scroller: scroller, id: "startblock", delay: 0.0, animate: true, anchor: .top) scroll_to_event(scroller: scroller, id: "startblock", delay: 0.0, animate: true, anchor: .top)

View File

@ -169,8 +169,8 @@ struct WalletView: View {
} }
profile.damus_donation = p profile.damus_donation = p
notify(.profile_updated, ProfileUpdate(pubkey: damus_state.pubkey, profile: profile)) notify(.profile_updated(pubkey: damus_state.pubkey, profile: profile))
} }
.onDisappear { .onDisappear {
guard let keypair = damus_state.keypair.to_full(), guard let keypair = damus_state.keypair.to_full(),

View File

@ -185,12 +185,8 @@ struct CustomizeZapView: View {
} }
} }
func receive_zap(notif: Notification) { func receive_zap(zap_ev: ZappingEvent) {
let zap_ev = notif.object as! ZappingEvent guard zap_ev.is_custom, zap_ev.target.id == target.id else {
guard zap_ev.is_custom else {
return
}
guard zap_ev.target.id == target.id else {
return return
} }
@ -257,8 +253,8 @@ struct CustomizeZapView: View {
.onAppear { .onAppear {
model.set_defaults(settings: state.settings) model.set_defaults(settings: state.settings)
} }
.onReceive(handle_notify(.zapping)) { notif in .onReceive(handle_notify(.zapping)) { zap_ev in
receive_zap(notif: notif) receive_zap(zap_ev: zap_ev)
} }
.background(fillColor().edgesIgnoringSafeArea(.all)) .background(fillColor().edgesIgnoringSafeArea(.all))
.onTapGesture { .onTapGesture {

View File

@ -34,7 +34,7 @@ struct MainView: View {
} }
} }
.dynamicTypeSize(.xSmall ... .xxxLarge) .dynamicTypeSize(.xSmall ... .xxxLarge)
.onReceive(handle_notify(.logout)) { _ in .onReceive(handle_notify(.logout)) { () in
try? clear_keypair() try? clear_keypair()
keypair = nil keypair = nil
} }
@ -59,7 +59,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo let userInfo = response.notification.request.content.userInfo
let notification = LossyLocalNotification.from_user_info(user_info: userInfo) let notification = LossyLocalNotification.from_user_info(user_info: userInfo)
notify(.local_notification, notification) notify(.local_notification(notification))
completionHandler() completionHandler()
} }
} }