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:
parent
80063af19a
commit
b40c595a7c
@ -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 */,
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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]] {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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 }
|
||||||
|
@ -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)
|
|
||||||
}
|
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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: {
|
||||||
|
@ -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")) {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.")
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.")
|
||||||
|
@ -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)
|
||||||
|
@ -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(),
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user