DM Message Requests

Put strangers in a different tab

Changelog-Added: Add DM Message Requests
This commit is contained in:
William Casarin
2023-01-21 11:13:44 -08:00
parent e14cd99c85
commit d658d1d987
7 changed files with 88 additions and 20 deletions

View File

@@ -29,6 +29,6 @@ struct DamusState {
static var empty: DamusState { static var empty: DamusState {
return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(), previews: PreviewCache()) return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache())
} }
} }

View File

@@ -8,13 +8,34 @@
import Foundation import Foundation
class DirectMessageModel: ObservableObject { class DirectMessageModel: ObservableObject {
@Published var events: [NostrEvent] @Published var events: [NostrEvent] {
didSet {
init(events: [NostrEvent]) { is_request = determine_is_request()
self.events = events }
} }
init() { var is_request: Bool
var our_pubkey: String
func determine_is_request() -> Bool {
for event in events {
if event.pubkey == our_pubkey {
return false
}
}
return true
}
init(events: [NostrEvent], our_pubkey: String) {
self.events = events
self.is_request = false
self.our_pubkey = our_pubkey
}
init(our_pubkey: String) {
self.events = [] self.events = []
self.is_request = false
self.our_pubkey = our_pubkey
} }
} }

View File

@@ -10,13 +10,26 @@ import Foundation
class DirectMessagesModel: ObservableObject { class DirectMessagesModel: ObservableObject {
@Published var dms: [(String, DirectMessageModel)] = [] @Published var dms: [(String, DirectMessageModel)] = []
@Published var loading: Bool = false @Published var loading: Bool = false
let our_pubkey: String
init(our_pubkey: String) {
self.our_pubkey = our_pubkey
}
var message_requests: [(String, DirectMessageModel)] {
return dms.filter { dm in dm.1.is_request }
}
var friend_dms: [(String, DirectMessageModel)] {
return dms.filter { dm in !dm.1.is_request }
}
func lookup_or_create(_ pubkey: String) -> DirectMessageModel { func lookup_or_create(_ pubkey: String) -> DirectMessageModel {
if let dm = lookup(pubkey) { if let dm = lookup(pubkey) {
return dm return dm
} }
let new = DirectMessageModel() let new = DirectMessageModel(our_pubkey: our_pubkey)
dms.append((pubkey, new)) dms.append((pubkey, new))
return new return new
} }

View File

@@ -48,17 +48,19 @@ class HomeModel: ObservableObject {
@Published var new_events: NewEventsBits = NewEventsBits() @Published var new_events: NewEventsBits = NewEventsBits()
@Published var notifications: [NostrEvent] = [] @Published var notifications: [NostrEvent] = []
@Published var dms: DirectMessagesModel = DirectMessagesModel() @Published var dms: DirectMessagesModel
@Published var events: [NostrEvent] = [] @Published var events: [NostrEvent] = []
@Published var loading: Bool = false @Published var loading: Bool = false
@Published var signal: SignalModel = SignalModel() @Published var signal: SignalModel = SignalModel()
init() { init() {
self.damus_state = DamusState.empty self.damus_state = DamusState.empty
self.dms = DirectMessagesModel(our_pubkey: damus_state.pubkey)
} }
init(damus_state: DamusState) { init(damus_state: DamusState) {
self.damus_state = damus_state self.damus_state = damus_state
self.dms = DirectMessagesModel(our_pubkey: damus_state.pubkey)
} }
var pool: RelayPool { var pool: RelayPool {
@@ -644,7 +646,7 @@ func handle_incoming_dm(prev_events: NewEventsBits, dms: DirectMessagesModel, ou
if !found { if !found {
inserted = true inserted = true
let model = DirectMessageModel(events: [ev]) let model = DirectMessageModel(events: [ev], our_pubkey: our_pubkey)
dms.dms.append((the_pk, model)) dms.dms.append((the_pk, model))
} }

View File

@@ -158,7 +158,7 @@ struct DMChatView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
let ev = NostrEvent(content: "hi", pubkey: "pubkey", kind: 1, tags: []) let ev = NostrEvent(content: "hi", pubkey: "pubkey", kind: 1, tags: [])
let model = DirectMessageModel(events: [ev]) let model = DirectMessageModel(events: [ev], our_pubkey: "pubkey")
DMChatView(damus_state: test_damus_state(), pubkey: "pubkey") DMChatView(damus_state: test_damus_state(), pubkey: "pubkey")
.environmentObject(model) .environmentObject(model)

View File

@@ -7,15 +7,26 @@
import SwiftUI import SwiftUI
enum DMType: Hashable {
case rando
case friend
}
struct DirectMessagesView: View { struct DirectMessagesView: View {
let damus_state: DamusState let damus_state: DamusState
@State var dm_type: DMType = .friend
@State var open_dm: Bool = false @State var open_dm: Bool = false
@State var pubkey: String = "" @State var pubkey: String = ""
@State var active_model: DirectMessageModel = DirectMessageModel()
@EnvironmentObject var model: DirectMessagesModel @EnvironmentObject var model: DirectMessagesModel
@State var active_model: DirectMessageModel
var MainContent: some View { init(damus_state: DamusState) {
self.damus_state = damus_state
self._active_model = State(initialValue: DirectMessageModel(our_pubkey: damus_state.pubkey))
}
func MainContent(requests: Bool) -> some View {
ScrollView { ScrollView {
let chat = DMChatView(damus_state: damus_state, pubkey: pubkey) let chat = DMChatView(damus_state: damus_state, pubkey: pubkey)
.environmentObject(active_model) .environmentObject(active_model)
@@ -26,13 +37,12 @@ struct DirectMessagesView: View {
if model.dms.isEmpty, !model.loading { if model.dms.isEmpty, !model.loading {
EmptyTimelineView() EmptyTimelineView()
} else { } else {
ForEach(model.dms, id: \.0) { tup in let dms = requests ? model.message_requests : model.friend_dms
ForEach(dms, id: \.0) { tup in
MaybeEvent(tup) MaybeEvent(tup)
} }
} }
} }
.padding(.horizontal)
.padding(.top)
} }
} }
@@ -52,8 +62,29 @@ struct DirectMessagesView: View {
} }
var body: some View { var body: some View {
MainContent VStack {
.navigationTitle(NSLocalizedString("Encrypted DMs", comment: "Navigation title for view of encrypted DMs, where DM is an English abbreviation for Direct Message.")) Picker(NSLocalizedString("DM Type", comment: "DM selector for seeing either DMs or message requests, which are messages that have not been responded to yet."), selection: $dm_type) {
Text("DMs")
.tag(DMType.friend)
Text("Requests")
.tag(DMType.rando)
}
.pickerStyle(.segmented)
TabView(selection: $dm_type) {
MainContent(requests: false)
.tag(DMType.friend)
MainContent(requests: true)
.tag(DMType.rando)
}
.tabViewStyle(.page(indexDisplayMode: .never))
}
.padding(.horizontal)
.padding(.top)
.navigationTitle(NSLocalizedString("Encrypted DMs", comment: "Navigation title for view of encrypted DMs, where DM is an English abbreviation for Direct Message."))
} }
} }
@@ -63,8 +94,9 @@ struct DirectMessagesView_Previews: PreviewProvider {
pubkey: "pubkey", pubkey: "pubkey",
kind: 4, kind: 4,
tags: []) tags: [])
let model = DirectMessageModel(events: [ev]) let ds = test_damus_state()
DirectMessagesView(damus_state: test_damus_state()) let model = DirectMessageModel(events: [ev], our_pubkey: ds.pubkey)
DirectMessagesView(damus_state: ds)
.environmentObject(model) .environmentObject(model)
} }
} }

View File

@@ -355,7 +355,7 @@ struct ProfileView_Previews: PreviewProvider {
func test_damus_state() -> DamusState { func test_damus_state() -> DamusState {
let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681" let pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"
let damus = DamusState(pool: RelayPool(), keypair: Keypair(pubkey: pubkey, privkey: "privkey"), likes: EventCounter(our_pubkey: pubkey), boosts: EventCounter(our_pubkey: pubkey), contacts: Contacts(our_pubkey: pubkey), tips: TipCounter(our_pubkey: pubkey), profiles: Profiles(), dms: DirectMessagesModel(), previews: PreviewCache()) let damus = DamusState(pool: RelayPool(), keypair: Keypair(pubkey: pubkey, privkey: "privkey"), likes: EventCounter(our_pubkey: pubkey), boosts: EventCounter(our_pubkey: pubkey), contacts: Contacts(our_pubkey: pubkey), tips: TipCounter(our_pubkey: pubkey), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: pubkey), previews: PreviewCache())
let prof = Profile(name: "damus", display_name: "damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", banner: "", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io") let prof = Profile(name: "damus", display_name: "damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", banner: "", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io")
let tsprof = TimestampedProfile(profile: prof, timestamp: 0) let tsprof = TimestampedProfile(profile: prof, timestamp: 0)