-
@@ -417,11 +403,7 @@ export const ProfileForm = observer(function ProfileForm(props: TProfileFormProp
{t("deactivate_account_description")}
- setDeactivateAccountModal(true)}
- data-ph-element={PROFILE_SETTINGS_TRACKER_ELEMENTS.DEACTIVATE_ACCOUNT_BUTTON}
- >
+ setDeactivateAccountModal(true)}>
{t("deactivate_account")}
diff --git a/apps/web/core/components/profile/notification/email-notification-form.tsx b/apps/web/core/components/profile/notification/email-notification-form.tsx
index 39e9d382cb..8ab4fac880 100644
--- a/apps/web/core/components/profile/notification/email-notification-form.tsx
+++ b/apps/web/core/components/profile/notification/email-notification-form.tsx
@@ -1,14 +1,11 @@
-import type { FC } from "react";
-import React, { useEffect } from "react";
+import { useEffect } from "react";
import { Controller, useForm } from "react-hook-form";
-import { PROFILE_SETTINGS_TRACKER_ELEMENTS, PROFILE_SETTINGS_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IUserEmailNotificationSettings } from "@plane/types";
// ui
import { ToggleSwitch } from "@plane/ui";
// services
-import { captureClick, captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { UserService } from "@/services/user.service";
// types
interface IEmailNotificationFormProps {
@@ -33,25 +30,12 @@ export function EmailNotificationForm(props: IEmailNotificationFormProps) {
await userService.updateCurrentUserEmailNotificationSettings({
[key]: value,
});
- captureSuccess({
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.notifications_updated,
- payload: {
- [key]: value,
- },
- });
setToast({
title: t("success"),
type: TOAST_TYPE.SUCCESS,
message: t("email_notification_setting_updated_successfully"),
});
- } catch (err) {
- console.error(err);
- captureError({
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.notifications_updated,
- payload: {
- [key]: value,
- },
- });
+ } catch (_error) {
setToast({
title: t("error"),
type: TOAST_TYPE.ERROR,
@@ -82,9 +66,6 @@ export function EmailNotificationForm(props: IEmailNotificationFormProps) {
value={value}
onChange={(newValue) => {
onChange(newValue);
- captureClick({
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.PROPERTY_CHANGES_TOGGLE,
- });
handleSettingChange("property_change", newValue);
}}
size="sm"
@@ -107,9 +88,6 @@ export function EmailNotificationForm(props: IEmailNotificationFormProps) {
value={value}
onChange={(newValue) => {
onChange(newValue);
- captureClick({
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.STATE_CHANGES_TOGGLE,
- });
handleSettingChange("state_change", newValue);
}}
size="sm"
@@ -154,9 +132,6 @@ export function EmailNotificationForm(props: IEmailNotificationFormProps) {
value={value}
onChange={(newValue) => {
onChange(newValue);
- captureClick({
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.COMMENTS_TOGGLE,
- });
handleSettingChange("comment", newValue);
}}
size="sm"
@@ -179,9 +154,6 @@ export function EmailNotificationForm(props: IEmailNotificationFormProps) {
value={value}
onChange={(newValue) => {
onChange(newValue);
- captureClick({
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.MENTIONS_TOGGLE,
- });
handleSettingChange("mention", newValue);
}}
size="sm"
diff --git a/apps/web/core/components/profile/preferences/language-timezone.tsx b/apps/web/core/components/profile/preferences/language-timezone.tsx
index 677ae2bcbd..ef2de25298 100644
--- a/apps/web/core/components/profile/preferences/language-timezone.tsx
+++ b/apps/web/core/components/profile/preferences/language-timezone.tsx
@@ -1,10 +1,8 @@
import { observer } from "mobx-react";
-import { PROFILE_SETTINGS_TRACKER_ELEMENTS, PROFILE_SETTINGS_TRACKER_EVENTS } from "@plane/constants";
import { SUPPORTED_LANGUAGES, useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import { CustomSelect } from "@plane/ui";
import { TimezoneSelect } from "@/components/global";
-import { captureElementAndEvent } from "@/helpers/event-tracker.helper";
import { useUser, useUserProfile } from "@/hooks/store/user";
export const LanguageTimezone = observer(function LanguageTimezone() {
@@ -17,81 +15,38 @@ export const LanguageTimezone = observer(function LanguageTimezone() {
const { updateUserProfile } = useUserProfile();
const { t } = useTranslation();
- const handleTimezoneChange = (value: string) => {
- updateCurrentUser({ user_timezone: value })
- .then(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.TIMEZONE_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.timezone_updated,
- payload: {
- timezone: value,
- },
- state: "SUCCESS",
- },
- });
- setToast({
- title: "Success!",
- message: "Timezone updated successfully",
- type: TOAST_TYPE.SUCCESS,
- });
- })
- .catch(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.TIMEZONE_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.timezone_updated,
- state: "ERROR",
- },
- });
- setToast({
- title: "Error!",
- message: "Failed to update timezone",
- type: TOAST_TYPE.ERROR,
- });
+ const handleTimezoneChange = async (value: string) => {
+ try {
+ await updateCurrentUser({ user_timezone: value });
+ setToast({
+ title: "Success!",
+ message: "Timezone updated successfully",
+ type: TOAST_TYPE.SUCCESS,
});
+ } catch (_error) {
+ setToast({
+ title: "Error!",
+ message: "Failed to update timezone",
+ type: TOAST_TYPE.ERROR,
+ });
+ }
};
- const handleLanguageChange = (value: string) => {
- updateUserProfile({ language: value })
- .then(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.LANGUAGE_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.language_updated,
- payload: {
- language: value,
- },
- state: "SUCCESS",
- },
- });
- setToast({
- title: "Success!",
- message: "Language updated successfully",
- type: TOAST_TYPE.SUCCESS,
- });
- })
- .catch(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.LANGUAGE_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.language_updated,
- state: "ERROR",
- },
- });
- setToast({
- title: "Error!",
- message: "Failed to update language",
- type: TOAST_TYPE.ERROR,
- });
+
+ const handleLanguageChange = async (value: string) => {
+ try {
+ await updateUserProfile({ language: value });
+ setToast({
+ title: "Success!",
+ message: "Language updated successfully",
+ type: TOAST_TYPE.SUCCESS,
});
+ } catch (_error) {
+ setToast({
+ title: "Error!",
+ message: "Failed to update language",
+ type: TOAST_TYPE.ERROR,
+ });
+ }
};
const getLanguageLabel = (value: string) => {
diff --git a/apps/web/core/components/profile/start-of-week-preference.tsx b/apps/web/core/components/profile/start-of-week-preference.tsx
index 259e570a7f..d95a0857be 100644
--- a/apps/web/core/components/profile/start-of-week-preference.tsx
+++ b/apps/web/core/components/profile/start-of-week-preference.tsx
@@ -1,16 +1,10 @@
-import React from "react";
import { observer } from "mobx-react";
// plane imports
-import {
- PROFILE_SETTINGS_TRACKER_ELEMENTS,
- PROFILE_SETTINGS_TRACKER_EVENTS,
- START_OF_THE_WEEK_OPTIONS,
-} from "@plane/constants";
+import { START_OF_THE_WEEK_OPTIONS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { EStartOfTheWeek } from "@plane/types";
import { CustomSelect } from "@plane/ui";
// hooks
-import { captureElementAndEvent } from "@/helpers/event-tracker.helper";
import { useUserProfile } from "@/hooks/store/user";
import { PreferencesSection } from "../preferences/section";
@@ -23,6 +17,15 @@ export const StartOfWeekPreference = observer(function StartOfWeekPreference(pro
// hooks
const { data: userProfile, updateUserProfile } = useUserProfile();
+ const handleStartOfWeekChange = async (val: number) => {
+ try {
+ await updateUserProfile({ start_of_the_week: val });
+ setToast({ type: TOAST_TYPE.SUCCESS, title: "Success", message: "First day of the week updated successfully" });
+ } catch (_error) {
+ setToast({ type: TOAST_TYPE.ERROR, title: "Update failed", message: "Please try again later." });
+ }
+ };
+
return (
{
- updateUserProfile({ start_of_the_week: val })
- .then(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.FIRST_DAY_OF_WEEK_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.first_day_updated,
- payload: {
- start_of_the_week: val,
- },
- state: "SUCCESS",
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success",
- message: "First day of the week updated successfully",
- });
- })
- .catch(() => {
- captureElementAndEvent({
- element: {
- elementName: PROFILE_SETTINGS_TRACKER_ELEMENTS.FIRST_DAY_OF_WEEK_DROPDOWN,
- },
- event: {
- eventName: PROFILE_SETTINGS_TRACKER_EVENTS.first_day_updated,
- state: "ERROR",
- },
- });
- setToast({ type: TOAST_TYPE.ERROR, title: "Update failed", message: "Please try again later." });
- });
- }}
+ onChange={handleStartOfWeekChange}
input
maxHeight="lg"
>
diff --git a/apps/web/core/components/project-states/create-update/create.tsx b/apps/web/core/components/project-states/create-update/create.tsx
index 7cded141b5..a47eaed264 100644
--- a/apps/web/core/components/project-states/create-update/create.tsx
+++ b/apps/web/core/components/project-states/create-update/create.tsx
@@ -1,22 +1,20 @@
import { useState } from "react";
import { observer } from "mobx-react";
-import { STATE_TRACKER_EVENTS, STATE_GROUPS } from "@plane/constants";
+import { STATE_GROUPS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IState, TStateGroups, TStateOperationsCallbacks } from "@plane/types";
// components
import { StateForm } from "@/components/project-states";
-// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
type TStateCreate = {
groupKey: TStateGroups;
- shouldTrackEvents: boolean;
+ shouldTrackEvents?: boolean;
createStateCallback: TStateOperationsCallbacks["createState"];
handleClose: () => void;
};
export const StateCreate = observer(function StateCreate(props: TStateCreate) {
- const { groupKey, shouldTrackEvents, createStateCallback, handleClose } = props;
+ const { groupKey, createStateCallback, handleClose } = props;
// states
const [loader, setLoader] = useState(false);
@@ -31,14 +29,7 @@ export const StateCreate = observer(function StateCreate(props: TStateCreate) {
try {
const response = await createStateCallback({ ...formData, group: groupKey });
- if (shouldTrackEvents)
- captureSuccess({
- eventName: STATE_TRACKER_EVENTS.create,
- payload: {
- state_group: groupKey,
- id: response.id,
- },
- });
+
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
@@ -48,13 +39,6 @@ export const StateCreate = observer(function StateCreate(props: TStateCreate) {
return { status: "success" };
} catch (error) {
const errorStatus = error as { status: number; data: { error: string } };
- if (shouldTrackEvents)
- captureError({
- eventName: STATE_TRACKER_EVENTS.create,
- payload: {
- state_group: groupKey,
- },
- });
if (errorStatus?.status === 400) {
setToast({
type: TOAST_TYPE.ERROR,
diff --git a/apps/web/core/components/project-states/create-update/update.tsx b/apps/web/core/components/project-states/create-update/update.tsx
index a71e913e9e..beeec8ef25 100644
--- a/apps/web/core/components/project-states/create-update/update.tsx
+++ b/apps/web/core/components/project-states/create-update/update.tsx
@@ -1,12 +1,9 @@
import { useState } from "react";
import { observer } from "mobx-react";
-import { STATE_TRACKER_EVENTS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IState, TStateOperationsCallbacks } from "@plane/types";
// components
import { StateForm } from "@/components/project-states";
-// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
type TStateUpdate = {
state: IState;
@@ -16,7 +13,7 @@ type TStateUpdate = {
};
export const StateUpdate = observer(function StateUpdate(props: TStateUpdate) {
- const { state, updateStateCallback, shouldTrackEvents, handleClose } = props;
+ const { state, updateStateCallback, handleClose } = props;
// states
const [loader, setLoader] = useState(false);
@@ -30,15 +27,6 @@ export const StateUpdate = observer(function StateUpdate(props: TStateUpdate) {
try {
await updateStateCallback(state.id, formData);
- if (shouldTrackEvents) {
- captureSuccess({
- eventName: STATE_TRACKER_EVENTS.update,
- payload: {
- state_group: state.group,
- id: state.id,
- },
- });
- }
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
@@ -61,15 +49,6 @@ export const StateUpdate = observer(function StateUpdate(props: TStateUpdate) {
title: "Error!",
message: "State could not be updated. Please try again.",
});
- if (shouldTrackEvents) {
- captureError({
- eventName: STATE_TRACKER_EVENTS.update,
- payload: {
- state_group: state.group,
- id: state.id,
- },
- });
- }
return { status: "error" };
}
}
diff --git a/apps/web/core/components/project-states/options/delete.tsx b/apps/web/core/components/project-states/options/delete.tsx
index dc554012bb..7048bf4b1e 100644
--- a/apps/web/core/components/project-states/options/delete.tsx
+++ b/apps/web/core/components/project-states/options/delete.tsx
@@ -1,7 +1,6 @@
import { useState } from "react";
import { observer } from "mobx-react";
import { Loader } from "lucide-react";
-import { STATE_TRACKER_EVENTS, STATE_TRACKER_ELEMENTS } from "@plane/constants";
import { CloseIcon } from "@plane/propel/icons";
// plane imports
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
@@ -10,18 +9,17 @@ import type { IState, TStateOperationsCallbacks } from "@plane/types";
import { AlertModalCore } from "@plane/ui";
import { cn } from "@plane/utils";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { usePlatformOS } from "@/hooks/use-platform-os";
type TStateDelete = {
totalStates: number;
state: IState;
deleteStateCallback: TStateOperationsCallbacks["deleteState"];
- shouldTrackEvents: boolean;
+ shouldTrackEvents?: boolean;
};
export const StateDelete = observer(function StateDelete(props: TStateDelete) {
- const { totalStates, state, deleteStateCallback, shouldTrackEvents } = props;
+ const { totalStates, state, deleteStateCallback } = props;
// hooks
const { isMobile } = usePlatformOS();
// states
@@ -37,26 +35,9 @@ export const StateDelete = observer(function StateDelete(props: TStateDelete) {
try {
await deleteStateCallback(state.id);
- if (shouldTrackEvents) {
- captureSuccess({
- eventName: STATE_TRACKER_EVENTS.delete,
- payload: {
- id: state.id,
- },
- });
- }
-
setIsDelete(false);
} catch (error) {
const errorStatus = error as { status: number; data: { error: string } };
- if (shouldTrackEvents) {
- captureError({
- eventName: STATE_TRACKER_EVENTS.delete,
- payload: {
- id: state.id,
- },
- });
- }
if (errorStatus.status === 400) {
setToast({
type: TOAST_TYPE.ERROR,
@@ -99,7 +80,6 @@ export const StateDelete = observer(function StateDelete(props: TStateDelete) {
)}
disabled={isDeleteDisabled}
onClick={() => setIsDeleteModal(true)}
- data-ph-element={STATE_TRACKER_ELEMENTS.STATE_LIST_DELETE_BUTTON}
>
{
- captureSuccess({
- eventName: STATE_TRACKER_EVENTS.delete,
- payload: {
- id: data.id,
- },
- });
handleClose();
})
.catch((err) => {
@@ -60,12 +51,6 @@ export const StateDeleteModal = observer(function StateDeleteModal(props: TState
title: "Error!",
message: "State could not be deleted. Please try again.",
});
- captureError({
- eventName: STATE_TRACKER_EVENTS.delete,
- payload: {
- id: data.id,
- },
- });
})
.finally(() => {
setIsDeleteLoading(false);
diff --git a/apps/web/core/components/project/card-list.tsx b/apps/web/core/components/project/card-list.tsx
index 24efb4802e..01e7842379 100644
--- a/apps/web/core/components/project/card-list.tsx
+++ b/apps/web/core/components/project/card-list.tsx
@@ -1,13 +1,12 @@
import { observer } from "mobx-react";
// plane imports
-import { EUserPermissionsLevel, EUserPermissions, PROJECT_TRACKER_ELEMENTS } from "@plane/constants";
+import { EUserPermissionsLevel, EUserPermissions } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { EmptyStateDetailed } from "@plane/propel/empty-state";
import { ContentWrapper } from "@plane/ui";
// components
import { calculateTotalFilters } from "@plane/utils";
import { ProjectsLoader } from "@/components/ui/loader/projects-loader";
-import { captureClick } from "@/helpers/event-tracker.helper";
// hooks
import { useCommandPalette } from "@/hooks/store/use-command-palette";
import { useProject } from "@/hooks/store/use-project";
@@ -62,7 +61,6 @@ export const ProjectCardList = observer(function ProjectCardList(props: TProject
label: t("workspace_projects.empty_state.general.primary_button.text"),
onClick: () => {
toggleCreateProjectModal(true);
- captureClick({ elementName: PROJECT_TRACKER_ELEMENTS.EMPTY_STATE_CREATE_PROJECT_BUTTON });
},
disabled: !canPerformEmptyStateActions,
variant: "primary",
diff --git a/apps/web/core/components/project/create/header.tsx b/apps/web/core/components/project/create/header.tsx
index abbaf259bc..3e6c1384cc 100644
--- a/apps/web/core/components/project/create/header.tsx
+++ b/apps/web/core/components/project/create/header.tsx
@@ -55,7 +55,7 @@ function ProjectCreateHeader(props: Props) {
)}
{isClosable && (
-
+
diff --git a/apps/web/core/components/project/delete-project-modal.tsx b/apps/web/core/components/project/delete-project-modal.tsx
index 8b4f33f39f..3a0276fee9 100644
--- a/apps/web/core/components/project/delete-project-modal.tsx
+++ b/apps/web/core/components/project/delete-project-modal.tsx
@@ -1,16 +1,12 @@
import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form";
import { AlertTriangle } from "lucide-react";
-// types
-import { PROJECT_TRACKER_EVENTS } from "@plane/constants";
+// Plane imports
import { Button } from "@plane/propel/button";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IProject } from "@plane/types";
-// ui
import { Input, EModalPosition, EModalWidth, ModalCore } from "@plane/ui";
-// constants
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useProject } from "@/hooks/store/use-project";
import { useAppRouter } from "@/hooks/use-app-router";
@@ -55,36 +51,22 @@ export function DeleteProjectModal(props: DeleteProjectModal) {
const onSubmit = async () => {
if (!workspaceSlug || !canDelete) return;
- await deleteProject(workspaceSlug.toString(), project.id)
- .then(() => {
- if (projectId && projectId.toString() === project.id) router.push(`/${workspaceSlug}/projects`);
-
- handleClose();
- captureSuccess({
- eventName: PROJECT_TRACKER_EVENTS.delete,
- payload: {
- id: project.id,
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "Project deleted successfully.",
- });
- })
- .catch(() => {
- captureError({
- eventName: PROJECT_TRACKER_EVENTS.delete,
- payload: {
- id: project.id,
- },
- });
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: "Something went wrong. Please try again later.",
- });
+ try {
+ await deleteProject(workspaceSlug.toString(), project.id);
+ if (projectId && projectId.toString() === project.id) router.push(`/${workspaceSlug}/projects`);
+ handleClose();
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "Project deleted successfully.",
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Something went wrong. Please try again later.",
+ });
+ }
};
return (
diff --git a/apps/web/core/components/project/form.tsx b/apps/web/core/components/project/form.tsx
index cc405aaab6..634275c40f 100644
--- a/apps/web/core/components/project/form.tsx
+++ b/apps/web/core/components/project/form.tsx
@@ -1,7 +1,7 @@
import { useEffect, useState } from "react";
import { Controller, useForm } from "react-hook-form";
import { Info } from "lucide-react";
-import { NETWORK_CHOICES, PROJECT_TRACKER_ELEMENTS, PROJECT_TRACKER_EVENTS } from "@plane/constants";
+import { NETWORK_CHOICES } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
// plane imports
import { Button } from "@plane/propel/button";
@@ -18,7 +18,6 @@ import { ImagePickerPopover } from "@/components/core/image-picker-popover";
import { TimezoneSelect } from "@/components/global";
// helpers
import { handleCoverImageChange } from "@/helpers/cover-image.helper";
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useProject } from "@/hooks/store/use-project";
import { usePlatformOS } from "@/hooks/use-platform-os";
@@ -87,12 +86,6 @@ export function ProjectDetailsForm(props: IProjectDetailsForm) {
if (!workspaceSlug || !project) return;
return updateProject(workspaceSlug.toString(), project.id, payload)
.then(() => {
- captureSuccess({
- eventName: PROJECT_TRACKER_EVENTS.update,
- payload: {
- id: projectId,
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: t("toast.success"),
@@ -101,13 +94,6 @@ export function ProjectDetailsForm(props: IProjectDetailsForm) {
})
.catch((err) => {
try {
- captureError({
- eventName: PROJECT_TRACKER_EVENTS.update,
- payload: {
- id: projectId,
- },
- });
-
// Handle the new error format where codes are nested in arrays under field names
const errorData = err ?? {};
@@ -437,14 +423,7 @@ export function ProjectDetailsForm(props: IProjectDetailsForm) {
<>
-
+
{isLoading ? t("updating") : t("common.update_project")}
diff --git a/apps/web/core/components/project/leave-project-modal.tsx b/apps/web/core/components/project/leave-project-modal.tsx
index 20a81e9f65..202a43f38c 100644
--- a/apps/web/core/components/project/leave-project-modal.tsx
+++ b/apps/web/core/components/project/leave-project-modal.tsx
@@ -1,18 +1,13 @@
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
import { Controller, useForm } from "react-hook-form";
-// headless ui
import { AlertTriangleIcon } from "lucide-react";
-// types
-import { MEMBER_TRACKER_EVENTS } from "@plane/constants";
+// Plane imports
import { Button } from "@plane/propel/button";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IProject } from "@plane/types";
-// ui
import { Input, EModalPosition, EModalWidth, ModalCore } from "@plane/ui";
-// constants
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useUserPermissions } from "@/hooks/store/user";
import { useAppRouter } from "@/hooks/use-app-router";
@@ -62,21 +57,8 @@ export const LeaveProjectModal = observer(function LeaveProjectModal(props: ILea
return leaveProject(workspaceSlug.toString(), project.id)
.then(() => {
handleClose();
- captureSuccess({
- eventName: MEMBER_TRACKER_EVENTS.project.leave,
- payload: {
- project: project.id,
- },
- });
})
.catch((err) => {
- captureError({
- eventName: MEMBER_TRACKER_EVENTS.project.leave,
- payload: {
- project: project.id,
- },
- error: err,
- });
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
diff --git a/apps/web/core/components/project/member-list-item.tsx b/apps/web/core/components/project/member-list-item.tsx
index b3589a74ca..4955f85c48 100644
--- a/apps/web/core/components/project/member-list-item.tsx
+++ b/apps/web/core/components/project/member-list-item.tsx
@@ -1,10 +1,7 @@
import { observer } from "mobx-react";
// plane imports
-import { MEMBER_TRACKER_EVENTS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import { Table } from "@plane/ui";
-// helpers
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useMember } from "@/hooks/store/use-member";
import { useUser, useUserPermissions } from "@/hooks/store/user";
@@ -45,21 +42,8 @@ export const ProjectMemberListItem = observer(function ProjectMemberListItem(pro
await leaveProject(workspaceSlug.toString(), projectId.toString())
.then(async () => {
router.push(`/${workspaceSlug}/projects`);
- captureSuccess({
- eventName: MEMBER_TRACKER_EVENTS.project.leave,
- payload: {
- project: projectId,
- },
- });
})
.catch((err) => {
- captureError({
- eventName: MEMBER_TRACKER_EVENTS.project.leave,
- payload: {
- project: projectId,
- },
- error: err,
- });
setToast({
type: TOAST_TYPE.ERROR,
title: "You can’t leave this project yet.",
diff --git a/apps/web/core/components/project/send-project-invitation-modal.tsx b/apps/web/core/components/project/send-project-invitation-modal.tsx
index 8b1391da88..e2b8ef68e1 100644
--- a/apps/web/core/components/project/send-project-invitation-modal.tsx
+++ b/apps/web/core/components/project/send-project-invitation-modal.tsx
@@ -2,7 +2,7 @@ import React, { useEffect } from "react";
import { observer } from "mobx-react";
import { useForm, Controller, useFieldArray } from "react-hook-form";
// plane imports
-import { ROLE, EUserPermissions, MEMBER_TRACKER_EVENTS } from "@plane/constants";
+import { ROLE, EUserPermissions } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Button } from "@plane/propel/button";
import { PlusIcon, CloseIcon, ChevronDownIcon } from "@plane/propel/icons";
@@ -11,7 +11,6 @@ import { Avatar, CustomSelect, CustomSearchSelect, EModalPosition, EModalWidth,
// helpers
import { getFileURL } from "@plane/utils";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useMember } from "@/hooks/store/use-member";
import { useUserPermissions } from "@/hooks/store/user";
@@ -86,23 +85,9 @@ export const SendProjectInvitationModal = observer(function SendProjectInvitatio
type: TOAST_TYPE.SUCCESS,
message: "Members added successfully.",
});
-
- captureSuccess({
- eventName: MEMBER_TRACKER_EVENTS.project.add,
- payload: {
- members: [...payload.members.map((member) => member.member_id)],
- },
- });
})
.catch((error) => {
console.error(error);
- captureError({
- eventName: MEMBER_TRACKER_EVENTS.project.add,
- payload: {
- members: [...payload.members.map((member) => member.member_id)],
- },
- error: error,
- });
})
.finally(() => {
reset(defaultValues);
diff --git a/apps/web/core/components/project/settings/features-list.tsx b/apps/web/core/components/project/settings/features-list.tsx
index a2fa4ccdef..fcfab32ae0 100644
--- a/apps/web/core/components/project/settings/features-list.tsx
+++ b/apps/web/core/components/project/settings/features-list.tsx
@@ -1,14 +1,11 @@
import { observer } from "mobx-react";
// plane imports
-import { PROJECT_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { setPromiseToast } from "@plane/propel/toast";
import { Tooltip } from "@plane/propel/tooltip";
import type { IProject } from "@plane/types";
// components
import { SettingsHeading } from "@/components/settings/heading";
-// helpers
-import { captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useProject } from "@/hooks/store/use-project";
import { useUser } from "@/hooks/store/user";
@@ -53,12 +50,6 @@ export const ProjectFeaturesList = observer(function ProjectFeaturesList(props:
},
});
void updateProjectPromise.then(() => {
- captureSuccess({
- eventName: PROJECT_TRACKER_EVENTS.feature_toggled,
- payload: {
- feature_key: featureKey,
- },
- });
return undefined;
});
};
diff --git a/apps/web/core/components/views/delete-view-modal.tsx b/apps/web/core/components/views/delete-view-modal.tsx
index b1810b30ff..f657fb60e8 100644
--- a/apps/web/core/components/views/delete-view-modal.tsx
+++ b/apps/web/core/components/views/delete-view-modal.tsx
@@ -1,15 +1,12 @@
-import React, { useState } from "react";
+import { useState } from "react";
import { observer } from "mobx-react";
import { useParams, useRouter } from "next/navigation";
// types
-import { PROJECT_VIEW_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IProjectView } from "@plane/types";
// ui
import { AlertModalCore } from "@plane/ui";
-// helpers
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useProjectView } from "@/hooks/store/use-project-view";
@@ -36,41 +33,24 @@ export const DeleteProjectViewModal = observer(function DeleteProjectViewModal(p
const handleDeleteView = async () => {
if (!workspaceSlug || !projectId) return;
-
- setIsDeleteLoading(true);
-
- await deleteView(workspaceSlug.toString(), projectId.toString(), data.id)
- .then(() => {
- handleClose();
- router.push(`/${workspaceSlug}/projects/${projectId}/views`);
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "View deleted successfully.",
- });
- captureSuccess({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.delete,
- payload: {
- view_id: data.id,
- },
- });
- })
- .catch(() => {
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: "View could not be deleted. Please try again.",
- });
- captureError({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.delete,
- payload: {
- view_id: data.id,
- },
- });
- })
- .finally(() => {
- setIsDeleteLoading(false);
+ try {
+ setIsDeleteLoading(true);
+ await deleteView(workspaceSlug.toString(), projectId.toString(), data.id);
+ handleClose();
+ router.push(`/${workspaceSlug}/projects/${projectId}/views`);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "View deleted successfully.",
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "View could not be deleted. Please try again.",
+ });
+ }
+ setIsDeleteLoading(false);
};
return (
diff --git a/apps/web/core/components/views/modal.tsx b/apps/web/core/components/views/modal.tsx
index 289d1d44be..785e901ff0 100644
--- a/apps/web/core/components/views/modal.tsx
+++ b/apps/web/core/components/views/modal.tsx
@@ -1,14 +1,11 @@
-import type { FC } from "react";
import { observer } from "mobx-react";
// types
-import { PROJECT_VIEW_TRACKER_EVENTS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IProjectView } from "@plane/types";
import { EIssuesStoreType } from "@plane/types";
// ui
import { EModalPosition, EModalWidth, ModalCore } from "@plane/ui";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useIssues } from "@/hooks/store/use-issues";
import { useProjectView } from "@/hooks/store/use-project-view";
import { useWorkItemFilters } from "@/hooks/store/work-item-filters/use-work-item-filters";
@@ -42,60 +39,37 @@ export const CreateUpdateProjectViewModal = observer(function CreateUpdateProjec
};
const handleCreateView = async (payload: IProjectView) => {
- await createView(workspaceSlug, projectId, payload)
- .then((res) => {
- handleClose();
- router.push(`/${workspaceSlug}/projects/${projectId}/views/${res.id}`);
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "View created successfully.",
- });
- captureSuccess({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.create,
- payload: {
- view_id: res.id,
- },
- });
- })
- .catch(() => {
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: "Something went wrong. Please try again.",
- });
- captureError({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.create,
- });
+ try {
+ const res = await createView(workspaceSlug, projectId, payload);
+ handleClose();
+ router.push(`/${workspaceSlug}/projects/${projectId}/views/${res.id}`);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "View created successfully.",
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Failed to create view. Please try again.",
+ });
+ }
};
const handleUpdateView = async (payload: IProjectView) => {
- await updateView(workspaceSlug, projectId, data?.id as string, payload)
- .then((viewDetails) => {
- mutateFilters(workspaceSlug, viewDetails.id, viewDetails);
- resetExpression(EIssuesStoreType.PROJECT_VIEW, viewDetails.id, viewDetails.rich_filters);
- handleClose();
- captureSuccess({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: data?.id,
- },
- });
- })
- .catch((err) => {
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: err?.detail ?? "Something went wrong. Please try again.",
- });
- captureError({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: data?.id,
- },
- });
+ try {
+ const viewDetails = await updateView(workspaceSlug, projectId, data?.id as string, payload);
+ mutateFilters(workspaceSlug, viewDetails.id, viewDetails);
+ resetExpression(EIssuesStoreType.PROJECT_VIEW, viewDetails.id, viewDetails.rich_filters);
+ handleClose();
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Failed to update view. Please try again.",
});
+ }
};
const handleFormSubmit = async (formData: IProjectView) => {
diff --git a/apps/web/core/components/views/quick-actions.tsx b/apps/web/core/components/views/quick-actions.tsx
index dbab8280b8..6e1faad59e 100644
--- a/apps/web/core/components/views/quick-actions.tsx
+++ b/apps/web/core/components/views/quick-actions.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { observer } from "mobx-react";
import { MoreHorizontal } from "lucide-react";
// types
-import { EUserPermissions, EUserPermissionsLevel, PROJECT_VIEW_TRACKER_ELEMENTS } from "@plane/constants";
+import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { IconButton } from "@plane/propel/icon-button";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IProjectView } from "@plane/types";
@@ -12,7 +12,6 @@ import { ContextMenu, CustomMenu } from "@plane/ui";
import { copyUrlToClipboard, cn } from "@plane/utils";
// helpers
import { useViewMenuItems } from "@/components/common/quick-actions-helper";
-import { captureClick } from "@/helpers/event-tracker.helper";
// hooks
import { useUser, useUserPermissions } from "@/hooks/store/user";
import { PublishViewModal, useViewPublish } from "@/plane-web/components/views/publish";
@@ -77,9 +76,7 @@ export const ViewQuickActions = observer(function ViewQuickActions(props: Props)
const CONTEXT_MENU_ITEMS = MENU_ITEMS.map(function CONTEXT_MENU_ITEMS(item) {
return {
...item,
-
action: () => {
- captureClick({ elementName: PROJECT_VIEW_TRACKER_ELEMENTS.LIST_ITEM_CONTEXT_MENU });
item.action();
},
};
@@ -110,7 +107,6 @@ export const ViewQuickActions = observer(function ViewQuickActions(props: Props)
{
- captureClick({ elementName: PROJECT_VIEW_TRACKER_ELEMENTS.QUICK_ACTIONS });
item.action();
}}
className={cn(
diff --git a/apps/web/core/components/web-hooks/create-webhook-modal.tsx b/apps/web/core/components/web-hooks/create-webhook-modal.tsx
index 49f8b6c313..e3c36746a2 100644
--- a/apps/web/core/components/web-hooks/create-webhook-modal.tsx
+++ b/apps/web/core/components/web-hooks/create-webhook-modal.tsx
@@ -1,7 +1,6 @@
-import React, { useState } from "react";
+import { useState } from "react";
import { useParams } from "next/navigation";
// types
-import { WORKSPACE_SETTINGS_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWebhook, IWorkspace, TWebhookEventTypes } from "@plane/types";
@@ -10,7 +9,6 @@ import { EModalPosition, EModalWidth, ModalCore } from "@plane/ui";
// helpers
import { csvDownload } from "@plane/utils";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import useKeypress from "@/hooks/use-keypress";
// components
import { WebhookForm } from "./form";
@@ -68,12 +66,6 @@ export function CreateWebhookModal(props: ICreateWebhookModal) {
await createWebhook(workspaceSlug.toString(), payload)
.then(({ webHook, secretKey }) => {
- captureSuccess({
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_created,
- payload: {
- webhook: formData?.url,
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: t("workspace_settings.settings.webhooks.toasts.created.title"),
@@ -86,13 +78,6 @@ export function CreateWebhookModal(props: ICreateWebhookModal) {
csvDownload(csvData, `webhook-secret-key-${Date.now()}`);
})
.catch((error) => {
- captureError({
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_created,
- payload: {
- webhook: formData?.url,
- },
- error: error as Error,
- });
setToast({
type: TOAST_TYPE.ERROR,
title: t("workspace_settings.settings.webhooks.toasts.not_created.title"),
diff --git a/apps/web/core/components/web-hooks/delete-webhook-modal.tsx b/apps/web/core/components/web-hooks/delete-webhook-modal.tsx
index f370b8b606..11d72cd904 100644
--- a/apps/web/core/components/web-hooks/delete-webhook-modal.tsx
+++ b/apps/web/core/components/web-hooks/delete-webhook-modal.tsx
@@ -1,11 +1,9 @@
import { useState } from "react";
import { useParams } from "next/navigation";
// ui
-import { WORKSPACE_SETTINGS_TRACKER_EVENTS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import { AlertModalCore } from "@plane/ui";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useWebhook } from "@/hooks/store/use-webhook";
import { useAppRouter } from "@/hooks/use-app-router";
@@ -31,39 +29,23 @@ export function DeleteWebhookModal(props: IDeleteWebhook) {
const handleDelete = async () => {
if (!workspaceSlug || !webhookId) return;
-
setIsDeleting(true);
-
- removeWebhook(workspaceSlug.toString(), webhookId.toString())
- .then(() => {
- captureSuccess({
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_deleted,
- payload: {
- webhook: webhookId,
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "Webhook deleted successfully.",
- });
- router.replace(`/${workspaceSlug}/settings/webhooks/`);
- })
- .catch((error) => {
- captureError({
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_deleted,
- payload: {
- webhook: webhookId,
- },
- error: error as Error,
- });
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: error?.error ?? "Something went wrong. Please try again.",
- });
- })
- .finally(() => setIsDeleting(false));
+ try {
+ await removeWebhook(workspaceSlug.toString(), webhookId.toString());
+ router.replace(`/${workspaceSlug}/settings/webhooks/`);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "Webhook deleted successfully.",
+ });
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Webhook could not be deleted. Please try again.",
+ });
+ }
+ setIsDeleting(false);
};
return (
diff --git a/apps/web/core/components/web-hooks/form/toggle.tsx b/apps/web/core/components/web-hooks/form/toggle.tsx
index b83f88cc26..88aca446df 100644
--- a/apps/web/core/components/web-hooks/form/toggle.tsx
+++ b/apps/web/core/components/web-hooks/form/toggle.tsx
@@ -1,12 +1,9 @@
import type { Control } from "react-hook-form";
import { Controller } from "react-hook-form";
// constants
-import { WORKSPACE_SETTINGS_TRACKER_ELEMENTS } from "@plane/constants";
import type { IWebhook } from "@plane/types";
// ui
import { ToggleSwitch } from "@plane/ui";
-// hooks
-import { captureClick } from "@/helpers/event-tracker.helper";
interface IWebHookToggle {
control: Control;
@@ -23,9 +20,6 @@ export function WebhookToggle({ control }: IWebHookToggle) {
{
- captureClick({
- elementName: WORKSPACE_SETTINGS_TRACKER_ELEMENTS.WEBHOOK_DETAILS_PAGE_TOGGLE_SWITCH,
- });
onChange(val);
}}
size="sm"
diff --git a/apps/web/core/components/web-hooks/webhooks-list-item.tsx b/apps/web/core/components/web-hooks/webhooks-list-item.tsx
index 023bb13991..1355406f7a 100644
--- a/apps/web/core/components/web-hooks/webhooks-list-item.tsx
+++ b/apps/web/core/components/web-hooks/webhooks-list-item.tsx
@@ -1,14 +1,10 @@
-import type { FC } from "react";
import Link from "next/link";
import { useParams } from "next/navigation";
-import { WORKSPACE_SETTINGS_TRACKER_ELEMENTS, WORKSPACE_SETTINGS_TRACKER_EVENTS } from "@plane/constants";
+// Plane imports
import type { IWebhook } from "@plane/types";
-// hooks
import { ToggleSwitch } from "@plane/ui";
-import { captureElementAndEvent } from "@/helpers/event-tracker.helper";
+// hooks
import { useWebhook } from "@/hooks/store/use-webhook";
-// ui
-// types
interface IWebhookListItem {
webhook: IWebhook;
@@ -21,37 +17,9 @@ export function WebhooksListItem(props: IWebhookListItem) {
// store hooks
const { updateWebhook } = useWebhook();
- const handleToggle = () => {
+ const handleToggle = async () => {
if (!workspaceSlug || !webhook.id) return;
- updateWebhook(workspaceSlug.toString(), webhook.id, { is_active: !webhook.is_active })
- .then(() => {
- captureElementAndEvent({
- element: {
- elementName: WORKSPACE_SETTINGS_TRACKER_ELEMENTS.WEBHOOK_LIST_ITEM_TOGGLE_SWITCH,
- },
- event: {
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_toggled,
- state: "SUCCESS",
- payload: {
- webhook: webhook.url,
- },
- },
- });
- })
- .catch(() => {
- captureElementAndEvent({
- element: {
- elementName: WORKSPACE_SETTINGS_TRACKER_ELEMENTS.WEBHOOK_LIST_ITEM_TOGGLE_SWITCH,
- },
- event: {
- eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.webhook_toggled,
- state: "ERROR",
- payload: {
- webhook: webhook.url,
- },
- },
- });
- });
+ await updateWebhook(workspaceSlug.toString(), webhook.id, { is_active: !webhook.is_active });
};
return (
diff --git a/apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx b/apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx
index b076ff03fd..2c3f42207c 100644
--- a/apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx
+++ b/apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx
@@ -2,7 +2,7 @@ import { useCallback, useMemo, useState } from "react";
import { isEqual, cloneDeep } from "lodash-es";
import { observer } from "mobx-react";
// plane imports
-import { EUserPermissionsLevel, PROJECT_VIEW_TRACKER_EVENTS } from "@plane/constants";
+import { EUserPermissionsLevel } from "@plane/constants";
import { setToast, TOAST_TYPE } from "@plane/propel/toast";
import type { IProjectView, TWorkItemFilterExpression } from "@plane/types";
import { EUserProjectRoles, EViewAccess } from "@plane/types";
@@ -10,7 +10,6 @@ import { EUserProjectRoles, EViewAccess } from "@plane/types";
import { removeNillKeys } from "@/components/issues/issue-layouts/utils";
import { CreateUpdateProjectViewModal } from "@/components/views/modal";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useCycle } from "@/hooks/store/use-cycle";
import { useLabel } from "@/hooks/store/use-label";
import { useMember } from "@/hooks/store/use-member";
@@ -153,12 +152,6 @@ export const ProjectLevelWorkItemFiltersHOC = observer(function ProjectLevelWork
title: "Success!",
message: "Your view has been updated successfully.",
});
- captureSuccess({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: viewDetails.id,
- },
- });
})
.catch(() => {
setToast({
@@ -166,12 +159,6 @@ export const ProjectLevelWorkItemFiltersHOC = observer(function ProjectLevelWork
title: "Error!",
message: "Your view could not be updated. Please try again.",
});
- captureError({
- eventName: PROJECT_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: viewDetails.id,
- },
- });
});
},
[viewDetails, updateView, workspaceSlug, projectId, getViewFilterPayload]
diff --git a/apps/web/core/components/work-item-filters/filters-hoc/workspace-level.tsx b/apps/web/core/components/work-item-filters/filters-hoc/workspace-level.tsx
index 59842f8e94..5f15f8fe1c 100644
--- a/apps/web/core/components/work-item-filters/filters-hoc/workspace-level.tsx
+++ b/apps/web/core/components/work-item-filters/filters-hoc/workspace-level.tsx
@@ -2,7 +2,7 @@ import { useCallback, useMemo, useState } from "react";
import { isEqual, cloneDeep } from "lodash-es";
import { observer } from "mobx-react";
// plane imports
-import { DEFAULT_GLOBAL_VIEWS_LIST, EUserPermissionsLevel, GLOBAL_VIEW_TRACKER_EVENTS } from "@plane/constants";
+import { DEFAULT_GLOBAL_VIEWS_LIST, EUserPermissionsLevel } from "@plane/constants";
import { setToast, TOAST_TYPE } from "@plane/propel/toast";
import type { IWorkspaceView, TWorkItemFilterExpression } from "@plane/types";
import { EUserProjectRoles, EViewAccess } from "@plane/types";
@@ -10,7 +10,6 @@ import { EUserProjectRoles, EViewAccess } from "@plane/types";
import { removeNillKeys } from "@/components/issues/issue-layouts/utils";
import { CreateUpdateWorkspaceViewModal } from "@/components/workspace/views/modal";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useGlobalView } from "@/hooks/store/use-global-view";
import { useLabel } from "@/hooks/store/use-label";
import { useMember } from "@/hooks/store/use-member";
@@ -140,12 +139,6 @@ export const WorkspaceLevelWorkItemFiltersHOC = observer(function WorkspaceLevel
title: "Success!",
message: "Your view has been updated successfully.",
});
- captureSuccess({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: viewDetails.id,
- },
- });
})
.catch(() => {
setToast({
@@ -153,12 +146,6 @@ export const WorkspaceLevelWorkItemFiltersHOC = observer(function WorkspaceLevel
title: "Error!",
message: "Your view could not be updated. Please try again.",
});
- captureError({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.update,
- payload: {
- view_id: viewDetails.id,
- },
- });
});
},
[viewDetails, updateGlobalView, workspaceSlug, getViewFilterPayload]
diff --git a/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx b/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx
index e1469e7cca..e90622de40 100644
--- a/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx
+++ b/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx
@@ -1,17 +1,10 @@
import { observer } from "mobx-react";
import { CheckCheck, RefreshCw } from "lucide-react";
// plane imports
-import {
- ENotificationLoader,
- ENotificationQueryParamType,
- NOTIFICATION_TRACKER_ELEMENTS,
- NOTIFICATION_TRACKER_EVENTS,
-} from "@plane/constants";
+import { ENotificationLoader, ENotificationQueryParamType } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Tooltip } from "@plane/propel/tooltip";
import { Spinner } from "@plane/ui";
-// helpers
-import { captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useWorkspaceNotifications } from "@/hooks/store/notifications";
import { usePlatformOS } from "@/hooks/use-platform-os";
@@ -59,12 +52,8 @@ export const NotificationSidebarHeaderOptions = observer(function NotificationSi
{
- captureSuccess({
- eventName: NOTIFICATION_TRACKER_EVENTS.all_marked_read,
- });
handleMarkAllNotificationsAsRead();
}}
/>
diff --git a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx
index 61c2f8ac50..3c1c76399a 100644
--- a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx
+++ b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx
@@ -1,14 +1,9 @@
import { observer } from "mobx-react";
import { ArchiveRestore } from "lucide-react";
// plane imports
-import { NOTIFICATION_TRACKER_ELEMENTS, NOTIFICATION_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { ArchiveIcon } from "@plane/propel/icons";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
-// helpers
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
-// hooks
-import { useWorkspaceNotifications } from "@/hooks/store/notifications";
// store
import type { INotification } from "@/store/notifications/notification";
// local imports
@@ -24,7 +19,6 @@ export const NotificationItemArchiveOption = observer(function NotificationItemA
) {
const { workspaceSlug, notification } = props;
// hooks
- const { currentNotificationTab } = useWorkspaceNotifications();
const { asJson: data, archiveNotification, unArchiveNotification } = notification;
const { t } = useTranslation();
@@ -32,32 +26,17 @@ export const NotificationItemArchiveOption = observer(function NotificationItemA
try {
const request = data.archived_at ? unArchiveNotification : archiveNotification;
await request(workspaceSlug);
- captureSuccess({
- eventName: data.archived_at ? NOTIFICATION_TRACKER_EVENTS.unarchive : NOTIFICATION_TRACKER_EVENTS.archive,
- payload: {
- id: data?.data?.issue?.id,
- tab: currentNotificationTab,
- },
- });
setToast({
title: data.archived_at ? t("notification.toasts.unarchived") : t("notification.toasts.archived"),
type: TOAST_TYPE.SUCCESS,
});
} catch (e) {
console.error(e);
- captureError({
- eventName: data.archived_at ? NOTIFICATION_TRACKER_EVENTS.unarchive : NOTIFICATION_TRACKER_EVENTS.archive,
- payload: {
- id: data?.data?.issue?.id,
- tab: currentNotificationTab,
- },
- });
}
};
return (
diff --git a/apps/web/core/components/workspace/create-workspace-form.tsx b/apps/web/core/components/workspace/create-workspace-form.tsx
index 8b380da8df..2af67c09e9 100644
--- a/apps/web/core/components/workspace/create-workspace-form.tsx
+++ b/apps/web/core/components/workspace/create-workspace-form.tsx
@@ -2,12 +2,7 @@ import type { Dispatch, SetStateAction } from "react";
import { useEffect, useState } from "react";
import { observer } from "mobx-react";
import { Controller, useForm } from "react-hook-form";
-import {
- ORGANIZATION_SIZE,
- RESTRICTED_URLS,
- WORKSPACE_TRACKER_ELEMENTS,
- WORKSPACE_TRACKER_EVENTS,
-} from "@plane/constants";
+import { ORGANIZATION_SIZE, RESTRICTED_URLS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Button } from "@plane/propel/button";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
@@ -15,7 +10,6 @@ import type { IWorkspace } from "@plane/types";
// ui
import { CustomSelect, Input } from "@plane/ui";
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useWorkspace } from "@/hooks/store/use-workspace";
import { useAppRouter } from "@/hooks/use-app-router";
// services
@@ -71,13 +65,8 @@ export const CreateWorkspaceForm = observer(function CreateWorkspaceForm(props:
const res = (await workspaceService.workspaceSlugCheck(formData.slug)) as { status: boolean };
if (res.status === true && !RESTRICTED_URLS.includes(formData.slug)) {
setSlugError(false);
-
try {
const workspaceResponse = await createWorkspace(formData);
- captureSuccess({
- eventName: WORKSPACE_TRACKER_EVENTS.create,
- payload: { slug: formData.slug },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: t("workspace_creation.toast.success.title"),
@@ -86,11 +75,6 @@ export const CreateWorkspaceForm = observer(function CreateWorkspaceForm(props:
if (onSubmit) await onSubmit(workspaceResponse);
} catch {
- captureError({
- eventName: WORKSPACE_TRACKER_EVENTS.create,
- payload: { slug: formData.slug },
- error: new Error("Error creating workspace"),
- });
setToast({
type: TOAST_TYPE.ERROR,
title: t("workspace_creation.toast.error.title"),
@@ -250,14 +234,7 @@ export const CreateWorkspaceForm = observer(function CreateWorkspaceForm(props:
{secondaryButton}
-
+
{isSubmitting ? t(primaryButtonText.loading) : t(primaryButtonText.default)}
{!secondaryButton && (
diff --git a/apps/web/core/components/workspace/delete-workspace-form.tsx b/apps/web/core/components/workspace/delete-workspace-form.tsx
index 52603caabb..c0041d8ab6 100644
--- a/apps/web/core/components/workspace/delete-workspace-form.tsx
+++ b/apps/web/core/components/workspace/delete-workspace-form.tsx
@@ -1,18 +1,14 @@
-import React from "react";
import { observer } from "mobx-react";
import { Controller, useForm } from "react-hook-form";
import { AlertTriangle } from "lucide-react";
-// types
-import { WORKSPACE_TRACKER_EVENTS } from "@plane/constants";
+// Plane Imports
import { useTranslation } from "@plane/i18n";
import { Button } from "@plane/propel/button";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWorkspace } from "@plane/types";
-// ui
import { Input } from "@plane/ui";
-// hooks
import { cn } from "@plane/utils";
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
+// hooks
import { useWorkspace } from "@/hooks/store/use-workspace";
import { useUserSettings } from "@/hooks/store/user";
import { useAppRouter } from "@/hooks/use-app-router";
@@ -59,33 +55,23 @@ export const DeleteWorkspaceForm = observer(function DeleteWorkspaceForm(props:
const onSubmit = async () => {
if (!data || !canDelete) return;
- await deleteWorkspace(data.slug)
- .then(async () => {
- await fetchCurrentUserSettings();
- handleClose();
- router.push(getWorkspaceRedirectionUrl());
- captureSuccess({
- eventName: WORKSPACE_TRACKER_EVENTS.delete,
- payload: { slug: data.slug },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: t("workspace_settings.settings.general.delete_modal.success_title"),
- message: t("workspace_settings.settings.general.delete_modal.success_message"),
- });
- })
- .catch(() => {
- setToast({
- type: TOAST_TYPE.ERROR,
- title: t("workspace_settings.settings.general.delete_modal.error_title"),
- message: t("workspace_settings.settings.general.delete_modal.error_message"),
- });
- captureError({
- eventName: WORKSPACE_TRACKER_EVENTS.delete,
- payload: { slug: data.slug },
- error: new Error("Error deleting workspace"),
- });
+ try {
+ await deleteWorkspace(data.slug);
+ await fetchCurrentUserSettings();
+ handleClose();
+ router.push(getWorkspaceRedirectionUrl());
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: t("workspace_settings.settings.general.delete_modal.success_title"),
+ message: t("workspace_settings.settings.general.delete_modal.success_message"),
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: t("workspace_settings.settings.general.delete_modal.error_title"),
+ message: t("workspace_settings.settings.general.delete_modal.error_message"),
+ });
+ }
};
return (
diff --git a/apps/web/core/components/workspace/settings/invitations-list-item.tsx b/apps/web/core/components/workspace/settings/invitations-list-item.tsx
index 8565436556..12b4cc821f 100644
--- a/apps/web/core/components/workspace/settings/invitations-list-item.tsx
+++ b/apps/web/core/components/workspace/settings/invitations-list-item.tsx
@@ -1,9 +1,8 @@
import { useState } from "react";
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
-
// plane imports
-import { ROLE, EUserPermissions, EUserPermissionsLevel, MEMBER_TRACKER_ELEMENTS } from "@plane/constants";
+import { ROLE, EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { LinkIcon, TrashIcon, ChevronDownIcon } from "@plane/propel/icons";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
@@ -13,7 +12,6 @@ import { cn, copyTextToClipboard } from "@plane/utils";
// components
import { ConfirmWorkspaceMemberRemove } from "@/components/workspace/confirm-workspace-member-remove";
// hooks
-import { captureClick } from "@/helpers/event-tracker.helper";
import { useMember } from "@/hooks/store/use-member";
import { useUserPermissions } from "@/hooks/store/user";
@@ -96,9 +94,6 @@ export const WorkspaceInvitationsListItem = observer(function WorkspaceInvitatio
{
key: "remove",
action: () => {
- captureClick({
- elementName: MEMBER_TRACKER_ELEMENTS.WORKSPACE_INVITATIONS_LIST_CONTEXT_MENU,
- });
setRemoveMemberModal(true);
},
title: t("common.remove"),
diff --git a/apps/web/core/components/workspace/settings/members-list-item.tsx b/apps/web/core/components/workspace/settings/members-list-item.tsx
index 31c41615db..9499110ee5 100644
--- a/apps/web/core/components/workspace/settings/members-list-item.tsx
+++ b/apps/web/core/components/workspace/settings/members-list-item.tsx
@@ -1,7 +1,6 @@
import { isEmpty } from "lodash-es";
import { observer } from "mobx-react";
// plane imports
-import { MEMBER_TRACKER_EVENTS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWorkspaceMember } from "@plane/types";
@@ -10,8 +9,6 @@ import { Table } from "@plane/ui";
import { MembersLayoutLoader } from "@/components/ui/loader/layouts/members-layout-loader";
import { ConfirmWorkspaceMemberRemove } from "@/components/workspace/confirm-workspace-member-remove";
import type { RowData } from "@/components/workspace/settings/member-columns";
-// helpers
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useMember } from "@/hooks/store/use-member";
import { useWorkspace } from "@/hooks/store/use-workspace";
@@ -47,22 +44,8 @@ export const WorkspaceMembersListItem = observer(function WorkspaceMembersListIt
await leaveWorkspace(workspaceSlug.toString());
await fetchCurrentUserSettings();
router.push(getWorkspaceRedirectionUrl());
- captureSuccess({
- eventName: MEMBER_TRACKER_EVENTS.workspace.leave,
- payload: {
- workspace: workspaceSlug,
- },
- });
} catch (err: unknown) {
const error = err as { error?: string };
- const errorForCapture: Error | string = err instanceof Error ? err : String(err);
- captureError({
- eventName: MEMBER_TRACKER_EVENTS.workspace.leave,
- payload: {
- workspace: workspaceSlug,
- },
- error: errorForCapture,
- });
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
diff --git a/apps/web/core/components/workspace/settings/workspace-details.tsx b/apps/web/core/components/workspace/settings/workspace-details.tsx
index bc13dfbd25..5bcc832d2d 100644
--- a/apps/web/core/components/workspace/settings/workspace-details.tsx
+++ b/apps/web/core/components/workspace/settings/workspace-details.tsx
@@ -1,15 +1,8 @@
import { useEffect, useState } from "react";
import { observer } from "mobx-react";
import { Controller, useForm } from "react-hook-form";
-
-// constants
-import {
- ORGANIZATION_SIZE,
- EUserPermissions,
- EUserPermissionsLevel,
- WORKSPACE_TRACKER_EVENTS,
- WORKSPACE_TRACKER_ELEMENTS,
-} from "@plane/constants";
+// Plane Imports
+import { ORGANIZATION_SIZE, EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Button } from "@plane/propel/button";
import { EditIcon } from "@plane/propel/icons";
@@ -19,9 +12,8 @@ import { CustomSelect, Input } from "@plane/ui";
import { copyUrlToClipboard, getFileURL } from "@plane/utils";
// components
import { WorkspaceImageUploadModal } from "@/components/core/modals/workspace-image-upload-modal";
-// helpers
import { TimezoneSelect } from "@/components/global/timezone-select";
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
+// hooks
import { useWorkspace } from "@/hooks/store/use-workspace";
import { useUserPermissions } from "@/hooks/store/user";
// plane web components
@@ -70,21 +62,12 @@ export const WorkspaceDetails = observer(function WorkspaceDetails() {
try {
await updateWorkspace(currentWorkspace.slug, payload);
- captureSuccess({
- eventName: WORKSPACE_TRACKER_EVENTS.update,
- payload: { slug: currentWorkspace.slug },
- });
setToast({
title: "Success!",
type: TOAST_TYPE.SUCCESS,
message: "Workspace updated successfully",
});
} catch (err: unknown) {
- captureError({
- eventName: WORKSPACE_TRACKER_EVENTS.update,
- payload: { slug: currentWorkspace.slug },
- error: err instanceof Error ? err : new Error(String(err)),
- });
console.error(err);
} finally {
setTimeout(() => {
@@ -305,7 +288,6 @@ export const WorkspaceDetails = observer(function WorkspaceDetails() {
{isAdmin && (
{
diff --git a/apps/web/core/components/workspace/sidebar/user-menu-item.tsx b/apps/web/core/components/workspace/sidebar/user-menu-item.tsx
index 183332502c..1360511bb9 100644
--- a/apps/web/core/components/workspace/sidebar/user-menu-item.tsx
+++ b/apps/web/core/components/workspace/sidebar/user-menu-item.tsx
@@ -2,15 +2,13 @@ import { observer } from "mobx-react";
import Link from "next/link";
import { useParams, usePathname } from "next/navigation";
// plane imports
-import { EUserPermissionsLevel, SIDEBAR_TRACKER_ELEMENTS } from "@plane/constants";
-
+import { EUserPermissionsLevel } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import type { EUserWorkspaceRoles } from "@plane/types";
// components
import { SidebarNavItem } from "@/components/sidebar/sidebar-navigation";
import { NotificationAppSidebarOption } from "@/components/workspace-notifications/notification-app-sidebar-option";
// hooks
-import { captureClick } from "@/helpers/event-tracker.helper";
import { useAppTheme } from "@/hooks/store/use-app-theme";
import { useUserPermissions } from "@/hooks/store/user";
@@ -44,20 +42,14 @@ export const SidebarUserMenuItem = observer(function SidebarUserMenuItem(props:
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (!allowPermissions(item.access as any, EUserPermissionsLevel.WORKSPACE, workspaceSlug.toString())) return null;
- const handleLinkClick = (itemKey: string) => {
+ const handleLinkClick = () => {
if (window.innerWidth < 768) {
toggleSidebar();
}
- captureClick({
- elementName: SIDEBAR_TRACKER_ELEMENTS.USER_MENU_ITEM,
- context: {
- destination: itemKey,
- },
- });
};
return (
- handleLinkClick(item.key)}>
+
diff --git a/apps/web/core/components/workspace/views/delete-view-modal.tsx b/apps/web/core/components/workspace/views/delete-view-modal.tsx
index 744807a0e6..6562fe5333 100644
--- a/apps/web/core/components/workspace/views/delete-view-modal.tsx
+++ b/apps/web/core/components/workspace/views/delete-view-modal.tsx
@@ -1,16 +1,12 @@
-import React, { useState } from "react";
+import { useState } from "react";
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
-// types
-import { GLOBAL_VIEW_TRACKER_EVENTS } from "@plane/constants";
+// Plane Imports
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWorkspaceView } from "@plane/types";
-// ui
import { AlertModalCore } from "@plane/ui";
-// constants
// hooks
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
import { useGlobalView } from "@/hooks/store/use-global-view";
type Props = {
@@ -32,37 +28,20 @@ export const DeleteGlobalViewModal = observer(function DeleteGlobalViewModal(pro
const handleDeletion = async () => {
if (!workspaceSlug) return;
-
setIsDeleteLoading(true);
- await deleteGlobalView(workspaceSlug.toString(), data.id)
- .then(() => {
- captureSuccess({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.delete,
- payload: {
- view_id: data.id,
- },
- });
- })
- .catch((error: any) => {
- captureError({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.delete,
- payload: {
- view_id: data.id,
- },
- error: error,
- });
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: error?.error ?? "Something went wrong while deleting the view. Please try again.",
- });
- })
- .finally(() => {
- setIsDeleteLoading(false);
- handleClose();
+ try {
+ await deleteGlobalView(workspaceSlug.toString(), data.id);
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Failed to delete the view. Please try again.",
});
+ }
+ setIsDeleteLoading(false);
+ handleClose();
// remove filters from local storage
localStorage.removeItem(`global_view_filters/${data.id}`);
};
diff --git a/apps/web/core/components/workspace/views/header.tsx b/apps/web/core/components/workspace/views/header.tsx
index ef09a1e233..dd26d830c7 100644
--- a/apps/web/core/components/workspace/views/header.tsx
+++ b/apps/web/core/components/workspace/views/header.tsx
@@ -1,20 +1,12 @@
-import React, { useEffect, useRef, useState } from "react";
+import { useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// plane imports
-import {
- DEFAULT_GLOBAL_VIEWS_LIST,
- EUserPermissions,
- EUserPermissionsLevel,
- GLOBAL_VIEW_TRACKER_ELEMENTS,
- GLOBAL_VIEW_TRACKER_EVENTS,
-} from "@plane/constants";
+import { DEFAULT_GLOBAL_VIEWS_LIST, EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { PlusIcon } from "@plane/propel/icons";
import type { TStaticViewTypes } from "@plane/types";
import { Header, EHeaderVariant } from "@plane/ui";
-// helpers
-import { captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useGlobalView } from "@/hooks/store/use-global-view";
import { useUserPermissions } from "@/hooks/store/user";
@@ -76,15 +68,6 @@ export const GlobalViewsHeader = observer(function GlobalViewsHeader() {
// bring the active view to the centre of the header
useEffect(() => {
if (globalViewId && currentWorkspaceViews) {
- captureSuccess({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.open,
- payload: {
- view_id: globalViewId,
- view_type: ["all-issues", "assigned", "created", "subscribed"].includes(globalViewId.toString())
- ? "Default"
- : "Custom",
- },
- });
const activeTabElement = document.querySelector(`#global-view-${globalViewId.toString()}`);
if (activeTabElement && containerRef.current) {
const containerRect = containerRef.current.getBoundingClientRect();
@@ -119,7 +102,6 @@ export const GlobalViewsHeader = observer(function GlobalViewsHeader() {
{isAuthorizedUser ? (
setCreateViewModal(true)}
>
diff --git a/apps/web/core/components/workspace/views/modal.tsx b/apps/web/core/components/workspace/views/modal.tsx
index 71483d7126..89a9102f9a 100644
--- a/apps/web/core/components/workspace/views/modal.tsx
+++ b/apps/web/core/components/workspace/views/modal.tsx
@@ -1,14 +1,10 @@
-import React from "react";
import { observer } from "mobx-react";
import { useParams } from "next/navigation";
// plane imports
-import { GLOBAL_VIEW_TRACKER_EVENTS } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWorkspaceView } from "@plane/types";
import { EIssuesStoreType } from "@plane/types";
import { EModalPosition, EModalWidth, ModalCore } from "@plane/ui";
-// helpers
-import { captureError, captureSuccess } from "@/helpers/event-tracker.helper";
// hooks
import { useGlobalView } from "@/hooks/store/use-global-view";
import { useWorkItemFilters } from "@/hooks/store/work-item-filters/use-work-item-filters";
@@ -40,83 +36,57 @@ export const CreateUpdateWorkspaceViewModal = observer(function CreateUpdateWork
const handleCreateView = async (payload: Partial) => {
if (!workspaceSlug) return;
- const payloadData: Partial = {
- ...payload,
- rich_filters: {
- ...payload?.rich_filters,
- },
- };
-
- await createGlobalView(workspaceSlug, payloadData)
- .then((res) => {
- captureSuccess({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.create,
- payload: {
- id: res.id,
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "View created successfully.",
- });
-
- router.push(`/${workspaceSlug}/workspace-views/${res.id}`);
- handleClose();
- })
- .catch(() => {
- captureError({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.create,
- });
- setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: "View could not be created. Please try again.",
- });
+ try {
+ const payloadData: Partial = {
+ ...payload,
+ rich_filters: {
+ ...payload?.rich_filters,
+ },
+ };
+ const res = await createGlobalView(workspaceSlug, payloadData);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "View created successfully.",
});
+ router.push(`/${workspaceSlug}/workspace-views/${res.id}`);
+ handleClose();
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "View could not be created. Please try again.",
+ });
+ }
};
const handleUpdateView = async (payload: Partial) => {
if (!workspaceSlug || !data) return;
- const payloadData: Partial = {
- ...payload,
- query: {
- ...payload?.rich_filters,
- },
- };
-
- await updateGlobalView(workspaceSlug, data.id, payloadData)
- .then((res) => {
- if (res) {
- resetExpression(EIssuesStoreType.GLOBAL, data.id, res.rich_filters);
- captureSuccess({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.update,
- payload: {
- id: res.id,
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "View updated successfully.",
- });
- handleClose();
- }
- })
- .catch(() => {
- captureError({
- eventName: GLOBAL_VIEW_TRACKER_EVENTS.update,
- payload: {
- id: data.id,
- },
- });
+ try {
+ const payloadData: Partial = {
+ ...payload,
+ query: {
+ ...payload?.rich_filters,
+ },
+ };
+ const res = await updateGlobalView(workspaceSlug, data.id, payloadData);
+ if (res) {
+ resetExpression(EIssuesStoreType.GLOBAL, data.id, res.rich_filters);
setToast({
- type: TOAST_TYPE.ERROR,
- title: "Error!",
- message: "View could not be updated. Please try again.",
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "View updated successfully.",
});
+ handleClose();
+ }
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "View could not be updated. Please try again.",
});
+ }
};
const handleFormSubmit = async (formData: Partial) => {
diff --git a/apps/web/core/components/workspace/views/quick-action.tsx b/apps/web/core/components/workspace/views/quick-action.tsx
index 4739b2d076..0d70a3b8c4 100644
--- a/apps/web/core/components/workspace/views/quick-action.tsx
+++ b/apps/web/core/components/workspace/views/quick-action.tsx
@@ -1,14 +1,13 @@
import { useState } from "react";
import { observer } from "mobx-react";
// plane imports
-import { EUserPermissions, EUserPermissionsLevel, GLOBAL_VIEW_TRACKER_ELEMENTS } from "@plane/constants";
+import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import type { IWorkspaceView } from "@plane/types";
import { CustomMenu } from "@plane/ui";
import { copyUrlToClipboard, cn } from "@plane/utils";
// helpers
import { useViewMenuItems } from "@/components/common/quick-actions-helper";
-import { captureClick } from "@/helpers/event-tracker.helper";
// hooks
import { useUser, useUserPermissions } from "@/hooks/store/user";
// local imports
@@ -33,14 +32,15 @@ export const WorkspaceViewQuickActions = observer(function WorkspaceViewQuickAct
const isAdmin = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE);
const viewLink = `${workspaceSlug}/workspace-views/${view.id}`;
- const handleCopyText = () =>
- copyUrlToClipboard(viewLink).then(() => {
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Link Copied!",
- message: "View link copied to clipboard.",
- });
+ const handleCopyText = async () => {
+ await copyUrlToClipboard(viewLink);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Link Copied!",
+ message: "View link copied to clipboard.",
});
+ };
+
const handleOpenInNewTab = () => window.open(`/${viewLink}`, "_blank");
const MENU_ITEMS = useViewMenuItems({
@@ -70,9 +70,6 @@ export const WorkspaceViewQuickActions = observer(function WorkspaceViewQuickAct
{
- captureClick({
- elementName: GLOBAL_VIEW_TRACKER_ELEMENTS.QUICK_ACTIONS,
- });
item.action();
}}
className={cn(
diff --git a/apps/web/core/components/workspace/views/view-list-item.tsx b/apps/web/core/components/workspace/views/view-list-item.tsx
index 8f754fe592..0db808d0a0 100644
--- a/apps/web/core/components/workspace/views/view-list-item.tsx
+++ b/apps/web/core/components/workspace/views/view-list-item.tsx
@@ -2,14 +2,10 @@ import { useState } from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { useParams } from "next/navigation";
-
-import { GLOBAL_VIEW_TRACKER_ELEMENTS } from "@plane/constants";
-import { EditIcon, TrashIcon } from "@plane/propel/icons";
// plane imports
+import { EditIcon, TrashIcon } from "@plane/propel/icons";
import { CustomMenu } from "@plane/ui";
import { truncateText } from "@plane/utils";
-// helpers
-import { captureClick } from "@/helpers/event-tracker.helper";
// hooks
import { useGlobalView } from "@/hooks/store/use-global-view";
// local imports
@@ -51,9 +47,6 @@ export const GlobalViewListItem = observer(function GlobalViewListItem(props: Pr
{
- captureClick({
- elementName: GLOBAL_VIEW_TRACKER_ELEMENTS.LIST_ITEM,
- });
setUpdateViewModal(true);
}}
>
@@ -64,9 +57,6 @@ export const GlobalViewListItem = observer(function GlobalViewListItem(props: Pr
{
- captureClick({
- elementName: GLOBAL_VIEW_TRACKER_ELEMENTS.LIST_ITEM,
- });
setDeleteViewModal(true);
}}
>
diff --git a/apps/web/core/hooks/use-page-operations.ts b/apps/web/core/hooks/use-page-operations.ts
index 95537ef5dd..da63c3e768 100644
--- a/apps/web/core/hooks/use-page-operations.ts
+++ b/apps/web/core/hooks/use-page-operations.ts
@@ -1,12 +1,9 @@
import { useMemo } from "react";
// plane imports
-import { IS_FAVORITE_MENU_OPEN, PROJECT_PAGE_TRACKER_EVENTS } from "@plane/constants";
-import type { EditorRefApi } from "@plane/editor";
+import { IS_FAVORITE_MENU_OPEN } from "@plane/constants";
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
import { EPageAccess } from "@plane/types";
import { copyUrlToClipboard } from "@plane/utils";
-// helpers
-import { captureSuccess, captureError } from "@/helpers/event-tracker.helper";
// hooks
import { useCollaborativePageActions } from "@/hooks/use-collaborative-page-actions";
// store types
@@ -57,35 +54,23 @@ export const usePageOperations = (
const pageLink = getRedirectionLink();
return {
- copyLink: () => {
- copyUrlToClipboard(pageLink).then(() => {
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Link Copied!",
- message: "Page link copied to clipboard.",
- });
+ copyLink: async () => {
+ await copyUrlToClipboard(pageLink);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Link Copied!",
+ message: "Page link copied to clipboard.",
});
},
duplicate: async () => {
try {
await duplicate();
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.duplicate,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: "Page duplicated successfully.",
});
- } catch (error: any) {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.duplicate,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -97,33 +82,16 @@ export const usePageOperations = (
openInNewTab: () => window.open(pageLink, "_blank"),
toggleAccess: async () => {
const changedPageType = access === EPageAccess.PUBLIC ? "private" : "public";
- const eventName = PROJECT_PAGE_TRACKER_EVENTS.access_update;
-
try {
if (access === EPageAccess.PUBLIC)
await executeCollaborativeAction({ type: "sendMessageToServer", message: "make-private" });
else await executeCollaborativeAction({ type: "sendMessageToServer", message: "make-public" });
-
- captureSuccess({
- eventName,
- payload: {
- id: page.id,
- from_access: access === EPageAccess.PUBLIC ? "Public" : "Private",
- to_access: access === EPageAccess.PUBLIC ? "Private" : "Public",
- state: "SUCCESS",
- },
- });
-
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: `The page has been marked ${changedPageType} and moved to the ${changedPageType} section.`,
});
- } catch (error: any) {
- captureError({
- eventName,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -135,23 +103,12 @@ export const usePageOperations = (
if (archived_at) {
try {
await executeCollaborativeAction({ type: "sendMessageToServer", message: "unarchive" });
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.restore,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: "Page restored successfully.",
});
- } catch (error: any) {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.restore,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -161,23 +118,12 @@ export const usePageOperations = (
} else {
try {
await executeCollaborativeAction({ type: "sendMessageToServer", message: "archive" });
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.archive,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: "Page archived successfully.",
});
- } catch (error: any) {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.archive,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -186,75 +132,50 @@ export const usePageOperations = (
}
}
},
- toggleFavorite: () => {
+ toggleFavorite: async () => {
if (is_favorite) {
- removePageFromFavorites()
- .then(() => {
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.unfavorite,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "Page removed from favorites.",
- });
- })
- .catch((error) => {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.unfavorite,
- error,
- });
+ try {
+ await removePageFromFavorites();
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "Page removed from favorites.",
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Page could not be removed from favorites. Please try again later.",
+ });
+ }
} else {
- addToFavorites()
- .then(() => {
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.favorite,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
- if (!isFavoriteMenuOpen) toggleFavoriteMenu(true);
- setToast({
- type: TOAST_TYPE.SUCCESS,
- title: "Success!",
- message: "Page added to favorites.",
- });
- })
- .catch((error) => {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.favorite,
- error,
- });
+ try {
+ await addToFavorites();
+ if (!isFavoriteMenuOpen) toggleFavoriteMenu(true);
+ setToast({
+ type: TOAST_TYPE.SUCCESS,
+ title: "Success!",
+ message: "Page added to favorites.",
});
+ } catch (_error) {
+ setToast({
+ type: TOAST_TYPE.ERROR,
+ title: "Error!",
+ message: "Page could not be added to favorites. Please try again later.",
+ });
+ }
}
},
toggleLock: async () => {
if (is_locked) {
try {
await executeCollaborativeAction({ type: "sendMessageToServer", message: "unlock" });
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.unlock,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: "Page unlocked successfully.",
});
- } catch (error: any) {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.unlock,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -264,23 +185,12 @@ export const usePageOperations = (
} else {
try {
await executeCollaborativeAction({ type: "sendMessageToServer", message: "lock" });
- captureSuccess({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.lock,
- payload: {
- id: page.id,
- state: "SUCCESS",
- },
- });
setToast({
type: TOAST_TYPE.SUCCESS,
title: "Success!",
message: "Page locked successfully.",
});
- } catch (error: any) {
- captureError({
- eventName: PROJECT_PAGE_TRACKER_EVENTS.lock,
- error,
- });
+ } catch (_error) {
setToast({
type: TOAST_TYPE.ERROR,
title: "Error!",
@@ -300,7 +210,6 @@ export const usePageOperations = (
is_favorite,
is_locked,
isFavoriteMenuOpen,
- page.id,
removePageFromFavorites,
toggleFavoriteMenu,
]);
diff --git a/apps/web/core/lib/posthog-provider.tsx b/apps/web/core/lib/posthog-provider.tsx
deleted file mode 100644
index cb3d691a98..0000000000
--- a/apps/web/core/lib/posthog-provider.tsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import type { ReactNode } from "react";
-import { lazy, Suspense, useEffect, useCallback, useRef, useState } from "react";
-import { PostHogProvider as PHProvider } from "@posthog/react";
-import { observer } from "mobx-react";
-import { useParams } from "next/navigation";
-import posthog from "posthog-js";
-// constants
-import { GROUP_WORKSPACE_TRACKER_EVENT } from "@plane/constants";
-// helpers
-import { getUserRole } from "@plane/utils";
-// hooks
-import { captureClick, joinEventGroup } from "@/helpers/event-tracker.helper";
-import { useInstance } from "@/hooks/store/use-instance";
-import { useWorkspace } from "@/hooks/store/use-workspace";
-import { useUser, useUserPermissions } from "@/hooks/store/user";
-// dynamic imports
-const PostHogPageView = lazy(function PostHogPageView() {
- return import("@/lib/posthog-view");
-});
-
-export interface IPosthogWrapper {
- children: ReactNode;
-}
-
-const PostHogProvider = observer(function PostHogProvider(props: IPosthogWrapper) {
- const { children } = props;
- const { data: user } = useUser();
- const { currentWorkspace } = useWorkspace();
- const { instance } = useInstance();
- const { workspaceSlug, projectId } = useParams();
- const { getWorkspaceRoleByWorkspaceSlug, getProjectRoleByWorkspaceSlugAndProjectId } = useUserPermissions();
- // refs
- const isInitializedRef = useRef(false);
- // states
- const [hydrated, setHydrated] = useState(false);
- // derived values
- const currentProjectRole = getProjectRoleByWorkspaceSlugAndProjectId(
- workspaceSlug?.toString(),
- projectId?.toString()
- );
- const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug?.toString());
- const is_telemetry_enabled = instance?.is_telemetry_enabled || false;
- const is_posthog_enabled = process.env.VITE_POSTHOG_KEY && process.env.VITE_POSTHOG_HOST && is_telemetry_enabled;
-
- useEffect(() => {
- if (user && hydrated) {
- // Identify sends an event, so you want may want to limit how often you call it
- posthog?.identify(user.email, {
- id: user.id,
- first_name: user.first_name,
- last_name: user.last_name,
- email: user.email,
- workspace_role: currentWorkspaceRole ? getUserRole(currentWorkspaceRole) : undefined,
- project_role: currentProjectRole ? getUserRole(currentProjectRole) : undefined,
- });
- if (currentWorkspace) {
- joinEventGroup(GROUP_WORKSPACE_TRACKER_EVENT, currentWorkspace?.id, {
- date: new Date().toDateString(),
- workspace_id: currentWorkspace?.id,
- });
- }
- }
- }, [user, currentProjectRole, currentWorkspaceRole, currentWorkspace, hydrated]);
-
- useEffect(() => {
- if (isInitializedRef.current) return; // prevent multiple initializations
- const posthogKey = process.env.VITE_POSTHOG_KEY;
- const posthogHost = process.env.VITE_POSTHOG_HOST;
- const isDebugMode = process.env.VITE_POSTHOG_DEBUG === "1";
- if (posthogKey && posthogHost && !posthog.__loaded) {
- posthog.init(posthogKey, {
- api_host: posthogHost,
- ui_host: posthogHost,
- debug: isDebugMode, // Debug mode based on the environment variable
- autocapture: false,
- capture_pageview: false, // Disable automatic pageview capture, as we capture manually
- capture_pageleave: true,
- disable_session_recording: true,
- });
- isInitializedRef.current = true;
- setHydrated(true);
- }
- }, []);
-
- const clickHandler = useCallback((event: MouseEvent) => {
- const target = event.target as HTMLElement;
- // Use closest to find the nearest parent element with data-ph-element attribute
- const elementWithAttribute = target.closest("[data-ph-element]") as HTMLElement;
- if (elementWithAttribute) {
- const element = elementWithAttribute.getAttribute("data-ph-element");
- if (element) {
- captureClick({ elementName: element });
- }
- }
- }, []);
-
- useEffect(() => {
- if (!is_posthog_enabled || !hydrated) return;
-
- document.addEventListener("click", clickHandler);
-
- return () => {
- document.removeEventListener("click", clickHandler);
- };
- }, [hydrated, is_posthog_enabled, clickHandler]);
-
- if (is_posthog_enabled && hydrated)
- return (
-
-
-
-
- {children}
-
- );
-
- return <>{children}>;
-});
-
-export default PostHogProvider;
diff --git a/apps/web/core/lib/posthog-view.tsx b/apps/web/core/lib/posthog-view.tsx
deleted file mode 100644
index 1c29ea5670..0000000000
--- a/apps/web/core/lib/posthog-view.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useEffect } from "react";
-import { usePathname, useSearchParams } from "next/navigation";
-// posthog
-import { usePostHog } from "posthog-js/react";
-
-export default function PostHogPageView(): null {
- const pathname = usePathname();
- const searchParams = useSearchParams();
- const posthog = usePostHog();
- useEffect(() => {
- // Track pageviews
- if (pathname && posthog) {
- let url = window.origin + pathname;
- if (searchParams.toString()) {
- url = url + `?${searchParams.toString()}`;
- }
- posthog.capture("$pageview", {
- $current_url: url,
- });
- }
- }, [pathname, searchParams, posthog]);
-
- return null;
-}
diff --git a/apps/web/helpers/event-tracker.helper.ts b/apps/web/helpers/event-tracker.helper.ts
deleted file mode 100644
index 908db1e54b..0000000000
--- a/apps/web/helpers/event-tracker.helper.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-import posthog from "posthog-js";
-
-export type TEventState = "SUCCESS" | "ERROR";
-export type TElementContext = Record;
-export type TEventContext = Record;
-export type TInteractionType = "clicked" | "viewed" | "hovered";
-
-/**
- * Join a event group in PostHog
- * @param groupName - The name of the group
- * @param groupId - The ID of the group
- * @param properties - The properties of the group
- */
-export const joinEventGroup = (groupName: string, groupId: string, properties: Record) => {
- posthog?.group(groupName, groupId, properties);
-};
-
-type TCaptureElementParams = {
- elementName: string;
- interaction_type: TInteractionType;
- context?: TElementContext;
-};
-
-/**
- * Capture UI element interactions (clicks, hovers, views, etc.)
- * This helps understand user behavior and interaction patterns
- *
- * @param element - Generic UI element type
- * @param context - Context about where and why the interaction happened
- */
-const captureElement = (params: TCaptureElementParams) => {
- const { elementName, interaction_type, context } = params;
- if (!posthog) return;
-
- const elementEvent = `${elementName}_${interaction_type}`;
-
- const payload = {
- element_type: elementName,
- timestamp: new Date().toISOString(),
- ...context,
- };
-
- posthog.capture(elementEvent, payload);
-};
-
-type TCaptureClickParams = Omit;
-/**
- * Capture click events
- * @param element - The element that was clicked
- * @param context - Additional context
- */
-export const captureClick = (params: TCaptureClickParams) => {
- captureElement({ ...params, interaction_type: "clicked" });
-};
-
-type TCaptureViewParams = Omit;
-/**
- * Capture view events
- * @param element - The element that was viewed
- * @param context - Additional context
- */
-export const captureView = (params: TCaptureViewParams) => {
- captureElement({ ...params, interaction_type: "viewed" });
-};
-
-type TCaptureHoverParams = Omit;
-/**
- * Capture hover events
- * @param element - The element that was hovered
- * @param context - Additional context
- */
-export const captureHover = (params: TCaptureHoverParams) => {
- captureElement({ ...params, interaction_type: "hovered" });
-};
-
-type TCaptureEventParams = {
- eventName: string;
- payload?: Record;
- context?: TEventContext;
- state: TEventState;
-};
-/**
- * Capture business events (outcomes, state changes, etc.)
- * This helps understand business metrics and conversion rates
- *
- * @param eventName - Business event name (e.g., "cycle_created", "project_updated")
- * @param state - Success or error state
- * @param payload - Event-specific data
- * @param context - Additional context
- */
-const captureEvent = (params: TCaptureEventParams) => {
- const { eventName, payload, context, state } = params;
- if (!posthog) return;
-
- const finalPayload = {
- ...context,
- ...payload,
- state,
- timestamp: new Date().toISOString(),
- };
-
- posthog.capture(eventName, finalPayload);
-};
-
-type TCaptureSuccessParams = Omit;
-/**
- * Capture success events
- * @param eventName - The name of the event
- * @param payload - Additional payload
- * @param context - Additional context
- */
-export const captureSuccess = (params: TCaptureSuccessParams) => {
- captureEvent({ ...params, state: "SUCCESS" });
-};
-
-type TCaptureErrorParams = Omit & {
- error?: Error | string;
-};
-/**
- * Capture error events
- * @param eventName - The name of the event
- * @param error - The error object
- * @param payload - Additional payload
- * @param context - Additional context
- */
-export const captureError = (params: TCaptureErrorParams) => {
- captureEvent({ ...params, state: "ERROR", payload: { ...params.payload, error: params.error } });
-};
-
-type TCaptureElementAndEventParams = {
- element: Omit;
- event: TCaptureEventParams;
-};
-/**
- * Capture both element interaction and business event together
- * @param element - The element that was interacted with
- * @param event - The business event that was triggered
- */
-export const captureElementAndEvent = (params: TCaptureElementAndEventParams) => {
- const { element, event } = params;
- // Capture the element interaction first
- captureElement({ ...element, interaction_type: "clicked" });
-
- // Then capture the business event
- captureEvent(event);
-};
diff --git a/apps/web/package.json b/apps/web/package.json
index f775fd5c06..b738271348 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -37,7 +37,6 @@
"@plane/ui": "workspace:*",
"@plane/utils": "workspace:*",
"@popperjs/core": "^2.11.8",
- "@posthog/react": "^1.4.0",
"@react-pdf/renderer": "^3.4.5",
"@react-router/node": "catalog:",
"@sentry/react-router": "catalog:",
@@ -56,7 +55,6 @@
"mobx-react": "catalog:",
"mobx-utils": "catalog:",
"next-themes": "0.4.6",
- "posthog-js": "^1.255.1",
"react": "catalog:",
"react-color": "^2.19.3",
"react-dom": "catalog:",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b330a1e0be..2a4b33c52a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -639,9 +639,6 @@ importers:
'@popperjs/core':
specifier: ^2.11.8
version: 2.11.8
- '@posthog/react':
- specifier: ^1.4.0
- version: 1.4.0(@types/react@18.3.11)(posthog-js@1.255.1)(react@18.3.1)
'@react-pdf/renderer':
specifier: ^3.4.5
version: 3.4.5(react@18.3.1)
@@ -696,9 +693,6 @@ importers:
next-themes:
specifier: 0.4.6
version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- posthog-js:
- specifier: ^1.255.1
- version: 1.255.1
react:
specifier: 'catalog:'
version: 18.3.1
@@ -2603,16 +2597,6 @@ packages:
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
- '@posthog/react@1.4.0':
- resolution: {integrity: sha512-xzPeZ753fQ0deZzdgY/0YavZvNpmdaxUzLYJYu5XjONNcZ8PwJnNLEK+7D/Cj8UM4Q8nWI7QC5mjum0uLWa4FA==}
- peerDependencies:
- '@types/react': '>=16.8.0'
- posthog-js: '>=1.257.2'
- react: '>=16.8.0'
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
'@prettier/plugin-oxc@0.1.3':
resolution: {integrity: sha512-aABz3zIRilpWMekbt1FL1JVBQrQLR8L4Td2SRctECrWSsXGTNn/G1BqNSKCdbvQS1LWstAXfqcXzDki7GAAJyg==}
engines: {node: '>=14'}
@@ -5116,9 +5100,6 @@ packages:
resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
engines: {node: '>=18'}
- core-js@3.45.1:
- resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==}
-
cors@2.8.5:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
@@ -5874,9 +5855,6 @@ packages:
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
- fflate@0.4.8:
- resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
-
fflate@0.8.2:
resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
@@ -7756,20 +7734,6 @@ packages:
resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
engines: {node: '>=0.10.0'}
- posthog-js@1.255.1:
- resolution: {integrity: sha512-KMh0o9MhORhEZVjXpktXB5rJ8PfDk+poqBoTSoLzWgNjhJf6D8jcyB9jUMA6vVPfn4YeepVX5NuclDRqOwr5Mw==}
- peerDependencies:
- '@rrweb/types': 2.0.0-alpha.17
- rrweb-snapshot: 2.0.0-alpha.17
- peerDependenciesMeta:
- '@rrweb/types':
- optional: true
- rrweb-snapshot:
- optional: true
-
- preact@10.27.1:
- resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==}
-
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -9231,9 +9195,6 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
- web-vitals@4.2.4:
- resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
-
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
@@ -10715,13 +10676,6 @@ snapshots:
'@popperjs/core@2.11.8': {}
- '@posthog/react@1.4.0(@types/react@18.3.11)(posthog-js@1.255.1)(react@18.3.1)':
- dependencies:
- posthog-js: 1.255.1
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.11
-
'@prettier/plugin-oxc@0.1.3':
dependencies:
oxc-parser: 0.99.0
@@ -13546,8 +13500,6 @@ snapshots:
cookie@1.0.2: {}
- core-js@3.45.1: {}
-
cors@2.8.5:
dependencies:
object-assign: 4.1.1
@@ -14438,8 +14390,6 @@ snapshots:
fecha@4.2.3: {}
- fflate@0.4.8: {}
-
fflate@0.8.2: {}
file-entry-cache@8.0.0:
@@ -16633,15 +16583,6 @@ snapshots:
dependencies:
xtend: 4.0.2
- posthog-js@1.255.1:
- dependencies:
- core-js: 3.45.1
- fflate: 0.4.8
- preact: 10.27.1
- web-vitals: 4.2.4
-
- preact@10.27.1: {}
-
prelude-ls@1.2.1: {}
prettier@3.7.4: {}
@@ -18416,8 +18357,6 @@ snapshots:
web-namespaces@2.0.1: {}
- web-vitals@4.2.4: {}
-
webidl-conversions@3.0.1: {}
webidl-conversions@7.0.0:
diff --git a/turbo.json b/turbo.json
index 443c8fc703..5d1c227553 100644
--- a/turbo.json
+++ b/turbo.json
@@ -17,9 +17,6 @@
"VITE_ENABLE_SESSION_RECORDER",
"VITE_LIVE_BASE_PATH",
"VITE_LIVE_BASE_URL",
- "VITE_POSTHOG_DEBUG",
- "VITE_POSTHOG_HOST",
- "VITE_POSTHOG_KEY",
"VITE_SENTRY_DSN",
"VITE_SENTRY_ENVIRONMENT",
"VITE_SENTRY_PROFILES_SAMPLE_RATE",
From 6129e8e53bf1a77ced35c02cd5afa0508976871a Mon Sep 17 00:00:00 2001
From: sriram veeraghanta
Date: Tue, 30 Dec 2025 21:46:32 +0530
Subject: [PATCH 10/11] Revert "[WEB-4959]chore: refactor project member page
#8464" (#8476)
This reverts commit c97e41851530fbb0426c542fa8739ab95218f8a5.
---
.../settings/(workspace)/layout.tsx | 4 +-
.../settings/(workspace)/members/page.tsx | 3 +-
.../settings/projects/[projectId]/layout.tsx | 10 ++---
.../members/members-activity-button.tsx | 10 -----
.../ce/components/settings/right-sidebar.tsx | 10 -----
.../workspace/right-sidebar/index.ts | 1 +
.../workspace/right-sidebar/root.tsx | 10 +++++
.../ce/store/member/project-member.store.ts | 9 -----
.../core/components/project/member-list.tsx | 5 ---
.../settings/invitations-list-item.tsx | 3 ++
.../workspace/settings/member-columns.tsx | 3 ++
.../workspace/settings/members-list-item.tsx | 3 +-
apps/web/core/constants/fetch-keys.ts | 6 +--
.../project/base-project-member.store.ts | 21 +++-------
.../workspace/workspace-member.store.ts | 38 +++++++++----------
15 files changed, 51 insertions(+), 85 deletions(-)
delete mode 100644 apps/web/ce/components/projects/members/members-activity-button.tsx
delete mode 100644 apps/web/ce/components/settings/right-sidebar.tsx
create mode 100644 apps/web/ce/components/workspace/right-sidebar/index.ts
create mode 100644 apps/web/ce/components/workspace/right-sidebar/root.tsx
diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
index 5ac77bcccc..783f7a0dd0 100644
--- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
+++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
@@ -9,7 +9,7 @@ import { SettingsMobileNav } from "@/components/settings/mobile";
import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants";
import type { EUserWorkspaceRoles } from "@plane/types";
// plane web components
-import { SettingsRightSidebar } from "@/plane-web/components/settings/right-sidebar";
+import { WorkspaceSettingsRightSidebar } from "@/plane-web/components/workspace/right-sidebar";
// hooks
import { useUserPermissions } from "@/hooks/store/user";
// local components
@@ -48,7 +48,7 @@ const WorkspaceSettingLayout = observer(function WorkspaceSettingLayout({ params
-
+
)}
diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
index f74d9ca271..d096a17fff 100644
--- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
+++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
@@ -40,7 +40,7 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
const {
workspace: { workspaceMemberIds, inviteMembersToWorkspace, filtersStore },
} = useMember();
- const { currentWorkspace } = useWorkspace();
+ const { currentWorkspace, mutateWorkspaceMembersActivity } = useWorkspace();
const { t } = useTranslation();
// derived values
@@ -53,6 +53,7 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
const handleWorkspaceInvite = async (data: IWorkspaceBulkInviteFormData) => {
try {
await inviteMembersToWorkspace(workspaceSlug, data);
+ void mutateWorkspaceMembersActivity(workspaceSlug);
setInviteModal(false);
diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx
index 2128bd2f2e..8e8c09064d 100644
--- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx
+++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/layout.tsx
@@ -7,13 +7,10 @@ import { SettingsMobileNav } from "@/components/settings/mobile";
import { ProjectSettingsSidebar } from "@/components/settings/project/sidebar";
// plane web imports
import { ProjectAuthWrapper } from "@/plane-web/layouts/project-wrapper";
-import { SettingsRightSidebar } from "@/plane-web/components/settings/right-sidebar";
// types
import type { Route } from "./+types/layout";
-export const ProjectDetailSettingsLayout = observer(function ProjectDetailSettingsLayout({
- params,
-}: Route.ComponentProps) {
+function ProjectDetailSettingsLayout({ params }: Route.ComponentProps) {
const { workspaceSlug, projectId } = params;
// router
const pathname = usePathname();
@@ -27,11 +24,10 @@ export const ProjectDetailSettingsLayout = observer(function ProjectDetailSettin
-
>
);
-});
+}
-export default ProjectDetailSettingsLayout;
+export default observer(ProjectDetailSettingsLayout);
diff --git a/apps/web/ce/components/projects/members/members-activity-button.tsx b/apps/web/ce/components/projects/members/members-activity-button.tsx
deleted file mode 100644
index 169d47a939..0000000000
--- a/apps/web/ce/components/projects/members/members-activity-button.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { observer } from "mobx-react";
-
-type TProjectMembersActivityButtonProps = { workspaceSlug: string; projectId: string };
-
-export const ProjectMembersActivityButton = observer(function ProjectMembersActivityButton(
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- props: TProjectMembersActivityButtonProps
-) {
- return <>>;
-});
diff --git a/apps/web/ce/components/settings/right-sidebar.tsx b/apps/web/ce/components/settings/right-sidebar.tsx
deleted file mode 100644
index 887da2f8e3..0000000000
--- a/apps/web/ce/components/settings/right-sidebar.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { observer } from "mobx-react";
-
-type TSettingsRightSidebarProps = { workspaceSlug: string; projectId?: string };
-
-export const SettingsRightSidebar = observer(function SettingsRightSidebar(
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- props: TSettingsRightSidebarProps
-) {
- return <>>;
-});
diff --git a/apps/web/ce/components/workspace/right-sidebar/index.ts b/apps/web/ce/components/workspace/right-sidebar/index.ts
new file mode 100644
index 0000000000..1efe34c51e
--- /dev/null
+++ b/apps/web/ce/components/workspace/right-sidebar/index.ts
@@ -0,0 +1 @@
+export * from "./root";
diff --git a/apps/web/ce/components/workspace/right-sidebar/root.tsx b/apps/web/ce/components/workspace/right-sidebar/root.tsx
new file mode 100644
index 0000000000..c98bb682a5
--- /dev/null
+++ b/apps/web/ce/components/workspace/right-sidebar/root.tsx
@@ -0,0 +1,10 @@
+import { observer } from "mobx-react";
+
+type TWorkspaceSettingsRightSidebarProps = { workspaceSlug: string };
+
+export const WorkspaceSettingsRightSidebar = observer(function WorkspaceSettingsRightSidebar(
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ props: TWorkspaceSettingsRightSidebarProps
+) {
+ return <>>;
+});
diff --git a/apps/web/ce/store/member/project-member.store.ts b/apps/web/ce/store/member/project-member.store.ts
index 1be3ee1c1c..f0e5b3069d 100644
--- a/apps/web/ce/store/member/project-member.store.ts
+++ b/apps/web/ce/store/member/project-member.store.ts
@@ -41,13 +41,4 @@ export class ProjectMemberStore extends BaseProjectMemberStore implements IProje
* @param userId - The ID of the user to remove from the project
*/
processMemberRemoval = (projectId: string, userId: string) => this.handleMemberRemoval(projectId, userId);
-
- /**
- * @description Mutate project members activity
- * @param workspaceSlug
- * @param projectId
- */
- mutateProjectMembersActivity = async (_workspaceSlug: string, _projectId: string) => {
- // No-op in default/CE version
- };
}
diff --git a/apps/web/core/components/project/member-list.tsx b/apps/web/core/components/project/member-list.tsx
index acc32265f2..5dbe78d72e 100644
--- a/apps/web/core/components/project/member-list.tsx
+++ b/apps/web/core/components/project/member-list.tsx
@@ -14,8 +14,6 @@ import { useUserPermissions } from "@/hooks/store/user";
import { MemberListFiltersDropdown } from "./dropdowns/filters/member-list";
import { ProjectMemberListItem } from "./member-list-item";
import { SendProjectInvitationModal } from "./send-project-invitation-modal";
-// plane web components
-import { ProjectMembersActivityButton } from "@/plane-web/components/projects/members/members-activity-button";
type TProjectMemberListProps = {
projectId: string;
@@ -86,7 +84,6 @@ export const ProjectMemberList = observer(function ProjectMemberList(props: TPro
className="w-full max-w-[234px] border-none bg-transparent text-13 focus:outline-none placeholder:text-placeholder"
placeholder="Search"
value={searchQuery}
- // eslint-disable-next-line jsx-a11y/no-autofocus
autoFocus
onChange={(e) => setSearchQuery(e.target.value)}
/>
@@ -96,11 +93,9 @@ export const ProjectMemberList = observer(function ProjectMemberList(props: TPro
handleUpdate={handleRoleFilterUpdate}
memberType="project"
/>
- {isAdmin &&
}
{isAdmin && (
{
setInviteModal(true);
}}
diff --git a/apps/web/core/components/workspace/settings/invitations-list-item.tsx b/apps/web/core/components/workspace/settings/invitations-list-item.tsx
index 12b4cc821f..20ea3d7a9c 100644
--- a/apps/web/core/components/workspace/settings/invitations-list-item.tsx
+++ b/apps/web/core/components/workspace/settings/invitations-list-item.tsx
@@ -14,6 +14,7 @@ import { ConfirmWorkspaceMemberRemove } from "@/components/workspace/confirm-wor
// hooks
import { useMember } from "@/hooks/store/use-member";
import { useUserPermissions } from "@/hooks/store/user";
+import { useWorkspace } from "@/hooks/store/use-workspace";
type Props = {
invitationId: string;
@@ -29,6 +30,7 @@ export const WorkspaceInvitationsListItem = observer(function WorkspaceInvitatio
const { t } = useTranslation();
// store hooks
const { allowPermissions, workspaceInfoBySlug } = useUserPermissions();
+ const { mutateWorkspaceMembersActivity } = useWorkspace();
const {
workspace: { updateMemberInvitation, deleteMemberInvitation, getWorkspaceInvitationDetails },
} = useMember();
@@ -57,6 +59,7 @@ export const WorkspaceInvitationsListItem = observer(function WorkspaceInvitatio
title: "Success!",
message: "Invitation removed successfully.",
});
+ void mutateWorkspaceMembersActivity(workspaceSlug);
} catch (err: unknown) {
const error = err as { error?: string };
setToast({
diff --git a/apps/web/core/components/workspace/settings/member-columns.tsx b/apps/web/core/components/workspace/settings/member-columns.tsx
index 53bc115e9f..b98438b1d4 100644
--- a/apps/web/core/components/workspace/settings/member-columns.tsx
+++ b/apps/web/core/components/workspace/settings/member-columns.tsx
@@ -16,6 +16,7 @@ import { getFileURL } from "@plane/utils";
// hooks
import { useMember } from "@/hooks/store/use-member";
import { useUser, useUserPermissions } from "@/hooks/store/user";
+import { useWorkspace } from "@/hooks/store/use-workspace";
// plane web constants
export interface RowData {
@@ -120,6 +121,7 @@ export const AccountTypeColumn = observer(function AccountTypeColumn(props: Acco
const {
workspace: { updateMember },
} = useMember();
+ const { mutateWorkspaceMembersActivity } = useWorkspace();
const { data: currentUser } = useUser();
// derived values
@@ -154,6 +156,7 @@ export const AccountTypeColumn = observer(function AccountTypeColumn(props: Acco
await updateMember(workspaceSlug.toString(), rowData.member.id, {
role: value as unknown as EUserPermissions,
});
+ void mutateWorkspaceMembersActivity(workspaceSlug);
} catch (err: unknown) {
const error = err as { error?: string | string[] };
const errorString = Array.isArray(error?.error) ? error.error[0] : error?.error;
diff --git a/apps/web/core/components/workspace/settings/members-list-item.tsx b/apps/web/core/components/workspace/settings/members-list-item.tsx
index 9499110ee5..4f0b20dc5d 100644
--- a/apps/web/core/components/workspace/settings/members-list-item.tsx
+++ b/apps/web/core/components/workspace/settings/members-list-item.tsx
@@ -32,7 +32,7 @@ export const WorkspaceMembersListItem = observer(function WorkspaceMembersListIt
workspace: { removeMemberFromWorkspace },
} = useMember();
const { leaveWorkspace } = useUserPermissions();
- const { getWorkspaceRedirectionUrl } = useWorkspace();
+ const { getWorkspaceRedirectionUrl, mutateWorkspaceMembersActivity } = useWorkspace();
const { fetchCurrentUserSettings } = useUserSettings();
const { t } = useTranslation();
// derived values
@@ -59,6 +59,7 @@ export const WorkspaceMembersListItem = observer(function WorkspaceMembersListIt
try {
await removeMemberFromWorkspace(workspaceSlug.toString(), memberId);
+ void mutateWorkspaceMembersActivity(workspaceSlug);
} catch (err: unknown) {
const error = err as { error?: string };
setToast({
diff --git a/apps/web/core/constants/fetch-keys.ts b/apps/web/core/constants/fetch-keys.ts
index 5c6623f162..b7d669506e 100644
--- a/apps/web/core/constants/fetch-keys.ts
+++ b/apps/web/core/constants/fetch-keys.ts
@@ -154,10 +154,10 @@ export const APPLICATION_BY_CLIENT_ID = (clientId: string) => `APPLICATION_BY_CL
export const APPLICATION_CATEGORIES_LIST = () => `APPLICATION_CATEGORIES_LIST`;
// project level keys
-export const PROJECT_DETAILS = (_workspaceSlug: string, projectId: string) =>
+export const PROJECT_DETAILS = (workspaceSlug: string, projectId: string) =>
`PROJECT_DETAILS_${projectId.toString().toUpperCase()}`;
-export const PROJECT_ME_INFORMATION = (_workspaceSlug: string, projectId: string) =>
+export const PROJECT_ME_INFORMATION = (workspaceSlug: string, projectId: string) =>
`PROJECT_ME_INFORMATION_${projectId.toString().toUpperCase()}`;
export const PROJECT_LABELS = (projectId: string, projectRole: EUserPermissions | undefined) =>
@@ -166,8 +166,6 @@ export const PROJECT_LABELS = (projectId: string, projectRole: EUserPermissions
export const PROJECT_MEMBERS = (projectId: string, projectRole: EUserPermissions | undefined) =>
`PROJECT_MEMBERS_${projectId.toString().toUpperCase()}_${projectRole}`;
-export const PROJECT_MEMBER_ACTIVITY = (projectId: string) => `PROJECT_MEMBER_ACTIVITY_${projectId.toUpperCase()}`;
-
export const PROJECT_STATES = (projectId: string, projectRole: EUserPermissions | undefined) =>
`PROJECT_STATES_${projectId.toString().toUpperCase()}_${projectRole}`;
diff --git a/apps/web/core/store/member/project/base-project-member.store.ts b/apps/web/core/store/member/project/base-project-member.store.ts
index 3252b1948f..eb135868aa 100644
--- a/apps/web/core/store/member/project/base-project-member.store.ts
+++ b/apps/web/core/store/member/project/base-project-member.store.ts
@@ -81,7 +81,6 @@ export interface IBaseProjectMemberStore {
role: EUserProjectRoles
) => Promise;
removeMemberFromProject: (workspaceSlug: string, projectId: string, userId: string) => Promise;
- mutateProjectMembersActivity: (workspaceSlug: string, projectId: string) => Promise;
}
export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore {
@@ -316,13 +315,13 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
});
});
});
- update(this.projectRoot.projectMap, [projectId, "members"], (memberIds: string[]) =>
+ update(this.projectRoot.projectMap, [projectId, "members"], (memberIds) =>
uniq([...memberIds, ...data.members.map((m) => m.member_id)])
);
this.projectRoot.projectMap[projectId].members = this.projectRoot.projectMap?.[projectId]?.members?.concat(
data.members.map((m) => m.member_id)
);
- void this.mutateProjectMembersActivity(workspaceSlug, projectId);
+
return response;
});
@@ -376,7 +375,6 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
role,
}
);
- void this.mutateProjectMembersActivity(workspaceSlug, projectId);
return response;
} catch (error) {
// revert back to original members in case of error
@@ -431,11 +429,11 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
removeMemberFromProject = async (workspaceSlug: string, projectId: string, userId: string) => {
const memberDetails = this.getProjectMemberDetails(userId, projectId);
if (!memberDetails || !memberDetails?.id) throw new Error("Member not found");
- await this.projectMemberService.deleteProjectMember(workspaceSlug, projectId, memberDetails?.id);
- runInAction(() => {
- this.processMemberRemoval(projectId, userId);
+ await this.projectMemberService.deleteProjectMember(workspaceSlug, projectId, memberDetails?.id).then(() => {
+ runInAction(() => {
+ this.processMemberRemoval(projectId, userId);
+ });
});
- void this.mutateProjectMembersActivity(workspaceSlug, projectId);
};
/**
@@ -503,11 +501,4 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
throw error;
}
};
-
- /**
- * Mutate project members activity
- * @param workspaceSlug
- * @param projectId
- */
- abstract mutateProjectMembersActivity(workspaceSlug: string, projectId: string): Promise;
}
diff --git a/apps/web/core/store/member/workspace/workspace-member.store.ts b/apps/web/core/store/member/workspace/workspace-member.store.ts
index 1d820d6628..edf9d2a297 100644
--- a/apps/web/core/store/member/workspace/workspace-member.store.ts
+++ b/apps/web/core/store/member/workspace/workspace-member.store.ts
@@ -4,14 +4,14 @@ import { computedFn } from "mobx-utils";
// types
import type { EUserPermissions } from "@plane/constants";
import type { IWorkspaceBulkInviteFormData, IWorkspaceMember, IWorkspaceMemberInvitation } from "@plane/types";
-// plane-web imports
-import type { RootStore } from "@/plane-web/store/root.store";
+// plane-web constants
// services
import { WorkspaceService } from "@/plane-web/services";
// types
import type { IRouterStore } from "@/store/router.store";
import type { IUserStore } from "@/store/user";
// store
+import type { CoreRootStore } from "../../root.store";
import type { IMemberRootStore } from "../index.ts";
import type { IWorkspaceMemberFiltersStore } from "./workspace-member-filters.store";
import { WorkspaceMemberFiltersStore } from "./workspace-member-filters.store";
@@ -69,11 +69,10 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
routerStore: IRouterStore;
userStore: IUserStore;
memberRoot: IMemberRootStore;
- rootStore: RootStore;
// services
workspaceService;
- constructor(_memberRoot: IMemberRootStore, _rootStore: RootStore) {
+ constructor(_memberRoot: IMemberRootStore, _rootStore: CoreRootStore) {
makeObservable(this, {
// observables
workspaceMemberMap: observable,
@@ -96,7 +95,6 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
this.routerStore = _rootStore.router;
this.userStore = _rootStore.user;
this.memberRoot = _memberRoot;
- this.rootStore = _rootStore;
// services
this.workspaceService = new WorkspaceService();
}
@@ -261,7 +259,6 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
set(this.workspaceMemberMap, [workspaceSlug, userId, "role"], data.role);
});
await this.workspaceService.updateWorkspaceMember(workspaceSlug, memberDetails.id, data);
- void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
} catch (error) {
// revert back to original members in case of error
runInAction(() => {
@@ -279,11 +276,11 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
removeMemberFromWorkspace = async (workspaceSlug: string, userId: string) => {
const memberDetails = this.getWorkspaceMemberDetails(userId);
if (!memberDetails) throw new Error("Member not found");
- await this.workspaceService.deleteWorkspaceMember(workspaceSlug, memberDetails?.id);
- runInAction(() => {
- set(this.workspaceMemberMap, [workspaceSlug, userId, "is_active"], false);
+ await this.workspaceService.deleteWorkspaceMember(workspaceSlug, memberDetails?.id).then(() => {
+ runInAction(() => {
+ set(this.workspaceMemberMap, [workspaceSlug, userId, "is_active"], false);
+ });
});
- void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
};
/**
@@ -304,9 +301,9 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
* @param data
*/
inviteMembersToWorkspace = async (workspaceSlug: string, data: IWorkspaceBulkInviteFormData) => {
- await this.workspaceService.inviteWorkspace(workspaceSlug, data);
+ const response = await this.workspaceService.inviteWorkspace(workspaceSlug, data);
await this.fetchWorkspaceMemberInvitations(workspaceSlug);
- void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
+ return response;
};
/**
@@ -320,7 +317,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
invitationId: string,
data: Partial
) => {
- const originalMemberInvitations = [...(this.workspaceMemberInvitations?.[workspaceSlug] ?? [])]; // in case of error, we will revert back to original members
+ const originalMemberInvitations = [...this.workspaceMemberInvitations?.[workspaceSlug]]; // in case of error, we will revert back to original members
try {
const memberInvitations = originalMemberInvitations?.map((invitation) => ({
...invitation,
@@ -345,15 +342,14 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
* @param workspaceSlug
* @param memberId
*/
- deleteMemberInvitation = async (workspaceSlug: string, invitationId: string) => {
- await this.workspaceService.deleteWorkspaceInvitations(workspaceSlug.toString(), invitationId);
- runInAction(() => {
- this.workspaceMemberInvitations[workspaceSlug] = this.workspaceMemberInvitations[workspaceSlug].filter(
- (inv) => inv.id !== invitationId
- );
+ deleteMemberInvitation = async (workspaceSlug: string, invitationId: string) =>
+ await this.workspaceService.deleteWorkspaceInvitations(workspaceSlug.toString(), invitationId).then(() => {
+ runInAction(() => {
+ this.workspaceMemberInvitations[workspaceSlug] = this.workspaceMemberInvitations[workspaceSlug].filter(
+ (inv) => inv.id !== invitationId
+ );
+ });
});
- void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
- };
isUserSuspended = computedFn((userId: string, workspaceSlug: string) => {
if (!workspaceSlug) return false;
From 3d5e427894d35185d7cf23da29bc75677d48f93d Mon Sep 17 00:00:00 2001
From: Prateek Shourya
Date: Wed, 31 Dec 2025 00:08:40 +0530
Subject: [PATCH 11/11] chore: remove unused right sidebar component and clean
up workspace member settings (#8477)
---
.../(settings)/settings/(workspace)/layout.tsx | 3 ---
.../settings/(workspace)/members/page.tsx | 17 +++--------------
.../components/workspace/right-sidebar/index.ts | 1 -
.../components/workspace/right-sidebar/root.tsx | 10 ----------
.../settings/invitations-list-item.tsx | 3 ---
.../workspace/settings/member-columns.tsx | 4 ----
.../workspace/settings/members-list-item.tsx | 3 +--
.../member/workspace/workspace-member.store.ts | 4 ++--
8 files changed, 6 insertions(+), 39 deletions(-)
delete mode 100644 apps/web/ce/components/workspace/right-sidebar/index.ts
delete mode 100644 apps/web/ce/components/workspace/right-sidebar/root.tsx
diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
index 783f7a0dd0..9eb72a7829 100644
--- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
+++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx
@@ -8,8 +8,6 @@ import { SettingsMobileNav } from "@/components/settings/mobile";
// plane imports
import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants";
import type { EUserWorkspaceRoles } from "@plane/types";
-// plane web components
-import { WorkspaceSettingsRightSidebar } from "@/plane-web/components/workspace/right-sidebar";
// hooks
import { useUserPermissions } from "@/hooks/store/user";
// local components
@@ -48,7 +46,6 @@ const WorkspaceSettingLayout = observer(function WorkspaceSettingLayout({ params
-
)}
diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
index d096a17fff..7f8e32fec1 100644
--- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
+++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx
@@ -1,12 +1,7 @@
import { useState } from "react";
import { observer } from "mobx-react";
// types
-import {
- EUserPermissions,
- EUserPermissionsLevel,
- MEMBER_TRACKER_ELEMENTS,
- MEMBER_TRACKER_EVENTS,
-} from "@plane/constants";
+import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Button } from "@plane/propel/button";
import { SearchIcon } from "@plane/propel/icons";
@@ -40,7 +35,7 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
const {
workspace: { workspaceMemberIds, inviteMembersToWorkspace, filtersStore },
} = useMember();
- const { currentWorkspace, mutateWorkspaceMembersActivity } = useWorkspace();
+ const { currentWorkspace } = useWorkspace();
const { t } = useTranslation();
// derived values
@@ -53,7 +48,6 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
const handleWorkspaceInvite = async (data: IWorkspaceBulkInviteFormData) => {
try {
await inviteMembersToWorkspace(workspaceSlug, data);
- void mutateWorkspaceMembersActivity(workspaceSlug);
setInviteModal(false);
@@ -137,12 +131,7 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
/>