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: {