From 6ec259a0e71174651bae95d4628138bf6fd68742 Mon Sep 17 00:00:00 2001 From: kj_sh604 Date: Sun, 15 Mar 2026 16:19:35 -0400 Subject: refactor: packages/ --- .../excalidraw/components/ShareableLinkDialog.tsx | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 packages/excalidraw/components/ShareableLinkDialog.tsx (limited to 'packages/excalidraw/components/ShareableLinkDialog.tsx') diff --git a/packages/excalidraw/components/ShareableLinkDialog.tsx b/packages/excalidraw/components/ShareableLinkDialog.tsx new file mode 100644 index 0000000..987c7bf --- /dev/null +++ b/packages/excalidraw/components/ShareableLinkDialog.tsx @@ -0,0 +1,80 @@ +import { useRef, useState } from "react"; + +import { copyTextToSystemClipboard } from "../clipboard"; +import { useI18n } from "../i18n"; + +import { Dialog } from "./Dialog"; +import { TextField } from "./TextField"; +import { FilledButton } from "./FilledButton"; +import { useCopyStatus } from "../hooks/useCopiedIndicator"; +import { copyIcon } from "./icons"; + +import "./ShareableLinkDialog.scss"; + +export type ShareableLinkDialogProps = { + link: string; + + onCloseRequest: () => void; + setErrorMessage: (error: string) => void; +}; + +export const ShareableLinkDialog = ({ + link, + onCloseRequest, + setErrorMessage, +}: ShareableLinkDialogProps) => { + const { t } = useI18n(); + const [, setJustCopied] = useState(false); + const timerRef = useRef(0); + const ref = useRef(null); + + const copyRoomLink = async () => { + try { + await copyTextToSystemClipboard(link); + } catch (e) { + setErrorMessage(t("errors.copyToSystemClipboardFailed")); + } + setJustCopied(true); + + if (timerRef.current) { + window.clearTimeout(timerRef.current); + } + + timerRef.current = window.setTimeout(() => { + setJustCopied(false); + }, 3000); + + ref.current?.select(); + }; + const { onCopy, copyStatus } = useCopyStatus(); + return ( + +
+

Shareable link

+
+ + { + onCopy(); + copyRoomLink(); + }} + /> +
+
+ 🔒 {t("alerts.uploadedSecurly")} +
+
+
+ ); +}; -- cgit v1.2.3