/* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import classNames from "classnames"; import { EventType } from "matrix-js-sdk/src/matrix"; import React, { useContext, useRef, useState, MouseEvent, ReactNode } from "react"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import RoomContext from "../../../contexts/RoomContext"; import { useTimeout } from "../../../hooks/useTimeout"; import { TranslatedString } from "../../../languageHandler"; import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds"; import AccessibleButton from "./AccessibleButton"; import Spinner from "./Spinner"; export const AVATAR_SIZE = "52px"; interface IProps { hasAvatar: boolean; noAvatarLabel?: TranslatedString; hasAvatarLabel?: TranslatedString; setAvatarUrl(url: string): Promise; isUserAvatar?: boolean; onClick?(ev: MouseEvent): void; children?: ReactNode; } const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAvatarLabel, setAvatarUrl, isUserAvatar, children, onClick, }) => { const cli = useContext(MatrixClientContext); const [busy, setBusy] = useState(false); const [hover, setHover] = useState(false); const [show, setShow] = useState(false); useTimeout(() => { setShow(true); }, 3000); // show after 3 seconds useTimeout(() => { setShow(false); }, 13000); // hide after being shown for 10 seconds const uploadRef = useRef(null); const label = hasAvatar || busy ? hasAvatarLabel : noAvatarLabel; const { room } = useContext(RoomContext); const canSetAvatar = isUserAvatar || room?.currentState?.maySendStateEvent(EventType.RoomAvatar, cli.getSafeUserId()); if (!canSetAvatar) return {children}; const visible = !!label && (hover || show); return ( { chromeFileInputFix(ev); onClick?.(ev); }} onChange={async (ev): Promise => { if (!ev.target.files?.length) return; setBusy(true); const file = ev.target.files[0]; const { content_uri: uri } = await cli.uploadContent(file); await setAvatarUrl(uri); setBusy(false); }} accept="image/*" /> { uploadRef.current?.click(); }} onMouseOver={() => setHover(true)} onMouseLeave={() => setHover(false)} > {children}
{busy ? :
}
{label}
); }; export default MiniAvatarUploader;