From e144ce8cf281f6f0a783770c3234ff5841c57dd3 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Thu, 28 Aug 2025 20:02:44 +0530 Subject: [PATCH] [WIKI-556] chore: disable tracking of page hover (#7650) * chore: disable tracking of page hover * chore: add track check for page feth * chore: make track check mandatory * chore: update track format --------- Co-authored-by: VipinDevelops --- apps/api/plane/app/views/page/base.py | 16 +++++++++------- .../[projectId]/pages/(detail)/[pageId]/page.tsx | 5 ++++- .../core/services/page/project-page.service.ts | 8 ++++++-- apps/web/core/store/pages/project-page.store.ts | 16 +++++++++++++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/api/plane/app/views/page/base.py b/apps/api/plane/app/views/page/base.py index 96de81abf..4e12bba52 100644 --- a/apps/api/plane/app/views/page/base.py +++ b/apps/api/plane/app/views/page/base.py @@ -198,6 +198,7 @@ class PageViewSet(BaseViewSet): def retrieve(self, request, slug, project_id, pk=None): page = self.get_queryset().filter(pk=pk).first() project = Project.objects.get(pk=project_id) + track_visit = request.query_params.get("track_visit", "false").lower() == "true" """ if the role is guest and guest_view_all_features is false and owned by is not @@ -230,13 +231,14 @@ class PageViewSet(BaseViewSet): ).values_list("entity_identifier", flat=True) data = PageDetailSerializer(page).data data["issue_ids"] = issue_ids - recent_visited_task.delay( - slug=slug, - entity_name="page", - entity_identifier=pk, - user_id=request.user.id, - project_id=project_id, - ) + if track_visit: + recent_visited_task.delay( + slug=slug, + entity_name="page", + entity_identifier=pk, + user_id=request.user.id, + project_id=project_id, + ) return Response(data, status=status.HTTP_200_OK) @allow_permission([ROLE.ADMIN], model=Page, creator=True) diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx index 94cdfd279..c14e24065 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx @@ -58,7 +58,10 @@ const PageDetailsPage = observer(() => { const { error: pageDetailsError } = useSWR( workspaceSlug && projectId && pageId ? `PAGE_DETAILS_${pageId}` : null, workspaceSlug && projectId && pageId - ? () => fetchPageDetails(workspaceSlug?.toString(), projectId?.toString(), pageId.toString()) + ? () => + fetchPageDetails(workspaceSlug?.toString(), projectId?.toString(), pageId.toString(), { + trackVisit: true, + }) : null, { revalidateIfStale: true, diff --git a/apps/web/core/services/page/project-page.service.ts b/apps/web/core/services/page/project-page.service.ts index 5d5326512..d5fea6e4c 100644 --- a/apps/web/core/services/page/project-page.service.ts +++ b/apps/web/core/services/page/project-page.service.ts @@ -23,8 +23,12 @@ export class ProjectPageService extends APIService { }); } - async fetchById(workspaceSlug: string, projectId: string, pageId: string): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/pages/${pageId}/`) + async fetchById(workspaceSlug: string, projectId: string, pageId: string, trackVisit: boolean): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/pages/${pageId}/`, { + params: { + track_visit: trackVisit, + }, + }) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; diff --git a/apps/web/core/store/pages/project-page.store.ts b/apps/web/core/store/pages/project-page.store.ts index 5b8bfdb0d..08094f7f4 100644 --- a/apps/web/core/store/pages/project-page.store.ts +++ b/apps/web/core/store/pages/project-page.store.ts @@ -49,7 +49,12 @@ export interface IProjectPageStore { projectId: string, pageType?: TPageNavigationTabs ) => Promise; - fetchPageDetails: (workspaceSlug: string, projectId: string, pageId: string) => Promise; + fetchPageDetails: ( + workspaceSlug: string, + projectId: string, + pageId: string, + { trackVisit }: { trackVisit: boolean } + ) => Promise; createPage: (pageData: Partial) => Promise; removePage: (pageId: string) => Promise; movePage: (workspaceSlug: string, projectId: string, pageId: string, newProjectId: string) => Promise; @@ -239,7 +244,12 @@ export class ProjectPageStore implements IProjectPageStore { * @description fetch the details of a page * @param {string} pageId */ - fetchPageDetails = async (workspaceSlug: string, projectId: string, pageId: string) => { + fetchPageDetails = async ( + workspaceSlug: string, + projectId: string, + pageId: string, + { trackVisit }: { trackVisit: boolean } + ) => { try { if (!workspaceSlug || !projectId || !pageId) return undefined; @@ -249,7 +259,7 @@ export class ProjectPageStore implements IProjectPageStore { this.error = undefined; }); - const page = await this.service.fetchById(workspaceSlug, projectId, pageId); + const page = await this.service.fetchById(workspaceSlug, projectId, pageId, trackVisit); runInAction(() => { if (page?.id) {