diff --git a/apps/roam/src/components/CreateRelationDialog.tsx b/apps/roam/src/components/CreateRelationDialog.tsx index d880bf0fe..3eb8f3a32 100644 --- a/apps/roam/src/components/CreateRelationDialog.tsx +++ b/apps/roam/src/components/CreateRelationDialog.tsx @@ -24,6 +24,7 @@ import type { Result } from "~/utils/types"; import internalError from "~/utils/internalError"; import getDiscourseNodes from "~/utils/getDiscourseNodes"; import { USE_REIFIED_RELATIONS } from "~/data/userSettings"; +import posthog from "posthog-js"; export type CreateRelationDialogProps = { onClose: () => void; @@ -162,6 +163,10 @@ const CreateRelationDialog = ({ }; const onCreateSync = (): void => { + posthog.capture("Create Relation Dialog: Create Triggered", { + relationName: selectedRelationName, + hasTarget: !!selectedTarget.uid, + }); onCreate() .then((result: boolean) => { if (result) { diff --git a/apps/roam/src/components/DiscourseFloatingMenu.tsx b/apps/roam/src/components/DiscourseFloatingMenu.tsx index a3e25b112..07f71b694 100644 --- a/apps/roam/src/components/DiscourseFloatingMenu.tsx +++ b/apps/roam/src/components/DiscourseFloatingMenu.tsx @@ -12,6 +12,7 @@ import { } from "@blueprintjs/core"; import { FeedbackWidget } from "./BirdEatsBugs"; import { render as renderSettings } from "~/components/settings/Settings"; +import posthog from "posthog-js"; type DiscourseFloatingMenuProps = { // CSS placement class @@ -36,6 +37,7 @@ export const DiscourseFloatingMenu = (props: DiscourseFloatingMenuProps) => ( text="Send feedback" icon="send-message" onClick={() => { + posthog.capture("Floating Menu: Feedback Clicked"); try { (window.birdeatsbug as FeedbackWidget | undefined)?.trigger?.(); } catch (error) { @@ -46,6 +48,7 @@ export const DiscourseFloatingMenu = (props: DiscourseFloatingMenuProps) => ( posthog.capture("Floating Menu: Docs Clicked")} href="https://discoursegraphs.com/docs/roam" rel="noopener noreferrer" target="_blank" @@ -53,6 +56,7 @@ export const DiscourseFloatingMenu = (props: DiscourseFloatingMenuProps) => ( posthog.capture("Floating Menu: Community Clicked")} href="https://join.slack.com/t/discoursegraphs/shared_invite/zt-37xklatti-cpEjgPQC0YyKYQWPNgAkEg" rel="noopener noreferrer" target="_blank" @@ -60,12 +64,18 @@ export const DiscourseFloatingMenu = (props: DiscourseFloatingMenuProps) => ( renderSettings({ onloadArgs: props.onloadArgs! })} + onClick={() => { + posthog.capture("Floating Menu: Settings Clicked"); + renderSettings({ onloadArgs: props.onloadArgs! }); + }} rel="noopener noreferrer" target="_blank" /> } + onOpened={() => { + posthog.capture("Floating Menu: Opened"); + }} onClosed={() => { document.getElementById("dg-floating-menu-button")?.blur(); }} diff --git a/apps/roam/src/components/DiscourseSuggestionsPanel.tsx b/apps/roam/src/components/DiscourseSuggestionsPanel.tsx index 554251993..d6b02f60b 100644 --- a/apps/roam/src/components/DiscourseSuggestionsPanel.tsx +++ b/apps/roam/src/components/DiscourseSuggestionsPanel.tsx @@ -7,6 +7,7 @@ import { Collapse, } from "@blueprintjs/core"; import React, { useState, useCallback, useEffect } from "react"; +import posthog from "posthog-js"; import SuggestionsBody from "./SuggestionsBody"; export const DiscourseSuggestionsPanel = ({ @@ -31,6 +32,9 @@ export const DiscourseSuggestionsPanel = ({ const handleToggle = useCallback(() => { setIsOpen((prev) => { const next = !prev; + posthog.capture("Suggestive Mode Panel: Toggled", { + isOpen: next, + }); onToggle(next); return next; }); diff --git a/apps/roam/src/components/Export.tsx b/apps/roam/src/components/Export.tsx index 5e18802e5..928e459e1 100644 --- a/apps/roam/src/components/Export.tsx +++ b/apps/roam/src/components/Export.tsx @@ -83,6 +83,7 @@ import getDiscourseRelations, { DiscourseRelation, } from "~/utils/getDiscourseRelations"; import { AddReferencedNodeType } from "./canvas/DiscourseRelationShape/DiscourseRelationTool"; +import posthog from "posthog-js"; const ExportProgress = ({ id }: { id: string }) => { const [progress, setProgress] = useState(0); @@ -154,6 +155,9 @@ const ExportDialog: ExportDialogComponent = ({ useEffect(() => { setDialogOpen(isOpen); }, [isOpen]); + + // TODO: maybe add posthog capture here for isOpen + const [dialogOpen, setDialogOpen] = useState(isOpen); const exportTypes = useMemo( () => getExportTypes({ results, exportId, isExportDiscourseGraph }), @@ -651,6 +655,8 @@ const ExportDialog: ExportDialogComponent = ({ let toastContent: React.ReactNode; let uid = selectedPageUid; const title = selectedPageTitle; + const isCanvasDestination = !isSendToGraph && isCanvasPage; + const shouldCreatePage = !isSendToGraph && !isLiveBlock(uid); if (isSendToGraph) { addToGraphOverView(); @@ -687,6 +693,13 @@ const ExportDialog: ExportDialogComponent = ({ ); } + posthog.capture("Results View: Send To Destination", { + destination: isSendToGraph ? "graph" : "page", + isCanvasDestination, + createdPage: shouldCreatePage, + resultCount: results.length, + }); + renderToast({ content: toastContent, intent: "success", @@ -735,10 +748,20 @@ const ExportDialog: ExportDialogComponent = ({ if (download) { const blob = new Blob([download], { type: "application/zip" }); saveAs(blob, `${filename}.zip`); + posthog.capture("Export Dialog: Export Completed", { + exportType: "PDF", + destination: activeExportDestination, + fileCount: files.length, + }); } onClose(); } catch (e) { setError("Failed to export files."); + posthog.capture("Export Dialog: Export Failed", { + exportType: "PDF", + destination: activeExportDestination, + error: (e as Error).message ?? "unknown error", + }); } }; const ExportPanel = ( @@ -838,6 +861,13 @@ const ExportDialog: ExportDialogComponent = ({ setLoading(true); updateExportProgress({ progress: 0, id: exportId }); setError(""); + posthog.capture("Export Dialog: Export Started", { + exportType: activeExportType, + destination: activeExportDestination, + includeDiscourseContext, + resultCount: results.length, + isExportDiscourseGraph, + }); // eslint-disable-next-line @typescript-eslint/no-misused-promises setTimeout(async () => { try { @@ -879,6 +909,11 @@ const ExportDialog: ExportDialogComponent = ({ content: "Upload Success", intent: "success", }); + posthog.capture("Export Dialog: Export Completed", { + exportType: activeExportType, + destination: activeExportDestination, + fileCount: files.length, + }); onClose(); } } catch (error) { @@ -894,6 +929,11 @@ const ExportDialog: ExportDialogComponent = ({ type: "text/plain;charset=utf-8", }); saveAs(blob, title); + posthog.capture("Export Dialog: Export Completed", { + exportType: activeExportType, + destination: activeExportDestination, + fileCount: files.length, + }); onClose(); return; } @@ -906,12 +946,22 @@ const ExportDialog: ExportDialogComponent = ({ ); void zip.generateAsync({ type: "blob" }).then((content) => { saveAs(content, `${filename}.zip`); + posthog.capture("Export Dialog: Export Completed", { + exportType: activeExportType, + destination: activeExportDestination, + fileCount: files.length, + }); onClose(); }); } else { setError(`Unsupported export type: ${exportType}`); } } catch (e) { + posthog.capture("Export Dialog: Export Failed", { + exportType: activeExportType, + destination: activeExportDestination, + error: (e as Error).message ?? "unknown error", + }); internalError({ error: e as Error, type: "Export Dialog Failed", @@ -1007,7 +1057,12 @@ const ExportDialog: ExportDialogComponent = ({ id="export-tabs" large={true} selectedTabId={selectedTabId} - onChange={(newTabId: string) => setSelectedTabId(newTabId)} + onChange={(newTabId: string) => { + setSelectedTabId(newTabId); + posthog.capture("Export Dialog: Tab Opened", { + tabId: newTabId, + }); + }} > diff --git a/apps/roam/src/components/ImportDialog.tsx b/apps/roam/src/components/ImportDialog.tsx index ca72c8d1d..766e689ae 100644 --- a/apps/roam/src/components/ImportDialog.tsx +++ b/apps/roam/src/components/ImportDialog.tsx @@ -11,6 +11,7 @@ import React, { useMemo, useState } from "react"; import createBlock from "roamjs-components/writes/createBlock"; import getChildrenLengthByPageUid from "roamjs-components/queries/getChildrenLengthByPageUid"; import createOverlayRender from "roamjs-components/util/createOverlayRender"; +import posthog from "posthog-js"; import importDiscourseGraph from "~/utils/importDiscourseGraph"; const ImportDialog = ({ onClose }: { onClose: () => void }) => { @@ -49,6 +50,10 @@ const ImportDialog = ({ onClose }: { onClose: () => void }) => { disabled={loading} onClick={() => { setLoading(true); + posthog.capture("Import Dialog: Import Started", { + hasFile: !!file, + title, + }); setTimeout(() => { const reader = new FileReader(); reader.onload = (event) => { diff --git a/apps/roam/src/components/LeftSidebarView.tsx b/apps/roam/src/components/LeftSidebarView.tsx index 34ce369ca..4647d3238 100644 --- a/apps/roam/src/components/LeftSidebarView.tsx +++ b/apps/roam/src/components/LeftSidebarView.tsx @@ -42,6 +42,7 @@ import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByPar import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/utils/renderNodeConfigPage"; import getPageTitleByPageUid from "roamjs-components/queries/getPageTitleByPageUid"; import { migrateLeftSidebarSettings } from "~/utils/migrateLeftSidebarSettings"; +import posthog from "posthog-js"; const parseReference = (text: string) => { const extracted = extractRef(text); @@ -61,6 +62,10 @@ const openTarget = async (e: React.MouseEvent, targetUid: string) => { e.preventDefault(); e.stopPropagation(); const target = parseReference(targetUid); + posthog.capture("Left Sidebar: Target Opened", { + targetType: target.type, + openInSidebar: e.shiftKey, + }); if (target.type === "block") { if (e.shiftKey) { await openBlockInSidebar(target.uid); diff --git a/apps/roam/src/components/ModifyNodeDialog.tsx b/apps/roam/src/components/ModifyNodeDialog.tsx index c36ff9071..c3d71c702 100644 --- a/apps/roam/src/components/ModifyNodeDialog.tsx +++ b/apps/roam/src/components/ModifyNodeDialog.tsx @@ -35,6 +35,7 @@ import { render as renderToast } from "roamjs-components/components/Toast"; import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle"; import resolveQueryBuilderRef from "~/utils/resolveQueryBuilderRef"; import runQuery from "~/utils/runQuery"; +import posthog from "posthog-js"; export type ModifyNodeDialogMode = "create" | "edit"; export type ModifyNodeDialogProps = { @@ -301,6 +302,10 @@ const ModifyNodeDialog = ({ const onSubmit = async () => { if (!content.text.trim()) return; + posthog.capture("Modify Node Dialog: Submit Triggered", { + mode, + nodeType: selectedNodeType.type, + }); try { if (mode === "create") { // If content is locked (user selected existing node), just insert it diff --git a/apps/roam/src/components/QueryDrawer.tsx b/apps/roam/src/components/QueryDrawer.tsx index 3f11740a5..f7913e8cd 100644 --- a/apps/roam/src/components/QueryDrawer.tsx +++ b/apps/roam/src/components/QueryDrawer.tsx @@ -380,7 +380,7 @@ const QueryDrawer = ({ ); export const openQueryDrawer = (onloadArgs: OnloadArgs) => { - posthog.capture("Query Drawer: Opened", {}); + posthog.capture("Query Drawer: Opened"); return Promise.resolve( getPageUidByPageTitle("roam/js/query-builder/drawer") || createPage({ diff --git a/apps/roam/src/components/SuggestionsBody.tsx b/apps/roam/src/components/SuggestionsBody.tsx index 89cf7f7c9..f2b0de587 100644 --- a/apps/roam/src/components/SuggestionsBody.tsx +++ b/apps/roam/src/components/SuggestionsBody.tsx @@ -29,6 +29,7 @@ import { render as renderToast } from "roamjs-components/components/Toast"; import { getSetting } from "~/utils/extensionSettings"; import { USE_REIFIED_RELATIONS } from "~/data/userSettings"; import { createReifiedRelation } from "~/utils/createReifiedBlock"; +import posthog from "posthog-js"; export type DiscourseData = { results: Awaited>; @@ -369,6 +370,12 @@ const SuggestionsBody = ({ node: { text: `[[${node.text}]]` }, }); } + posthog.capture("Suggestive Mode: Suggestion Adopted", { + tag, + nodeType: node.type, + nodeText: node.text, + useReifiedRelations: getSetting(USE_REIFIED_RELATIONS, false), + }); setHydeFilteredNodes((prev) => prev.filter((n) => n.uid !== node.uid)); }; diff --git a/apps/roam/src/components/VectorDuplicateMatches.tsx b/apps/roam/src/components/VectorDuplicateMatches.tsx index e32f86e20..ae67df2ba 100644 --- a/apps/roam/src/components/VectorDuplicateMatches.tsx +++ b/apps/roam/src/components/VectorDuplicateMatches.tsx @@ -8,6 +8,7 @@ import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTit import { DiscourseNode } from "~/utils/getDiscourseNodes"; import extractContentFromTitle from "~/utils/extractContentFromTitle"; import { handleTitleAdditions } from "~/utils/handleTitleAdditions"; +import posthog from "posthog-js"; export const VectorDuplicateMatches = ({ pageTitle, @@ -109,6 +110,7 @@ export const VectorDuplicateMatches = ({ className="flex cursor-pointer items-center justify-between p-2" onClick={() => { setIsOpen(!isOpen); + posthog.capture("Possible Duplicates: Toggled"); }} >
diff --git a/apps/roam/src/components/canvas/CanvasDrawer.tsx b/apps/roam/src/components/canvas/CanvasDrawer.tsx index 97bdb2df4..226cb838f 100644 --- a/apps/roam/src/components/canvas/CanvasDrawer.tsx +++ b/apps/roam/src/components/canvas/CanvasDrawer.tsx @@ -20,6 +20,7 @@ import getCurrentPageUid from "roamjs-components/dom/getCurrentPageUid"; import getDiscourseNodes from "~/utils/getDiscourseNodes"; import { DiscourseNodeShape } from "./DiscourseNodeUtil"; import { formatHexColor } from "~/components/settings/DiscourseNodeCanvasSettings"; +import posthog from "posthog-js"; export type GroupedShapes = Record; @@ -390,6 +391,7 @@ export const CanvasDrawerPanel = () => { const editor = useEditor(); const toggleDrawer = useCallback(() => { setIsOpen((prev) => !prev); + posthog.capture("Canvas Drawer: Toggled"); }, []); const [isOpen, setIsOpen] = useState(false); const pageUid = getCurrentPageUid(); diff --git a/apps/roam/src/components/canvas/Clipboard.tsx b/apps/roam/src/components/canvas/Clipboard.tsx index 97e02ddec..d5254313f 100644 --- a/apps/roam/src/components/canvas/Clipboard.tsx +++ b/apps/roam/src/components/canvas/Clipboard.tsx @@ -61,6 +61,7 @@ import getBlockProps from "~/utils/getBlockProps"; import setBlockProps from "~/utils/setBlockProps"; import { measureCanvasNodeText } from "~/utils/measureCanvasNodeText"; import internalError from "~/utils/internalError"; +import posthog from "posthog-js"; export type ClipboardPage = { uid: string; @@ -216,7 +217,10 @@ export const ClipboardProvider = ({ const openClipboard = useCallback(() => setIsOpen(true), []); const closeClipboard = useCallback(() => setIsOpen(false), []); - const toggleClipboard = useCallback(() => setIsOpen((prev) => !prev), []); + const toggleClipboard = useCallback(() => { + setIsOpen((prev) => !prev); + posthog.capture("Canvas Clipboard: Toggled"); + }, []); const addPage = useCallback((page: ClipboardPage) => { setPages((prev) => { diff --git a/apps/roam/src/components/canvas/ConvertToDialog.tsx b/apps/roam/src/components/canvas/ConvertToDialog.tsx index 83e40967d..93298b983 100644 --- a/apps/roam/src/components/canvas/ConvertToDialog.tsx +++ b/apps/roam/src/components/canvas/ConvertToDialog.tsx @@ -4,6 +4,7 @@ import { Editor } from "tldraw"; import { DiscourseNode } from "~/utils/getDiscourseNodes"; import { getOnSelectForShape } from "./uiOverrides"; import { Dialog, Button, Classes } from "@blueprintjs/core"; +import posthog from "posthog-js"; const ConvertToDialog = ({ extensionAPI, @@ -62,6 +63,13 @@ const ConvertToDialog = ({ className="flex-grow justify-start p-2 px-7 focus:bg-gray-300 focus:outline-none" style={{ caretColor: "transparent" }} onClick={() => { + posthog.capture( + "Canvas Convert To Dialog: Node Type Selected", + { + nodeType: node.type, + shapeType: selectedShapes[0]?.type || "unknown", + }, + ); getOnSelectForShape({ shape: selectedShapes[0], nodeType: node.type, diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index 4008eb2fe..074a438a3 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -1,5 +1,11 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import React, { useState, useRef, useMemo, useEffect, useCallback } from "react"; +import React, { + useState, + useRef, + useMemo, + useEffect, + useCallback, +} from "react"; import ExtensionApiContextProvider, { useExtensionAPI, } from "roamjs-components/components/ExtensionApiContext"; @@ -98,6 +104,7 @@ import { TLRecord } from "@tldraw/tlschema"; import { WHITE_LOGO_SVG } from "~/icons"; import { BLOCK_REF_REGEX } from "roamjs-components/dom"; import { defaultHandleExternalTextContent } from "./defaultHandleExternalTextContent"; +import posthog from "posthog-js"; declare global { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions @@ -172,12 +179,14 @@ const TldrawCanvas = ({ title }: { title: string }) => { if (wrapper) wrapper.classList.add("dg-tldraw-maximized"); tldrawEl.classList.add("absolute", "inset-0"); tldrawEl.classList.remove("relative"); + posthog.capture("Canvas: Fullscreen Toggled", { maximized: true }); updateViewportScreenBounds(tldrawEl); } else { // Going back to normal if (wrapper) wrapper.classList.remove("dg-tldraw-maximized"); tldrawEl.classList.add("relative"); tldrawEl.classList.remove("absolute", "inset-0"); + posthog.capture("Canvas: Fullscreen Toggled", { maximized: false }); updateViewportScreenBounds(tldrawEl); } }; @@ -347,6 +356,10 @@ const TldrawCanvas = ({ title }: { title: string }) => { // Check if we have a target shape if (shapeAtPoint && isDiscourseNodeShape(shapeAtPoint)) { + posthog.capture("Canvas: Relation Created", { + relationType: relationShape.type, + toolType: relationCreationRef.current.toolType || "", + }); // We have a valid target, call the relation creation method const util = app.getShapeUtil(relationShape); if ( @@ -420,6 +433,7 @@ const TldrawCanvas = ({ title }: { title: string }) => { const uid = e.dataTransfer.getData("application/x-roam-uid"); if (!uid || !appRef.current || !extensionAPI) return; + posthog.capture("Canvas: Roam Block Dropped"); // Use the text content handler to process ((uid)) - this will handle both // creating discourse nodes and falling back to text shapes @@ -501,6 +515,12 @@ const TldrawCanvas = ({ title }: { title: string }) => { // STORE const pageUid = useMemo(() => getPageUidByPageTitle(title), [title]); + useEffect(() => { + posthog.capture("Canvas: Opened", { + pageUid, + inSidebar: !!containerRef.current?.closest(".rm-sidebar-outline"), + }); + }, [pageUid]); const arrowShapeMigrations = useMemo( () => createMigrations({ @@ -723,6 +743,9 @@ const TldrawCanvas = ({ title }: { title: string }) => { if (e.shiftKey) { if (app.getSelectedShapes().length > 1) return; // User is selecting multiple shapes + posthog.capture("Canvas: Open Node", { + source: "sidebar", + }); void openBlockInSidebar(shapeUid); app.selectNone(); } @@ -732,6 +755,10 @@ const TldrawCanvas = ({ title }: { title: string }) => { // || e.metaKey ) { const isPage = !!getPageTitleByPageUid(shapeUid); + posthog.capture("Canvas: Open Node", { + source: "main-window", + isPage, + }); if (isPage) { void window.roamAlphaAPI.ui.mainWindow.openPage({ page: { uid: shapeUid }, @@ -904,6 +931,9 @@ const InsideEditorAndUiContext = ({ nodeType: nodeType.type, content, }); + posthog.capture("Canvas: Node Added from External Content", { + source: "page-reference", + }); return; } @@ -923,6 +953,9 @@ const InsideEditorAndUiContext = ({ nodeType: "blck-node", content, }); + posthog.capture("Canvas: Node Added from External Content", { + source: "block-reference", + }); } catch (error) { await callDefaultTextHandler(content); } @@ -978,6 +1011,10 @@ const InsideEditorAndUiContext = ({ y: position.y - size.h / 2, props: { assetId, w: size.w, h: size.h }, }); + posthog.capture("Canvas: Asset Added", { + source: "file-drop", + mimeType: file.type, + }); return asset; }, @@ -1054,6 +1091,10 @@ const InsideEditorAndUiContext = ({ y: position.y - height / 2, props: { assetId, w: width, h: height }, }); + posthog.capture("Canvas: Asset Added", { + source: "svg-paste", + mimeType: "image/svg+xml", + }); return asset; }, diff --git a/apps/roam/src/components/settings/DefaultFilters.tsx b/apps/roam/src/components/settings/DefaultFilters.tsx index d96761d06..f9daeb85f 100644 --- a/apps/roam/src/components/settings/DefaultFilters.tsx +++ b/apps/roam/src/components/settings/DefaultFilters.tsx @@ -2,6 +2,7 @@ import { Button, Intent, InputGroup } from "@blueprintjs/core"; import React, { useEffect, useState } from "react"; import type { OnloadArgs } from "roamjs-components/types"; import type { Filters } from "roamjs-components/components/Filter"; +import posthog from "posthog-js"; // // TODO - REWORK THIS COMPONENT @@ -190,6 +191,9 @@ const DefaultFilters = ({ minimal disabled={!newColumn} onClick={() => { + posthog.capture("Default Filters: Column Added", { + column: newColumn, + }); const newFilters = { ...filters, [newColumn]: { diff --git a/apps/roam/src/components/settings/GeneralSettings.tsx b/apps/roam/src/components/settings/GeneralSettings.tsx index 05962f597..f28631ba8 100644 --- a/apps/roam/src/components/settings/GeneralSettings.tsx +++ b/apps/roam/src/components/settings/GeneralSettings.tsx @@ -7,6 +7,7 @@ import { GlobalTextPanel, FeatureFlagPanel, } from "./components/BlockPropSettingPanels"; +import posthog from "posthog-js"; const DiscourseGraphHome = () => { const settings = useMemo(() => { @@ -51,6 +52,9 @@ const DiscourseGraphHome = () => { if (checked) { setIsAlertOpen(true); } + posthog.capture("General Settings: Left Sidebar Toggled", { + enabled: checked, + }); }} /> { const extensionAPI = onloadArgs.extensionAPI; @@ -69,6 +70,9 @@ const HomePersonalSettings = ({ onloadArgs }: { onloadArgs: OnloadArgs }) => { onChange={(checked) => { void setSetting("discourse-context-overlay", checked); onPageRefObserverChange(overlayHandler)(checked); + posthog.capture("Personal Settings: Overlay Toggled", { + enabled: checked, + }); }} /> {settings.suggestiveModeEnabled?.value && ( diff --git a/apps/roam/src/components/settings/LeftSidebarGlobalSettings.tsx b/apps/roam/src/components/settings/LeftSidebarGlobalSettings.tsx index d9c8d739a..a40f1184c 100644 --- a/apps/roam/src/components/settings/LeftSidebarGlobalSettings.tsx +++ b/apps/roam/src/components/settings/LeftSidebarGlobalSettings.tsx @@ -17,6 +17,7 @@ import refreshConfigTree from "~/utils/refreshConfigTree"; import { refreshAndNotify } from "~/components/LeftSidebarView"; import getPageTitleByPageUid from "roamjs-components/queries/getPageTitleByPageUid"; import getTextByBlockUid from "roamjs-components/queries/getTextByBlockUid"; +import posthog from "posthog-js"; const PageItem = memo( ({ @@ -203,6 +204,9 @@ const LeftSidebarGlobalSectionsContent = ({ setPages((prev) => [...prev, newPage]); setNewPageInput(""); setAutocompleteKey((prev) => prev + 1); + posthog.capture("Left Sidebar Global Settings: Page Added", { + pageName, + }); refreshAndNotify(); } catch (error) { renderToast({ diff --git a/apps/roam/src/components/settings/LeftSidebarPersonalSettings.tsx b/apps/roam/src/components/settings/LeftSidebarPersonalSettings.tsx index ede31bd96..6f561fef7 100644 --- a/apps/roam/src/components/settings/LeftSidebarPersonalSettings.tsx +++ b/apps/roam/src/components/settings/LeftSidebarPersonalSettings.tsx @@ -35,6 +35,7 @@ import refreshConfigTree from "~/utils/refreshConfigTree"; import { refreshAndNotify } from "~/components/LeftSidebarView"; import { memo, Dispatch, SetStateAction } from "react"; import getPageTitleByPageUid from "roamjs-components/queries/getPageTitleByPageUid"; +import posthog from "posthog-js"; const SectionItem = memo( ({ @@ -586,6 +587,9 @@ const LeftSidebarPersonalSectionsContent = ({ } as LeftSidebarPersonalSectionConfig, ]); + posthog.capture("Left Sidebar Personal Settings: Section Added", { + sectionName, + }); setNewSectionInput(""); refreshAndNotify(); } catch (error) { diff --git a/apps/roam/src/components/settings/QuerySettings.tsx b/apps/roam/src/components/settings/QuerySettings.tsx index 459896141..e40613c0c 100644 --- a/apps/roam/src/components/settings/QuerySettings.tsx +++ b/apps/roam/src/components/settings/QuerySettings.tsx @@ -10,6 +10,7 @@ import { PersonalNumberPanel, PersonalMultiTextPanel, } from "./components/BlockPropSettingPanels"; +import posthog from "posthog-js"; const QuerySettings = ({ extensionAPI, @@ -27,6 +28,9 @@ const QuerySettings = ({ } onChange={(checked) => { void extensionAPI.settings.set(HIDE_METADATA_KEY, checked); + posthog.capture("Query Settings: Hide Metadata Toggled", { + hidden: checked, + }); }} /> { void extensionAPI.settings.set(DEFAULT_PAGE_SIZE_KEY, value); + posthog.capture("Query Settings: Default Page Size Changed", { + value, + }); }} /> {