From 4a5dcfb7043e2374b721c781f78aeb619862de55 Mon Sep 17 00:00:00 2001 From: AykutSarac Date: Thu, 9 May 2024 17:32:52 +0300 Subject: [PATCH] feat: add ga events --- src/containers/Editor/BottomBar.tsx | 20 ++++++-- src/containers/Modals/AccountModal/index.tsx | 6 ++- src/containers/Modals/CloudModal/index.tsx | 27 +++++++---- src/containers/Modals/DownloadModal/index.tsx | 4 +- src/containers/Modals/ImportModal/index.tsx | 5 ++ src/containers/Modals/JWTModal/index.tsx | 4 +- src/containers/Modals/NodeModal/index.tsx | 6 ++- src/containers/Modals/PremiumModal/index.tsx | 2 + src/containers/Modals/SchemaModal/index.tsx | 4 +- src/containers/Modals/ShareModal/index.tsx | 9 +++- src/containers/Modals/TypeModal/index.tsx | 6 ++- src/containers/Toolbar/FileMenu.tsx | 2 +- src/containers/Toolbar/OptionsMenu.tsx | 31 +++++++++--- src/containers/Toolbar/ToolsMenu.tsx | 35 +++++++++++--- src/containers/Toolbar/ViewMenu.tsx | 17 +++++-- src/containers/Toolbar/ZoomMenu.tsx | 48 ++++++++++++++++--- src/containers/Toolbar/index.tsx | 2 + .../Views/GraphView/PremiumView.tsx | 2 + src/hooks/useFocusNode.ts | 2 +- src/pages/pricing.tsx | 2 + src/services/document.service.ts | 2 +- src/store/useFile.ts | 15 ------ src/store/useModal.ts | 2 - 23 files changed, 191 insertions(+), 62 deletions(-) diff --git a/src/containers/Editor/BottomBar.tsx b/src/containers/Editor/BottomBar.tsx index 15dc3cd..f261ba2 100644 --- a/src/containers/Editor/BottomBar.tsx +++ b/src/containers/Editor/BottomBar.tsx @@ -15,6 +15,7 @@ import { BiSolidDockLeft } from "react-icons/bi"; import { MdOutlineCheckCircleOutline } from "react-icons/md"; import { TbTransform } from "react-icons/tb"; import { VscError, VscFeedback, VscSourceControl, VscSync, VscSyncIgnored } from "react-icons/vsc"; +import { gaEvent } from "src/lib/utils/gaEvent"; import { documentSvc } from "src/services/document.service"; import useConfig from "src/store/useConfig"; import useFile from "src/store/useFile"; @@ -106,7 +107,10 @@ export const BottomBar = () => { const [isPrivate, setIsPrivate] = React.useState(false); const [isUpdating, setIsUpdating] = React.useState(false); - const toggleEditor = () => toggleFullscreen(!fullscreen); + const toggleEditor = () => { + toggleFullscreen(!fullscreen); + gaEvent("Bottom Bar", "toggle fullscreen"); + }; React.useEffect(() => { setIsPrivate(data?.private ?? true); @@ -239,12 +243,22 @@ export const BottomBar = () => { Share {liveTransformEnabled ? ( - toggleLiveTransform(false)}> + { + toggleLiveTransform(false); + gaEvent("Bottom Bar", "toggle live transform", "manual"); + }} + > Live Transform ) : ( - toggleLiveTransform(true)}> + { + toggleLiveTransform(true); + gaEvent("Bottom Bar", "toggle live transform", "live"); + }} + > Manual Transform diff --git a/src/containers/Modals/AccountModal/index.tsx b/src/containers/Modals/AccountModal/index.tsx index 4d62220..06aaa6b 100644 --- a/src/containers/Modals/AccountModal/index.tsx +++ b/src/containers/Modals/AccountModal/index.tsx @@ -11,6 +11,7 @@ import { Badge, } from "@mantine/core"; import { IoRocketSharp } from "react-icons/io5"; +import { gaEvent } from "src/lib/utils/gaEvent"; import useModal from "src/store/useModal"; import useUser from "src/store/useUser"; @@ -62,7 +63,10 @@ export const AccountModal: React.FC = ({ opened, onClose }) => { variant="gradient" gradient={{ from: "teal", to: "lime", deg: 105 }} leftSection={} - onClick={() => setVisible("premium")(true)} + onClick={() => { + setVisible("premium")(true); + gaEvent("Account Modal", "click upgrade premium"); + }} > Upgrade to Premium diff --git a/src/containers/Modals/CloudModal/index.tsx b/src/containers/Modals/CloudModal/index.tsx index 4bc368d..dd1278e 100644 --- a/src/containers/Modals/CloudModal/index.tsx +++ b/src/containers/Modals/CloudModal/index.tsx @@ -30,6 +30,7 @@ import { FaTrash } from "react-icons/fa"; import { SlOptionsVertical } from "react-icons/sl"; import { VscAdd } from "react-icons/vsc"; import { FileFormat } from "src/enums/file.enum"; +import { gaEvent } from "src/lib/utils/gaEvent"; import { documentSvc } from "src/services/document.service"; import useFile, { File } from "src/store/useFile"; @@ -124,6 +125,7 @@ export const CloudModal: React.FC = ({ opened, onClose }) => { if (error) throw new Error(error.message); if (data[0]) setFile(data[0]); + gaEvent("Cloud Modal", "open file"); } catch (error) { if (error instanceof Error) toast.error(error.message); } finally { @@ -134,14 +136,23 @@ export const CloudModal: React.FC = ({ opened, onClose }) => { ); const onDeleteClick = React.useCallback( - (file: File) => { - toast - .promise(documentSvc.delete(file.id), { - loading: "Deleting file...", - error: "An error occurred while deleting the file!", - success: `Deleted ${file.name}!`, - }) - .then(() => refetch()); + async (file: File) => { + try { + toast.loading("Deleting file...", { id: "delete-file" }); + + const { error } = await documentSvc.delete(file.id); + if (error) throw new Error(error.message); + + await refetch(); + toast.success(`Deleted ${file.name}!`, { id: "delete-file" }); + gaEvent("Cloud Modal", "delete file"); + } catch (error) { + if (error instanceof Error) { + toast.error(error.message, { id: "delete-file" }); + } + } finally { + toast.dismiss("delete-file"); + } }, [refetch] ); diff --git a/src/containers/Modals/DownloadModal/index.tsx b/src/containers/Modals/DownloadModal/index.tsx index 3276e21..7407081 100644 --- a/src/containers/Modals/DownloadModal/index.tsx +++ b/src/containers/Modals/DownloadModal/index.tsx @@ -90,7 +90,7 @@ export const DownloadModal: React.FC = ({ opened, onClose }) => { ]); toast.success("Copied to clipboard"); - gaEvent("click", "clipboard image"); + gaEvent("Download Modal", "clipboard image"); } catch (error) { toast.error("Failed to copy to clipboard"); } finally { @@ -111,7 +111,7 @@ export const DownloadModal: React.FC = ({ opened, onClose }) => { }); downloadURI(dataURI, `${fileDetails.filename}.${extension}`); - gaEvent("download", "download graph image", extension); + gaEvent("Download Modal", "download image", extension); } catch (error) { toast.error("Failed to download image!"); } finally { diff --git a/src/containers/Modals/ImportModal/index.tsx b/src/containers/Modals/ImportModal/index.tsx index bd4b85e..fc276c9 100644 --- a/src/containers/Modals/ImportModal/index.tsx +++ b/src/containers/Modals/ImportModal/index.tsx @@ -14,6 +14,7 @@ import { Dropzone } from "@mantine/dropzone"; import toast from "react-hot-toast"; import { AiOutlineUpload } from "react-icons/ai"; import { FileFormat } from "src/enums/file.enum"; +import { gaEvent } from "src/lib/utils/gaEvent"; import useFile from "src/store/useFile"; export const ImportModal: React.FC = ({ opened, onClose }) => { @@ -28,6 +29,8 @@ export const ImportModal: React.FC = ({ opened, onClose }) => { setFile(null); toast.loading("Loading...", { id: "toastFetch" }); + gaEvent("Import Modal", "fetch url"); + return fetch(url) .then(res => res.json()) .then(json => { @@ -47,6 +50,8 @@ export const ImportModal: React.FC = ({ opened, onClose }) => { setURL(""); onClose(); }); + + gaEvent("Import Modal", "import file", format); } }; diff --git a/src/containers/Modals/JWTModal/index.tsx b/src/containers/Modals/JWTModal/index.tsx index 420f91b..e0bc568 100644 --- a/src/containers/Modals/JWTModal/index.tsx +++ b/src/containers/Modals/JWTModal/index.tsx @@ -1,6 +1,7 @@ import React from "react"; import { Modal, Button, ModalProps, Textarea, Divider, Group } from "@mantine/core"; import { decode } from "jsonwebtoken"; +import { gaEvent } from "src/lib/utils/gaEvent"; import useFile from "src/store/useFile"; export const JWTModal: React.FC = ({ opened, onClose }) => { @@ -10,8 +11,9 @@ export const JWTModal: React.FC = ({ opened, onClose }) => { const resolve = () => { if (!token) return; const json = decode(token); - setContents({ contents: JSON.stringify(json, null, 2) }); + + gaEvent("JWT Modal", "resolve"); setToken(""); onClose(); }; diff --git a/src/containers/Modals/NodeModal/index.tsx b/src/containers/Modals/NodeModal/index.tsx index 3f2bf8d..5991269 100644 --- a/src/containers/Modals/NodeModal/index.tsx +++ b/src/containers/Modals/NodeModal/index.tsx @@ -2,6 +2,7 @@ import React from "react"; import { Modal, Stack, Text, ScrollArea, ModalProps, Button } from "@mantine/core"; import { CodeHighlight } from "@mantine/code-highlight"; import { VscLock } from "react-icons/vsc"; +import { gaEvent } from "src/lib/utils/gaEvent"; import useGraph from "src/store/useGraph"; import useModal from "src/store/useModal"; @@ -32,7 +33,10 @@ export const NodeModal: React.FC = ({ opened, onClose }) => {