Merge pull request #302 from drawdb-io/unshare

Ushare a diagram
This commit is contained in:
1ilit 2024-11-23 20:18:26 +04:00 committed by GitHub
commit 881768b765
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 92 additions and 92 deletions

View File

@ -336,7 +336,7 @@ export default function Modal({
case MODAL.LANGUAGE: case MODAL.LANGUAGE:
return <Language />; return <Language />;
case MODAL.SHARE: case MODAL.SHARE:
return <Share title={title} />; return <Share title={title} setModal={setModal} />;
default: default:
return <></>; return <></>;
} }

View File

@ -13,8 +13,9 @@ import {
} from "../../../hooks"; } from "../../../hooks";
import { databases } from "../../../data/databases"; import { databases } from "../../../data/databases";
import { octokit } from "../../../data/octokit"; import { octokit } from "../../../data/octokit";
import { MODAL } from "../../../data/constants";
export default function Share({ title }) { export default function Share({ title, setModal }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { gistId, setGistId } = useContext(IdContext); const { gistId, setGistId } = useContext(IdContext);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
@ -51,6 +52,21 @@ export default function Share({ title }) {
transform, transform,
]); ]);
const unshare = useCallback(async () => {
try {
await octokit.request(`DELETE /gists/${gistId}`, {
gist_id: gistId,
headers: {
"X-GitHub-Api-Version": "2022-11-28",
},
});
setGistId("");
setModal(MODAL.NONE);
} catch (e) {
console.error(e);
}
}, [gistId, setGistId, setModal]);
const updateGist = useCallback(async () => { const updateGist = useCallback(async () => {
setLoading(true); setLoading(true);
try { try {
@ -136,17 +152,16 @@ export default function Share({ title }) {
<div> <div>
<div className="flex gap-3"> <div className="flex gap-3">
<Input value={url} size="large" /> <Input value={url} size="large" />
<Button </div>
size="large" <div className="text-xs mt-2">{t("share_info")}</div>
theme="solid" <div className="flex gap-2 mt-3">
icon={<IconLink />} <Button block onClick={unshare}>
onClick={copyLink} {t("unshare")}
> </Button>
<Button block theme="solid" icon={<IconLink />} onClick={copyLink}>
{t("copy_link")} {t("copy_link")}
</Button> </Button>
</div> </div>
<hr className="opacity-20 mt-3 mb-1" />
<div className="text-xs">{t("share_info")}</div>
</div> </div>
); );
} }

View File

@ -65,6 +65,8 @@ export default function WorkSpace() {
}; };
const save = useCallback(async () => { const save = useCallback(async () => {
if (saveState !== State.SAVING) return;
const name = window.name.split(" "); const name = window.name.split(" ");
const op = name[0]; const op = name[0];
const saveAsDiagram = window.name === "" || op === "d" || op === "lt"; const saveAsDiagram = window.name === "" || op === "d" || op === "lt";
@ -72,10 +74,7 @@ export default function WorkSpace() {
if (saveAsDiagram) { if (saveAsDiagram) {
searchParams.delete("shareId"); searchParams.delete("shareId");
setSearchParams(searchParams); setSearchParams(searchParams);
if ( if ((id === 0 && window.name === "") || op === "lt") {
(id === 0 && window.name === "") ||
window.name.split(" ")[0] === "lt"
) {
await db.diagrams await db.diagrams
.add({ .add({
database: database, database: database,
@ -162,6 +161,7 @@ export default function WorkSpace() {
enums, enums,
gistId, gistId,
loadedFromGistId, loadedFromGistId,
saveState
]); ]);
const load = useCallback(async () => { const load = useCallback(async () => {
@ -283,52 +283,7 @@ export default function WorkSpace() {
}); });
}; };
if (window.name === "") { const loadFromGist = async (shareId) => {
loadLatestDiagram();
} else {
const name = window.name.split(" ");
const op = name[0];
const id = parseInt(name[1]);
switch (op) {
case "d": {
loadDiagram(id);
break;
}
case "t":
case "lt": {
loadTemplate(id);
break;
}
default:
break;
}
}
}, [
setTransform,
setRedoStack,
setUndoStack,
setRelationships,
setTables,
setAreas,
setNotes,
setTypes,
setTasks,
setDatabase,
database,
setEnums,
selectedDb,
]);
const loadFromGist = useCallback(
async (shareId) => {
const existingDiagram = await db.diagrams.get({
loadedFromGistId: shareId,
});
if (existingDiagram) {
window.name = "d " + existingDiagram.id;
} else {
window.name = "";
}
try { try {
const res = await octokit.request(`GET /gists/${shareId}`, { const res = await octokit.request(`GET /gists/${shareId}`, {
gist_id: shareId, gist_id: shareId,
@ -358,21 +313,62 @@ export default function WorkSpace() {
console.log(e); console.log(e);
setSaveState(State.FAILED_TO_LOAD); setSaveState(State.FAILED_TO_LOAD);
} }
}, };
[
setAreas, const shareId = searchParams.get("shareId");
setDatabase, if (shareId) {
setEnums, const existingDiagram = await db.diagrams.get({
setNotes, loadedFromGistId: shareId,
setRelationships, });
setTables,
setTypes, if (existingDiagram) {
setTransform, window.name = "d " + existingDiagram.id;
setRedoStack, setId(existingDiagram.id);
setUndoStack, } else {
setSaveState, window.name = "";
], setId(0);
); }
await loadFromGist(shareId);
return;
}
if (window.name === "") {
await loadLatestDiagram();
} else {
const name = window.name.split(" ");
const op = name[0];
const id = parseInt(name[1]);
switch (op) {
case "d": {
await loadDiagram(id);
break;
}
case "t":
case "lt": {
await loadTemplate(id);
break;
}
default:
break;
}
}
}, [
setTransform,
setRedoStack,
setUndoStack,
setRelationships,
setTables,
setAreas,
setNotes,
setTypes,
setTasks,
setDatabase,
database,
setEnums,
selectedDb,
setSaveState,
searchParams,
]);
useEffect(() => { useEffect(() => {
if ( if (
@ -399,31 +395,19 @@ export default function WorkSpace() {
tasks?.length, tasks?.length,
transform.zoom, transform.zoom,
title, title,
gistId,
setSaveState, setSaveState,
]); ]);
useEffect(() => { useEffect(() => {
if (gistId && gistId !== "") {
setSaveState(State.SAVING);
}
}, [gistId, setSaveState]);
useEffect(() => {
if (saveState !== State.SAVING) return;
save(); save();
}, [id, gistId, saveState, save]); }, [saveState, save]);
useEffect(() => { useEffect(() => {
document.title = "Editor | drawDB"; document.title = "Editor | drawDB";
const shareId = searchParams.get("shareId"); load();
if (shareId) { }, [load]);
loadFromGist(shareId);
} else {
load();
}
}, [load, searchParams, loadFromGist]);
return ( return (
<div className="h-full flex flex-col overflow-hidden theme"> <div className="h-full flex flex-col overflow-hidden theme">

View File

@ -1,7 +1,7 @@
import { createContext, useState } from "react"; import { createContext, useState } from "react";
import { State } from "../data/constants"; import { State } from "../data/constants";
export const SaveStateContext = createContext(null); export const SaveStateContext = createContext(State.NONE);
export default function SaveStateContextProvider({ children }) { export default function SaveStateContextProvider({ children }) {
const [saveState, setSaveState] = useState(State.NONE); const [saveState, setSaveState] = useState(State.NONE);

View File

@ -237,6 +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",
unshare: "Unshare",
copy_link: "Copy link", copy_link: "Copy link",
readme: "README", readme: "README",
failed_to_load: "Failed to load. Make sure the link is correct.", failed_to_load: "Failed to load. Make sure the link is correct.",