import { useRef, useState } from "react"; import * as Popover from "@radix-ui/react-popover"; import { copyTextToSystemClipboard } from "../../packages/excalidraw/clipboard"; import { trackEvent } from "../../packages/excalidraw/analytics"; import { getFrame } from "../../packages/excalidraw/utils"; import { useI18n } from "../../packages/excalidraw/i18n"; import { KEYS } from "../../packages/excalidraw/keys"; import { Dialog } from "../../packages/excalidraw/components/Dialog"; import { copyIcon, playerPlayIcon, playerStopFilledIcon, share, shareIOS, shareWindows, tablerCheckIcon, } from "../../packages/excalidraw/components/icons"; import { TextField } from "../../packages/excalidraw/components/TextField"; import { FilledButton } from "../../packages/excalidraw/components/FilledButton"; import { ReactComponent as CollabImage } from "../../packages/excalidraw/assets/lock.svg"; import "./RoomDialog.scss"; const getShareIcon = () => { const navigator = window.navigator as any; const isAppleBrowser = /Apple/.test(navigator.vendor); const isWindowsBrowser = navigator.appVersion.indexOf("Win") !== -1; if (isAppleBrowser) { return shareIOS; } else if (isWindowsBrowser) { return shareWindows; } return share; }; export type RoomModalProps = { handleClose: () => void; activeRoomLink: string; username: string; onUsernameChange: (username: string) => void; onRoomCreate: () => void; onRoomDestroy: () => void; setErrorMessage: (message: string) => void; }; export const RoomModal = ({ activeRoomLink, onRoomCreate, onRoomDestroy, setErrorMessage, username, onUsernameChange, handleClose, }: RoomModalProps) => { const { t } = useI18n(); const [justCopied, setJustCopied] = useState(false); const timerRef = useRef(0); const ref = useRef(null); const isShareSupported = "share" in navigator; const copyRoomLink = async () => { try { await copyTextToSystemClipboard(activeRoomLink); setJustCopied(true); if (timerRef.current) { window.clearTimeout(timerRef.current); } timerRef.current = window.setTimeout(() => { setJustCopied(false); }, 3000); } catch (error: any) { setErrorMessage(error.message); } ref.current?.select(); }; const shareRoomLink = async () => { try { await navigator.share({ title: t("roomDialog.shareTitle"), text: t("roomDialog.shareTitle"), url: activeRoomLink, }); } catch (error: any) { // Just ignore. } }; if (activeRoomLink) { return ( <>

{t("labels.liveCollaboration")}

event.key === KEYS.ENTER && handleClose()} />
{isShareSupported && ( )} event.preventDefault()} onCloseAutoFocus={(event) => event.preventDefault()} className="RoomDialog__popover" side="top" align="end" sideOffset={5.5} > {tablerCheckIcon} copied

{t("roomDialog.desc_privacy")}

{t("roomDialog.desc_exitSession")}

{ trackEvent("share", "room closed"); onRoomDestroy(); }} />
); } return ( <>
{t("labels.liveCollaboration")}
{t("roomDialog.desc_intro")} {t("roomDialog.desc_privacy")}
{ trackEvent("share", "room creation", `ui (${getFrame()})`); onRoomCreate(); }} />
); }; const RoomDialog = (props: RoomModalProps) => { return (
); }; export default RoomDialog;