From 6f9b4d1ae25e1c375d87f7a93b80ed2e9eba9a0f Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Wed, 15 Jan 2025 19:21:57 +0000 Subject: [PATCH] Add a "share event" button --- web/src/icons/share.svg | 1 + .../timeline/menu/ConfirmWithMessageModal.tsx | 26 ++++++++++++++++++- .../ui/timeline/menu/useSecondaryItems.tsx | 24 ++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 web/src/icons/share.svg diff --git a/web/src/icons/share.svg b/web/src/icons/share.svg new file mode 100644 index 0000000..9d1a7d3 --- /dev/null +++ b/web/src/icons/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx b/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx index 9028a32..d8699a1 100644 --- a/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx +++ b/web/src/ui/timeline/menu/ConfirmWithMessageModal.tsx @@ -28,7 +28,7 @@ interface ConfirmWithMessageProps { onConfirm: (reason: string) => void } -const ConfirmWithMessageModal = ({ +export const ConfirmWithMessageModal = ({ evt, title, description, placeholder, confirmButton, onConfirm, }: ConfirmWithMessageProps) => { const [reason, setReason] = useState("") @@ -60,4 +60,28 @@ const ConfirmWithMessageModal = ({ } +export const ConfirmWithoutMessageModal = ({ + evt, title, description, confirmButton, onConfirm, +}: Omit) => { + const closeModal = use(ModalCloseContext) + const onConfirmWrapped = (evt: React.FormEvent) => { + evt.preventDefault() + closeModal() + onConfirm("") + } + return
+

{title}

+
+ +
+
+ {description} +
+
+ + +
+
+} + export default ConfirmWithMessageModal diff --git a/web/src/ui/timeline/menu/useSecondaryItems.tsx b/web/src/ui/timeline/menu/useSecondaryItems.tsx index 134d4f7..e3f1934 100644 --- a/web/src/ui/timeline/menu/useSecondaryItems.tsx +++ b/web/src/ui/timeline/menu/useSecondaryItems.tsx @@ -20,12 +20,13 @@ import { MemDBEvent } from "@/api/types" import { ModalCloseContext, ModalContext } from "../../modal" import { RoomContext, RoomContextData } from "../../roomview/roomcontext.ts" import JSONView from "../../util/JSONView.tsx" -import ConfirmWithMessageModal from "./ConfirmWithMessageModal.tsx" +import { ConfirmWithMessageModal, ConfirmWithoutMessageModal } from "./ConfirmWithMessageModal.tsx" import { getPending, getPowerLevels } from "./util.ts" import ViewSourceIcon from "@/icons/code.svg?react" import DeleteIcon from "@/icons/delete.svg?react" import PinIcon from "@/icons/pin.svg?react" import ReportIcon from "@/icons/report.svg?react" +import ShareIcon from "@/icons/share.svg?react" import UnpinIcon from "@/icons/unpin.svg?react" export const useSecondaryItems = ( @@ -89,6 +90,26 @@ export const useSecondaryItems = ( .catch(err => window.alert(`Failed to ${pin ? "pin" : "unpin"} message: ${err}`)) } + const onClickShareEvent = () => { + openModal({ + dimmed: true, + boxed: true, + innerBoxClass: "confirm-message-modal", + content: + {navigator.clipboard.writeText( + `matrix:roomid/${evt.room_id.slice(1)}/e/${evt.event_id.slice(1)}`) + .catch(err => window.alert(`Failed to copy link: ${err}`)) + }} + /> + , + }) + } + const [isPending, pendingTitle] = getPending(evt) useRoomState(roomCtx.store, "m.room.power_levels", "") // We get pins from getPinnedEvents, but use the hook anyway to subscribe to changes @@ -104,6 +125,7 @@ export const useSecondaryItems = ( return <> + {ownPL >= pinPL && (pins.includes(evt.event_id) ?