From 28b563b95b06f85386a82e5e8d7215514f70b79f Mon Sep 17 00:00:00 2001 From: Abdullah Atta Date: Sat, 8 Nov 2025 12:49:36 +0500 Subject: [PATCH] web: make monograph analytics a pro feature --- .../web/src/components/publish-view/index.tsx | 70 +++++++++++++------ .../common/src/utils/is-feature-available.ts | 11 +++ 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/apps/web/src/components/publish-view/index.tsx b/apps/web/src/components/publish-view/index.tsx index cdee1585c..5445aa0f6 100644 --- a/apps/web/src/components/publish-view/index.tsx +++ b/apps/web/src/components/publish-view/index.tsx @@ -23,15 +23,20 @@ import { Loading, Refresh } from "../icons"; import { db } from "../../common/db"; import { writeText } from "clipboard-polyfill"; import { showToast } from "../../utils/toast"; -import { EV, EVENTS, hosts, Monograph, MonographStats } from "@notesnook/core"; +import { EV, EVENTS, hosts, MonographAnalytics } from "@notesnook/core"; import { useStore } from "../../stores/monograph-store"; import { Note } from "@notesnook/core"; import { strings } from "@notesnook/intl"; -import { getFormattedDate, usePromise } from "@notesnook/common"; +import { + getFormattedDate, + useIsFeatureAvailable, + usePromise +} from "@notesnook/common"; import { createRoot, Root } from "react-dom/client"; import { PopupPresenter } from "@notesnook/ui"; import { BaseDialogProps, DialogManager } from "../../common/dialog-manager"; import Dialog from "../../components/dialog"; +import { UpgradeDialog } from "../../dialogs/buy-dialog/upgrade-dialog"; type PublishViewProps = { note: Note; @@ -43,11 +48,11 @@ function PublishView(props: PublishViewProps) { const [selfDestruct, setSelfDestruct] = useState( props.monograph?.selfDestruct ); - const [stats, setStats] = useState( - props.monograph?.stats || { viewCount: 0 } + const [analytics, setAnalytics] = useState( + props.monograph?.analytics || { totalViews: 0 } ); const [status, setStatus] = useState<{ - action: "publish" | "unpublish" | "stats"; + action: "publish" | "unpublish" | "analytics"; }>(); const [processingStatus, setProcessingStatus] = useState<{ total?: number; @@ -57,6 +62,7 @@ function PublishView(props: PublishViewProps) { const publishNote = useStore((store) => store.publish); const unpublishNote = useStore((store) => store.unpublish); const [monograph, setMonograph] = useState(props.monograph); + const monographAnalytics = useIsFeatureAvailable("monographAnalytics"); useEffect(() => { const fileDownloadedEvent = EV.subscribe( @@ -144,25 +150,43 @@ function PublishView(props: PublishViewProps) { }} > {strings.views()} - - - {stats.viewCount} - + {monographAnalytics?.isAllowed ? ( + + + {analytics.totalViews} + + + + ) : monographAnalytics ? ( - + ) : null} ) : null}