mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-07-13 16:20:22 +00:00
Copy share url
This commit is contained in:
parent
7dcecf3c1f
commit
3f24ceaf93
@ -9,6 +9,7 @@ import {
|
|||||||
IconUndo,
|
IconUndo,
|
||||||
IconRedo,
|
IconRedo,
|
||||||
IconEdit,
|
IconEdit,
|
||||||
|
IconShareStroked,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import { Link, useNavigate } from "react-router-dom";
|
import { Link, useNavigate } from "react-router-dom";
|
||||||
import icon from "../../assets/icon_dark_64.png";
|
import icon from "../../assets/icon_dark_64.png";
|
||||||
@ -70,7 +71,6 @@ import { exportSQL } from "../../utils/exportSQL";
|
|||||||
import { databases } from "../../data/databases";
|
import { databases } from "../../data/databases";
|
||||||
import { jsonToMermaid } from "../../utils/exportAs/mermaid";
|
import { jsonToMermaid } from "../../utils/exportAs/mermaid";
|
||||||
import { isRtl } from "../../i18n/utils/rtl";
|
import { isRtl } from "../../i18n/utils/rtl";
|
||||||
import ShareButton from "./ShareButton";
|
|
||||||
|
|
||||||
export default function ControlPanel({
|
export default function ControlPanel({
|
||||||
diagramId,
|
diagramId,
|
||||||
@ -1363,7 +1363,15 @@ export default function ControlPanel({
|
|||||||
{layout.header && (
|
{layout.header && (
|
||||||
<div className="flex justify-between items-center me-7">
|
<div className="flex justify-between items-center me-7">
|
||||||
{header()}
|
{header()}
|
||||||
<ShareButton setModal={setModal} />
|
<Button
|
||||||
|
type="primary"
|
||||||
|
className="text-base me-2 pe-6 ps-5 py-[18px] rounded-md"
|
||||||
|
size="default"
|
||||||
|
icon={<IconShareStroked />}
|
||||||
|
onClick={() => setModal(MODAL.SHARE)}
|
||||||
|
>
|
||||||
|
{t("share")}
|
||||||
|
</Button>{" "}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{layout.toolbar && toolbar()}
|
{layout.toolbar && toolbar()}
|
||||||
|
@ -1,38 +1,114 @@
|
|||||||
import { Banner } from "@douyinfe/semi-ui";
|
import { Button, Input, Spin, Toast } from "@douyinfe/semi-ui";
|
||||||
import { MODAL } from "../../../data/constants";
|
import { MODAL } from "../../../data/constants";
|
||||||
|
import { useCallback, useContext, useEffect, useState, useMemo } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Octokit } from "octokit";
|
||||||
|
import { IdContext } from "../../Workspace";
|
||||||
|
import { IconLink } from "@douyinfe/semi-icons";
|
||||||
|
|
||||||
export default function Share({ setModal }) {
|
export default function Share({ setModal }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { gistId, setGistId } = useContext(IdContext);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
const userToken = localStorage.getItem("github_token");
|
||||||
|
const octokit = useMemo(() => {
|
||||||
|
return new Octokit({
|
||||||
|
auth: userToken ?? import.meta.env.VITE_GITHUB_ACCESS_TOKEN,
|
||||||
|
});
|
||||||
|
}, [userToken]);
|
||||||
|
const url = useMemo(
|
||||||
|
() => window.location.href + "?shareId=" + gistId,
|
||||||
|
[gistId],
|
||||||
|
);
|
||||||
|
|
||||||
|
const updateGist = useCallback(async () => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await octokit.request(`PATCH /gists/${gistId}`, {
|
||||||
|
gist_id: gistId,
|
||||||
|
description: "drawDB diagram",
|
||||||
|
files: {
|
||||||
|
"test.json": {
|
||||||
|
content: '{"Hello":"SEAMAN"}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"X-GitHub-Api-Version": "2022-11-28",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
}, [gistId, octokit]);
|
||||||
|
|
||||||
|
const generateLink = useCallback(async () => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
const res = await octokit.request("POST /gists", {
|
||||||
|
description: "drawDB diagram",
|
||||||
|
public: false,
|
||||||
|
files: {
|
||||||
|
"test.json": {
|
||||||
|
content: '{"Hello":"WORLD"}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"X-GitHub-Api-Version": "2022-11-28",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
setGistId(res.data.id);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
}, [octokit, setGistId]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const updateOrGenerateLink = async () => {
|
||||||
|
try {
|
||||||
|
if (!gistId || gistId === "") {
|
||||||
|
await generateLink();
|
||||||
|
} else {
|
||||||
|
await updateGist();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
} finally {
|
||||||
|
setModal(MODAL.SHARE);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
updateOrGenerateLink();
|
||||||
|
}, [gistId, generateLink, setModal, updateGist]);
|
||||||
|
|
||||||
|
const copyLink = () => {
|
||||||
|
navigator.clipboard
|
||||||
|
.writeText(url)
|
||||||
|
.then(() => {
|
||||||
|
Toast.success(t("copied_to_clipboard"));
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
Toast.error(t("oops_smth_went_wrong"));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (loading)
|
||||||
|
return (
|
||||||
|
<div className="text-blue-500 text-center">
|
||||||
|
<Spin size="middle" />
|
||||||
|
<div>{t("loading")}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id="share" className="space-y-4">
|
<div className="flex gap-3">
|
||||||
<Banner
|
<Input value={url} size="large" />
|
||||||
fullMode={false}
|
<Button size="large" theme="solid" icon={<IconLink />} onClick={copyLink}>
|
||||||
type="info"
|
{t("copy_link")}
|
||||||
icon={null}
|
</Button>
|
||||||
closeIcon={null}
|
|
||||||
description={
|
|
||||||
<ul className="list-disc ms-4">
|
|
||||||
<li>
|
|
||||||
Generating a link will create a gist with the JSON representation
|
|
||||||
of the diagram.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
You can create the gist from your account by providing your token
|
|
||||||
<button
|
|
||||||
onClick={() => setModal(MODAL.GITHUB_TOKEN)}
|
|
||||||
className="ms-1 text-sky-500 hover:underline font-semibold"
|
|
||||||
>
|
|
||||||
here
|
|
||||||
</button>
|
|
||||||
.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Sharing will not create a live real-time collaboration session.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
import { Button, Spin } from "@douyinfe/semi-ui";
|
|
||||||
import { IconShareStroked } from "@douyinfe/semi-icons";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { Octokit } from "octokit";
|
|
||||||
import { MODAL } from "../../data/constants";
|
|
||||||
import { useContext, useState } from "react";
|
|
||||||
import { IdContext } from "../Workspace";
|
|
||||||
|
|
||||||
export default function ShareButton({ setModal }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const { gistId, setGistId } = useContext(IdContext);
|
|
||||||
const [loading, setLoading] = useState(false);
|
|
||||||
|
|
||||||
const updateGist = async () => {
|
|
||||||
setLoading(true);
|
|
||||||
const userToken = localStorage.getItem("github_token");
|
|
||||||
|
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: userToken ?? import.meta.env.VITE_GITHUB_ACCESS_TOKEN,
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await octokit.request(`PATCH /gists/${gistId}`, {
|
|
||||||
gist_id: gistId,
|
|
||||||
description: "drawDB diagram",
|
|
||||||
files: {
|
|
||||||
"test.json": {
|
|
||||||
content: '{"Hello":"SEAMAN"}',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
headers: {
|
|
||||||
"X-GitHub-Api-Version": "2022-11-28",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
console.log(res);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
} finally {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateLink = async () => {
|
|
||||||
setLoading(true);
|
|
||||||
const userToken = localStorage.getItem("github_token");
|
|
||||||
|
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: userToken ?? import.meta.env.VITE_GITHUB_ACCESS_TOKEN,
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await octokit.request("POST /gists", {
|
|
||||||
description: "drawDB diagram",
|
|
||||||
public: false,
|
|
||||||
files: {
|
|
||||||
"test.json": {
|
|
||||||
content: '{"Hello":"WORLD"}',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
headers: {
|
|
||||||
"X-GitHub-Api-Version": "2022-11-28",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
setGistId(res.data.id);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
} finally {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onShare = async () => {
|
|
||||||
try {
|
|
||||||
if (!gistId || gistId === "") {
|
|
||||||
await generateLink();
|
|
||||||
} else {
|
|
||||||
await updateGist();
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
} finally {
|
|
||||||
setModal(MODAL.SHARE);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
type="primary"
|
|
||||||
className="text-base me-2 pe-6 ps-5 py-[18px] rounded-md"
|
|
||||||
size="default"
|
|
||||||
icon={loading ? <Spin /> : <IconShareStroked />}
|
|
||||||
onClick={onShare}
|
|
||||||
>
|
|
||||||
{t("share")}
|
|
||||||
</Button>
|
|
||||||
);
|
|
||||||
}
|
|
@ -237,7 +237,7 @@ const en = {
|
|||||||
didnt_find_diagram: "Oops! Didn't find the diagram.",
|
didnt_find_diagram: "Oops! Didn't find the diagram.",
|
||||||
unsigned: "Unsigned",
|
unsigned: "Unsigned",
|
||||||
share: "Share",
|
share: "Share",
|
||||||
generate_link: "Generate link",
|
copy_link: "Copy link",
|
||||||
github_token: "GitHub Token",
|
github_token: "GitHub Token",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user