commit cb1e16b1a45b7faa06d67a661944d350b641c38b
parent 6e964f71ff7a0e7e942c8819973e63b4f5193cec
Author: Terry Yiu <git@tyiu.xyz>
Date: Mon, 3 Jul 2023 14:52:19 -0400
Fix reports to conform to NIP-56
Changelog-Fixed: Fix reports to conform to NIP-56
Signed-off-by: Terry Yiu <git@tyiu.xyz>
Tested-by: William Casarin <jb55@jb55.com>
Diffstat:
2 files changed, 73 insertions(+), 37 deletions(-)
diff --git a/damus/Models/Report.swift b/damus/Models/Report.swift
@@ -7,11 +7,27 @@
import Foundation
-enum ReportType: String {
- case explicit
- case illegal
+enum ReportType: String, CustomStringConvertible, CaseIterable {
case spam
+ case nudity
+ case profanity
+ case illegal
case impersonation
+
+ var description: String {
+ switch self {
+ case .spam:
+ return NSLocalizedString("Spam", comment: "Description of report type for spam.")
+ case .nudity:
+ return NSLocalizedString("Nudity", comment: "Description of report type for nudity.")
+ case .profanity:
+ return NSLocalizedString("Profanity", comment: "Description of report type for profanity.")
+ case .illegal:
+ return NSLocalizedString("Illegal Content", comment: "Description of report type for illegal content.")
+ case .impersonation:
+ return NSLocalizedString("Impersonation", comment: "Description of report type for impersonation.")
+ }
+ }
}
struct ReportNoteTarget {
@@ -31,16 +47,12 @@ struct Report {
}
func create_report_tags(target: ReportTarget, type: ReportType) -> [[String]] {
- var tags: [[String]]
switch target {
case .user(let pubkey):
- tags = [["p", pubkey]]
+ return [["p", pubkey, type.rawValue]]
case .note(let notet):
- tags = [["e", notet.note_id], ["p", notet.pubkey]]
+ return [["e", notet.note_id, type.rawValue], ["p", notet.pubkey]]
}
-
- tags.append(["report", type.rawValue])
- return tags
}
func create_report_event(privkey: String, report: Report) -> NostrEvent? {
diff --git a/damus/Views/ReportView.swift b/damus/Views/ReportView.swift
@@ -14,6 +14,8 @@ struct ReportView: View {
@State var report_sent: Bool = false
@State var report_id: String = ""
+ @State var report_message: String = ""
+ @State var selected_report_type: ReportType?
var body: some View {
if report_sent {
@@ -43,8 +45,8 @@ struct ReportView: View {
.padding()
}
- func do_send_report(type: ReportType) {
- guard let ev = send_report(privkey: privkey, postbox: postbox, target: target, type: type) else {
+ func do_send_report() {
+ guard let selected_report_type, let ev = send_report(privkey: privkey, postbox: postbox, target: target, type: selected_report_type, message: report_message) else {
return
}
@@ -55,6 +57,15 @@ struct ReportView: View {
report_sent = true
report_id = note_id
}
+
+ var send_report_button_text: String {
+ switch target {
+ case .note:
+ return NSLocalizedString("Report Note", comment: "Button to report a note.")
+ case .user:
+ return NSLocalizedString("Report User", comment: "Button to report a user.")
+ }
+ }
var MainForm: some View {
VStack {
@@ -63,37 +74,50 @@ struct ReportView: View {
.font(.headline)
.padding()
- Form {
- Section(content: {
- Button(NSLocalizedString("It's spam", comment: "Button for user to report that the account or content has spam.")) {
- do_send_report(type: .spam)
- }
-
- Button(NSLocalizedString("Nudity or explicit content", comment: "Button for user to report that the account or content has nudity or explicit content.")) {
- do_send_report(type: .explicit)
- }
-
- Button(NSLocalizedString("Illegal content", comment: "Button for user to report that the account or content has illegal content.")) {
- do_send_report(type: .illegal)
- }
-
- if case .user = target {
- Button(NSLocalizedString("They are impersonating someone", comment: "Button for user to report that the account is impersonating someone.")) {
- do_send_report(type: .impersonation)
+ Form {
+ Section(content: {
+ Picker("", selection: $selected_report_type) {
+ ForEach(ReportType.allCases, id: \.self) { report_type in
+ // Impersonation type is not supported when reporting notes.
+ switch target {
+ case .note:
+ if report_type != .impersonation {
+ Text(verbatim: String(describing: report_type))
+ .tag(Optional(report_type))
+ }
+ case .user:
+ Text(verbatim: String(describing: report_type))
+ .tag(Optional(report_type))
+ }
+ }
}
- }
- }, header: {
- Text("What do you want to report?", comment: "Header text to prompt user what issue they want to report.")
- }, footer: {
- Text("Your report will be sent to the relays you are connected to", comment: "Footer text to inform user what will happen when the report is submitted.")
- })
- }
+ .labelsHidden()
+ .pickerStyle(.inline)
+ }, header: {
+ Text("What do you want to report?", comment: "Header text to prompt user what issue they want to report.")
+ })
+
+ Section(content: {
+ TextField(NSLocalizedString("Optional", comment: "Prompt to enter optional additional information when reporting an account or content."), text: $report_message, axis: .vertical)
+ }, header: {
+ Text("Additional information", comment: "Header text to prompt user to optionally provide additional information when reporting a user or note.")
+ })
+
+ Section(content: {
+ Button(send_report_button_text) {
+ do_send_report()
+ }
+ .disabled(selected_report_type == nil)
+ }, footer: {
+ Text("Your report will be sent to the relays you are connected to", comment: "Footer text to inform user what will happen when the report is submitted.")
+ })
+ }
}
}
}
-func send_report(privkey: String, postbox: PostBox, target: ReportTarget, type: ReportType) -> NostrEvent? {
- let report = Report(type: type, target: target, message: "")
+func send_report(privkey: String, postbox: PostBox, target: ReportTarget, type: ReportType, message: String) -> NostrEvent? {
+ let report = Report(type: type, target: target, message: message)
guard let ev = create_report_event(privkey: privkey, report: report) else {
return nil
}