/* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ import React, { type JSX, type ReactNode, type Ref, useState } from "react"; import classNames from "classnames"; import { type RoomMember } from "matrix-js-sdk/src/matrix"; import LocationIcon from "@vector-im/compound-design-tokens/assets/web/icons/location-pin-solid"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; import MemberAvatar from "../avatars/MemberAvatar"; interface Props { id?: string; // renders MemberAvatar when provided roomMember?: RoomMember; // use member text color as background useMemberColor?: boolean; tooltip?: ReactNode; ref?: Ref; } /** * Wrap with tooltip handlers when * tooltip is truthy */ const OptionalTooltip: React.FC<{ tooltip?: ReactNode; children: ReactNode; }> = ({ tooltip, children }) => { const [isVisible, setIsVisible] = useState(false); if (!tooltip) { return <>{children}; } const show = (): void => setIsVisible(true); const hide = (): void => setIsVisible(false); const toggleVisibility = (e: React.MouseEvent): void => { // stop map from zooming in on click e.stopPropagation(); setIsVisible(!isVisible); }; return (
{children} {isVisible && tooltip}
); }; /** * Generic location marker */ const Marker = ({ id, roomMember, useMemberColor, tooltip, ref }: Props): JSX.Element => { const memberColorClass = useMemberColor && roomMember ? getUserNameColorClass(roomMember.userId) : ""; return (
{roomMember ? ( ) : ( )}
); }; export default Marker;