Add copy button to code exports
This commit is contained in:
parent
881768b765
commit
8301cea0bd
52
src/components/EditorHeader/Modal/Code.jsx
Normal file
52
src/components/EditorHeader/Modal/Code.jsx
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import { useState } from "react";
|
||||||
|
import { sql } from "@codemirror/lang-sql";
|
||||||
|
import { json } from "@codemirror/lang-json";
|
||||||
|
import { vscodeDark } from "@uiw/codemirror-theme-vscode";
|
||||||
|
import { githubLight } from "@uiw/codemirror-theme-github";
|
||||||
|
import { useSettings } from "../../../hooks";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import CodeMirror from "@uiw/react-codemirror";
|
||||||
|
|
||||||
|
const languageExtension = {
|
||||||
|
sql: [sql()],
|
||||||
|
json: [json()],
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Code({ value, language }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { settings } = useSettings();
|
||||||
|
const [copied, setCopied] = useState(false);
|
||||||
|
|
||||||
|
const copyCode = () => {
|
||||||
|
navigator.clipboard
|
||||||
|
.writeText(value)
|
||||||
|
.then(() => {
|
||||||
|
setCopied(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
setCopied(false);
|
||||||
|
}, 2000);
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="relative">
|
||||||
|
<CodeMirror
|
||||||
|
value={value}
|
||||||
|
height="360px"
|
||||||
|
extensions={languageExtension[language]}
|
||||||
|
editable={false}
|
||||||
|
theme={settings.mode === "dark" ? vscodeDark : githubLight}
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
onClick={copyCode}
|
||||||
|
className={`absolute right-4 top-2 px-2 py-1 rounded ${settings.mode === "dark" ? "bg-zinc-700" : "bg-zinc-200"}`}
|
||||||
|
>
|
||||||
|
<i className={`bi bi-clipboard${copied ? "-check" : ""} me-2`} />
|
||||||
|
{t("copy")}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -12,7 +12,6 @@ import {
|
|||||||
useAreas,
|
useAreas,
|
||||||
useEnums,
|
useEnums,
|
||||||
useNotes,
|
useNotes,
|
||||||
useSettings,
|
|
||||||
useDiagram,
|
useDiagram,
|
||||||
useTransform,
|
useTransform,
|
||||||
useTypes,
|
useTypes,
|
||||||
@ -34,21 +33,12 @@ import ImportSource from "./ImportSource";
|
|||||||
import SetTableWidth from "./SetTableWidth";
|
import SetTableWidth from "./SetTableWidth";
|
||||||
import Language from "./Language";
|
import Language from "./Language";
|
||||||
import Share from "./Share";
|
import Share from "./Share";
|
||||||
import CodeMirror from "@uiw/react-codemirror";
|
import Code from "./Code";
|
||||||
import { sql } from "@codemirror/lang-sql";
|
|
||||||
import { vscodeDark } from "@uiw/codemirror-theme-vscode";
|
|
||||||
import { json } from "@codemirror/lang-json";
|
|
||||||
import { githubLight } from "@uiw/codemirror-theme-github";
|
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { importSQL } from "../../../utils/importSQL";
|
import { importSQL } from "../../../utils/importSQL";
|
||||||
import { databases } from "../../../data/databases";
|
import { databases } from "../../../data/databases";
|
||||||
import { isRtl } from "../../../i18n/utils/rtl";
|
import { isRtl } from "../../../i18n/utils/rtl";
|
||||||
|
|
||||||
const languageExtension = {
|
|
||||||
sql: [sql()],
|
|
||||||
json: [json()],
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Modal({
|
export default function Modal({
|
||||||
modal,
|
modal,
|
||||||
setModal,
|
setModal,
|
||||||
@ -64,7 +54,6 @@ export default function Modal({
|
|||||||
const { setNotes } = useNotes();
|
const { setNotes } = useNotes();
|
||||||
const { setAreas } = useAreas();
|
const { setAreas } = useAreas();
|
||||||
const { setTypes } = useTypes();
|
const { setTypes } = useTypes();
|
||||||
const { settings } = useSettings();
|
|
||||||
const { setEnums } = useEnums();
|
const { setEnums } = useEnums();
|
||||||
const { setTasks } = useTasks();
|
const { setTasks } = useTasks();
|
||||||
const { setTransform } = useTransform();
|
const { setTransform } = useTransform();
|
||||||
@ -303,14 +292,7 @@ export default function Modal({
|
|||||||
{modal === MODAL.IMG ? (
|
{modal === MODAL.IMG ? (
|
||||||
<Image src={exportData.data} alt="Diagram" height={280} />
|
<Image src={exportData.data} alt="Diagram" height={280} />
|
||||||
) : (
|
) : (
|
||||||
<CodeMirror
|
<Code value={exportData.data} language={exportData.extension} />
|
||||||
value={exportData.data}
|
|
||||||
height="360px"
|
|
||||||
extensions={languageExtension[exportData.extension]}
|
|
||||||
onChange={() => {}}
|
|
||||||
editable={false}
|
|
||||||
theme={settings.mode === "dark" ? vscodeDark : githubLight}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
<div className="text-sm font-semibold mt-2">{t("filename")}:</div>
|
<div className="text-sm font-semibold mt-2">{t("filename")}:</div>
|
||||||
<Input
|
<Input
|
||||||
|
Loading…
Reference in New Issue
Block a user