damus

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

commit 9f332a148fe4fc5af70b2e2a6206d8efb4e78dce
parent 50f45288ce0cf86777d50fd102e30a43fd4a1636
Author: Charlie Fish <contact@charlie.fish>
Date:   Wed, 17 Jan 2024 18:17:37 -0700

mute: add new UI views for new mute list

- Adding MuteDurationMenu & AddMuteItemView
    - In a future patch I will update AddMuteItemView to actually update and relay the new mute list

Related: https://github.com/damus-io/damus/issues/1718
Related: https://github.com/damus-io/damus/issues/856
Lighting Address: fishcharlie@strike.me

Signed-off-by: Charlie Fish <contact@charlie.fish>
Reviewed-by: William Casarin <jb55@jb55.com>
Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 8++++++++
Adamus/Views/Muting/AddMuteItemView.swift | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adamus/Views/Muting/MuteDurationMenu.swift | 40++++++++++++++++++++++++++++++++++++++++
3 files changed, 150 insertions(+), 0 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -421,6 +421,8 @@ 9CA876E229A00CEA0003B9A3 /* AttachMediaUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */; }; ADFE73552AD4793100EC7326 /* QRScanNSECView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFE73542AD4793100EC7326 /* QRScanNSECView.swift */; }; B501062D2B363036003874F5 /* AuthIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B501062C2B363036003874F5 /* AuthIntegrationTests.swift */; }; + B51C1CEA2B55A60A00E312A9 /* AddMuteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51C1CE82B55A60A00E312A9 /* AddMuteItemView.swift */; }; + B51C1CEB2B55A60A00E312A9 /* MuteDurationMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51C1CE92B55A60A00E312A9 /* MuteDurationMenu.swift */; }; B57B4C622B312BD700A232C0 /* ReconnectRelaysNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C612B312BD700A232C0 /* ReconnectRelaysNotify.swift */; }; B57B4C642B312BFA00A232C0 /* RelayAuthenticationDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C632B312BFA00A232C0 /* RelayAuthenticationDetail.swift */; }; B57B4C662B312C3700A232C0 /* NostrAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C652B312C3700A232C0 /* NostrAuth.swift */; }; @@ -1317,6 +1319,8 @@ 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachMediaUtility.swift; sourceTree = "<group>"; }; ADFE73542AD4793100EC7326 /* QRScanNSECView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScanNSECView.swift; sourceTree = "<group>"; }; B501062C2B363036003874F5 /* AuthIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthIntegrationTests.swift; sourceTree = "<group>"; usesTabs = 0; }; + B51C1CE82B55A60A00E312A9 /* AddMuteItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddMuteItemView.swift; sourceTree = "<group>"; }; + B51C1CE92B55A60A00E312A9 /* MuteDurationMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MuteDurationMenu.swift; sourceTree = "<group>"; }; B57B4C612B312BD700A232C0 /* ReconnectRelaysNotify.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReconnectRelaysNotify.swift; sourceTree = "<group>"; }; B57B4C632B312BFA00A232C0 /* RelayAuthenticationDetail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RelayAuthenticationDetail.swift; sourceTree = "<group>"; }; B57B4C652B312C3700A232C0 /* NostrAuth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NostrAuth.swift; sourceTree = "<group>"; }; @@ -2552,6 +2556,8 @@ 4CF0ABDF2981A83000D66079 /* Muting */ = { isa = PBXGroup; children = ( + B51C1CE82B55A60A00E312A9 /* AddMuteItemView.swift */, + B51C1CE92B55A60A00E312A9 /* MuteDurationMenu.swift */, 4CF0ABE02981A83900D66079 /* MutelistView.swift */, ); path = Muting; @@ -3027,6 +3033,7 @@ F7F0BA272978E54D009531F3 /* ParticipantsView.swift in Sources */, 4CF0ABE32981BC7D00D66079 /* UserView.swift in Sources */, 4CE0E2AF29A2E82100DB4CA2 /* EventHolder.swift in Sources */, + B51C1CEA2B55A60A00E312A9 /* AddMuteItemView.swift in Sources */, 4C5D5C992A6AF8F80024563C /* NdbNote.swift in Sources */, 4CF0ABF029857E9200D66079 /* Bech32Object.swift in Sources */, 4C3D52B8298DB5C6001C5831 /* TextEvent.swift in Sources */, @@ -3288,6 +3295,7 @@ 50A60D142A28BEEE00186190 /* RelayLog.swift in Sources */, D7EDED212B117DCA0018B19C /* SequenceUtils.swift in Sources */, BA37598A2ABCCDE40018D73B /* ImageResizer.swift in Sources */, + B51C1CEB2B55A60A00E312A9 /* MuteDurationMenu.swift in Sources */, 4CB88389296AF99A00DC99E7 /* EventDetailBar.swift in Sources */, 4C32B9512A9AD44700DC3548 /* FlatbuffersErrors.swift in Sources */, 4CE8794E2996B16A00F758CC /* RelayToggle.swift in Sources */, diff --git a/damus/Views/Muting/AddMuteItemView.swift b/damus/Views/Muting/AddMuteItemView.swift @@ -0,0 +1,102 @@ +// +// AddMuteItemView.swift +// damus +// +// Created by Charlie Fish on 1/10/24. +// +import SwiftUI + +struct AddMuteItemView: View { + let state: DamusState + @State var new_text: String = "" + @State var expiration: DamusDuration? + + @Environment(\.dismiss) var dismiss + + var body: some View { + VStack { + Text("Add mute item", comment: "Title text to indicate user to an add an item to their mutelist.") + .font(.system(size: 20, weight: .bold)) + .padding(.vertical) + + Divider() + .padding(.bottom) + + Picker(selection: $expiration) { + Text("Indefinite", comment: "Mute a given item indefinitly (until user unmutes it). As opposed to muting the item for a given period of time.") + ForEach(DamusDuration.allCases, id: \.self) { duration in + Text(duration.title).tag(duration) + } + } label: { + Text("Duration", comment: "The duration in which to mute the given item.") + } + + + HStack { + Label("", image: "copy2") + .onTapGesture { + if let pasted_text = UIPasteboard.general.string { + self.new_text = pasted_text + } + } + TextField(NSLocalizedString("npub, #hashtag, phrase", comment: "Placeholder example for relay server address."), text: $new_text) + .autocorrectionDisabled(true) + .textInputAutocapitalization(.never) + + Label("", image: "close-circle") + .foregroundColor(.accentColor) + .opacity((new_text == "") ? 0.0 : 1.0) + .onTapGesture { + self.new_text = "" + } + } + .padding(10) + .background(.secondary.opacity(0.2)) + .cornerRadius(10) + + Button(action: { + let expiration_date: Date? = self.expiration?.date_from_now + let mute_item: MuteItem? = { + if new_text.starts(with: "npub") { + if let pubkey: Pubkey = bech32_pubkey_decode(new_text) { + return .user(pubkey, expiration_date) + } else { + return nil + } + } else if new_text.starts(with: "#") { + // Remove the starting `#` character + new_text.removeFirst() + return .hashtag(Hashtag(hashtag: new_text), expiration_date) + } else { + return .word(new_text, expiration_date) + } + }() + + // @TODO: in future patch - actually update & relay the new mute list + + new_text = "" + + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + + dismiss() + }) { + HStack { + Text(verbatim: "Add mute item") + .bold() + } + .frame(minWidth: 300, maxWidth: .infinity, alignment: .center) + } + .buttonStyle(GradientButtonStyle(padding: 10)) + .padding(.vertical) + + Spacer() + } + .padding() + } +} + +struct AddMuteItemView_Previews: PreviewProvider { + static var previews: some View { + AddMuteItemView(state: test_damus_state) + } +} diff --git a/damus/Views/Muting/MuteDurationMenu.swift b/damus/Views/Muting/MuteDurationMenu.swift @@ -0,0 +1,40 @@ +// +// MuteDurationMenu.swift +// damus +// +// Created by Charlie Fish on 1/14/24. +// + +import SwiftUI + +struct MuteDurationMenu<T: View>: View { + var action: (DamusDuration?) -> Void + @ViewBuilder var label: () -> T + + var body: some View { + Menu { + Button { + action(nil) + } label: { + Text("Indefinite", comment: "Mute a given item indefinitly (until user unmutes it). As opposed to muting the item for a given period of time.") + } + ForEach(DamusDuration.allCases, id: \.self) { duration in + Button { + action(duration) + } label: { + Text("\(duration.title)") + } + } + } label: { + self.label() + } + } +} + +#Preview { + MuteDurationMenu { _ in + + } label: { + Text("Mute hashtag") + } +}