Add modal for github token

This commit is contained in:
1ilit 2024-08-27 23:39:14 +04:00
parent 75f930ba76
commit 488641ddcc
8 changed files with 117 additions and 20 deletions

View File

@ -1290,6 +1290,9 @@ export default function ControlPanel({
language: { language: {
function: () => setModal(MODAL.LANGUAGE), function: () => setModal(MODAL.LANGUAGE),
}, },
github_token: {
function: () => setModal(MODAL.GITHUB_TOKEN),
},
flush_storage: { flush_storage: {
warning: { warning: {
title: t("flush_storage"), title: t("flush_storage"),

View File

@ -0,0 +1,43 @@
import { Button, Input } from "@douyinfe/semi-ui";
import { useTranslation } from "react-i18next";
export default function GithubToken({ token, setToken }) {
const { t } = useTranslation();
const clearToken = () => {
localStorage.removeItem("github_token");
setToken("");
};
return (
<div>
<div className="mb-3">
Set your{" "}
<a
href="https://github.com/settings/tokens"
className="text-blue-500 hover:underline font-semibold"
>
personal access token
</a>{" "}
here if you wish to save diagrams to your gists.
</div>
<div className="flex gap-2">
<Input
className="w-full"
placeholder={t("github_token")}
value={token}
onChange={(v) => setToken(v)}
/>
<Button
icon={<i className="fa-solid fa-xmark" />}
type="danger"
title={t("clear")}
onClick={clearToken}
/>
</div>
<div className="mt-1 text-xs">
*This will be stored in the local storage
</div>
</div>
);
}

View File

@ -43,6 +43,7 @@ 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";
import Share from "./Share"; import Share from "./Share";
import GithubToken from "./GithubToken";
const languageExtension = { const languageExtension = {
sql: [sql()], sql: [sql()],
@ -82,6 +83,9 @@ export default function Modal({
const [selectedTemplateId, setSelectedTemplateId] = useState(-1); const [selectedTemplateId, setSelectedTemplateId] = useState(-1);
const [selectedDiagramId, setSelectedDiagramId] = useState(0); const [selectedDiagramId, setSelectedDiagramId] = useState(0);
const [saveAsTitle, setSaveAsTitle] = useState(title); const [saveAsTitle, setSaveAsTitle] = useState(title);
const [token, setToken] = useState(
localStorage.getItem("github_token") ?? "",
);
const overwriteDiagram = () => { const overwriteDiagram = () => {
setTables(importData.tables); setTables(importData.tables);
@ -238,6 +242,14 @@ export default function Modal({
setModal(MODAL.NONE); setModal(MODAL.NONE);
createNewDiagram(selectedTemplateId); createNewDiagram(selectedTemplateId);
return; return;
case MODAL.GITHUB_TOKEN:
setModal(MODAL.NONE);
if (token !== "") {
localStorage.setItem("github_token", token);
} else {
localStorage.removeItem("github_token");
}
return;
default: default:
setModal(MODAL.NONE); setModal(MODAL.NONE);
return; return;
@ -320,7 +332,7 @@ export default function Modal({
); );
} else { } else {
return ( return (
<div className="text-center my-3"> <div className="text-center my-3 text-sky-600">
<Spin tip={t("loading")} size="large" /> <Spin tip={t("loading")} size="large" />
</div> </div>
); );
@ -330,7 +342,9 @@ export default function Modal({
case MODAL.LANGUAGE: case MODAL.LANGUAGE:
return <Language />; return <Language />;
case MODAL.SHARE: case MODAL.SHARE:
return <Share />; return <Share setModal={setModal} />;
case MODAL.GITHUB_TOKEN:
return <GithubToken token={token} setToken={setToken} />;
default: default:
return <></>; return <></>;
} }

View File

@ -1,14 +1,21 @@
import { Button, Banner } from "@douyinfe/semi-ui"; import { Banner, Button, Spin } from "@douyinfe/semi-ui";
import { IconLink } from "@douyinfe/semi-icons"; import { IconLink } from "@douyinfe/semi-icons";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Octokit } from "octokit"; import { Octokit } from "octokit";
import { useState } from "react";
import { MODAL } from "../../../data/constants";
export default function Share() { export default function Share({ setModal }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const generateLink = async () => { const generateLink = async () => {
setLoading(true);
const userToken = localStorage.getItem("github_token");
const octokit = new Octokit({ const octokit = new Octokit({
auth: import.meta.env.VITE_GITHUB_ACCESS_TOKEN, auth:
userToken ?? import.meta.env.VITE_GITHUB_ACCESS_TOKEN,
}); });
try { try {
@ -27,30 +34,52 @@ export default function Share() {
console.log(res); console.log(res);
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} finally {
setLoading(false);
} }
}; };
return ( return (
<div className="space-y-4"> <div id="share" className="space-y-4">
<Banner <Banner
fullMode={false} fullMode={false}
type="info" type="info"
icon={null} icon={null}
closeIcon={null} closeIcon={null}
description="When you generate a link a gist with the JSON representation of the description={
diagram will get created. This will not start a real-time collaboration <ul className="list-disc ms-4">
session." <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 className="text-center">
<Button <Button
type="primary" type="primary"
theme="solid" theme="solid"
className="text-base me-2 pe-6 ps-5 py-[18px] rounded-md" className="text-base me-2 pe-6 ps-5 py-[18px] rounded-md"
size="default" size="default"
icon={<IconLink />} icon={loading ? <Spin /> : <IconLink />}
onClick={generateLink} onClick={generateLink}
> >
{t("generate_link")} {t("generate_link")}
</Button> </Button>
</div> </div>
</div>
); );
} }

View File

@ -92,6 +92,7 @@ export const MODAL = {
TABLE_WIDTH: 9, TABLE_WIDTH: 9,
LANGUAGE: 10, LANGUAGE: 10,
SHARE: 11, SHARE: 11,
GITHUB_TOKEN: 12,
}; };
export const STATUS = { export const STATUS = {

View File

@ -237,7 +237,8 @@ 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" generate_link: "Generate link",
github_token: "GitHub Token",
}, },
}; };

View File

@ -58,6 +58,10 @@
background-color: rgba(var(--semi-blue-6), 1); background-color: rgba(var(--semi-blue-6), 1);
} }
.semi-spin-wrapper{
color: inherit;
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 8px; width: 8px;
height: 8px; height: 8px;

View File

@ -25,6 +25,8 @@ export const getModalTitle = (modal) => {
return i18n.t("language"); return i18n.t("language");
case MODAL.SHARE: case MODAL.SHARE:
return i18n.t("share"); return i18n.t("share");
case MODAL.GITHUB_TOKEN:
return i18n.t("github_token");
default: default:
return ""; return "";
} }