From a864100df11c7a715830a35d10e1ab0ca15420f5 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal Date: Thu, 26 Jun 2025 19:32:18 +0530 Subject: [PATCH 1/4] refactor: event constants --- packages/constants/src/event-tracker.ts | 238 ---------------- packages/constants/src/event-tracker/core.ts | 258 ++++++++++++++++++ packages/constants/src/index.ts | 2 +- .../settings/(workspace)/members/page.tsx | 6 +- .../(all)/accounts/forgot-password/page.tsx | 8 +- web/app/(all)/invitations/page.tsx | 6 +- web/app/(all)/onboarding/page.tsx | 4 +- web/app/(all)/sign-up/page.tsx | 4 +- web/app/(home)/page.tsx | 4 +- web/ce/components/projects/create/root.tsx | 4 +- .../account/auth-forms/password.tsx | 12 +- .../account/auth-forms/unique-code.tsx | 4 +- .../analytics-sidebar/sidebar-header.tsx | 6 +- web/core/components/cycles/delete-modal.tsx | 6 +- .../cycles/list/cycle-list-item-action.tsx | 11 +- web/core/components/cycles/modal.tsx | 10 +- web/core/components/home/root.tsx | 4 +- .../components/inbox/content/issue-root.tsx | 10 +- .../inbox/modals/create-modal/create-root.tsx | 6 +- .../issue-detail-widgets/relations/helper.tsx | 10 +- .../issue-detail-quick-actions.tsx | 15 +- .../components/issues/issue-detail/root.tsx | 43 ++- .../roots/global-view-root.tsx | 8 +- .../issue-layouts/kanban/base-kanban-root.tsx | 8 +- .../properties/all-properties.tsx | 28 +- .../issues/issue-layouts/quick-add/root.tsx | 6 +- .../components/issues/issue-modal/base.tsx | 12 +- .../components/issues/peek-overview/root.tsx | 42 ++- .../modules/analytics-sidebar/root.tsx | 18 +- .../modules/delete-module-modal.tsx | 6 +- web/core/components/modules/modal.tsx | 10 +- .../components/modules/module-card-item.tsx | 7 +- .../modules/module-list-item-action.tsx | 7 +- .../onboarding/create-workspace.tsx | 19 +- .../components/onboarding/invitations.tsx | 6 +- .../components/onboarding/invite-members.tsx | 8 +- .../components/onboarding/profile-setup.tsx | 22 +- web/core/components/onboarding/tour/root.tsx | 6 +- .../pages/modals/create-page-modal.tsx | 6 +- .../pages/modals/delete-page-modal.tsx | 6 +- .../project-states/create-update/create.tsx | 6 +- .../project-states/create-update/update.tsx | 6 +- .../project-states/options/delete.tsx | 6 +- .../project-states/state-delete-modal.tsx | 6 +- .../project/delete-project-modal.tsx | 6 +- web/core/components/project/form.tsx | 6 +- .../project/leave-project-modal.tsx | 6 +- .../components/project/member-list-item.tsx | 4 +- .../project/send-project-invitation-modal.tsx | 6 +- .../sidebar/header/options/root.tsx | 4 +- .../notification-card/options/archive.tsx | 4 +- .../notification-card/options/read.tsx | 4 +- .../workspace/create-workspace-form.tsx | 17 +- .../workspace/delete-workspace-form.tsx | 6 +- .../workspace/settings/members-list-item.tsx | 4 +- .../workspace/settings/workspace-details.tsx | 11 +- .../workspace/sidebar/user-menu-item.tsx | 4 +- .../workspace/views/delete-view-modal.tsx | 6 +- .../components/workspace/views/header.tsx | 4 +- web/core/components/workspace/views/modal.tsx | 10 +- web/core/store/event-tracker.store.ts | 4 +- 61 files changed, 534 insertions(+), 492 deletions(-) delete mode 100644 packages/constants/src/event-tracker.ts create mode 100644 packages/constants/src/event-tracker/core.ts diff --git a/packages/constants/src/event-tracker.ts b/packages/constants/src/event-tracker.ts deleted file mode 100644 index 4fb1ea15c21..00000000000 --- a/packages/constants/src/event-tracker.ts +++ /dev/null @@ -1,238 +0,0 @@ -export type IssueEventProps = { - eventName: string; - payload: any; - updates?: any; - path?: string; -}; - -export type EventProps = { - eventName: string; - payload: any; - updates?: any; - path?: string; -}; - -export const getWorkspaceEventPayload = (payload: any) => ({ - workspace_id: payload.id, - created_at: payload.created_at, - updated_at: payload.updated_at, - organization_size: payload.organization_size, - first_time: payload.first_time, - state: payload.state, - element: payload.element, -}); - -export const getProjectEventPayload = (payload: any) => ({ - workspace_id: payload.workspace_id, - project_id: payload.id, - identifier: payload.identifier, - project_visibility: payload.network == 2 ? "Public" : "Private", - changed_properties: payload.changed_properties, - lead_id: payload.project_lead, - created_at: payload.created_at, - updated_at: payload.updated_at, - state: payload.state, - element: payload.element, -}); - -export const getCycleEventPayload = (payload: any) => ({ - workspace_id: payload.workspace_id, - project_id: payload.project, - cycle_id: payload.id, - created_at: payload.created_at, - updated_at: payload.updated_at, - start_date: payload.start_date, - target_date: payload.target_date, - cycle_status: payload.status, - changed_properties: payload.changed_properties, - state: payload.state, - element: payload.element, -}); - -export const getModuleEventPayload = (payload: any) => ({ - workspace_id: payload.workspace_id, - project_id: payload.project, - module_id: payload.id, - created_at: payload.created_at, - updated_at: payload.updated_at, - start_date: payload.start_date, - target_date: payload.target_date, - module_status: payload.status, - lead_id: payload.lead, - changed_properties: payload.changed_properties, - member_ids: payload.members, - state: payload.state, - element: payload.element, -}); - -export const getPageEventPayload = (payload: any) => ({ - workspace_id: payload.workspace_id, - project_id: payload.project, - created_at: payload.created_at, - updated_at: payload.updated_at, - access: payload.access === 0 ? "Public" : "Private", - is_locked: payload.is_locked, - archived_at: payload.archived_at, - created_by: payload.created_by, - state: payload.state, - element: payload.element, -}); - -export const getIssueEventPayload = (props: IssueEventProps) => { - const { eventName, payload, updates, path } = props; - let eventPayload: any = { - issue_id: payload.id, - estimate_point: payload.estimate_point, - link_count: payload.link_count, - target_date: payload.target_date, - is_draft: payload.is_draft, - label_ids: payload.label_ids, - assignee_ids: payload.assignee_ids, - created_at: payload.created_at, - updated_at: payload.updated_at, - sequence_id: payload.sequence_id, - module_ids: payload.module_ids, - sub_issues_count: payload.sub_issues_count, - parent_id: payload.parent_id, - project_id: payload.project_id, - workspace_id: payload.workspace_id, - priority: payload.priority, - state_id: payload.state_id, - start_date: payload.start_date, - attachment_count: payload.attachment_count, - cycle_id: payload.cycle_id, - module_id: payload.module_id, - archived_at: payload.archived_at, - state: payload.state, - view_id: - path?.includes("workspace-views") || path?.includes("views") - ? path.split("/").pop() - : "", - }; - - if (eventName === ISSUE_UPDATED) { - eventPayload = { - ...eventPayload, - ...updates, - updated_from: props.path?.includes("workspace-views") - ? "All views" - : props.path?.includes("cycles") - ? "Cycle" - : props.path?.includes("modules") - ? "Module" - : props.path?.includes("views") - ? "Project view" - : props.path?.includes("inbox") - ? "Inbox" - : props.path?.includes("draft") - ? "Draft" - : "Project", - }; - } - return eventPayload; -}; - -export const getProjectStateEventPayload = (payload: any) => ({ - workspace_id: payload.workspace_id, - project_id: payload.id, - state_id: payload.id, - created_at: payload.created_at, - updated_at: payload.updated_at, - group: payload.group, - color: payload.color, - default: payload.default, - state: payload.state, - element: payload.element, -}); - -// Workspace crud Events -export const WORKSPACE_CREATED = "Workspace created"; -export const WORKSPACE_UPDATED = "Workspace updated"; -export const WORKSPACE_DELETED = "Workspace deleted"; -// Project Events -export const PROJECT_CREATED = "Project created"; -export const PROJECT_UPDATED = "Project updated"; -export const PROJECT_DELETED = "Project deleted"; -// Cycle Events -export const CYCLE_CREATED = "Cycle created"; -export const CYCLE_UPDATED = "Cycle updated"; -export const CYCLE_DELETED = "Cycle deleted"; -export const CYCLE_FAVORITED = "Cycle favorited"; -export const CYCLE_UNFAVORITED = "Cycle unfavorited"; -// Module Events -export const MODULE_CREATED = "Module created"; -export const MODULE_UPDATED = "Module updated"; -export const MODULE_DELETED = "Module deleted"; -export const MODULE_FAVORITED = "Module favorited"; -export const MODULE_UNFAVORITED = "Module unfavorited"; -export const MODULE_LINK_CREATED = "Module link created"; -export const MODULE_LINK_UPDATED = "Module link updated"; -export const MODULE_LINK_DELETED = "Module link deleted"; -// Issue Events -export const ISSUE_CREATED = "Work item created"; -export const ISSUE_UPDATED = "Work item updated"; -export const ISSUE_DELETED = "Work item deleted"; -export const ISSUE_ARCHIVED = "Work item archived"; -export const ISSUE_RESTORED = "Work item restored"; -export const ISSUE_OPENED = "Work item opened"; -// Project State Events -export const STATE_CREATED = "State created"; -export const STATE_UPDATED = "State updated"; -export const STATE_DELETED = "State deleted"; -// Project Page Events -export const PAGE_CREATED = "Page created"; -export const PAGE_UPDATED = "Page updated"; -export const PAGE_DELETED = "Page deleted"; -// Member Events -export const MEMBER_INVITED = "Member invited"; -export const MEMBER_ACCEPTED = "Member accepted"; -export const PROJECT_MEMBER_ADDED = "Project member added"; -export const PROJECT_MEMBER_LEAVE = "Project member leave"; -export const WORKSPACE_MEMBER_LEAVE = "Workspace member leave"; -// Sign-in & Sign-up Events -export const NAVIGATE_TO_SIGNUP = "Navigate to sign-up page"; -export const NAVIGATE_TO_SIGNIN = "Navigate to sign-in page"; -export const CODE_VERIFIED = "Code verified"; -export const SETUP_PASSWORD = "Password setup"; -export const PASSWORD_CREATE_SELECTED = "Password created"; -export const PASSWORD_CREATE_SKIPPED = "Skipped to setup"; -export const SIGN_IN_WITH_PASSWORD = "Sign in with password"; -export const SIGN_UP_WITH_PASSWORD = "Sign up with password"; -export const SIGN_IN_WITH_CODE = "Sign in with magic link"; -export const FORGOT_PASSWORD = "Forgot password clicked"; -export const FORGOT_PASS_LINK = "Forgot password link generated"; -export const NEW_PASS_CREATED = "New password created"; -// Onboarding Events -export const USER_DETAILS = "User details added"; -export const USER_ONBOARDING_COMPLETED = "User onboarding completed"; -// Product Tour Events -export const PRODUCT_TOUR_STARTED = "Product tour started"; -export const PRODUCT_TOUR_COMPLETED = "Product tour completed"; -export const PRODUCT_TOUR_SKIPPED = "Product tour skipped"; -// Dashboard Events -export const CHANGELOG_REDIRECTED = "Changelog redirected"; -export const GITHUB_REDIRECTED = "GitHub redirected"; -// Sidebar Events -export const SIDEBAR_CLICKED = "Sidenav clicked"; -// Global View Events -export const GLOBAL_VIEW_CREATED = "Global view created"; -export const GLOBAL_VIEW_UPDATED = "Global view updated"; -export const GLOBAL_VIEW_DELETED = "Global view deleted"; -export const GLOBAL_VIEW_OPENED = "Global view opened"; -// Notification Events -export const NOTIFICATION_ARCHIVED = "Notification archived"; -export const NOTIFICATION_SNOOZED = "Notification snoozed"; -export const NOTIFICATION_READ = "Notification marked read"; -export const UNREAD_NOTIFICATIONS = "Unread notifications viewed"; -export const NOTIFICATIONS_READ = "All notifications marked read"; -export const SNOOZED_NOTIFICATIONS = "Snoozed notifications viewed"; -export const ARCHIVED_NOTIFICATIONS = "Archived notifications viewed"; -// Groups -export const GROUP_WORKSPACE = "Workspace_metrics"; - -//Elements -export const E_ONBOARDING = "Onboarding"; -export const E_ONBOARDING_STEP_1 = "Onboarding step 1"; -export const E_ONBOARDING_STEP_2 = "Onboarding step 2"; -// Favorites -export const FAVORITE_ADDED = "Favorite added"; diff --git a/packages/constants/src/event-tracker/core.ts b/packages/constants/src/event-tracker/core.ts new file mode 100644 index 00000000000..ee07cac548b --- /dev/null +++ b/packages/constants/src/event-tracker/core.ts @@ -0,0 +1,258 @@ +export type IssueEventProps = { + eventName: string; + payload: any; + updates?: any; + path?: string; +}; + +export type EventProps = { + eventName: string; + payload: any; + updates?: any; + path?: string; +}; + +export const getWorkspaceEventPayload = (payload: any) => ({ + workspace_id: payload.id, + created_at: payload.created_at, + updated_at: payload.updated_at, + organization_size: payload.organization_size, + first_time: payload.first_time, + state: payload.state, + element: payload.element, +}); + +export const getProjectEventPayload = (payload: any) => ({ + workspace_id: payload.workspace_id, + project_id: payload.id, + identifier: payload.identifier, + project_visibility: payload.network == 2 ? "Public" : "Private", + changed_properties: payload.changed_properties, + lead_id: payload.project_lead, + created_at: payload.created_at, + updated_at: payload.updated_at, + state: payload.state, + element: payload.element, +}); + +export const getCycleEventPayload = (payload: any) => ({ + workspace_id: payload.workspace_id, + project_id: payload.project, + cycle_id: payload.id, + created_at: payload.created_at, + updated_at: payload.updated_at, + start_date: payload.start_date, + target_date: payload.target_date, + cycle_status: payload.status, + changed_properties: payload.changed_properties, + state: payload.state, + element: payload.element, +}); + +export const getModuleEventPayload = (payload: any) => ({ + workspace_id: payload.workspace_id, + project_id: payload.project, + module_id: payload.id, + created_at: payload.created_at, + updated_at: payload.updated_at, + start_date: payload.start_date, + target_date: payload.target_date, + module_status: payload.status, + lead_id: payload.lead, + changed_properties: payload.changed_properties, + member_ids: payload.members, + state: payload.state, + element: payload.element, +}); + +export const getPageEventPayload = (payload: any) => ({ + workspace_id: payload.workspace_id, + project_id: payload.project, + created_at: payload.created_at, + updated_at: payload.updated_at, + access: payload.access === 0 ? "Public" : "Private", + is_locked: payload.is_locked, + archived_at: payload.archived_at, + created_by: payload.created_by, + state: payload.state, + element: payload.element, +}); + +export const getIssueEventPayload = (props: IssueEventProps) => { + const { eventName, payload, updates, path } = props; + let eventPayload: any = { + issue_id: payload.id, + estimate_point: payload.estimate_point, + link_count: payload.link_count, + target_date: payload.target_date, + is_draft: payload.is_draft, + label_ids: payload.label_ids, + assignee_ids: payload.assignee_ids, + created_at: payload.created_at, + updated_at: payload.updated_at, + sequence_id: payload.sequence_id, + module_ids: payload.module_ids, + sub_issues_count: payload.sub_issues_count, + parent_id: payload.parent_id, + project_id: payload.project_id, + workspace_id: payload.workspace_id, + priority: payload.priority, + state_id: payload.state_id, + start_date: payload.start_date, + attachment_count: payload.attachment_count, + cycle_id: payload.cycle_id, + module_id: payload.module_id, + archived_at: payload.archived_at, + state: payload.state, + view_id: path?.includes("workspace-views") || path?.includes("views") ? path.split("/").pop() : "", + }; + + if (eventName === WORK_ITEM_EVENT_TRACKER_KEYS.update) { + eventPayload = { + ...eventPayload, + ...updates, + updated_from: props.path?.includes("workspace-views") + ? "All views" + : props.path?.includes("cycles") + ? "Cycle" + : props.path?.includes("modules") + ? "Module" + : props.path?.includes("views") + ? "Project view" + : props.path?.includes("inbox") + ? "Inbox" + : props.path?.includes("draft") + ? "Draft" + : "Project", + }; + } + return eventPayload; +}; + +export const getProjectStateEventPayload = (payload: any) => ({ + workspace_id: payload.workspace_id, + project_id: payload.id, + state_id: payload.id, + created_at: payload.created_at, + updated_at: payload.updated_at, + group: payload.group, + color: payload.color, + default: payload.default, + state: payload.state, + element: payload.element, +}); + +// Dashboard Events +export const GITHUB_REDIRECTED = "GitHub redirected"; +// Groups +export const GROUP_WORKSPACE = "Workspace_metrics"; + +export const WORKSPACE_EVENT_TRACKER_KEYS = { + create: "Workspace created", + update: "Workspace updated", + delete: "Workspace deleted", +}; + +export const PROJECT_EVENT_TRACKER_KEYS = { + create: "Project created", + update: "Project updated", + delete: "Project deleted", +}; + +export const CYCLE_EVENT_TRACKER_KEYS = { + create: "Cycle created", + update: "Cycle updated", + delete: "Cycle deleted", + favorite: "Cycle favorited", + unfavorite: "Cycle unfavorited", +}; + +export const MODULE_EVENT_TRACKER_KEYS = { + create: "Module created", + update: "Module updated", + delete: "Module deleted", + favorite: "Module favorited", + unfavorite: "Module unfavorited", + link: { + create: "Module link created", + update: "Module link updated", + delete: "Module link deleted", + }, +}; + +export const WORK_ITEM_EVENT_TRACKER_KEYS = { + create: "Work item created", + update: "Work item updated", + delete: "Work item deleted", + archive: "Work item archived", + restore: "Work item restored", +}; + +export const STATE_EVENT_TRACKER_KEYS = { + create: "State created", + update: "State updated", + delete: "State deleted", +}; + +export const PAGE_EVENT_TRACKER_KEYS = { + create: "Page created", + update: "Page updated", + delete: "Page deleted", +}; + +export const MEMBER_EVENT_TRACKER_KEYS = { + invite: "Member invited", + accept: "Member accepted", + project: { + add: "Project member added", + leave: "Project member left", + }, + workspace: { + leave: "Workspace member left", + }, +}; + +export const AUTH_EVENT_TRACKER_KEYS = { + navigate: { + sign_up: "Navigate to sign-up page", + sign_in: "Navigate to sign-in page", + }, + code_verify: "Code verified", + sign_up_with_password: "Sign up with password", + sign_in_with_password: "Sign in with password", + sign_in_with_code: "Sign in with magic link", + forgot_password: "Forgot password clicked", +}; + +export const PRODUCT_TOUR_EVENT_TRACKER_KEYS = { + start: "Product tour started", + complete: "Product tour completed", + skip: "Product tour skipped", +}; + +export const GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS = { + create: "Global view created", + update: "Global view updated", + delete: "Global view deleted", + open: "Global view opened", +}; + +export const NOTIFICATION_EVENT_TRACKER_KEYS = { + archive: "Notification archived", + all_marked_read: "All notifications marked read", +}; + +export const USER_EVENT_TRACKER_KEYS = { + add_details: "User details added", + onboarding_complete: "User onboarding completed", +}; + +export const ONBOARDING_EVENT_TRACKER_KEYS = { + root: "Onboarding", + step_1: "Onboarding step 1", + step_2: "Onboarding step 2", +}; + +export const SIDEBAR_EVENT_TRACKER_KEYS = { + click: "Sidenav clicked", +}; diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts index d7ccebd319e..da3d458f18f 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -25,7 +25,7 @@ export * from "./intake"; export * from "./profile"; export * from "./workspace-drafts"; export * from "./label"; -export * from "./event-tracker"; +export * from "./event-tracker/core"; export * from "./spreadsheet"; export * from "./dashboard"; export * from "./page"; diff --git a/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx b/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx index d2c65340ea7..769373ae453 100644 --- a/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx +++ b/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { Search } from "lucide-react"; // types -import { MEMBER_INVITED, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { EUserPermissions, EUserPermissionsLevel, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IWorkspaceBulkInviteFormData } from "@plane/types"; // ui @@ -52,7 +52,7 @@ const WorkspaceMembersSettingsPage = observer(() => { return inviteMembersToWorkspace(workspaceSlug.toString(), data) .then(() => { setInviteModal(false); - captureEvent(MEMBER_INVITED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { emails: [ ...data.emails.map((email) => ({ email: email.email, @@ -70,7 +70,7 @@ const WorkspaceMembersSettingsPage = observer(() => { }); }) .catch((err) => { - captureEvent(MEMBER_INVITED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { emails: [ ...data.emails.map((email) => ({ email: email.email, diff --git a/web/app/(all)/accounts/forgot-password/page.tsx b/web/app/(all)/accounts/forgot-password/page.tsx index 8cf7eae4ad2..b9c400a1328 100644 --- a/web/app/(all)/accounts/forgot-password/page.tsx +++ b/web/app/(all)/accounts/forgot-password/page.tsx @@ -9,7 +9,7 @@ import { Controller, useForm } from "react-hook-form"; // icons import { CircleCheck } from "lucide-react"; // plane imports -import { FORGOT_PASS_LINK, NAVIGATE_TO_SIGNUP } from "@plane/constants"; +import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, TOAST_TYPE, getButtonStyling, setToast } from "@plane/ui"; import { cn, checkEmailValidity } from "@plane/utils"; @@ -71,7 +71,7 @@ const ForgotPasswordPage = observer(() => { email: formData.email, }) .then(() => { - captureEvent(FORGOT_PASS_LINK, { + captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password, { state: "SUCCESS", }); setToast({ @@ -82,7 +82,7 @@ const ForgotPasswordPage = observer(() => { setResendCodeTimer(30); }) .catch((err) => { - captureEvent(FORGOT_PASS_LINK, { + captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password, { state: "FAILED", }); setToast({ @@ -120,7 +120,7 @@ const ForgotPasswordPage = observer(() => { {t("auth.common.new_to_plane")} captureEvent(NAVIGATE_TO_SIGNUP, {})} + onClick={() => captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_up, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.create_account")} diff --git a/web/app/(all)/invitations/page.tsx b/web/app/(all)/invitations/page.tsx index 38d50f2e6f6..d775b702727 100644 --- a/web/app/(all)/invitations/page.tsx +++ b/web/app/(all)/invitations/page.tsx @@ -9,7 +9,7 @@ import { useTheme } from "next-themes"; import useSWR, { mutate } from "swr"; import { CheckCircle2 } from "lucide-react"; // plane imports -import { ROLE, MEMBER_ACCEPTED, EUserPermissions } from "@plane/constants"; +import { ROLE, EUserPermissions, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import type { IWorkspaceMemberInvitation } from "@plane/types"; @@ -86,7 +86,7 @@ const UserInvitationsPage = observer(() => { const invitation = invitations?.find((i) => i.id === firstInviteId); const redirectWorkspace = invitations?.find((i) => i.id === firstInviteId)?.workspace; joinWorkspaceMetricGroup(redirectWorkspace?.id); - captureEvent(MEMBER_ACCEPTED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { member_id: invitation?.id, // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain role: getUserRole((invitation?.role as unknown as EUserPermissions)!), @@ -112,7 +112,7 @@ const UserInvitationsPage = observer(() => { }); }) .catch(() => { - captureEvent(MEMBER_ACCEPTED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { project_id: undefined, accepted_from: "App", state: "FAILED", diff --git a/web/app/(all)/onboarding/page.tsx b/web/app/(all)/onboarding/page.tsx index 2211ad07db4..844d5540b99 100644 --- a/web/app/(all)/onboarding/page.tsx +++ b/web/app/(all)/onboarding/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; // types -import { USER_ONBOARDING_COMPLETED } from "@plane/constants"; +import { USER_EVENT_TRACKER_KEYS } from "@plane/constants"; import { TOnboardingSteps, TUserProfile } from "@plane/types"; // ui import { TOAST_TYPE, setToast } from "@plane/ui"; @@ -73,7 +73,7 @@ const OnboardingPage = observer(() => { await finishUserOnboarding() .then(() => { - captureEvent(USER_ONBOARDING_COMPLETED, { + captureEvent(USER_EVENT_TRACKER_KEYS.onboarding_complete, { email: user.email, user_id: user.id, status: "SUCCESS", diff --git a/web/app/(all)/sign-up/page.tsx b/web/app/(all)/sign-up/page.tsx index aa18cf085a8..1c3135cde92 100644 --- a/web/app/(all)/sign-up/page.tsx +++ b/web/app/(all)/sign-up/page.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // ui import { useTheme } from "next-themes"; // components -import { NAVIGATE_TO_SIGNIN } from "@plane/constants"; +import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { AuthRoot } from "@/components/account"; // constants @@ -54,7 +54,7 @@ const SignInPage = observer(() => { {t("auth.common.already_have_an_account")} captureEvent(NAVIGATE_TO_SIGNIN, {})} + onClick={() => captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_in, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.login")} diff --git a/web/app/(home)/page.tsx b/web/app/(home)/page.tsx index aac36f0a1ea..5832bff77fe 100644 --- a/web/app/(home)/page.tsx +++ b/web/app/(home)/page.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // ui import { useTheme } from "next-themes"; // components -import { NAVIGATE_TO_SIGNUP } from "@plane/constants"; +import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { AuthRoot } from "@/components/account"; import { PageHead } from "@/components/core"; @@ -63,7 +63,7 @@ const HomePage = observer(() => { {t("auth.common.new_to_plane")} captureEvent(NAVIGATE_TO_SIGNUP, {})} + onClick={() => captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_up, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.create_account")} diff --git a/web/ce/components/projects/create/root.tsx b/web/ce/components/projects/create/root.tsx index 72f378ea2c3..3f47c21eef6 100644 --- a/web/ce/components/projects/create/root.tsx +++ b/web/ce/components/projects/create/root.tsx @@ -3,7 +3,7 @@ import { useState, FC } from "react"; import { observer } from "mobx-react"; import { FormProvider, useForm } from "react-hook-form"; -import { PROJECT_CREATED, DEFAULT_PROJECT_FORM_VALUES } from "@plane/constants"; +import { DEFAULT_PROJECT_FORM_VALUES, PROJECT_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // ui import { setToast, TOAST_TYPE } from "@plane/ui"; @@ -75,7 +75,7 @@ export const CreateProjectForm: FC = observer((props) = state: "SUCCESS", }; captureProjectEvent({ - eventName: PROJECT_CREATED, + eventName: PROJECT_EVENT_TRACKER_KEYS.create, payload: newPayload, }); setToast({ diff --git a/web/core/components/account/auth-forms/password.tsx b/web/core/components/account/auth-forms/password.tsx index b3740acea08..e8ac834bb86 100644 --- a/web/core/components/account/auth-forms/password.tsx +++ b/web/core/components/account/auth-forms/password.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // icons import { Eye, EyeOff, Info, X, XCircle } from "lucide-react"; // plane imports -import { FORGOT_PASSWORD, SIGN_IN_WITH_CODE, SIGN_IN_WITH_PASSWORD, SIGN_UP_WITH_PASSWORD, API_BASE_URL, E_PASSWORD_STRENGTH } from "@plane/constants"; +import { API_BASE_URL, E_PASSWORD_STRENGTH, AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, Spinner } from "@plane/ui"; import { getPasswordStrength } from "@plane/utils"; @@ -77,7 +77,7 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { const redirectToUniqueCodeSignIn = async () => { handleAuthStep(EAuthSteps.UNIQUE_CODE); - captureEvent(SIGN_IN_WITH_CODE); + captureEvent(AUTH_EVENT_TRACKER_KEYS.sign_in_with_code); }; const passwordSupport = @@ -85,7 +85,7 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => {
{isSMTPConfigured ? ( captureEvent(FORGOT_PASSWORD)} + onClick={() => captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password)} href={`/accounts/forgot-password?email=${encodeURIComponent(email)}`} className="text-xs font-medium text-custom-primary-100" > @@ -154,7 +154,11 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { : true; if (isPasswordValid) { setIsSubmitting(true); - captureEvent(mode === EAuthModes.SIGN_IN ? SIGN_IN_WITH_PASSWORD : SIGN_UP_WITH_PASSWORD); + captureEvent( + mode === EAuthModes.SIGN_IN + ? AUTH_EVENT_TRACKER_KEYS.sign_in_with_password + : AUTH_EVENT_TRACKER_KEYS.sign_up_with_password + ); if (formRef.current) formRef.current.submit(); // Manually submit the form if the condition is met } else { setBannerMessage(true); diff --git a/web/core/components/account/auth-forms/unique-code.tsx b/web/core/components/account/auth-forms/unique-code.tsx index a6c06b70d11..14dc95af5a8 100644 --- a/web/core/components/account/auth-forms/unique-code.tsx +++ b/web/core/components/account/auth-forms/unique-code.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from "react"; import { CircleCheck, XCircle } from "lucide-react"; -import { CODE_VERIFIED, API_BASE_URL } from "@plane/constants"; +import { API_BASE_URL, AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, Spinner } from "@plane/ui"; // constants @@ -84,7 +84,7 @@ export const AuthUniqueCodeForm: React.FC = (props) => { action={`${API_BASE_URL}/auth/${mode === EAuthModes.SIGN_IN ? "magic-sign-in" : "magic-sign-up"}/`} onSubmit={() => { setIsSubmitting(true); - captureEvent(CODE_VERIFIED, { + captureEvent(AUTH_EVENT_TRACKER_KEYS.code_verify, { state: "SUCCESS", first_time: !isExistingEmail, }); diff --git a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx index ebf94e0c63e..3d15c234f6b 100644 --- a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx +++ b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import { ArrowRight, ChevronRight } from "lucide-react"; // Plane Imports -import { CYCLE_STATUS, CYCLE_UPDATED, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { CYCLE_EVENT_TRACKER_KEYS, CYCLE_STATUS, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { ICycle } from "@plane/types"; import { setToast, TOAST_TYPE } from "@plane/ui"; @@ -67,7 +67,7 @@ export const CycleSidebarHeader: FC = observer((props) => { await updateCycleDetails(workspaceSlug.toString(), projectId.toString(), cycleDetails.id.toString(), data) .then((res) => { captureCycleEvent({ - eventName: CYCLE_UPDATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...res, changed_properties: [changedProperty], @@ -79,7 +79,7 @@ export const CycleSidebarHeader: FC = observer((props) => { .catch(() => { captureCycleEvent({ - eventName: CYCLE_UPDATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...data, element: "Right side-peek", diff --git a/web/core/components/cycles/delete-modal.tsx b/web/core/components/cycles/delete-modal.tsx index 210b1a13a3d..f11894b9869 100644 --- a/web/core/components/cycles/delete-modal.tsx +++ b/web/core/components/cycles/delete-modal.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { useParams, useSearchParams } from "next/navigation"; // types -import { PROJECT_ERROR_MESSAGES, CYCLE_DELETED } from "@plane/constants"; +import { PROJECT_ERROR_MESSAGES, CYCLE_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { ICycle } from "@plane/types"; // ui @@ -50,7 +50,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: "Cycle deleted successfully.", }); captureCycleEvent({ - eventName: CYCLE_DELETED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...cycle, state: "SUCCESS" }, }); }) @@ -65,7 +65,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: currentError.i18n_message && t(currentError.i18n_message), }); captureCycleEvent({ - eventName: CYCLE_DELETED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...cycle, state: "FAILED" }, }); }) diff --git a/web/core/components/cycles/list/cycle-list-item-action.tsx b/web/core/components/cycles/list/cycle-list-item-action.tsx index 79b1650e1fd..f5137e7d6f3 100644 --- a/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -7,8 +7,7 @@ import { useForm } from "react-hook-form"; import { Eye, Users, ArrowRight, CalendarDays } from "lucide-react"; // types import { - CYCLE_FAVORITED, - CYCLE_UNFAVORITED, + CYCLE_EVENT_TRACKER_KEYS, EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN, @@ -62,7 +61,7 @@ export const CycleListItemAction: FC = observer((props) => { const searchParams = useSearchParams(); const pathname = usePathname(); // store hooks - const { addCycleToFavorites, removeCycleFromFavorites, updateCycleDetails } = useCycle(); + const { addCycleToFavorites, removeCycleFromFavorites } = useCycle(); const { captureEvent } = useEventTracker(); const { allowPermissions } = useUserPermissions(); @@ -75,7 +74,7 @@ export const CycleListItemAction: FC = observer((props) => { const { getUserDetails } = useMember(); // form - const { control, reset, getValues } = useForm({ + const { reset } = useForm({ defaultValues, }); @@ -107,7 +106,7 @@ export const CycleListItemAction: FC = observer((props) => { const addToFavoritePromise = addCycleToFavorites(workspaceSlug?.toString(), projectId.toString(), cycleId).then( () => { if (!isFavoriteMenuOpen) toggleFavoriteMenu(true); - captureEvent(CYCLE_FAVORITED, { + captureEvent(CYCLE_EVENT_TRACKER_KEYS.favorite, { cycle_id: cycleId, element: "List layout", state: "SUCCESS", @@ -137,7 +136,7 @@ export const CycleListItemAction: FC = observer((props) => { projectId.toString(), cycleId ).then(() => { - captureEvent(CYCLE_UNFAVORITED, { + captureEvent(CYCLE_EVENT_TRACKER_KEYS.unfavorite, { cycle_id: cycleId, element: "List layout", state: "SUCCESS", diff --git a/web/core/components/cycles/modal.tsx b/web/core/components/cycles/modal.tsx index 15fa4a5b91c..21978540dd4 100644 --- a/web/core/components/cycles/modal.tsx +++ b/web/core/components/cycles/modal.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { format } from "date-fns"; import { mutate } from "swr"; // types -import { CYCLE_CREATED, CYCLE_UPDATED } from "@plane/constants"; +import { CYCLE_EVENT_TRACKER_KEYS } from "@plane/constants"; import type { CycleDateCheckData, ICycle, TCycleTabOptions } from "@plane/types"; // ui import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -64,7 +64,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { message: "Cycle created successfully.", }); captureCycleEvent({ - eventName: CYCLE_CREATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.create, payload: { ...res, state: "SUCCESS" }, }); }) @@ -75,7 +75,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { message: err?.detail ?? "Error in creating cycle. Please try again.", }); captureCycleEvent({ - eventName: CYCLE_CREATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.create, payload: { ...payload, state: "FAILED" }, }); }); @@ -89,7 +89,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { .then((res) => { const changed_properties = Object.keys(dirtyFields); captureCycleEvent({ - eventName: CYCLE_UPDATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...res, changed_properties: changed_properties, state: "SUCCESS" }, }); setToast({ @@ -100,7 +100,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { }) .catch((err) => { captureCycleEvent({ - eventName: CYCLE_UPDATED, + eventName: CYCLE_EVENT_TRACKER_KEYS.update, payload: { ...payload, state: "FAILED" }, }); setToast({ diff --git a/web/core/components/home/root.tsx b/web/core/components/home/root.tsx index c350d3119b8..6649871815f 100644 --- a/web/core/components/home/root.tsx +++ b/web/core/components/home/root.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // components import useSWR from "swr"; -import { PRODUCT_TOUR_COMPLETED } from "@plane/constants"; +import { PRODUCT_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; import { ContentWrapper } from "@plane/ui"; import { cn } from "@plane/utils"; import { TourRoot } from "@/components/onboarding"; @@ -38,7 +38,7 @@ export const WorkspaceHomeView = observer(() => { const handleTourCompleted = () => { updateTourCompleted() .then(() => { - captureEvent(PRODUCT_TOUR_COMPLETED, { + captureEvent(PRODUCT_TOUR_EVENT_TRACKER_KEYS.complete, { user_id: currentUser?.id, state: "SUCCESS", }); diff --git a/web/core/components/inbox/content/issue-root.tsx b/web/core/components/inbox/content/issue-root.tsx index e0469834382..45c7b34572d 100644 --- a/web/core/components/inbox/content/issue-root.tsx +++ b/web/core/components/inbox/content/issue-root.tsx @@ -4,7 +4,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useRef } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; // plane imports -import { EInboxIssueSource, ISSUE_ARCHIVED, ISSUE_DELETED } from "@plane/constants"; +import { EInboxIssueSource, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; import { EditorRefApi } from "@plane/editor"; import { TIssue, TNameDescriptionLoader } from "@plane/types"; import { Loader, TOAST_TYPE, setToast } from "@plane/ui"; @@ -105,7 +105,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { message: "Work item deleted successfully", }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: _issueId, state: "SUCCESS", element: "Work item detail page" }, path: pathname, }); @@ -117,7 +117,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { message: "Work item delete failed", }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: _issueId, state: "FAILED", element: "Work item detail page" }, path: pathname, }); @@ -156,14 +156,14 @@ export const InboxIssueMainContent: React.FC = observer((props) => { try { await archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "SUCCESS", element: "Work item details page" }, path: pathname, }); } catch (error) { console.log("Error in archiving issue:", error); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "FAILED", element: "Work item details page" }, path: pathname, }); diff --git a/web/core/components/inbox/modals/create-modal/create-root.tsx b/web/core/components/inbox/modals/create-modal/create-root.tsx index 1afccf7e0d0..ebfe7f574ca 100644 --- a/web/core/components/inbox/modals/create-modal/create-root.tsx +++ b/web/core/components/inbox/modals/create-modal/create-root.tsx @@ -4,7 +4,7 @@ import { FC, FormEvent, useCallback, useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; // plane imports -import { ETabIndices, ISSUE_CREATED } from "@plane/constants"; +import { ETabIndices, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; import { EditorRefApi } from "@plane/editor"; // types import { useTranslation } from "@plane/i18n"; @@ -168,7 +168,7 @@ export const InboxIssueCreateRoot: FC = observer((props) setFormData(defaultIssueData); } captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...formData, state: "SUCCESS", @@ -185,7 +185,7 @@ export const InboxIssueCreateRoot: FC = observer((props) .catch((error) => { console.error(error); captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...formData, state: "FAILED", diff --git a/web/core/components/issues/issue-detail-widgets/relations/helper.tsx b/web/core/components/issues/issue-detail-widgets/relations/helper.tsx index f92a3601fed..c22dd9308c2 100644 --- a/web/core/components/issues/issue-detail-widgets/relations/helper.tsx +++ b/web/core/components/issues/issue-detail-widgets/relations/helper.tsx @@ -2,7 +2,7 @@ import { useMemo } from "react"; import { usePathname } from "next/navigation"; // plane imports -import { EIssueServiceType, ISSUE_DELETED, ISSUE_UPDATED } from "@plane/constants"; +import { EIssueServiceType, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue, TIssueServiceType } from "@plane/types"; import { TOAST_TYPE, setToast } from "@plane/ui"; @@ -41,7 +41,7 @@ export const useRelationOperations = ( try { await updateIssue(workspaceSlug, projectId, issueId, data); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -56,7 +56,7 @@ export const useRelationOperations = ( }); } catch { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -75,14 +75,14 @@ export const useRelationOperations = ( try { return removeIssue(workspaceSlug, projectId, issueId).then(() => { captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, path: pathname, }); }); } catch { captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, path: pathname, }); diff --git a/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx b/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx index df536d900f6..a803e503d17 100644 --- a/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx +++ b/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx @@ -5,12 +5,11 @@ import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; import { ArchiveIcon, ArchiveRestoreIcon, LinkIcon, Trash2 } from "lucide-react"; import { - ISSUE_ARCHIVED, - ISSUE_DELETED, ARCHIVABLE_STATE_GROUPS, EIssuesStoreType, EUserPermissions, EUserPermissionsLevel, + WORK_ITEM_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; @@ -105,19 +104,19 @@ export const IssueDetailQuickActions: FC = observer((props) => { return deleteIssue(workspaceSlug, projectId, issueId).then(() => { router.push(redirectionPath); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "SUCCESS", element: "Work item detail page" }, path: pathname, }); }); - } catch (error) { + } catch { setToast({ title: t("toast.error "), type: TOAST_TYPE.ERROR, message: t("entity.delete.failed", { entity: t("issue.label", { count: 1 }) }), }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "FAILED", element: "Work item detail page" }, path: pathname, }); @@ -130,13 +129,13 @@ export const IssueDetailQuickActions: FC = observer((props) => { router.push(`/${workspaceSlug}/projects/${projectId}/archives/issues/${issue.id}`); }); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue details page" }, path: pathname, }); - } catch (error) { + } catch { captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "FAILED", element: "Issue details page" }, path: pathname, }); diff --git a/web/core/components/issues/issue-detail/root.tsx b/web/core/components/issues/issue-detail/root.tsx index 4ad3b8d8d5b..77506fe1dad 100644 --- a/web/core/components/issues/issue-detail/root.tsx +++ b/web/core/components/issues/issue-detail/root.tsx @@ -6,11 +6,9 @@ import { usePathname } from "next/navigation"; // types import { EIssuesStoreType, - ISSUE_UPDATED, - ISSUE_DELETED, - ISSUE_ARCHIVED, EUserPermissions, EUserPermissionsLevel, + WORK_ITEM_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue } from "@plane/types"; @@ -98,7 +96,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await updateIssue(workspaceSlug, projectId, issueId, data); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -109,7 +107,7 @@ export const IssueDetailRoot: FC = observer((props) => { } catch (error) { console.log("Error in updating issue:", error); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -134,7 +132,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("entity.delete.success", { entity: t("issue.label") }), }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, path: pathname, }); @@ -146,7 +144,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("entity.delete.failed", { entity: t("issue.label") }), }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, path: pathname, }); @@ -156,14 +154,14 @@ export const IssueDetailRoot: FC = observer((props) => { try { await archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue details page" }, path: pathname, }); } catch (error) { console.log("Error in archiving issue:", error); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "FAILED", element: "Issue details page" }, path: pathname, }); @@ -173,7 +171,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await addCycleToIssue(workspaceSlug, projectId, cycleId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -181,14 +179,14 @@ export const IssueDetailRoot: FC = observer((props) => { }, path: pathname, }); - } catch (error) { + } catch { setToast({ type: TOAST_TYPE.ERROR, title: t("common.error.label"), message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -202,7 +200,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await addIssueToCycle(workspaceSlug, projectId, cycleId, issueIds); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issueIds, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -210,14 +208,14 @@ export const IssueDetailRoot: FC = observer((props) => { }, path: pathname, }); - } catch (error) { + } catch { setToast({ type: TOAST_TYPE.ERROR, title: t("common.error.label"), message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -243,7 +241,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); await removeFromCyclePromise; captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -251,9 +249,9 @@ export const IssueDetailRoot: FC = observer((props) => { }, path: pathname, }); - } catch (error) { + } catch { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -279,7 +277,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); await removeFromModulePromise; captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -287,9 +285,9 @@ export const IssueDetailRoot: FC = observer((props) => { }, path: pathname, }); - } catch (error) { + } catch { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -308,7 +306,7 @@ export const IssueDetailRoot: FC = observer((props) => { ) => { const promise = await changeModulesInIssue(workspaceSlug, projectId, issueId, addModuleIds, removeModuleIds); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -333,6 +331,7 @@ export const IssueDetailRoot: FC = observer((props) => { removeIssueFromModule, captureIssueEvent, pathname, + t, ] ); diff --git a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx index 4086a5c060b..aa2d17ad431 100644 --- a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx +++ b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx @@ -11,8 +11,10 @@ import { EIssueFilterType, EIssuesStoreType, EViewAccess, - GLOBAL_VIEW_UPDATED, - EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; + EUserPermissions, + EUserPermissionsLevel, + GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS, +} from "@plane/constants"; import { IIssueFilterOptions, TStaticViewTypes } from "@plane/types"; //ui // components @@ -112,7 +114,7 @@ export const GlobalViewsAppliedFiltersRoot = observer((props: Props) => { updateGlobalView(workspaceSlug.toString(), globalViewId.toString(), viewFilters).then((res) => { if (res) - captureEvent(GLOBAL_VIEW_UPDATED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.update, { view_id: res.id, applied_filters: res.filters, state: "SUCCESS", diff --git a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx index 33ab962a525..d75ff196729 100644 --- a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -11,9 +11,9 @@ import { EIssueServiceType, EIssueFilterType, EIssuesStoreType, - ISSUE_DELETED, EUserPermissions, EUserPermissionsLevel, + WORK_ITEM_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { DeleteIssueModal } from "@/components/issues"; //constants @@ -152,7 +152,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas element, }) ); - }, [scrollableContainerRef?.current]); + }, []); // Make the Issue Delete Box a Drop Target useEffect(() => { @@ -181,7 +181,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas }, }) ); - }, [deleteAreaRef?.current, setIsDragOverDelete, setDraggedIssueId, setDeleteIssueModal]); + }, [setIsDragOverDelete, setDraggedIssueId, setDeleteIssueModal]); const renderQuickActions: TRenderQuickActions = useCallback( ({ issue, parentRef, customActionButton }) => ( @@ -210,7 +210,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas setDeleteIssueModal(false); setDraggedIssueId(undefined); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: draggedIssueId, state: "FAILED", element: "Kanban layout drag & drop" }, path: pathname, }); diff --git a/web/core/components/issues/issue-layouts/properties/all-properties.tsx b/web/core/components/issues/issue-layouts/properties/all-properties.tsx index 3b7e5c90bdd..e4e5af5da02 100644 --- a/web/core/components/issues/issue-layouts/properties/all-properties.tsx +++ b/web/core/components/issues/issue-layouts/properties/all-properties.tsx @@ -7,13 +7,19 @@ import { useParams, usePathname } from "next/navigation"; // icons import { Layers, Link, Paperclip } from "lucide-react"; // types -import { ISSUE_UPDATED } from "@plane/constants"; +import { WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; import { TIssue, IIssueDisplayProperties, TIssuePriorities } from "@plane/types"; // ui import { Tooltip } from "@plane/ui"; -import { cn, getDate, renderFormattedPayloadDate, generateWorkItemLink, shouldHighlightIssueDueDate } from "@plane/utils"; +import { + cn, + getDate, + renderFormattedPayloadDate, + generateWorkItemLink, + shouldHighlightIssueDueDate, +} from "@plane/utils"; // components import { EstimateDropdown, @@ -103,7 +109,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { state_id: stateId }).then(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -118,7 +124,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { priority: value }).then(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -133,7 +139,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { label_ids: ids }).then(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -148,7 +154,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { assignee_ids: ids }).then(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -173,7 +179,7 @@ export const IssueProperties: React.FC = observer((props) => { if (modulesToRemove.length > 0) issueOperations.removeModulesFromIssue(modulesToRemove); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { changed_property: "module_ids", change_details: { module_ids: moduleIds } }, @@ -189,7 +195,7 @@ export const IssueProperties: React.FC = observer((props) => { else issueOperations.removeIssueFromCycle?.(); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { changed_property: "cycle", change_details: { cycle_id: cycleId } }, @@ -203,7 +209,7 @@ export const IssueProperties: React.FC = observer((props) => { updateIssue(issue.project_id, issue.id, { start_date: date ? renderFormattedPayloadDate(date) : null }).then( () => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -220,7 +226,7 @@ export const IssueProperties: React.FC = observer((props) => { updateIssue(issue.project_id, issue.id, { target_date: date ? renderFormattedPayloadDate(date) : null }).then( () => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -236,7 +242,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { estimate_point: value }).then(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { diff --git a/web/core/components/issues/issue-layouts/quick-add/root.tsx b/web/core/components/issues/issue-layouts/quick-add/root.tsx index 28c4edbe5dd..2f69e66a457 100644 --- a/web/core/components/issues/issue-layouts/quick-add/root.tsx +++ b/web/core/components/issues/issue-layouts/quick-add/root.tsx @@ -6,7 +6,7 @@ import { useParams, usePathname } from "next/navigation"; import { useForm, UseFormRegister } from "react-hook-form"; import { PlusIcon } from "lucide-react"; // plane constants -import { EIssueLayoutTypes, EIssueServiceType, ISSUE_CREATED } from "@plane/constants"; +import { EIssueLayoutTypes, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; import { IProject, TIssue } from "@plane/types"; @@ -137,14 +137,14 @@ export const QuickAddIssueRoot: FC = observer((props) => { await quickAddPromise .then((res) => { captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...res, state: "SUCCESS", element: ` ${layout} quick add` }, path: pathname, }); }) .catch(() => { captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...payload, state: "FAILED", element: `${layout} quick ad` }, path: pathname, }); diff --git a/web/core/components/issues/issue-modal/base.tsx b/web/core/components/issues/issue-modal/base.tsx index 80370100fdf..5dc7fcf2aea 100644 --- a/web/core/components/issues/issue-modal/base.tsx +++ b/web/core/components/issues/issue-modal/base.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { useParams, usePathname } from "next/navigation"; -import { EIssuesStoreType, ISSUE_CREATED, ISSUE_UPDATED } from "@plane/constants"; +import { EIssuesStoreType, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import type { TBaseIssue, TIssue } from "@plane/types"; @@ -241,7 +241,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( ), }); captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...response, state: "SUCCESS" }, path: pathname, }); @@ -257,7 +257,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: error?.error ?? t(is_draft_issue ? "draft_creation_failed" : "issue_creation_failed"), }); captureIssueEvent({ - eventName: ISSUE_CREATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, payload: { ...payload, state: "FAILED" }, path: pathname, }); @@ -303,7 +303,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: t("issue_updated_successfully"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...payload, issueId: data.id, state: "SUCCESS" }, path: pathname, }); @@ -316,7 +316,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: error?.error ?? t("issue_could_not_be_updated"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...payload, state: "FAILED" }, path: pathname, }); @@ -334,8 +334,6 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( if (beforeFormSubmit) await beforeFormSubmit(); if (!data?.id) response = await handleCreateIssue(payload, is_draft_issue); else response = await handleUpdateIssue(payload); - } catch (error) { - throw error; } finally { if (response != undefined && onSubmit) await onSubmit(response); } diff --git a/web/core/components/issues/peek-overview/root.tsx b/web/core/components/issues/peek-overview/root.tsx index 5ea7855bb8d..fdacf096f4e 100644 --- a/web/core/components/issues/peek-overview/root.tsx +++ b/web/core/components/issues/peek-overview/root.tsx @@ -6,13 +6,10 @@ import { usePathname } from "next/navigation"; // plane types import { EIssuesStoreType, - ISSUE_UPDATED, - ISSUE_DELETED, - ISSUE_ARCHIVED, - ISSUE_RESTORED, EUserPermissions, EUserPermissionsLevel, EIssueServiceType, + WORK_ITEM_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue, IWorkItemPeekOverview } from "@plane/types"; @@ -26,7 +23,6 @@ import { useEventTracker, useIssueDetail, useIssues, useUserPermissions } from " import { useIssueStoreType } from "@/hooks/use-issue-layout-store"; import { useWorkItemProperties } from "@/plane-web/hooks/use-issue-properties"; - export const IssuePeekOverview: FC = observer((props) => { const { embedIssue = false, @@ -86,7 +82,7 @@ export const IssuePeekOverview: FC = observer((props) => .then(async () => { fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: Object.keys(data).join(","), @@ -97,7 +93,7 @@ export const IssuePeekOverview: FC = observer((props) => }) .catch(() => { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -113,7 +109,7 @@ export const IssuePeekOverview: FC = observer((props) => try { return issues?.removeIssue(workspaceSlug, projectId, issueId).then(() => { captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); @@ -126,7 +122,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("entity.delete.failed", { entity: t("issue.label", { count: 1 }) }), }); captureIssueEvent({ - eventName: ISSUE_DELETED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -137,13 +133,13 @@ export const IssuePeekOverview: FC = observer((props) => if (!issues?.archiveIssue) return; await issues.archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); } catch { captureIssueEvent({ - eventName: ISSUE_ARCHIVED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -158,7 +154,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.restore.success.message"), }); captureIssueEvent({ - eventName: ISSUE_RESTORED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.restore, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); @@ -169,7 +165,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.restore.failed.message"), }); captureIssueEvent({ - eventName: ISSUE_RESTORED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.restore, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -180,7 +176,7 @@ export const IssuePeekOverview: FC = observer((props) => await issues.addCycleToIssue(workspaceSlug, projectId, cycleId, issueId); fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -195,7 +191,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -209,7 +205,7 @@ export const IssuePeekOverview: FC = observer((props) => try { await issues.addIssueToCycle(workspaceSlug, projectId, cycleId, issueIds); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { ...issueIds, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -224,7 +220,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -251,7 +247,7 @@ export const IssuePeekOverview: FC = observer((props) => await removeFromCyclePromise; fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -261,7 +257,7 @@ export const IssuePeekOverview: FC = observer((props) => }); } catch { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -287,7 +283,7 @@ export const IssuePeekOverview: FC = observer((props) => ); fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -314,7 +310,7 @@ export const IssuePeekOverview: FC = observer((props) => await removeFromModulePromise; fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "module_id", @@ -324,7 +320,7 @@ export const IssuePeekOverview: FC = observer((props) => }); } catch { captureIssueEvent({ - eventName: ISSUE_UPDATED, + eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "module_id", @@ -335,7 +331,7 @@ export const IssuePeekOverview: FC = observer((props) => } }, }), - [fetchIssue, is_draft, issues, fetchActivities, captureIssueEvent, pathname, removeRoutePeekId, restoreIssue] + [fetchIssue, is_draft, issues, fetchActivities, captureIssueEvent, pathname, removeRoutePeekId, restoreIssue, t] ); useEffect(() => { diff --git a/web/core/components/modules/analytics-sidebar/root.tsx b/web/core/components/modules/analytics-sidebar/root.tsx index bbe1e0d142a..df50fa8d6e6 100644 --- a/web/core/components/modules/analytics-sidebar/root.tsx +++ b/web/core/components/modules/analytics-sidebar/root.tsx @@ -6,7 +6,13 @@ import { useParams } from "next/navigation"; import { Controller, useForm } from "react-hook-form"; import { CalendarClock, ChevronDown, ChevronRight, Info, Plus, SquareUser, Users } from "lucide-react"; import { Disclosure, Transition } from "@headlessui/react"; -import { MODULE_STATUS, MODULE_LINK_CREATED, MODULE_LINK_DELETED, MODULE_LINK_UPDATED, MODULE_UPDATED, EUserPermissions, EUserPermissionsLevel, EEstimateSystem } from "@plane/constants"; +import { + MODULE_STATUS, + EUserPermissions, + EUserPermissionsLevel, + EEstimateSystem, + MODULE_EVENT_TRACKER_KEYS, +} from "@plane/constants"; // plane types import { useTranslation } from "@plane/i18n"; import { ILinkDetails, IModule, ModuleLink } from "@plane/types"; @@ -74,13 +80,13 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { updateModuleDetails(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), data) .then((res) => { captureModuleEvent({ - eventName: MODULE_UPDATED, + eventName: MODULE_EVENT_TRACKER_KEYS.update, payload: { ...res, changed_properties: Object.keys(data)[0], element: "Right side-peek", state: "SUCCESS" }, }); }) .catch(() => { captureModuleEvent({ - eventName: MODULE_UPDATED, + eventName: MODULE_EVENT_TRACKER_KEYS.update, payload: { ...data, state: "FAILED" }, }); }); @@ -92,7 +98,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { const payload = { metadata: {}, ...formData }; await createModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), payload).then(() => - captureEvent(MODULE_LINK_CREATED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.link.create, { module_id: moduleId, state: "SUCCESS", }) @@ -106,7 +112,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { await updateModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), linkId, payload).then( () => - captureEvent(MODULE_LINK_UPDATED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.link.update, { module_id: moduleId, state: "SUCCESS", }) @@ -118,7 +124,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { deleteModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), linkId) .then(() => { - captureEvent(MODULE_LINK_DELETED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.link.delete, { module_id: moduleId, state: "SUCCESS", }); diff --git a/web/core/components/modules/delete-module-modal.tsx b/web/core/components/modules/delete-module-modal.tsx index b35356f67b1..31c5b1460a3 100644 --- a/web/core/components/modules/delete-module-modal.tsx +++ b/web/core/components/modules/delete-module-modal.tsx @@ -4,7 +4,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // types -import { PROJECT_ERROR_MESSAGES, MODULE_DELETED } from "@plane/constants"; +import { MODULE_EVENT_TRACKER_KEYS, PROJECT_ERROR_MESSAGES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import type { IModule } from "@plane/types"; // ui @@ -52,7 +52,7 @@ export const DeleteModuleModal: React.FC = observer((props) => { message: "Module deleted successfully.", }); captureModuleEvent({ - eventName: MODULE_DELETED, + eventName: MODULE_EVENT_TRACKER_KEYS.delete, payload: { ...data, state: "SUCCESS" }, }); }) @@ -67,7 +67,7 @@ export const DeleteModuleModal: React.FC = observer((props) => { message: currentError.i18n_message && t(currentError.i18n_message), }); captureModuleEvent({ - eventName: MODULE_DELETED, + eventName: MODULE_EVENT_TRACKER_KEYS.delete, payload: { ...data, state: "FAILED" }, }); }) diff --git a/web/core/components/modules/modal.tsx b/web/core/components/modules/modal.tsx index e1bc7c7eff0..046c6c6c4a3 100644 --- a/web/core/components/modules/modal.tsx +++ b/web/core/components/modules/modal.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { useForm } from "react-hook-form"; // types -import { MODULE_CREATED, MODULE_UPDATED } from "@plane/constants"; +import { MODULE_EVENT_TRACKER_KEYS } from "@plane/constants"; import type { IModule } from "@plane/types"; // ui import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -64,7 +64,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: "Module created successfully.", }); captureModuleEvent({ - eventName: MODULE_CREATED, + eventName: MODULE_EVENT_TRACKER_KEYS.create, payload: { ...res, state: "SUCCESS" }, }); }) @@ -75,7 +75,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: err?.detail ?? err?.error ?? "Module could not be created. Please try again.", }); captureModuleEvent({ - eventName: MODULE_CREATED, + eventName: MODULE_EVENT_TRACKER_KEYS.create, payload: { ...data, state: "FAILED" }, }); }); @@ -95,7 +95,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: "Module updated successfully.", }); captureModuleEvent({ - eventName: MODULE_UPDATED, + eventName: MODULE_EVENT_TRACKER_KEYS.update, payload: { ...res, changed_properties: Object.keys(dirtyFields || {}), state: "SUCCESS" }, }); }) @@ -106,7 +106,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: err?.detail ?? err?.error ?? "Module could not be updated. Please try again.", }); captureModuleEvent({ - eventName: MODULE_UPDATED, + eventName: MODULE_EVENT_TRACKER_KEYS.update, payload: { ...data, state: "FAILED" }, }); }); diff --git a/web/core/components/modules/module-card-item.tsx b/web/core/components/modules/module-card-item.tsx index 59b269c4a48..680ec3b7cc3 100644 --- a/web/core/components/modules/module-card-item.tsx +++ b/web/core/components/modules/module-card-item.tsx @@ -9,11 +9,10 @@ import { Info, SquareUser } from "lucide-react"; import { MODULE_STATUS, PROGRESS_STATE_GROUPS_DETAILS, - MODULE_FAVORITED, - MODULE_UNFAVORITED, EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN, + MODULE_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { IModule } from "@plane/types"; @@ -80,7 +79,7 @@ export const ModuleCardItem: React.FC = observer((props) => { const addToFavoritePromise = addModuleToFavorites(workspaceSlug.toString(), projectId.toString(), moduleId).then( () => { if (!storedValue) toggleFavoriteMenu(true); - captureEvent(MODULE_FAVORITED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.favorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", @@ -111,7 +110,7 @@ export const ModuleCardItem: React.FC = observer((props) => { projectId.toString(), moduleId ).then(() => { - captureEvent(MODULE_UNFAVORITED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.unfavorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", diff --git a/web/core/components/modules/module-list-item-action.tsx b/web/core/components/modules/module-list-item-action.tsx index fe96bdad0d9..719aed30ac3 100644 --- a/web/core/components/modules/module-list-item-action.tsx +++ b/web/core/components/modules/module-list-item-action.tsx @@ -8,11 +8,10 @@ import { SquareUser } from "lucide-react"; // types import { MODULE_STATUS, - MODULE_FAVORITED, - MODULE_UNFAVORITED, EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN, + MODULE_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; @@ -69,7 +68,7 @@ export const ModuleListItemAction: FC = observer((props) => { () => { // open favorites menu if closed if (!storedValue) toggleFavoriteMenu(true); - captureEvent(MODULE_FAVORITED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.favorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", @@ -100,7 +99,7 @@ export const ModuleListItemAction: FC = observer((props) => { projectId.toString(), moduleId ).then(() => { - captureEvent(MODULE_UNFAVORITED, { + captureEvent(MODULE_EVENT_TRACKER_KEYS.unfavorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", diff --git a/web/core/components/onboarding/create-workspace.tsx b/web/core/components/onboarding/create-workspace.tsx index 7be711a1e98..38d688104fa 100644 --- a/web/core/components/onboarding/create-workspace.tsx +++ b/web/core/components/onboarding/create-workspace.tsx @@ -4,7 +4,12 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; // constants -import { ORGANIZATION_SIZE, RESTRICTED_URLS, WORKSPACE_CREATED, E_ONBOARDING } from "@plane/constants"; +import { + ONBOARDING_EVENT_TRACKER_KEYS, + ORGANIZATION_SIZE, + RESTRICTED_URLS, + WORKSPACE_EVENT_TRACKER_KEYS, +} from "@plane/constants"; // types import { useTranslation } from "@plane/i18n"; import { IUser, IWorkspace, TOnboardingSteps } from "@plane/types"; @@ -69,12 +74,12 @@ export const CreateWorkspace: React.FC = observer((props) => { message: t("workspace_creation.toast.success.message"), }); captureWorkspaceEvent({ - eventName: WORKSPACE_CREATED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.create, payload: { ...workspaceResponse, state: "SUCCESS", first_time: true, - element: E_ONBOARDING, + element: ONBOARDING_EVENT_TRACKER_KEYS.root, }, }); await fetchWorkspaces(); @@ -82,11 +87,11 @@ export const CreateWorkspace: React.FC = observer((props) => { }) .catch(() => { captureWorkspaceEvent({ - eventName: WORKSPACE_CREATED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.create, payload: { state: "FAILED", first_time: true, - element: E_ONBOARDING, + element: ONBOARDING_EVENT_TRACKER_KEYS.root, }, }); setToast({ @@ -263,7 +268,9 @@ export const CreateWorkspace: React.FC = observer((props) => { onChange={onChange} label={ ORGANIZATION_SIZE.find((c) => c === value) ?? ( - {t("workspace_creation.form.organization_size.placeholder")} + + {t("workspace_creation.form.organization_size.placeholder")} + ) } buttonClassName="!border-[0.5px] !border-onboarding-border-100 !shadow-none !rounded-md" diff --git a/web/core/components/onboarding/invitations.tsx b/web/core/components/onboarding/invitations.tsx index 0be9ae8db6c..bd3d3d97889 100644 --- a/web/core/components/onboarding/invitations.tsx +++ b/web/core/components/onboarding/invitations.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; // plane imports -import { ROLE, MEMBER_ACCEPTED } from "@plane/constants"; +import { ROLE, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; // types import { IWorkspaceMemberInvitation } from "@plane/types"; // ui @@ -50,7 +50,7 @@ export const Invitations: React.FC = (props) => { try { await workspaceService.joinWorkspaces({ invitations: invitationsRespond }); - captureEvent(MEMBER_ACCEPTED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { member_id: invitation?.id, role: getUserRole(invitation?.role as any), project_id: undefined, @@ -63,7 +63,7 @@ export const Invitations: React.FC = (props) => { await handleNextStep(); } catch (error) { console.error(error); - captureEvent(MEMBER_ACCEPTED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { member_id: invitation?.id, role: getUserRole(invitation?.role as any), project_id: undefined, diff --git a/web/core/components/onboarding/invite-members.tsx b/web/core/components/onboarding/invite-members.tsx index 55408c42bcc..a6e9f6d7c9b 100644 --- a/web/core/components/onboarding/invite-members.tsx +++ b/web/core/components/onboarding/invite-members.tsx @@ -1,6 +1,6 @@ "use client"; -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useState } from "react"; import { observer } from "mobx-react"; import Image from "next/image"; import { useTheme } from "next-themes"; @@ -20,7 +20,7 @@ import { usePopper } from "react-popper"; import { Check, ChevronDown, Plus, XCircle } from "lucide-react"; import { Listbox } from "@headlessui/react"; // plane imports -import { ROLE, ROLE_DETAILS, MEMBER_INVITED, EUserPermissions } from "@plane/constants"; +import { ROLE, ROLE_DETAILS, EUserPermissions, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import { IUser, IWorkspace } from "@plane/types"; @@ -311,7 +311,7 @@ export const InviteMembers: React.FC = (props) => { })), }) .then(async () => { - captureEvent(MEMBER_INVITED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { emails: [ ...payload.emails.map((email) => ({ email: email.email, @@ -331,7 +331,7 @@ export const InviteMembers: React.FC = (props) => { await nextStep(); }) .catch((err) => { - captureEvent(MEMBER_INVITED, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { project_id: undefined, state: "FAILED", element: "Onboarding", diff --git a/web/core/components/onboarding/profile-setup.tsx b/web/core/components/onboarding/profile-setup.tsx index 4cbb025552a..99a71e581de 100644 --- a/web/core/components/onboarding/profile-setup.tsx +++ b/web/core/components/onboarding/profile-setup.tsx @@ -6,7 +6,7 @@ import Image from "next/image"; import { useTheme } from "next-themes"; import { Controller, useForm } from "react-hook-form"; import { Eye, EyeOff } from "lucide-react"; -import { USER_DETAILS, E_ONBOARDING_STEP_1, E_ONBOARDING_STEP_2, E_PASSWORD_STRENGTH } from "@plane/constants"; +import { E_PASSWORD_STRENGTH, ONBOARDING_EVENT_TRACKER_KEYS, USER_EVENT_TRACKER_KEYS } from "@plane/constants"; // types import { useTranslation } from "@plane/i18n"; import { IUser, TUserProfile, TOnboardingSteps } from "@plane/types"; @@ -143,11 +143,11 @@ export const ProfileSetup: React.FC = observer((props) => { updateUserProfile(profileUpdatePayload), totalSteps > 2 && stepChange({ profile_complete: true }), ]); - captureEvent(USER_DETAILS, { + captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { use_case: formData.use_case, role: formData.role, state: "SUCCESS", - element: E_ONBOARDING_STEP_1, + element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, }); setToast({ type: TOAST_TYPE.SUCCESS, @@ -159,9 +159,9 @@ export const ProfileSetup: React.FC = observer((props) => { finishOnboarding(); } } catch { - captureEvent(USER_DETAILS, { + captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { state: "FAILED", - element: E_ONBOARDING_STEP_1, + element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, }); setToast({ type: TOAST_TYPE.ERROR, @@ -183,9 +183,9 @@ export const ProfileSetup: React.FC = observer((props) => { formData.password && handleSetPassword(formData.password), ]).then(() => setProfileSetupStep(EProfileSetupSteps.USER_PERSONALIZATION)); } catch { - captureEvent(USER_DETAILS, { + captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { state: "FAILED", - element: E_ONBOARDING_STEP_1, + element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, }); setToast({ type: TOAST_TYPE.ERROR, @@ -205,11 +205,11 @@ export const ProfileSetup: React.FC = observer((props) => { updateUserProfile(profileUpdatePayload), totalSteps > 2 && stepChange({ profile_complete: true }), ]); - captureEvent(USER_DETAILS, { + captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { use_case: formData.use_case, role: formData.role, state: "SUCCESS", - element: E_ONBOARDING_STEP_2, + element: ONBOARDING_EVENT_TRACKER_KEYS.step_2, }); setToast({ type: TOAST_TYPE.SUCCESS, @@ -221,9 +221,9 @@ export const ProfileSetup: React.FC = observer((props) => { finishOnboarding(); } } catch { - captureEvent(USER_DETAILS, { + captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { state: "FAILED", - element: E_ONBOARDING_STEP_2, + element: ONBOARDING_EVENT_TRACKER_KEYS.step_2, }); setToast({ type: TOAST_TYPE.ERROR, diff --git a/web/core/components/onboarding/tour/root.tsx b/web/core/components/onboarding/tour/root.tsx index e118ee64b60..fd34c2d0130 100644 --- a/web/core/components/onboarding/tour/root.tsx +++ b/web/core/components/onboarding/tour/root.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import Image, { StaticImageData } from "next/image"; import { X } from "lucide-react"; // ui -import { PRODUCT_TOUR_SKIPPED, PRODUCT_TOUR_STARTED } from "@plane/constants"; +import { PRODUCT_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; import { Button } from "@plane/ui"; // components import { TourSidebar } from "@/components/onboarding"; @@ -112,7 +112,7 @@ export const TourRoot: React.FC = observer((props) => {
- {slugError &&

{t("workspace_creation.errors.validation.url_already_taken")}

} + {slugError && ( +

{t("workspace_creation.errors.validation.url_already_taken")}

+ )} {invalidSlug && (

{t("workspace_creation.errors.validation.url_alphanumeric")}

)} @@ -221,7 +222,9 @@ export const CreateWorkspaceForm: FC = observer((props) => { onChange={onChange} label={ ORGANIZATION_SIZE.find((c) => c === value) ?? ( - {t("workspace_creation.form.organization_size.placeholder")} + + {t("workspace_creation.form.organization_size.placeholder")} + ) } buttonClassName="!border-[0.5px] !border-custom-border-200 !shadow-none" diff --git a/web/core/components/workspace/delete-workspace-form.tsx b/web/core/components/workspace/delete-workspace-form.tsx index bc99d3598b9..c47198777d7 100644 --- a/web/core/components/workspace/delete-workspace-form.tsx +++ b/web/core/components/workspace/delete-workspace-form.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import { AlertTriangle } from "lucide-react"; // types -import { WORKSPACE_DELETED } from "@plane/constants"; +import { WORKSPACE_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import type { IWorkspace } from "@plane/types"; // ui @@ -65,7 +65,7 @@ export const DeleteWorkspaceForm: React.FC = observer((props) => { handleClose(); router.push(getWorkspaceRedirectionUrl()); captureWorkspaceEvent({ - eventName: WORKSPACE_DELETED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.delete, payload: { ...data, state: "SUCCESS", @@ -85,7 +85,7 @@ export const DeleteWorkspaceForm: React.FC = observer((props) => { message: t("workspace_settings.settings.general.delete_modal.error_message"), }); captureWorkspaceEvent({ - eventName: WORKSPACE_DELETED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.delete, payload: { ...data, state: "FAILED", diff --git a/web/core/components/workspace/settings/members-list-item.tsx b/web/core/components/workspace/settings/members-list-item.tsx index 31a462c753a..5ab169c51f6 100644 --- a/web/core/components/workspace/settings/members-list-item.tsx +++ b/web/core/components/workspace/settings/members-list-item.tsx @@ -4,7 +4,7 @@ import { FC } from "react"; import { isEmpty } from "lodash"; import { observer } from "mobx-react"; // ui -import { WORKSPACE_MEMBER_LEAVE } from "@plane/constants"; +import { MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IWorkspaceMember } from "@plane/types"; import { TOAST_TYPE, Table, setToast } from "@plane/ui"; @@ -45,7 +45,7 @@ export const WorkspaceMembersListItem: FC = observer((props) => { .then(async () => { await fetchCurrentUserSettings(); router.push(getWorkspaceRedirectionUrl()); - captureEvent(WORKSPACE_MEMBER_LEAVE, { + captureEvent(MEMBER_EVENT_TRACKER_KEYS.workspace.leave, { state: "SUCCESS", element: "Workspace settings members page", }); diff --git a/web/core/components/workspace/settings/workspace-details.tsx b/web/core/components/workspace/settings/workspace-details.tsx index 8c996b2744c..830984c053a 100644 --- a/web/core/components/workspace/settings/workspace-details.tsx +++ b/web/core/components/workspace/settings/workspace-details.tsx @@ -5,7 +5,12 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import { Pencil } from "lucide-react"; // constants -import { ORGANIZATION_SIZE, WORKSPACE_UPDATED, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { + ORGANIZATION_SIZE, + EUserPermissions, + EUserPermissionsLevel, + WORKSPACE_EVENT_TRACKER_KEYS, +} from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IWorkspace } from "@plane/types"; import { Button, CustomSelect, Input, TOAST_TYPE, setToast } from "@plane/ui"; @@ -62,7 +67,7 @@ export const WorkspaceDetails: FC = observer(() => { await updateWorkspace(currentWorkspace.slug, payload) .then((res) => { captureWorkspaceEvent({ - eventName: WORKSPACE_UPDATED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.update, payload: { ...res, state: "SUCCESS", @@ -77,7 +82,7 @@ export const WorkspaceDetails: FC = observer(() => { }) .catch((err) => { captureWorkspaceEvent({ - eventName: WORKSPACE_UPDATED, + eventName: WORKSPACE_EVENT_TRACKER_KEYS.update, payload: { state: "FAILED", element: "Workspace general settings page", diff --git a/web/core/components/workspace/sidebar/user-menu-item.tsx b/web/core/components/workspace/sidebar/user-menu-item.tsx index f8f0f120a3a..69a3a933b45 100644 --- a/web/core/components/workspace/sidebar/user-menu-item.tsx +++ b/web/core/components/workspace/sidebar/user-menu-item.tsx @@ -3,7 +3,7 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useParams, usePathname } from "next/navigation"; // plane imports -import { EUserPermissionsLevel, SIDEBAR_CLICKED, EUserWorkspaceRoles } from "@plane/constants"; +import { EUserPermissionsLevel, EUserWorkspaceRoles, SIDEBAR_EVENT_TRACKER_KEYS } from "@plane/constants"; import { usePlatformOS } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; import { Tooltip } from "@plane/ui"; @@ -49,7 +49,7 @@ export const SidebarUserMenuItem: FC = observer((props if (window.innerWidth < 768) { toggleSidebar(); } - captureEvent(SIDEBAR_CLICKED, { + captureEvent(SIDEBAR_EVENT_TRACKER_KEYS.click, { destination: itemKey, }); }; diff --git a/web/core/components/workspace/views/delete-view-modal.tsx b/web/core/components/workspace/views/delete-view-modal.tsx index 63016d157d5..7c9537279dc 100644 --- a/web/core/components/workspace/views/delete-view-modal.tsx +++ b/web/core/components/workspace/views/delete-view-modal.tsx @@ -4,7 +4,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // types -import { GLOBAL_VIEW_DELETED } from "@plane/constants"; +import { GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; import { IWorkspaceView } from "@plane/types"; // ui import { AlertModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -37,13 +37,13 @@ export const DeleteGlobalViewModal: React.FC = observer((props) => { await deleteGlobalView(workspaceSlug.toString(), data.id) .then(() => { - captureEvent(GLOBAL_VIEW_DELETED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.delete, { view_id: data.id, state: "SUCCESS", }); }) .catch((error: any) => { - captureEvent(GLOBAL_VIEW_DELETED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.delete, { view_id: data.id, state: "FAILED", }); diff --git a/web/core/components/workspace/views/header.tsx b/web/core/components/workspace/views/header.tsx index e7312980062..9e091efae7f 100644 --- a/web/core/components/workspace/views/header.tsx +++ b/web/core/components/workspace/views/header.tsx @@ -6,9 +6,9 @@ import { Plus } from "lucide-react"; // plane imports import { DEFAULT_GLOBAL_VIEWS_LIST, - GLOBAL_VIEW_OPENED, EUserPermissions, EUserPermissionsLevel, + GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { TStaticViewTypes } from "@plane/types"; // components @@ -77,7 +77,7 @@ export const GlobalViewsHeader: React.FC = observer(() => { // bring the active view to the centre of the header useEffect(() => { if (globalViewId && currentWorkspaceViews) { - captureEvent(GLOBAL_VIEW_OPENED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.open, { view_id: globalViewId, view_type: ["all-issues", "assigned", "created", "subscribed"].includes(globalViewId.toString()) ? "Default" diff --git a/web/core/components/workspace/views/modal.tsx b/web/core/components/workspace/views/modal.tsx index 7ed07d0ec88..8c00532773a 100644 --- a/web/core/components/workspace/views/modal.tsx +++ b/web/core/components/workspace/views/modal.tsx @@ -4,7 +4,7 @@ import React from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // types -import { GLOBAL_VIEW_CREATED, GLOBAL_VIEW_UPDATED } from "@plane/constants"; +import { GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; import { IWorkspaceView } from "@plane/types"; // ui import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -47,7 +47,7 @@ export const CreateUpdateWorkspaceViewModal: React.FC = observer((props) await createGlobalView(workspaceSlug.toString(), payloadData) .then((res) => { - captureEvent(GLOBAL_VIEW_CREATED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.create, { view_id: res.id, applied_filters: res.filters, state: "SUCCESS", @@ -62,7 +62,7 @@ export const CreateUpdateWorkspaceViewModal: React.FC = observer((props) handleClose(); }) .catch(() => { - captureEvent(GLOBAL_VIEW_CREATED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.create, { applied_filters: payload?.filters, state: "FAILED", }); @@ -87,7 +87,7 @@ export const CreateUpdateWorkspaceViewModal: React.FC = observer((props) await updateGlobalView(workspaceSlug.toString(), data.id, payloadData) .then((res) => { if (res) { - captureEvent(GLOBAL_VIEW_UPDATED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.update, { view_id: res.id, applied_filters: res.filters, state: "SUCCESS", @@ -101,7 +101,7 @@ export const CreateUpdateWorkspaceViewModal: React.FC = observer((props) } }) .catch(() => { - captureEvent(GLOBAL_VIEW_UPDATED, { + captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.update, { view_id: data.id, applied_filters: data.filters, state: "FAILED", diff --git a/web/core/store/event-tracker.store.ts b/web/core/store/event-tracker.store.ts index c6f68a0978f..c8571802d1d 100644 --- a/web/core/store/event-tracker.store.ts +++ b/web/core/store/event-tracker.store.ts @@ -3,7 +3,6 @@ import posthog from "posthog-js"; // store import { GROUP_WORKSPACE, - WORKSPACE_CREATED, EventProps, IssueEventProps, getCycleEventPayload, @@ -13,6 +12,7 @@ import { getProjectStateEventPayload, getWorkspaceEventPayload, getPageEventPayload, + WORKSPACE_EVENT_TRACKER_KEYS, } from "@plane/constants"; import { CoreRootStore } from "./root.store"; @@ -115,7 +115,7 @@ export class EventTrackerStore implements IEventTrackerStore { */ captureWorkspaceEvent = (props: EventProps) => { const { eventName, payload } = props; - if (eventName === WORKSPACE_CREATED && payload.state == "SUCCESS") { + if (eventName === WORKSPACE_EVENT_TRACKER_KEYS.create && payload.state == "SUCCESS") { this.joinWorkspaceMetricGroup(payload.id); } const eventPayload: any = getWorkspaceEventPayload({ From 09b20db83ed29d57d900a7e22990d3c500307777 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal Date: Thu, 26 Jun 2025 19:38:14 +0530 Subject: [PATCH 2/4] fix: cycle event keys --- web/core/components/cycles/delete-modal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/core/components/cycles/delete-modal.tsx b/web/core/components/cycles/delete-modal.tsx index f11894b9869..3405322d78b 100644 --- a/web/core/components/cycles/delete-modal.tsx +++ b/web/core/components/cycles/delete-modal.tsx @@ -50,7 +50,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: "Cycle deleted successfully.", }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_EVENT_TRACKER_KEYS.delete, payload: { ...cycle, state: "SUCCESS" }, }); }) @@ -65,7 +65,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: currentError.i18n_message && t(currentError.i18n_message), }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_EVENT_TRACKER_KEYS.delete, payload: { ...cycle, state: "FAILED" }, }); }) From 86b818671efe7255d2a703c2b9f408d44c3c0850 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal Date: Fri, 27 Jun 2025 13:35:40 +0530 Subject: [PATCH 3/4] chore: store extension --- web/ce/store/event-tracker.store.ts | 11 +++++++++++ web/core/hooks/store/use-event-tracker.ts | 2 +- web/core/store/event-tracker.store.ts | 4 ++-- web/core/store/root.store.ts | 6 +++--- web/ee/store/event-tracker.store.ts | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 web/ce/store/event-tracker.store.ts create mode 100644 web/ee/store/event-tracker.store.ts diff --git a/web/ce/store/event-tracker.store.ts b/web/ce/store/event-tracker.store.ts new file mode 100644 index 00000000000..4f5074dd94a --- /dev/null +++ b/web/ce/store/event-tracker.store.ts @@ -0,0 +1,11 @@ +import { RootStore } from "@/plane-web/store/root.store"; +import { CoreEventTrackerStore, ICoreEventTrackerStore } from "@/store/event-tracker.store"; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface IEventTrackerStore extends ICoreEventTrackerStore {} + +export class EventTrackerStore extends CoreEventTrackerStore implements IEventTrackerStore { + constructor(_rootStore: RootStore) { + super(_rootStore); + } +} diff --git a/web/core/hooks/store/use-event-tracker.ts b/web/core/hooks/store/use-event-tracker.ts index 081710af049..0f92aaced49 100644 --- a/web/core/hooks/store/use-event-tracker.ts +++ b/web/core/hooks/store/use-event-tracker.ts @@ -2,7 +2,7 @@ import { useContext } from "react"; // mobx store import { StoreContext } from "@/lib/store-context"; // types -import { IEventTrackerStore } from "@/store/event-tracker.store"; +import { IEventTrackerStore } from "@/plane-web/store/event-tracker.store"; export const useEventTracker = (): IEventTrackerStore => { const context = useContext(StoreContext); diff --git a/web/core/store/event-tracker.store.ts b/web/core/store/event-tracker.store.ts index c8571802d1d..6097504c1ba 100644 --- a/web/core/store/event-tracker.store.ts +++ b/web/core/store/event-tracker.store.ts @@ -16,7 +16,7 @@ import { } from "@plane/constants"; import { CoreRootStore } from "./root.store"; -export interface IEventTrackerStore { +export interface ICoreEventTrackerStore { // properties trackElement: string | undefined; // computed @@ -35,7 +35,7 @@ export interface IEventTrackerStore { captureProjectStateEvent: (props: EventProps) => void; } -export class EventTrackerStore implements IEventTrackerStore { +export abstract class CoreEventTrackerStore implements ICoreEventTrackerStore { trackElement: string | undefined = undefined; rootStore; constructor(_rootStore: CoreRootStore) { diff --git a/web/core/store/root.store.ts b/web/core/store/root.store.ts index e210754cc9b..e2ef10ae36d 100644 --- a/web/core/store/root.store.ts +++ b/web/core/store/root.store.ts @@ -4,6 +4,7 @@ import { FALLBACK_LANGUAGE, LANGUAGE_STORAGE_KEY } from "@plane/i18n"; // plane web store import { AnalyticsStore, IAnalyticsStore } from "@/plane-web/store/analytics.store"; import { CommandPaletteStore, ICommandPaletteStore } from "@/plane-web/store/command-palette.store"; +import { EventTrackerStore, IEventTrackerStore } from "@/plane-web/store/event-tracker.store"; import { RootStore } from "@/plane-web/store/root.store"; import { IStateStore, StateStore } from "@/plane-web/store/state.store"; // stores @@ -12,7 +13,6 @@ import { CycleFilterStore, ICycleFilterStore } from "./cycle_filter.store"; import { DashboardStore, IDashboardStore } from "./dashboard.store"; import { EditorAssetStore, IEditorAssetStore } from "./editor/asset.store"; import { IProjectEstimateStore, ProjectEstimateStore } from "./estimates/project-estimate.store"; -import { EventTrackerStore, IEventTrackerStore } from "./event-tracker.store"; import { FavoriteStore, IFavoriteStore } from "./favorite.store"; import { GlobalViewStore, IGlobalViewStore } from "./global-view.store"; import { IProjectInboxStore, ProjectInboxStore } from "./inbox/project-inbox.store"; @@ -86,7 +86,7 @@ export class CoreRootStore { this.state = new StateStore(this as unknown as RootStore); this.label = new LabelStore(this); this.dashboard = new DashboardStore(this); - this.eventTracker = new EventTrackerStore(this); + this.eventTracker = new EventTrackerStore(this as unknown as RootStore); this.multipleSelect = new MultipleSelectStore(); this.projectInbox = new ProjectInboxStore(this); this.projectPages = new ProjectPageStore(this as unknown as RootStore); @@ -120,7 +120,7 @@ export class CoreRootStore { this.state = new StateStore(this as unknown as RootStore); this.label = new LabelStore(this); this.dashboard = new DashboardStore(this); - this.eventTracker = new EventTrackerStore(this); + this.eventTracker = new EventTrackerStore(this as unknown as RootStore); this.projectInbox = new ProjectInboxStore(this); this.projectPages = new ProjectPageStore(this as unknown as RootStore); this.multipleSelect = new MultipleSelectStore(); diff --git a/web/ee/store/event-tracker.store.ts b/web/ee/store/event-tracker.store.ts new file mode 100644 index 00000000000..68f6a3a741c --- /dev/null +++ b/web/ee/store/event-tracker.store.ts @@ -0,0 +1 @@ +export * from "ce/store/event-tracker.store"; From 098a220d07abfcd15e62dcc6e1a7198b69e3181e Mon Sep 17 00:00:00 2001 From: sriramveeraghanta Date: Fri, 27 Jun 2025 16:19:10 +0530 Subject: [PATCH 4/4] chore: update events naming convention --- packages/constants/src/event-tracker/core.ts | 150 +++++++++--------- packages/constants/src/event-tracker/index.ts | 1 + packages/constants/src/index.ts | 2 +- .../[workspaceSlug]/(projects)/header.tsx | 4 +- .../settings/(workspace)/members/page.tsx | 6 +- .../(all)/accounts/forgot-password/page.tsx | 8 +- web/app/(all)/invitations/page.tsx | 6 +- web/app/(all)/onboarding/page.tsx | 4 +- web/app/(all)/sign-up/page.tsx | 4 +- web/app/(home)/page.tsx | 4 +- web/ce/components/projects/create/root.tsx | 4 +- .../account/auth-forms/password.tsx | 10 +- .../account/auth-forms/unique-code.tsx | 4 +- .../analytics-sidebar/sidebar-header.tsx | 6 +- web/core/components/cycles/delete-modal.tsx | 6 +- .../cycles/list/cycle-list-item-action.tsx | 11 +- web/core/components/cycles/modal.tsx | 10 +- web/core/components/home/root.tsx | 4 +- .../components/inbox/content/issue-root.tsx | 10 +- .../inbox/modals/create-modal/create-root.tsx | 6 +- .../issue-detail-widgets/relations/helper.tsx | 10 +- .../issue-detail-quick-actions.tsx | 10 +- .../components/issues/issue-detail/root.tsx | 37 ++--- .../roots/global-view-root.tsx | 4 +- .../issue-layouts/kanban/base-kanban-root.tsx | 4 +- .../properties/all-properties.tsx | 20 +-- .../issues/issue-layouts/quick-add/root.tsx | 6 +- .../components/issues/issue-modal/base.tsx | 10 +- .../components/issues/peek-overview/root.tsx | 36 ++--- .../modules/analytics-sidebar/root.tsx | 12 +- .../modules/delete-module-modal.tsx | 6 +- web/core/components/modules/modal.tsx | 10 +- .../components/modules/module-card-item.tsx | 6 +- .../modules/module-list-item-action.tsx | 6 +- .../onboarding/create-workspace.tsx | 12 +- .../components/onboarding/invitations.tsx | 6 +- .../components/onboarding/invite-members.tsx | 6 +- .../components/onboarding/profile-setup.tsx | 22 +-- web/core/components/onboarding/tour/root.tsx | 6 +- .../pages/modals/create-page-modal.tsx | 6 +- .../pages/modals/delete-page-modal.tsx | 6 +- .../project-states/create-update/create.tsx | 6 +- .../project-states/create-update/update.tsx | 6 +- .../project-states/options/delete.tsx | 6 +- .../project-states/state-delete-modal.tsx | 6 +- .../project/delete-project-modal.tsx | 6 +- web/core/components/project/form.tsx | 6 +- .../project/leave-project-modal.tsx | 6 +- .../components/project/member-list-item.tsx | 4 +- .../project/send-project-invitation-modal.tsx | 6 +- .../sidebar/header/options/root.tsx | 4 +- .../notification-card/options/archive.tsx | 4 +- .../notification-card/options/read.tsx | 4 +- .../workspace/create-workspace-form.tsx | 6 +- .../workspace/delete-workspace-form.tsx | 6 +- .../workspace/settings/members-list-item.tsx | 4 +- .../workspace/settings/workspace-details.tsx | 11 +- .../workspace/sidebar/user-menu-item.tsx | 4 +- .../workspace/views/delete-view-modal.tsx | 6 +- .../components/workspace/views/header.tsx | 4 +- web/core/components/workspace/views/modal.tsx | 10 +- web/core/lib/posthog-provider.tsx | 4 +- web/core/store/event-tracker.store.ts | 8 +- 63 files changed, 307 insertions(+), 321 deletions(-) create mode 100644 packages/constants/src/event-tracker/index.ts diff --git a/packages/constants/src/event-tracker/core.ts b/packages/constants/src/event-tracker/core.ts index ee07cac548b..85f2ea6e2ba 100644 --- a/packages/constants/src/event-tracker/core.ts +++ b/packages/constants/src/event-tracker/core.ts @@ -107,7 +107,7 @@ export const getIssueEventPayload = (props: IssueEventProps) => { view_id: path?.includes("workspace-views") || path?.includes("views") ? path.split("/").pop() : "", }; - if (eventName === WORK_ITEM_EVENT_TRACKER_KEYS.update) { + if (eventName === WORK_ITEM_TRACKER_EVENTS.update) { eventPayload = { ...eventPayload, ...updates, @@ -143,116 +143,116 @@ export const getProjectStateEventPayload = (payload: any) => ({ }); // Dashboard Events -export const GITHUB_REDIRECTED = "GitHub redirected"; +export const GITHUB_REDIRECTED_TRACKER_EVENT = "github_redirected"; // Groups -export const GROUP_WORKSPACE = "Workspace_metrics"; +export const GROUP_WORKSPACE_TRACKER_EVENT = "workspace_metrics"; -export const WORKSPACE_EVENT_TRACKER_KEYS = { - create: "Workspace created", - update: "Workspace updated", - delete: "Workspace deleted", +export const WORKSPACE_TRACKER_EVENTS = { + create: "workspace_created", + update: "workspace_updated", + delete: "workspace_deleted", }; -export const PROJECT_EVENT_TRACKER_KEYS = { - create: "Project created", - update: "Project updated", - delete: "Project deleted", +export const PROJECT_TRACKER_EVENTS = { + create: "project_created", + update: "project_updated", + delete: "project_deleted", }; -export const CYCLE_EVENT_TRACKER_KEYS = { - create: "Cycle created", - update: "Cycle updated", - delete: "Cycle deleted", - favorite: "Cycle favorited", - unfavorite: "Cycle unfavorited", +export const CYCLE_TRACKER_EVENTS = { + create: "cycle_created", + update: "cycle_updated", + delete: "cycle_deleted", + favorite: "cycle_favorited", + unfavorite: "cycle_unfavorited", }; -export const MODULE_EVENT_TRACKER_KEYS = { - create: "Module created", - update: "Module updated", - delete: "Module deleted", - favorite: "Module favorited", - unfavorite: "Module unfavorited", +export const MODULE_TRACKER_EVENTS = { + create: "module_created", + update: "module_updated", + delete: "module_deleted", + favorite: "module_favorited", + unfavorite: "module_unfavorited", link: { - create: "Module link created", - update: "Module link updated", - delete: "Module link deleted", + create: "module_link_created", + update: "module_link_updated", + delete: "module_link_deleted", }, }; -export const WORK_ITEM_EVENT_TRACKER_KEYS = { - create: "Work item created", - update: "Work item updated", - delete: "Work item deleted", - archive: "Work item archived", - restore: "Work item restored", +export const WORK_ITEM_TRACKER_EVENTS = { + create: "work_item_created", + update: "work_item_updated", + delete: "work_item_deleted", + archive: "work_item_archived", + restore: "work_item_restored", }; -export const STATE_EVENT_TRACKER_KEYS = { - create: "State created", - update: "State updated", - delete: "State deleted", +export const STATE_TRACKER_EVENTS = { + create: "state_created", + update: "state_updated", + delete: "state_deleted", }; -export const PAGE_EVENT_TRACKER_KEYS = { - create: "Page created", - update: "Page updated", - delete: "Page deleted", +export const PROJECT_PAGE_TRACKER_EVENTS = { + create: "project_page_created", + update: "project_page_updated", + delete: "project_page_deleted", }; -export const MEMBER_EVENT_TRACKER_KEYS = { - invite: "Member invited", - accept: "Member accepted", +export const MEMBER_TRACKER_EVENTS = { + invite: "member_invited", + accept: "member_accepted", project: { - add: "Project member added", - leave: "Project member left", + add: "project_member_added", + leave: "project_member_left", }, workspace: { - leave: "Workspace member left", + leave: "workspace_member_left", }, }; -export const AUTH_EVENT_TRACKER_KEYS = { +export const AUTH_TRACKER_EVENTS = { navigate: { - sign_up: "Navigate to sign-up page", - sign_in: "Navigate to sign-in page", + sign_up: "navigate_to_sign_up_page", + sign_in: "navigate_to_sign_in_page", }, - code_verify: "Code verified", - sign_up_with_password: "Sign up with password", - sign_in_with_password: "Sign in with password", - sign_in_with_code: "Sign in with magic link", - forgot_password: "Forgot password clicked", + code_verify: "code_verified", + sign_up_with_password: "sign_up_with_password", + sign_in_with_password: "sign_in_with_password", + sign_in_with_code: "sign_in_with_magic_link", + forgot_password: "forgot_password_clicked", }; -export const PRODUCT_TOUR_EVENT_TRACKER_KEYS = { - start: "Product tour started", - complete: "Product tour completed", - skip: "Product tour skipped", +export const PRODUCT_TOUR_TRACKER_EVENTS = { + start: "product_tour_started", + complete: "product_tour_completed", + skip: "product_tour_skipped", }; -export const GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS = { - create: "Global view created", - update: "Global view updated", - delete: "Global view deleted", - open: "Global view opened", +export const GLOBAL_VIEW_TOUR_TRACKER_EVENTS = { + create: "global_view_created", + update: "global_view_updated", + delete: "global_view_deleted", + open: "global_view_opened", }; -export const NOTIFICATION_EVENT_TRACKER_KEYS = { - archive: "Notification archived", - all_marked_read: "All notifications marked read", +export const NOTIFICATION_TRACKER_EVENTS = { + archive: "notification_archived", + all_marked_read: "all_notifications_marked_read", }; -export const USER_EVENT_TRACKER_KEYS = { - add_details: "User details added", - onboarding_complete: "User onboarding completed", +export const USER_TRACKER_EVENTS = { + add_details: "user_details_added", + onboarding_complete: "user_onboarding_completed", }; -export const ONBOARDING_EVENT_TRACKER_KEYS = { - root: "Onboarding", - step_1: "Onboarding step 1", - step_2: "Onboarding step 2", +export const ONBOARDING_TRACKER_EVENTS = { + root: "onboarding", + step_1: "onboarding_step_1", + step_2: "onboarding_step_2", }; -export const SIDEBAR_EVENT_TRACKER_KEYS = { - click: "Sidenav clicked", +export const SIDEBAR_TRACKER_EVENTS = { + click: "sidenav_clicked", }; diff --git a/packages/constants/src/event-tracker/index.ts b/packages/constants/src/event-tracker/index.ts new file mode 100644 index 00000000000..8d119dee813 --- /dev/null +++ b/packages/constants/src/event-tracker/index.ts @@ -0,0 +1 @@ +export * from "./core"; diff --git a/packages/constants/src/index.ts b/packages/constants/src/index.ts index da3d458f18f..d7ccebd319e 100644 --- a/packages/constants/src/index.ts +++ b/packages/constants/src/index.ts @@ -25,7 +25,7 @@ export * from "./intake"; export * from "./profile"; export * from "./workspace-drafts"; export * from "./label"; -export * from "./event-tracker/core"; +export * from "./event-tracker"; export * from "./spreadsheet"; export * from "./dashboard"; export * from "./page"; diff --git a/web/app/(all)/[workspaceSlug]/(projects)/header.tsx b/web/app/(all)/[workspaceSlug]/(projects)/header.tsx index ef210ec2734..42e3222b3be 100644 --- a/web/app/(all)/[workspaceSlug]/(projects)/header.tsx +++ b/web/app/(all)/[workspaceSlug]/(projects)/header.tsx @@ -7,7 +7,7 @@ import { Home } from "lucide-react"; import githubBlackImage from "/public/logos/github-black.png"; import githubWhiteImage from "/public/logos/github-white.png"; // ui -import { GITHUB_REDIRECTED } from "@plane/constants"; +import { GITHUB_REDIRECTED_TRACKER_EVENT } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Breadcrumbs, Header } from "@plane/ui"; // components @@ -39,7 +39,7 @@ export const WorkspaceDashboardHeader = () => { - captureEvent(GITHUB_REDIRECTED, { + captureEvent(GITHUB_REDIRECTED_TRACKER_EVENT, { element: "navbar", }) } diff --git a/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx b/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx index 769373ae453..001c00dd27e 100644 --- a/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx +++ b/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { Search } from "lucide-react"; // types -import { EUserPermissions, EUserPermissionsLevel, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { EUserPermissions, EUserPermissionsLevel, MEMBER_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IWorkspaceBulkInviteFormData } from "@plane/types"; // ui @@ -52,7 +52,7 @@ const WorkspaceMembersSettingsPage = observer(() => { return inviteMembersToWorkspace(workspaceSlug.toString(), data) .then(() => { setInviteModal(false); - captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { + captureEvent(MEMBER_TRACKER_EVENTS.invite, { emails: [ ...data.emails.map((email) => ({ email: email.email, @@ -70,7 +70,7 @@ const WorkspaceMembersSettingsPage = observer(() => { }); }) .catch((err) => { - captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { + captureEvent(MEMBER_TRACKER_EVENTS.invite, { emails: [ ...data.emails.map((email) => ({ email: email.email, diff --git a/web/app/(all)/accounts/forgot-password/page.tsx b/web/app/(all)/accounts/forgot-password/page.tsx index b9c400a1328..a7e3e7ed407 100644 --- a/web/app/(all)/accounts/forgot-password/page.tsx +++ b/web/app/(all)/accounts/forgot-password/page.tsx @@ -9,7 +9,7 @@ import { Controller, useForm } from "react-hook-form"; // icons import { CircleCheck } from "lucide-react"; // plane imports -import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { AUTH_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, TOAST_TYPE, getButtonStyling, setToast } from "@plane/ui"; import { cn, checkEmailValidity } from "@plane/utils"; @@ -71,7 +71,7 @@ const ForgotPasswordPage = observer(() => { email: formData.email, }) .then(() => { - captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password, { + captureEvent(AUTH_TRACKER_EVENTS.forgot_password, { state: "SUCCESS", }); setToast({ @@ -82,7 +82,7 @@ const ForgotPasswordPage = observer(() => { setResendCodeTimer(30); }) .catch((err) => { - captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password, { + captureEvent(AUTH_TRACKER_EVENTS.forgot_password, { state: "FAILED", }); setToast({ @@ -120,7 +120,7 @@ const ForgotPasswordPage = observer(() => { {t("auth.common.new_to_plane")} captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_up, {})} + onClick={() => captureEvent(AUTH_TRACKER_EVENTS.navigate.sign_up, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.create_account")} diff --git a/web/app/(all)/invitations/page.tsx b/web/app/(all)/invitations/page.tsx index d775b702727..5e5f1958fe0 100644 --- a/web/app/(all)/invitations/page.tsx +++ b/web/app/(all)/invitations/page.tsx @@ -9,7 +9,7 @@ import { useTheme } from "next-themes"; import useSWR, { mutate } from "swr"; import { CheckCircle2 } from "lucide-react"; // plane imports -import { ROLE, EUserPermissions, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { ROLE, EUserPermissions, MEMBER_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import type { IWorkspaceMemberInvitation } from "@plane/types"; @@ -86,7 +86,7 @@ const UserInvitationsPage = observer(() => { const invitation = invitations?.find((i) => i.id === firstInviteId); const redirectWorkspace = invitations?.find((i) => i.id === firstInviteId)?.workspace; joinWorkspaceMetricGroup(redirectWorkspace?.id); - captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { + captureEvent(MEMBER_TRACKER_EVENTS.accept, { member_id: invitation?.id, // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain role: getUserRole((invitation?.role as unknown as EUserPermissions)!), @@ -112,7 +112,7 @@ const UserInvitationsPage = observer(() => { }); }) .catch(() => { - captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { + captureEvent(MEMBER_TRACKER_EVENTS.accept, { project_id: undefined, accepted_from: "App", state: "FAILED", diff --git a/web/app/(all)/onboarding/page.tsx b/web/app/(all)/onboarding/page.tsx index 844d5540b99..078d6fefaec 100644 --- a/web/app/(all)/onboarding/page.tsx +++ b/web/app/(all)/onboarding/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; // types -import { USER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { USER_TRACKER_EVENTS } from "@plane/constants"; import { TOnboardingSteps, TUserProfile } from "@plane/types"; // ui import { TOAST_TYPE, setToast } from "@plane/ui"; @@ -73,7 +73,7 @@ const OnboardingPage = observer(() => { await finishUserOnboarding() .then(() => { - captureEvent(USER_EVENT_TRACKER_KEYS.onboarding_complete, { + captureEvent(USER_TRACKER_EVENTS.onboarding_complete, { email: user.email, user_id: user.id, status: "SUCCESS", diff --git a/web/app/(all)/sign-up/page.tsx b/web/app/(all)/sign-up/page.tsx index 1c3135cde92..786b9738437 100644 --- a/web/app/(all)/sign-up/page.tsx +++ b/web/app/(all)/sign-up/page.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // ui import { useTheme } from "next-themes"; // components -import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { AUTH_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { AuthRoot } from "@/components/account"; // constants @@ -54,7 +54,7 @@ const SignInPage = observer(() => { {t("auth.common.already_have_an_account")} captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_in, {})} + onClick={() => captureEvent(AUTH_TRACKER_EVENTS.navigate.sign_in, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.login")} diff --git a/web/app/(home)/page.tsx b/web/app/(home)/page.tsx index 5832bff77fe..21e5c12d07c 100644 --- a/web/app/(home)/page.tsx +++ b/web/app/(home)/page.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // ui import { useTheme } from "next-themes"; // components -import { AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { AUTH_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { AuthRoot } from "@/components/account"; import { PageHead } from "@/components/core"; @@ -63,7 +63,7 @@ const HomePage = observer(() => { {t("auth.common.new_to_plane")} captureEvent(AUTH_EVENT_TRACKER_KEYS.navigate.sign_up, {})} + onClick={() => captureEvent(AUTH_TRACKER_EVENTS.navigate.sign_up, {})} className="font-semibold text-custom-primary-100 hover:underline" > {t("auth.common.create_account")} diff --git a/web/ce/components/projects/create/root.tsx b/web/ce/components/projects/create/root.tsx index 3f47c21eef6..18f4878fb5b 100644 --- a/web/ce/components/projects/create/root.tsx +++ b/web/ce/components/projects/create/root.tsx @@ -3,7 +3,7 @@ import { useState, FC } from "react"; import { observer } from "mobx-react"; import { FormProvider, useForm } from "react-hook-form"; -import { DEFAULT_PROJECT_FORM_VALUES, PROJECT_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { DEFAULT_PROJECT_FORM_VALUES, PROJECT_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // ui import { setToast, TOAST_TYPE } from "@plane/ui"; @@ -75,7 +75,7 @@ export const CreateProjectForm: FC = observer((props) = state: "SUCCESS", }; captureProjectEvent({ - eventName: PROJECT_EVENT_TRACKER_KEYS.create, + eventName: PROJECT_TRACKER_EVENTS.create, payload: newPayload, }); setToast({ diff --git a/web/core/components/account/auth-forms/password.tsx b/web/core/components/account/auth-forms/password.tsx index e8ac834bb86..3c2927418dd 100644 --- a/web/core/components/account/auth-forms/password.tsx +++ b/web/core/components/account/auth-forms/password.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; // icons import { Eye, EyeOff, Info, X, XCircle } from "lucide-react"; // plane imports -import { API_BASE_URL, E_PASSWORD_STRENGTH, AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { API_BASE_URL, E_PASSWORD_STRENGTH, AUTH_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, Spinner } from "@plane/ui"; import { getPasswordStrength } from "@plane/utils"; @@ -77,7 +77,7 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { const redirectToUniqueCodeSignIn = async () => { handleAuthStep(EAuthSteps.UNIQUE_CODE); - captureEvent(AUTH_EVENT_TRACKER_KEYS.sign_in_with_code); + captureEvent(AUTH_TRACKER_EVENTS.sign_in_with_code); }; const passwordSupport = @@ -85,7 +85,7 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => {
{isSMTPConfigured ? ( captureEvent(AUTH_EVENT_TRACKER_KEYS.forgot_password)} + onClick={() => captureEvent(AUTH_TRACKER_EVENTS.forgot_password)} href={`/accounts/forgot-password?email=${encodeURIComponent(email)}`} className="text-xs font-medium text-custom-primary-100" > @@ -156,8 +156,8 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { setIsSubmitting(true); captureEvent( mode === EAuthModes.SIGN_IN - ? AUTH_EVENT_TRACKER_KEYS.sign_in_with_password - : AUTH_EVENT_TRACKER_KEYS.sign_up_with_password + ? AUTH_TRACKER_EVENTS.sign_in_with_password + : AUTH_TRACKER_EVENTS.sign_up_with_password ); if (formRef.current) formRef.current.submit(); // Manually submit the form if the condition is met } else { diff --git a/web/core/components/account/auth-forms/unique-code.tsx b/web/core/components/account/auth-forms/unique-code.tsx index 14dc95af5a8..d6e3c91d8a7 100644 --- a/web/core/components/account/auth-forms/unique-code.tsx +++ b/web/core/components/account/auth-forms/unique-code.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from "react"; import { CircleCheck, XCircle } from "lucide-react"; -import { API_BASE_URL, AUTH_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { API_BASE_URL, AUTH_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button, Input, Spinner } from "@plane/ui"; // constants @@ -84,7 +84,7 @@ export const AuthUniqueCodeForm: React.FC = (props) => { action={`${API_BASE_URL}/auth/${mode === EAuthModes.SIGN_IN ? "magic-sign-in" : "magic-sign-up"}/`} onSubmit={() => { setIsSubmitting(true); - captureEvent(AUTH_EVENT_TRACKER_KEYS.code_verify, { + captureEvent(AUTH_TRACKER_EVENTS.code_verify, { state: "SUCCESS", first_time: !isExistingEmail, }); diff --git a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx index 3d15c234f6b..bad6335167a 100644 --- a/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx +++ b/web/core/components/cycles/analytics-sidebar/sidebar-header.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; import { ArrowRight, ChevronRight } from "lucide-react"; // Plane Imports -import { CYCLE_EVENT_TRACKER_KEYS, CYCLE_STATUS, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { CYCLE_TRACKER_EVENTS, CYCLE_STATUS, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { ICycle } from "@plane/types"; import { setToast, TOAST_TYPE } from "@plane/ui"; @@ -67,7 +67,7 @@ export const CycleSidebarHeader: FC = observer((props) => { await updateCycleDetails(workspaceSlug.toString(), projectId.toString(), cycleDetails.id.toString(), data) .then((res) => { captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_TRACKER_EVENTS.update, payload: { ...res, changed_properties: [changedProperty], @@ -79,7 +79,7 @@ export const CycleSidebarHeader: FC = observer((props) => { .catch(() => { captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_TRACKER_EVENTS.update, payload: { ...data, element: "Right side-peek", diff --git a/web/core/components/cycles/delete-modal.tsx b/web/core/components/cycles/delete-modal.tsx index 3405322d78b..f48733f7569 100644 --- a/web/core/components/cycles/delete-modal.tsx +++ b/web/core/components/cycles/delete-modal.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { useParams, useSearchParams } from "next/navigation"; // types -import { PROJECT_ERROR_MESSAGES, CYCLE_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { PROJECT_ERROR_MESSAGES, CYCLE_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { ICycle } from "@plane/types"; // ui @@ -50,7 +50,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: "Cycle deleted successfully.", }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.delete, + eventName: CYCLE_TRACKER_EVENTS.delete, payload: { ...cycle, state: "SUCCESS" }, }); }) @@ -65,7 +65,7 @@ export const CycleDeleteModal: React.FC = observer((props) => { message: currentError.i18n_message && t(currentError.i18n_message), }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.delete, + eventName: CYCLE_TRACKER_EVENTS.delete, payload: { ...cycle, state: "FAILED" }, }); }) diff --git a/web/core/components/cycles/list/cycle-list-item-action.tsx b/web/core/components/cycles/list/cycle-list-item-action.tsx index f5137e7d6f3..c5978ebd397 100644 --- a/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -6,12 +6,7 @@ import { useParams, usePathname, useSearchParams } from "next/navigation"; import { useForm } from "react-hook-form"; import { Eye, Users, ArrowRight, CalendarDays } from "lucide-react"; // types -import { - CYCLE_EVENT_TRACKER_KEYS, - EUserPermissions, - EUserPermissionsLevel, - IS_FAVORITE_MENU_OPEN, -} from "@plane/constants"; +import { CYCLE_TRACKER_EVENTS, EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; import { ICycle, TCycleGroups } from "@plane/types"; @@ -106,7 +101,7 @@ export const CycleListItemAction: FC = observer((props) => { const addToFavoritePromise = addCycleToFavorites(workspaceSlug?.toString(), projectId.toString(), cycleId).then( () => { if (!isFavoriteMenuOpen) toggleFavoriteMenu(true); - captureEvent(CYCLE_EVENT_TRACKER_KEYS.favorite, { + captureEvent(CYCLE_TRACKER_EVENTS.favorite, { cycle_id: cycleId, element: "List layout", state: "SUCCESS", @@ -136,7 +131,7 @@ export const CycleListItemAction: FC = observer((props) => { projectId.toString(), cycleId ).then(() => { - captureEvent(CYCLE_EVENT_TRACKER_KEYS.unfavorite, { + captureEvent(CYCLE_TRACKER_EVENTS.unfavorite, { cycle_id: cycleId, element: "List layout", state: "SUCCESS", diff --git a/web/core/components/cycles/modal.tsx b/web/core/components/cycles/modal.tsx index 21978540dd4..003eed531e5 100644 --- a/web/core/components/cycles/modal.tsx +++ b/web/core/components/cycles/modal.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { format } from "date-fns"; import { mutate } from "swr"; // types -import { CYCLE_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { CYCLE_TRACKER_EVENTS } from "@plane/constants"; import type { CycleDateCheckData, ICycle, TCycleTabOptions } from "@plane/types"; // ui import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -64,7 +64,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { message: "Cycle created successfully.", }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.create, + eventName: CYCLE_TRACKER_EVENTS.create, payload: { ...res, state: "SUCCESS" }, }); }) @@ -75,7 +75,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { message: err?.detail ?? "Error in creating cycle. Please try again.", }); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.create, + eventName: CYCLE_TRACKER_EVENTS.create, payload: { ...payload, state: "FAILED" }, }); }); @@ -89,7 +89,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { .then((res) => { const changed_properties = Object.keys(dirtyFields); captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_TRACKER_EVENTS.update, payload: { ...res, changed_properties: changed_properties, state: "SUCCESS" }, }); setToast({ @@ -100,7 +100,7 @@ export const CycleCreateUpdateModal: React.FC = (props) => { }) .catch((err) => { captureCycleEvent({ - eventName: CYCLE_EVENT_TRACKER_KEYS.update, + eventName: CYCLE_TRACKER_EVENTS.update, payload: { ...payload, state: "FAILED" }, }); setToast({ diff --git a/web/core/components/home/root.tsx b/web/core/components/home/root.tsx index 6649871815f..4c25bc3f68e 100644 --- a/web/core/components/home/root.tsx +++ b/web/core/components/home/root.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // components import useSWR from "swr"; -import { PRODUCT_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { PRODUCT_TOUR_TRACKER_EVENTS } from "@plane/constants"; import { ContentWrapper } from "@plane/ui"; import { cn } from "@plane/utils"; import { TourRoot } from "@/components/onboarding"; @@ -38,7 +38,7 @@ export const WorkspaceHomeView = observer(() => { const handleTourCompleted = () => { updateTourCompleted() .then(() => { - captureEvent(PRODUCT_TOUR_EVENT_TRACKER_KEYS.complete, { + captureEvent(PRODUCT_TOUR_TRACKER_EVENTS.complete, { user_id: currentUser?.id, state: "SUCCESS", }); diff --git a/web/core/components/inbox/content/issue-root.tsx b/web/core/components/inbox/content/issue-root.tsx index 45c7b34572d..7f6558cbb6f 100644 --- a/web/core/components/inbox/content/issue-root.tsx +++ b/web/core/components/inbox/content/issue-root.tsx @@ -4,7 +4,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useRef } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; // plane imports -import { EInboxIssueSource, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { EInboxIssueSource, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { EditorRefApi } from "@plane/editor"; import { TIssue, TNameDescriptionLoader } from "@plane/types"; import { Loader, TOAST_TYPE, setToast } from "@plane/ui"; @@ -105,7 +105,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { message: "Work item deleted successfully", }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: _issueId, state: "SUCCESS", element: "Work item detail page" }, path: pathname, }); @@ -117,7 +117,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { message: "Work item delete failed", }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: _issueId, state: "FAILED", element: "Work item detail page" }, path: pathname, }); @@ -156,14 +156,14 @@ export const InboxIssueMainContent: React.FC = observer((props) => { try { await archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "SUCCESS", element: "Work item details page" }, path: pathname, }); } catch (error) { console.log("Error in archiving issue:", error); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "FAILED", element: "Work item details page" }, path: pathname, }); diff --git a/web/core/components/inbox/modals/create-modal/create-root.tsx b/web/core/components/inbox/modals/create-modal/create-root.tsx index ebfe7f574ca..923a148e3b5 100644 --- a/web/core/components/inbox/modals/create-modal/create-root.tsx +++ b/web/core/components/inbox/modals/create-modal/create-root.tsx @@ -4,7 +4,7 @@ import { FC, FormEvent, useCallback, useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; // plane imports -import { ETabIndices, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { ETabIndices, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { EditorRefApi } from "@plane/editor"; // types import { useTranslation } from "@plane/i18n"; @@ -168,7 +168,7 @@ export const InboxIssueCreateRoot: FC = observer((props) setFormData(defaultIssueData); } captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...formData, state: "SUCCESS", @@ -185,7 +185,7 @@ export const InboxIssueCreateRoot: FC = observer((props) .catch((error) => { console.error(error); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...formData, state: "FAILED", diff --git a/web/core/components/issues/issue-detail-widgets/relations/helper.tsx b/web/core/components/issues/issue-detail-widgets/relations/helper.tsx index c22dd9308c2..6e68be0d469 100644 --- a/web/core/components/issues/issue-detail-widgets/relations/helper.tsx +++ b/web/core/components/issues/issue-detail-widgets/relations/helper.tsx @@ -2,7 +2,7 @@ import { useMemo } from "react"; import { usePathname } from "next/navigation"; // plane imports -import { EIssueServiceType, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { EIssueServiceType, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue, TIssueServiceType } from "@plane/types"; import { TOAST_TYPE, setToast } from "@plane/ui"; @@ -41,7 +41,7 @@ export const useRelationOperations = ( try { await updateIssue(workspaceSlug, projectId, issueId, data); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -56,7 +56,7 @@ export const useRelationOperations = ( }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -75,14 +75,14 @@ export const useRelationOperations = ( try { return removeIssue(workspaceSlug, projectId, issueId).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, path: pathname, }); }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, path: pathname, }); diff --git a/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx b/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx index a803e503d17..4be7686c2ca 100644 --- a/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx +++ b/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx @@ -9,7 +9,7 @@ import { EIssuesStoreType, EUserPermissions, EUserPermissionsLevel, - WORK_ITEM_EVENT_TRACKER_KEYS, + WORK_ITEM_TRACKER_EVENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; @@ -104,7 +104,7 @@ export const IssueDetailQuickActions: FC = observer((props) => { return deleteIssue(workspaceSlug, projectId, issueId).then(() => { router.push(redirectionPath); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "SUCCESS", element: "Work item detail page" }, path: pathname, }); @@ -116,7 +116,7 @@ export const IssueDetailQuickActions: FC = observer((props) => { message: t("entity.delete.failed", { entity: t("issue.label", { count: 1 }) }), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "FAILED", element: "Work item detail page" }, path: pathname, }); @@ -129,13 +129,13 @@ export const IssueDetailQuickActions: FC = observer((props) => { router.push(`/${workspaceSlug}/projects/${projectId}/archives/issues/${issue.id}`); }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue details page" }, path: pathname, }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "FAILED", element: "Issue details page" }, path: pathname, }); diff --git a/web/core/components/issues/issue-detail/root.tsx b/web/core/components/issues/issue-detail/root.tsx index 77506fe1dad..cbd67904590 100644 --- a/web/core/components/issues/issue-detail/root.tsx +++ b/web/core/components/issues/issue-detail/root.tsx @@ -4,12 +4,7 @@ import { FC, useMemo } from "react"; import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; // types -import { - EIssuesStoreType, - EUserPermissions, - EUserPermissionsLevel, - WORK_ITEM_EVENT_TRACKER_KEYS, -} from "@plane/constants"; +import { EIssuesStoreType, EUserPermissions, EUserPermissionsLevel, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue } from "@plane/types"; // ui @@ -96,7 +91,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await updateIssue(workspaceSlug, projectId, issueId, data); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -107,7 +102,7 @@ export const IssueDetailRoot: FC = observer((props) => { } catch (error) { console.log("Error in updating issue:", error); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: Object.keys(data).join(","), @@ -132,7 +127,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("entity.delete.success", { entity: t("issue.label") }), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, path: pathname, }); @@ -144,7 +139,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("entity.delete.failed", { entity: t("issue.label") }), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, path: pathname, }); @@ -154,14 +149,14 @@ export const IssueDetailRoot: FC = observer((props) => { try { await archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue details page" }, path: pathname, }); } catch (error) { console.log("Error in archiving issue:", error); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "FAILED", element: "Issue details page" }, path: pathname, }); @@ -171,7 +166,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await addCycleToIssue(workspaceSlug, projectId, cycleId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -186,7 +181,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -200,7 +195,7 @@ export const IssueDetailRoot: FC = observer((props) => { try { await addIssueToCycle(workspaceSlug, projectId, cycleId, issueIds); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issueIds, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -215,7 +210,7 @@ export const IssueDetailRoot: FC = observer((props) => { message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -241,7 +236,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); await removeFromCyclePromise; captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -251,7 +246,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "cycle_id", @@ -277,7 +272,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); await removeFromModulePromise; captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -287,7 +282,7 @@ export const IssueDetailRoot: FC = observer((props) => { }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "FAILED", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -306,7 +301,7 @@ export const IssueDetailRoot: FC = observer((props) => { ) => { const promise = await changeModulesInIssue(workspaceSlug, projectId, issueId, addModuleIds, removeModuleIds); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", diff --git a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx index aa2d17ad431..6bf8ed36160 100644 --- a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx +++ b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx @@ -13,7 +13,7 @@ import { EViewAccess, EUserPermissions, EUserPermissionsLevel, - GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS, + GLOBAL_VIEW_TOUR_TRACKER_EVENTS, } from "@plane/constants"; import { IIssueFilterOptions, TStaticViewTypes } from "@plane/types"; //ui @@ -114,7 +114,7 @@ export const GlobalViewsAppliedFiltersRoot = observer((props: Props) => { updateGlobalView(workspaceSlug.toString(), globalViewId.toString(), viewFilters).then((res) => { if (res) - captureEvent(GLOBAL_VIEW_TOUR_EVENT_TRACKER_KEYS.update, { + captureEvent(GLOBAL_VIEW_TOUR_TRACKER_EVENTS.update, { view_id: res.id, applied_filters: res.filters, state: "SUCCESS", diff --git a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx index d75ff196729..d4b29a35d76 100644 --- a/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -13,7 +13,7 @@ import { EIssuesStoreType, EUserPermissions, EUserPermissionsLevel, - WORK_ITEM_EVENT_TRACKER_KEYS, + WORK_ITEM_TRACKER_EVENTS, } from "@plane/constants"; import { DeleteIssueModal } from "@/components/issues"; //constants @@ -210,7 +210,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas setDeleteIssueModal(false); setDraggedIssueId(undefined); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: draggedIssueId, state: "FAILED", element: "Kanban layout drag & drop" }, path: pathname, }); diff --git a/web/core/components/issues/issue-layouts/properties/all-properties.tsx b/web/core/components/issues/issue-layouts/properties/all-properties.tsx index e4e5af5da02..e60a0d1a41d 100644 --- a/web/core/components/issues/issue-layouts/properties/all-properties.tsx +++ b/web/core/components/issues/issue-layouts/properties/all-properties.tsx @@ -7,7 +7,7 @@ import { useParams, usePathname } from "next/navigation"; // icons import { Layers, Link, Paperclip } from "lucide-react"; // types -import { WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; import { TIssue, IIssueDisplayProperties, TIssuePriorities } from "@plane/types"; @@ -109,7 +109,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { state_id: stateId }).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -124,7 +124,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { priority: value }).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -139,7 +139,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { label_ids: ids }).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -154,7 +154,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { assignee_ids: ids }).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -179,7 +179,7 @@ export const IssueProperties: React.FC = observer((props) => { if (modulesToRemove.length > 0) issueOperations.removeModulesFromIssue(modulesToRemove); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { changed_property: "module_ids", change_details: { module_ids: moduleIds } }, @@ -195,7 +195,7 @@ export const IssueProperties: React.FC = observer((props) => { else issueOperations.removeIssueFromCycle?.(); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { changed_property: "cycle", change_details: { cycle_id: cycleId } }, @@ -209,7 +209,7 @@ export const IssueProperties: React.FC = observer((props) => { updateIssue(issue.project_id, issue.id, { start_date: date ? renderFormattedPayloadDate(date) : null }).then( () => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -226,7 +226,7 @@ export const IssueProperties: React.FC = observer((props) => { updateIssue(issue.project_id, issue.id, { target_date: date ? renderFormattedPayloadDate(date) : null }).then( () => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { @@ -242,7 +242,7 @@ export const IssueProperties: React.FC = observer((props) => { if (updateIssue) updateIssue(issue.project_id, issue.id, { estimate_point: value }).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issue, state: "SUCCESS", element: currentLayout }, path: pathname, updates: { diff --git a/web/core/components/issues/issue-layouts/quick-add/root.tsx b/web/core/components/issues/issue-layouts/quick-add/root.tsx index 2f69e66a457..b6cd83e6600 100644 --- a/web/core/components/issues/issue-layouts/quick-add/root.tsx +++ b/web/core/components/issues/issue-layouts/quick-add/root.tsx @@ -6,7 +6,7 @@ import { useParams, usePathname } from "next/navigation"; import { useForm, UseFormRegister } from "react-hook-form"; import { PlusIcon } from "lucide-react"; // plane constants -import { EIssueLayoutTypes, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { EIssueLayoutTypes, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; import { IProject, TIssue } from "@plane/types"; @@ -137,14 +137,14 @@ export const QuickAddIssueRoot: FC = observer((props) => { await quickAddPromise .then((res) => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...res, state: "SUCCESS", element: ` ${layout} quick add` }, path: pathname, }); }) .catch(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...payload, state: "FAILED", element: `${layout} quick ad` }, path: pathname, }); diff --git a/web/core/components/issues/issue-modal/base.tsx b/web/core/components/issues/issue-modal/base.tsx index 5dc7fcf2aea..494eb80e795 100644 --- a/web/core/components/issues/issue-modal/base.tsx +++ b/web/core/components/issues/issue-modal/base.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { useParams, usePathname } from "next/navigation"; -import { EIssuesStoreType, WORK_ITEM_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { EIssuesStoreType, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import type { TBaseIssue, TIssue } from "@plane/types"; @@ -241,7 +241,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( ), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...response, state: "SUCCESS" }, path: pathname, }); @@ -257,7 +257,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: error?.error ?? t(is_draft_issue ? "draft_creation_failed" : "issue_creation_failed"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.create, + eventName: WORK_ITEM_TRACKER_EVENTS.create, payload: { ...payload, state: "FAILED" }, path: pathname, }); @@ -303,7 +303,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: t("issue_updated_successfully"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...payload, issueId: data.id, state: "SUCCESS" }, path: pathname, }); @@ -316,7 +316,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( message: error?.error ?? t("issue_could_not_be_updated"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...payload, state: "FAILED" }, path: pathname, }); diff --git a/web/core/components/issues/peek-overview/root.tsx b/web/core/components/issues/peek-overview/root.tsx index fdacf096f4e..e7a8239028f 100644 --- a/web/core/components/issues/peek-overview/root.tsx +++ b/web/core/components/issues/peek-overview/root.tsx @@ -9,7 +9,7 @@ import { EUserPermissions, EUserPermissionsLevel, EIssueServiceType, - WORK_ITEM_EVENT_TRACKER_KEYS, + WORK_ITEM_TRACKER_EVENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { TIssue, IWorkItemPeekOverview } from "@plane/types"; @@ -82,7 +82,7 @@ export const IssuePeekOverview: FC = observer((props) => .then(async () => { fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...data, issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: Object.keys(data).join(","), @@ -93,7 +93,7 @@ export const IssuePeekOverview: FC = observer((props) => }) .catch(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -109,7 +109,7 @@ export const IssuePeekOverview: FC = observer((props) => try { return issues?.removeIssue(workspaceSlug, projectId, issueId).then(() => { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); @@ -122,7 +122,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("entity.delete.failed", { entity: t("issue.label", { count: 1 }) }), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.delete, + eventName: WORK_ITEM_TRACKER_EVENTS.delete, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -133,13 +133,13 @@ export const IssuePeekOverview: FC = observer((props) => if (!issues?.archiveIssue) return; await issues.archiveIssue(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.archive, + eventName: WORK_ITEM_TRACKER_EVENTS.archive, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -154,7 +154,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.restore.success.message"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.restore, + eventName: WORK_ITEM_TRACKER_EVENTS.restore, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: pathname, }); @@ -165,7 +165,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.restore.failed.message"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.restore, + eventName: WORK_ITEM_TRACKER_EVENTS.restore, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, path: pathname, }); @@ -176,7 +176,7 @@ export const IssuePeekOverview: FC = observer((props) => await issues.addCycleToIssue(workspaceSlug, projectId, cycleId, issueId); fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -191,7 +191,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -205,7 +205,7 @@ export const IssuePeekOverview: FC = observer((props) => try { await issues.addIssueToCycle(workspaceSlug, projectId, cycleId, issueIds); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { ...issueIds, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -220,7 +220,7 @@ export const IssuePeekOverview: FC = observer((props) => message: t("issue.add.cycle.failed"), }); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -247,7 +247,7 @@ export const IssuePeekOverview: FC = observer((props) => await removeFromCyclePromise; fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -257,7 +257,7 @@ export const IssuePeekOverview: FC = observer((props) => }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "cycle_id", @@ -283,7 +283,7 @@ export const IssuePeekOverview: FC = observer((props) => ); fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue detail page" }, updates: { changed_property: "module_id", @@ -310,7 +310,7 @@ export const IssuePeekOverview: FC = observer((props) => await removeFromModulePromise; fetchActivities(workspaceSlug, projectId, issueId); captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, updates: { changed_property: "module_id", @@ -320,7 +320,7 @@ export const IssuePeekOverview: FC = observer((props) => }); } catch { captureIssueEvent({ - eventName: WORK_ITEM_EVENT_TRACKER_KEYS.update, + eventName: WORK_ITEM_TRACKER_EVENTS.update, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, updates: { changed_property: "module_id", diff --git a/web/core/components/modules/analytics-sidebar/root.tsx b/web/core/components/modules/analytics-sidebar/root.tsx index df50fa8d6e6..8142515b083 100644 --- a/web/core/components/modules/analytics-sidebar/root.tsx +++ b/web/core/components/modules/analytics-sidebar/root.tsx @@ -11,7 +11,7 @@ import { EUserPermissions, EUserPermissionsLevel, EEstimateSystem, - MODULE_EVENT_TRACKER_KEYS, + MODULE_TRACKER_EVENTS, } from "@plane/constants"; // plane types import { useTranslation } from "@plane/i18n"; @@ -80,13 +80,13 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { updateModuleDetails(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), data) .then((res) => { captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.update, + eventName: MODULE_TRACKER_EVENTS.update, payload: { ...res, changed_properties: Object.keys(data)[0], element: "Right side-peek", state: "SUCCESS" }, }); }) .catch(() => { captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.update, + eventName: MODULE_TRACKER_EVENTS.update, payload: { ...data, state: "FAILED" }, }); }); @@ -98,7 +98,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { const payload = { metadata: {}, ...formData }; await createModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), payload).then(() => - captureEvent(MODULE_EVENT_TRACKER_KEYS.link.create, { + captureEvent(MODULE_TRACKER_EVENTS.link.create, { module_id: moduleId, state: "SUCCESS", }) @@ -112,7 +112,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { await updateModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), linkId, payload).then( () => - captureEvent(MODULE_EVENT_TRACKER_KEYS.link.update, { + captureEvent(MODULE_TRACKER_EVENTS.link.update, { module_id: moduleId, state: "SUCCESS", }) @@ -124,7 +124,7 @@ export const ModuleAnalyticsSidebar: React.FC = observer((props) => { deleteModuleLink(workspaceSlug.toString(), projectId.toString(), moduleId.toString(), linkId) .then(() => { - captureEvent(MODULE_EVENT_TRACKER_KEYS.link.delete, { + captureEvent(MODULE_TRACKER_EVENTS.link.delete, { module_id: moduleId, state: "SUCCESS", }); diff --git a/web/core/components/modules/delete-module-modal.tsx b/web/core/components/modules/delete-module-modal.tsx index 31c5b1460a3..28128a5840f 100644 --- a/web/core/components/modules/delete-module-modal.tsx +++ b/web/core/components/modules/delete-module-modal.tsx @@ -4,7 +4,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // types -import { MODULE_EVENT_TRACKER_KEYS, PROJECT_ERROR_MESSAGES } from "@plane/constants"; +import { MODULE_TRACKER_EVENTS, PROJECT_ERROR_MESSAGES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import type { IModule } from "@plane/types"; // ui @@ -52,7 +52,7 @@ export const DeleteModuleModal: React.FC = observer((props) => { message: "Module deleted successfully.", }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.delete, + eventName: MODULE_TRACKER_EVENTS.delete, payload: { ...data, state: "SUCCESS" }, }); }) @@ -67,7 +67,7 @@ export const DeleteModuleModal: React.FC = observer((props) => { message: currentError.i18n_message && t(currentError.i18n_message), }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.delete, + eventName: MODULE_TRACKER_EVENTS.delete, payload: { ...data, state: "FAILED" }, }); }) diff --git a/web/core/components/modules/modal.tsx b/web/core/components/modules/modal.tsx index 046c6c6c4a3..f8e8378d67e 100644 --- a/web/core/components/modules/modal.tsx +++ b/web/core/components/modules/modal.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { useForm } from "react-hook-form"; // types -import { MODULE_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { MODULE_TRACKER_EVENTS } from "@plane/constants"; import type { IModule } from "@plane/types"; // ui import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui"; @@ -64,7 +64,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: "Module created successfully.", }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.create, + eventName: MODULE_TRACKER_EVENTS.create, payload: { ...res, state: "SUCCESS" }, }); }) @@ -75,7 +75,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: err?.detail ?? err?.error ?? "Module could not be created. Please try again.", }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.create, + eventName: MODULE_TRACKER_EVENTS.create, payload: { ...data, state: "FAILED" }, }); }); @@ -95,7 +95,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: "Module updated successfully.", }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.update, + eventName: MODULE_TRACKER_EVENTS.update, payload: { ...res, changed_properties: Object.keys(dirtyFields || {}), state: "SUCCESS" }, }); }) @@ -106,7 +106,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { message: err?.detail ?? err?.error ?? "Module could not be updated. Please try again.", }); captureModuleEvent({ - eventName: MODULE_EVENT_TRACKER_KEYS.update, + eventName: MODULE_TRACKER_EVENTS.update, payload: { ...data, state: "FAILED" }, }); }); diff --git a/web/core/components/modules/module-card-item.tsx b/web/core/components/modules/module-card-item.tsx index 680ec3b7cc3..8c8dd33a099 100644 --- a/web/core/components/modules/module-card-item.tsx +++ b/web/core/components/modules/module-card-item.tsx @@ -12,7 +12,7 @@ import { EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN, - MODULE_EVENT_TRACKER_KEYS, + MODULE_TRACKER_EVENTS, } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { IModule } from "@plane/types"; @@ -79,7 +79,7 @@ export const ModuleCardItem: React.FC = observer((props) => { const addToFavoritePromise = addModuleToFavorites(workspaceSlug.toString(), projectId.toString(), moduleId).then( () => { if (!storedValue) toggleFavoriteMenu(true); - captureEvent(MODULE_EVENT_TRACKER_KEYS.favorite, { + captureEvent(MODULE_TRACKER_EVENTS.favorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", @@ -110,7 +110,7 @@ export const ModuleCardItem: React.FC = observer((props) => { projectId.toString(), moduleId ).then(() => { - captureEvent(MODULE_EVENT_TRACKER_KEYS.unfavorite, { + captureEvent(MODULE_TRACKER_EVENTS.unfavorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", diff --git a/web/core/components/modules/module-list-item-action.tsx b/web/core/components/modules/module-list-item-action.tsx index 719aed30ac3..c9ac57da5a3 100644 --- a/web/core/components/modules/module-list-item-action.tsx +++ b/web/core/components/modules/module-list-item-action.tsx @@ -11,7 +11,7 @@ import { EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN, - MODULE_EVENT_TRACKER_KEYS, + MODULE_TRACKER_EVENTS, } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; @@ -68,7 +68,7 @@ export const ModuleListItemAction: FC = observer((props) => { () => { // open favorites menu if closed if (!storedValue) toggleFavoriteMenu(true); - captureEvent(MODULE_EVENT_TRACKER_KEYS.favorite, { + captureEvent(MODULE_TRACKER_EVENTS.favorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", @@ -99,7 +99,7 @@ export const ModuleListItemAction: FC = observer((props) => { projectId.toString(), moduleId ).then(() => { - captureEvent(MODULE_EVENT_TRACKER_KEYS.unfavorite, { + captureEvent(MODULE_TRACKER_EVENTS.unfavorite, { module_id: moduleId, element: "Grid layout", state: "SUCCESS", diff --git a/web/core/components/onboarding/create-workspace.tsx b/web/core/components/onboarding/create-workspace.tsx index 38d688104fa..157beec74a9 100644 --- a/web/core/components/onboarding/create-workspace.tsx +++ b/web/core/components/onboarding/create-workspace.tsx @@ -5,10 +5,10 @@ import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; // constants import { - ONBOARDING_EVENT_TRACKER_KEYS, + ONBOARDING_TRACKER_EVENTS, ORGANIZATION_SIZE, RESTRICTED_URLS, - WORKSPACE_EVENT_TRACKER_KEYS, + WORKSPACE_TRACKER_EVENTS, } from "@plane/constants"; // types import { useTranslation } from "@plane/i18n"; @@ -74,12 +74,12 @@ export const CreateWorkspace: React.FC = observer((props) => { message: t("workspace_creation.toast.success.message"), }); captureWorkspaceEvent({ - eventName: WORKSPACE_EVENT_TRACKER_KEYS.create, + eventName: WORKSPACE_TRACKER_EVENTS.create, payload: { ...workspaceResponse, state: "SUCCESS", first_time: true, - element: ONBOARDING_EVENT_TRACKER_KEYS.root, + element: ONBOARDING_TRACKER_EVENTS.root, }, }); await fetchWorkspaces(); @@ -87,11 +87,11 @@ export const CreateWorkspace: React.FC = observer((props) => { }) .catch(() => { captureWorkspaceEvent({ - eventName: WORKSPACE_EVENT_TRACKER_KEYS.create, + eventName: WORKSPACE_TRACKER_EVENTS.create, payload: { state: "FAILED", first_time: true, - element: ONBOARDING_EVENT_TRACKER_KEYS.root, + element: ONBOARDING_TRACKER_EVENTS.root, }, }); setToast({ diff --git a/web/core/components/onboarding/invitations.tsx b/web/core/components/onboarding/invitations.tsx index bd3d3d97889..349b9143101 100644 --- a/web/core/components/onboarding/invitations.tsx +++ b/web/core/components/onboarding/invitations.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; // plane imports -import { ROLE, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { ROLE, MEMBER_TRACKER_EVENTS } from "@plane/constants"; // types import { IWorkspaceMemberInvitation } from "@plane/types"; // ui @@ -50,7 +50,7 @@ export const Invitations: React.FC = (props) => { try { await workspaceService.joinWorkspaces({ invitations: invitationsRespond }); - captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { + captureEvent(MEMBER_TRACKER_EVENTS.accept, { member_id: invitation?.id, role: getUserRole(invitation?.role as any), project_id: undefined, @@ -63,7 +63,7 @@ export const Invitations: React.FC = (props) => { await handleNextStep(); } catch (error) { console.error(error); - captureEvent(MEMBER_EVENT_TRACKER_KEYS.accept, { + captureEvent(MEMBER_TRACKER_EVENTS.accept, { member_id: invitation?.id, role: getUserRole(invitation?.role as any), project_id: undefined, diff --git a/web/core/components/onboarding/invite-members.tsx b/web/core/components/onboarding/invite-members.tsx index a6e9f6d7c9b..6865b78565b 100644 --- a/web/core/components/onboarding/invite-members.tsx +++ b/web/core/components/onboarding/invite-members.tsx @@ -20,7 +20,7 @@ import { usePopper } from "react-popper"; import { Check, ChevronDown, Plus, XCircle } from "lucide-react"; import { Listbox } from "@headlessui/react"; // plane imports -import { ROLE, ROLE_DETAILS, EUserPermissions, MEMBER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { ROLE, ROLE_DETAILS, EUserPermissions, MEMBER_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import { IUser, IWorkspace } from "@plane/types"; @@ -311,7 +311,7 @@ export const InviteMembers: React.FC = (props) => { })), }) .then(async () => { - captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { + captureEvent(MEMBER_TRACKER_EVENTS.invite, { emails: [ ...payload.emails.map((email) => ({ email: email.email, @@ -331,7 +331,7 @@ export const InviteMembers: React.FC = (props) => { await nextStep(); }) .catch((err) => { - captureEvent(MEMBER_EVENT_TRACKER_KEYS.invite, { + captureEvent(MEMBER_TRACKER_EVENTS.invite, { project_id: undefined, state: "FAILED", element: "Onboarding", diff --git a/web/core/components/onboarding/profile-setup.tsx b/web/core/components/onboarding/profile-setup.tsx index 99a71e581de..68c4d7c05a0 100644 --- a/web/core/components/onboarding/profile-setup.tsx +++ b/web/core/components/onboarding/profile-setup.tsx @@ -6,7 +6,7 @@ import Image from "next/image"; import { useTheme } from "next-themes"; import { Controller, useForm } from "react-hook-form"; import { Eye, EyeOff } from "lucide-react"; -import { E_PASSWORD_STRENGTH, ONBOARDING_EVENT_TRACKER_KEYS, USER_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { E_PASSWORD_STRENGTH, ONBOARDING_TRACKER_EVENTS, USER_TRACKER_EVENTS } from "@plane/constants"; // types import { useTranslation } from "@plane/i18n"; import { IUser, TUserProfile, TOnboardingSteps } from "@plane/types"; @@ -143,11 +143,11 @@ export const ProfileSetup: React.FC = observer((props) => { updateUserProfile(profileUpdatePayload), totalSteps > 2 && stepChange({ profile_complete: true }), ]); - captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { + captureEvent(USER_TRACKER_EVENTS.add_details, { use_case: formData.use_case, role: formData.role, state: "SUCCESS", - element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, + element: ONBOARDING_TRACKER_EVENTS.step_1, }); setToast({ type: TOAST_TYPE.SUCCESS, @@ -159,9 +159,9 @@ export const ProfileSetup: React.FC = observer((props) => { finishOnboarding(); } } catch { - captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { + captureEvent(USER_TRACKER_EVENTS.add_details, { state: "FAILED", - element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, + element: ONBOARDING_TRACKER_EVENTS.step_1, }); setToast({ type: TOAST_TYPE.ERROR, @@ -183,9 +183,9 @@ export const ProfileSetup: React.FC = observer((props) => { formData.password && handleSetPassword(formData.password), ]).then(() => setProfileSetupStep(EProfileSetupSteps.USER_PERSONALIZATION)); } catch { - captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { + captureEvent(USER_TRACKER_EVENTS.add_details, { state: "FAILED", - element: ONBOARDING_EVENT_TRACKER_KEYS.step_1, + element: ONBOARDING_TRACKER_EVENTS.step_1, }); setToast({ type: TOAST_TYPE.ERROR, @@ -205,11 +205,11 @@ export const ProfileSetup: React.FC = observer((props) => { updateUserProfile(profileUpdatePayload), totalSteps > 2 && stepChange({ profile_complete: true }), ]); - captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { + captureEvent(USER_TRACKER_EVENTS.add_details, { use_case: formData.use_case, role: formData.role, state: "SUCCESS", - element: ONBOARDING_EVENT_TRACKER_KEYS.step_2, + element: ONBOARDING_TRACKER_EVENTS.step_2, }); setToast({ type: TOAST_TYPE.SUCCESS, @@ -221,9 +221,9 @@ export const ProfileSetup: React.FC = observer((props) => { finishOnboarding(); } } catch { - captureEvent(USER_EVENT_TRACKER_KEYS.add_details, { + captureEvent(USER_TRACKER_EVENTS.add_details, { state: "FAILED", - element: ONBOARDING_EVENT_TRACKER_KEYS.step_2, + element: ONBOARDING_TRACKER_EVENTS.step_2, }); setToast({ type: TOAST_TYPE.ERROR, diff --git a/web/core/components/onboarding/tour/root.tsx b/web/core/components/onboarding/tour/root.tsx index fd34c2d0130..90a183e0b3f 100644 --- a/web/core/components/onboarding/tour/root.tsx +++ b/web/core/components/onboarding/tour/root.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import Image, { StaticImageData } from "next/image"; import { X } from "lucide-react"; // ui -import { PRODUCT_TOUR_EVENT_TRACKER_KEYS } from "@plane/constants"; +import { PRODUCT_TOUR_TRACKER_EVENTS } from "@plane/constants"; import { Button } from "@plane/ui"; // components import { TourSidebar } from "@/components/onboarding"; @@ -112,7 +112,7 @@ export const TourRoot: React.FC = observer((props) => {