damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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:
Mdamus/Models/Report.swift | 30+++++++++++++++++++++---------
Mdamus/Views/ReportView.swift | 80+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
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 }