Add menu ellipsis button to notes
Changelog-Added: Add ellipsis button to notes
This commit is contained in:
committed by
William Casarin
parent
cff98161ee
commit
b6a7f52596
@@ -210,11 +210,11 @@ struct ImageCarousel: View {
|
|||||||
Text(url.absoluteString)
|
Text(url.absoluteString)
|
||||||
}
|
}
|
||||||
.id(url.absoluteString)
|
.id(url.absoluteString)
|
||||||
.contextMenu {
|
// .contextMenu {
|
||||||
Button(NSLocalizedString("Copy Image", comment: "Context menu option to copy an image to clipboard.")) {
|
// Button(NSLocalizedString("Copy Image", comment: "Context menu option to copy an image to clipboard.")) {
|
||||||
UIPasteboard.general.string = url.absoluteString
|
// UIPasteboard.general.string = url.absoluteString
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ struct ChatroomView: View {
|
|||||||
next_ev: ind == count-1 ? nil : thread.events[ind+1],
|
next_ev: ind == count-1 ? nil : thread.events[ind+1],
|
||||||
damus_state: damus
|
damus_state: damus
|
||||||
)
|
)
|
||||||
.event_context_menu(ev, keypair: damus.keypair, target_pubkey: ev.pubkey, bookmarks: damus.bookmarks)
|
.contextMenu{MenuItems(event: ev, keypair: damus.keypair, target_pubkey: ev.pubkey, bookmarks: damus.bookmarks)}
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
if thread.event.id == ev.id {
|
if thread.event.id == ev.id {
|
||||||
//dismiss()
|
//dismiss()
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ struct DMChatView: View {
|
|||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
ForEach(Array(zip(dms.events, dms.events.indices)), id: \.0.id) { (ev, ind) in
|
ForEach(Array(zip(dms.events, dms.events.indices)), id: \.0.id) { (ev, ind) in
|
||||||
DMView(event: dms.events[ind], damus_state: damus_state)
|
DMView(event: dms.events[ind], damus_state: damus_state)
|
||||||
.event_context_menu(ev, keypair: damus_state.keypair, target_pubkey: ev.pubkey, bookmarks: damus_state.bookmarks)
|
.contextMenu{MenuItems(event: ev, keypair: damus_state.keypair, target_pubkey: ev.pubkey, bookmarks: damus_state.bookmarks)}
|
||||||
}
|
}
|
||||||
EndBlock(height: 80)
|
EndBlock(height: 80)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,20 @@ struct EmbeddedEventView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
let profile = damus_state.profiles.lookup(id: pubkey)
|
let profile = damus_state.profiles.lookup(id: pubkey)
|
||||||
|
HStack {
|
||||||
EventProfile(damus_state: damus_state, pubkey: pubkey, profile: profile, size: .small)
|
EventProfile(damus_state: damus_state, pubkey: pubkey, profile: profile, size: .small)
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
EventMenuContext(event: event, keypair: damus_state.keypair, target_pubkey: event.pubkey, bookmarks: damus_state.bookmarks)
|
||||||
|
.padding([.bottom], 4)
|
||||||
|
|
||||||
|
}
|
||||||
|
.minimumScaleFactor(0.75)
|
||||||
|
.lineLimit(1)
|
||||||
|
|
||||||
EventBody(damus_state: damus_state, event: event, size: .small)
|
EventBody(damus_state: damus_state, event: event, size: .small)
|
||||||
}
|
}
|
||||||
.event_context_menu(event, keypair: damus_state.keypair, target_pubkey: pubkey, bookmarks: damus_state.bookmarks)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,29 @@ struct EventMenuContext: View {
|
|||||||
let target_pubkey: String
|
let target_pubkey: String
|
||||||
let bookmarks: BookmarksManager
|
let bookmarks: BookmarksManager
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack {
|
||||||
|
Menu {
|
||||||
|
|
||||||
|
MenuItems(event: event, keypair: keypair, target_pubkey: target_pubkey, bookmarks: bookmarks)
|
||||||
|
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("", comment: "Context menu"), systemImage: "ellipsis")
|
||||||
|
.foregroundColor(Color.gray)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.contentShape(Rectangle())
|
||||||
|
.onTapGesture {}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MenuItems: View {
|
||||||
|
let event: NostrEvent
|
||||||
|
let keypair: Keypair
|
||||||
|
let target_pubkey: String
|
||||||
|
let bookmarks: BookmarksManager
|
||||||
|
|
||||||
@State private var isBookmarked: Bool = false
|
@State private var isBookmarked: Bool = false
|
||||||
|
|
||||||
init(event: NostrEvent, keypair: Keypair, target_pubkey: String, bookmarks: BookmarksManager) {
|
init(event: NostrEvent, keypair: Keypair, target_pubkey: String, bookmarks: BookmarksManager) {
|
||||||
@@ -26,60 +49,62 @@ struct EventMenuContext: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
|
||||||
Button {
|
|
||||||
UIPasteboard.general.string = event.get_content(keypair.privkey)
|
|
||||||
} label: {
|
|
||||||
Label(NSLocalizedString("Copy Text", comment: "Context menu option for copying the text from an note."), systemImage: "doc.on.doc")
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
Group {
|
||||||
UIPasteboard.general.string = bech32_pubkey(target_pubkey)
|
Button {
|
||||||
} label: {
|
UIPasteboard.general.string = event.get_content(keypair.privkey)
|
||||||
Label(NSLocalizedString("Copy User Pubkey", comment: "Context menu option for copying the ID of the user who created the note."), systemImage: "person")
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
UIPasteboard.general.string = bech32_note_id(event.id) ?? event.id
|
|
||||||
} label: {
|
|
||||||
Label(NSLocalizedString("Copy Note ID", comment: "Context menu option for copying the ID of the note."), systemImage: "note.text")
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
UIPasteboard.general.string = event_to_json(ev: event)
|
|
||||||
} label: {
|
|
||||||
Label(NSLocalizedString("Copy Note JSON", comment: "Context menu option for copying the JSON text from the note."), systemImage: "square.on.square")
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
self.bookmarks.updateBookmark(event)
|
|
||||||
isBookmarked = self.bookmarks.isBookmarked(event)
|
|
||||||
} label: {
|
|
||||||
let imageName = isBookmarked ? "bookmark.fill" : "bookmark"
|
|
||||||
let removeBookmarkString = NSLocalizedString("Remove Bookmark", comment: "Context menu option for removing a note bookmark.")
|
|
||||||
let addBookmarkString = NSLocalizedString("Add Bookmark", comment: "Context menu option for adding a note bookmark.")
|
|
||||||
Label(isBookmarked ? removeBookmarkString : addBookmarkString, systemImage: imageName)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
NotificationCenter.default.post(name: .broadcast_event, object: event)
|
|
||||||
} label: {
|
|
||||||
Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), systemImage: "globe")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
Button(role: .destructive) {
|
|
||||||
let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id))
|
|
||||||
notify(.report, target)
|
|
||||||
} label: {
|
} label: {
|
||||||
Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), systemImage: "exclamationmark.bubble")
|
Label(NSLocalizedString("Copy Text", comment: "Context menu option for copying the text from an note."), systemImage: "doc.on.doc")
|
||||||
}
|
}
|
||||||
|
|
||||||
Button(role: .destructive) {
|
Button {
|
||||||
notify(.block, target_pubkey)
|
UIPasteboard.general.string = bech32_pubkey(target_pubkey)
|
||||||
} label: {
|
} label: {
|
||||||
Label(NSLocalizedString("Block", comment: "Context menu option for blocking users."), systemImage: "exclamationmark.octagon")
|
Label(NSLocalizedString("Copy User Pubkey", comment: "Context menu option for copying the ID of the user who created the note."), systemImage: "person")
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
UIPasteboard.general.string = bech32_note_id(event.id) ?? event.id
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("Copy Note ID", comment: "Context menu option for copying the ID of the note."), systemImage: "note.text")
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
UIPasteboard.general.string = event_to_json(ev: event)
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("Copy Note JSON", comment: "Context menu option for copying the JSON text from the note."), systemImage: "square.on.square")
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
self.bookmarks.updateBookmark(event)
|
||||||
|
isBookmarked = self.bookmarks.isBookmarked(event)
|
||||||
|
} label: {
|
||||||
|
let imageName = isBookmarked ? "bookmark.fill" : "bookmark"
|
||||||
|
let removeBookmarkString = NSLocalizedString("Remove Bookmark", comment: "Context menu option for removing a note bookmark.")
|
||||||
|
let addBookmarkString = NSLocalizedString("Add Bookmark", comment: "Context menu option for adding a note bookmark.")
|
||||||
|
Label(isBookmarked ? removeBookmarkString : addBookmarkString, systemImage: imageName)
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
NotificationCenter.default.post(name: .broadcast_event, object: event)
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("Broadcast", comment: "Context menu option for broadcasting the user's note to all of the user's connected relay servers."), systemImage: "globe")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 {
|
||||||
|
Button(role: .destructive) {
|
||||||
|
let target: ReportTarget = .note(ReportNoteTarget(pubkey: target_pubkey, note_id: event.id))
|
||||||
|
notify(.report, target)
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("Report", comment: "Context menu option for reporting content."), systemImage: "exclamationmark.bubble")
|
||||||
|
}
|
||||||
|
|
||||||
|
Button(role: .destructive) {
|
||||||
|
notify(.block, target_pubkey)
|
||||||
|
} label: {
|
||||||
|
Label(NSLocalizedString("Block", comment: "Context menu option for blocking users."), systemImage: "exclamationmark.octagon")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,18 @@ struct SelectedEventView: View {
|
|||||||
let profile = damus.profiles.lookup(id: pubkey)
|
let profile = damus.profiles.lookup(id: pubkey)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
EventProfile(damus_state: damus, pubkey: pubkey, profile: profile, size: .normal)
|
HStack {
|
||||||
|
EventProfile(damus_state: damus, pubkey: pubkey, profile: profile, size: .normal)
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
EventMenuContext(event: event, keypair: damus.keypair, target_pubkey: event.pubkey, bookmarks: damus.bookmarks)
|
||||||
|
.padding([.bottom], 4)
|
||||||
|
|
||||||
|
}
|
||||||
|
.minimumScaleFactor(0.75)
|
||||||
|
.lineLimit(1)
|
||||||
|
|
||||||
EventBody(damus_state: damus, event: event, size: .selected)
|
EventBody(damus_state: damus, event: event, size: .selected)
|
||||||
|
|
||||||
if let mention = first_eref_mention(ev: event, privkey: damus.keypair.privkey) {
|
if let mention = first_eref_mention(ev: event, privkey: damus.keypair.privkey) {
|
||||||
@@ -60,7 +71,6 @@ struct SelectedEventView: View {
|
|||||||
self.bar.update(damus: self.damus, evid: target)
|
self.bar.update(damus: self.damus, evid: target)
|
||||||
}
|
}
|
||||||
.padding([.leading], 2)
|
.padding([.leading], 2)
|
||||||
.event_context_menu(event, keypair: damus.keypair, target_pubkey: event.pubkey, bookmarks: damus.bookmarks)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,13 @@ struct TextEvent: View {
|
|||||||
.foregroundColor(.gray)
|
.foregroundColor(.gray)
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
|
EventMenuContext(event: event, keypair: damus.keypair, target_pubkey: event.pubkey, bookmarks: damus.bookmarks)
|
||||||
|
.padding([.bottom], 4)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
.minimumScaleFactor(0.75)
|
||||||
|
.lineLimit(1)
|
||||||
|
|
||||||
EventBody(damus_state: damus, event: event, size: .normal)
|
EventBody(damus_state: damus, event: event, size: .normal)
|
||||||
|
|
||||||
@@ -66,7 +72,6 @@ struct TextEvent: View {
|
|||||||
.id(event.id)
|
.id(event.id)
|
||||||
.frame(maxWidth: .infinity, minHeight: PFP_SIZE)
|
.frame(maxWidth: .infinity, minHeight: PFP_SIZE)
|
||||||
.padding([.bottom], 2)
|
.padding([.bottom], 2)
|
||||||
.event_context_menu(event, keypair: damus.keypair, target_pubkey: pubkey, bookmarks: damus.bookmarks)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user