diff --git a/src/components/ProjectBar/ProjectBar.jsx b/src/components/ProjectBar/ProjectBar.jsx index f3a5761ea..713d20e5e 100644 --- a/src/components/ProjectBar/ProjectBar.jsx +++ b/src/components/ProjectBar/ProjectBar.jsx @@ -6,6 +6,7 @@ import DownloadIcon from "../../assets/icons/download.svg"; import ProjectName from "../ProjectName/ProjectName"; import DownloadButton from "../DownloadButton/DownloadButton"; import SaveButton from "../SaveButton/SaveButton"; +import ShareButton from "../ShareButton/ShareButton"; const ProjectBar = () => { const { t } = useTranslation(); @@ -38,6 +39,9 @@ const ProjectBar = () => {
+
+ +
{lastSavedTime && user ? ( ) : null} diff --git a/src/components/ShareButton/ShareButton.jsx b/src/components/ShareButton/ShareButton.jsx new file mode 100644 index 000000000..b7de3813e --- /dev/null +++ b/src/components/ShareButton/ShareButton.jsx @@ -0,0 +1,50 @@ +import { useSelector, useDispatch } from "react-redux"; +import { useTranslation } from "react-i18next"; +import DesignSystemButton from "../DesignSystemButton/DesignSystemButton"; +import SaveIcon from "../../assets/icons/save.svg"; +import { syncProject, showLoginToSaveModal } from "../../redux/EditorSlice"; +import { isOwner } from "../../utils/projectHelpers"; + +const ShareButton = ({ className, type = "primary" }) => { + const dispatch = useDispatch(); + const { t } = useTranslation(); + + const user = useSelector((state) => state.auth.user); + const project = useSelector((state) => state.editor.project); + const loading = useSelector((state) => state.editor.loading); + + const onClickSave = async () => { + // window.plausible("Save button"); + + if (isOwner(user, project)) { + dispatch( + syncProject("share")({ + project, + accessToken: user.access_token, + // autosave: false, + }), + ); + } else if (user && project.identifier) { + dispatch( + syncProject("remix")({ project, accessToken: user.access_token }), + ); + } else { + dispatch(showLoginToSaveModal()); + } + }; + + return ( + loading === "success" && ( + } + type={type} + /> + ) + ); +}; + +export default ShareButton; diff --git a/src/redux/EditorSlice.js b/src/redux/EditorSlice.js index 25481dcd1..0e757296f 100644 --- a/src/redux/EditorSlice.js +++ b/src/redux/EditorSlice.js @@ -9,6 +9,7 @@ import { createOrUpdateProject, readProject, createRemix, + createShare, deleteProject, readProjectList, } from "../utils/apiCallHandler"; @@ -28,6 +29,10 @@ export const syncProject = (actionName) => case "remix": response = await createRemix(project, accessToken); break; + case "share": + response = await createShare(project, accessToken); + console.log(response); + break; case "save": response = await createOrUpdateProject(project, accessToken); break; diff --git a/src/utils/apiCallHandler.js b/src/utils/apiCallHandler.js index 9abf67a77..88e663bed 100644 --- a/src/utils/apiCallHandler.js +++ b/src/utils/apiCallHandler.js @@ -61,6 +61,14 @@ export const createRemix = async (project, accessToken) => { ); }; +export const createShare = async (project, accessToken) => { + return await post( + `${host}/api/projects/${project.identifier}/share`, + { project }, + headers(accessToken), + ); +}; + export const readProject = async (projectIdentifier, locale, accessToken) => { const queryString = locale ? `?locale=${locale}` : ""; return await get( diff --git a/src/utils/i18n.js b/src/utils/i18n.js index 9800546d7..a7c7f74e2 100644 --- a/src/utils/i18n.js +++ b/src/utils/i18n.js @@ -216,6 +216,7 @@ i18n renameProject: "Edit project name", renameSave: "Save project name", save: "Save", + share: "Share", settings: "Settings", }, imagePanel: {