/* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. Copyright 2017 Travis Ralston SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { JSX, useCallback, useState } from "react"; import { EventTimeline, EventType, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { IconButton, Menu, MenuItem, Separator, Tooltip } from "@vector-im/compound-web"; import ViewIcon from "@vector-im/compound-design-tokens/assets/web/icons/visibility-on"; import UnpinIcon from "@vector-im/compound-design-tokens/assets/web/icons/unpin"; import ForwardIcon from "@vector-im/compound-design-tokens/assets/web/icons/forward"; import TriggerIcon from "@vector-im/compound-design-tokens/assets/web/icons/overflow-horizontal"; import DeleteIcon from "@vector-im/compound-design-tokens/assets/web/icons/delete"; import ThreadIcon from "@vector-im/compound-design-tokens/assets/web/icons/threads"; import classNames from "classnames"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import MessageEvent from "../messages/MessageEvent"; import MemberAvatar from "../avatars/MemberAvatar"; import { _t } from "../../../languageHandler"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import { useRoomState } from "../../../hooks/useRoomState"; import { isContentActionable } from "../../../utils/EventUtils"; import { getForwardableEvent } from "../../../events"; import { OpenForwardDialogPayload } from "../../../dispatcher/payloads/OpenForwardDialogPayload"; import { createRedactEventDialog } from "../dialogs/ConfirmRedactDialog"; import { ShowThreadPayload } from "../../../dispatcher/payloads/ShowThreadPayload"; import PinningUtils from "../../../utils/PinningUtils.ts"; import PosthogTrackers from "../../../PosthogTrackers.ts"; const AVATAR_SIZE = "32px"; /** * Properties for {@link PinnedEventTile}. */ interface PinnedEventTileProps { /** * The event to display. */ event: MatrixEvent; /** * The permalink creator to use. */ permalinkCreator: RoomPermalinkCreator; /** * The room the event is in. */ room: Room; } /** * A pinned event tile. */ export function PinnedEventTile({ event, room, permalinkCreator }: PinnedEventTileProps): JSX.Element { const sender = event.getSender(); if (!sender) { throw new Error("Pinned event unexpectedly has no sender"); } const isInThread = Boolean(event.threadRootId); const displayThreadInfo = !event.isThreadRoot && isInThread; return (