* feat: event tracker helper * feat: track click events for `data-ph-element` * fix: handled click events * fix: handled name * chore: tracker element updates * chore: remove export * chore: tracker element type * chore: track element and event helper. * chore: minor improvements * chore: minor refactors * fix: workspace events * fix: added slug * fix: changes nomenclature * fix: nomenclature * chore: update event tracker helper types * fix: data id * refactor: cycle events (#7290) * chore: update event tracker helper types * refactor: cycle events * refactor: cycle events * refactor: cycle event tracker * chore: update tracker elements * chore: check for closest element with data-ph-element attribute --------- Co-authored-by: Prateek Shourya <prateekshourya@Prateeks-MacBook-Pro.local> * Refactor module events (#7291) * chore: update event tracker helper types * refactor: cycle events * refactor: cycle events * refactor: cycle event tracker * refactor: module tracker event and element * chore: update tracker element * chore: revert unnecessary changes --------- Co-authored-by: Prateek Shourya <prateekshourya@Prateeks-MacBook-Pro.local> * refactor: global views, product tour, notifications, onboarding, users and sidebar related events * chore: member tracker events (#7302) * chore: member-tracker-events * fix: constants * refactor: update event tracker constants * refactor: auth related event trackers (#7306) * Chore: state events (#7307) * chore: state events * fix: refactor * chore: project events (#7305) * chore: project-events * fix: refactor * fix: removed hardcoded values * fix: github redirection event * chore: project page tracker events (#7304) * added events for most page events * refactor: simplify lock button event handling in PageLockControl --------- Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com> Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com> * chore: minor cleanup and import fixes * refactor: added tracker elements for buttons (#7308) Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com> * fix: event type * refactor: posthog group event * chore: removed instances of event tracker (#7309) * refactor: remove event tracker stores and hooks * refactor: remove event tracker store * fix: build errors * clean up event tracker payloads * fix: coderabbit suggestions --------- Co-authored-by: Prateek Shourya <prateekshourya@Prateeks-MacBook-Pro.local> Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com> Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com> Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com> Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
312 lines
9.3 KiB
TypeScript
312 lines
9.3 KiB
TypeScript
import { useMemo } from "react";
|
|
// constants
|
|
import { IS_FAVORITE_MENU_OPEN, PROJECT_PAGE_TRACKER_EVENTS } from "@plane/constants";
|
|
import { EditorRefApi } from "@plane/editor";
|
|
import { EPageAccess } from "@plane/types/src/enums";
|
|
// ui
|
|
import { setToast, TOAST_TYPE } from "@plane/ui";
|
|
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
|
|
import { TPageInstance } from "@/store/pages/base-page";
|
|
// local storage
|
|
import useLocalStorage from "./use-local-storage";
|
|
|
|
export type TPageOperations = {
|
|
toggleLock: () => void;
|
|
toggleAccess: () => void;
|
|
toggleFavorite: () => void;
|
|
openInNewTab: () => void;
|
|
copyLink: () => void;
|
|
duplicate: () => void;
|
|
toggleArchive: () => void;
|
|
};
|
|
|
|
type Props = {
|
|
editorRef?: EditorRefApi | null;
|
|
page: TPageInstance;
|
|
};
|
|
|
|
export const usePageOperations = (
|
|
props: Props
|
|
): {
|
|
pageOperations: TPageOperations;
|
|
} => {
|
|
const { page } = props;
|
|
// derived values
|
|
const {
|
|
access,
|
|
addToFavorites,
|
|
archived_at,
|
|
duplicate,
|
|
is_favorite,
|
|
is_locked,
|
|
getRedirectionLink,
|
|
removePageFromFavorites,
|
|
} = page;
|
|
// collaborative actions
|
|
const { executeCollaborativeAction } = useCollaborativePageActions(props);
|
|
// local storage
|
|
const { setValue: toggleFavoriteMenu, storedValue: isFavoriteMenuOpen } = useLocalStorage<boolean>(
|
|
IS_FAVORITE_MENU_OPEN,
|
|
false
|
|
);
|
|
// page operations
|
|
const pageOperations: TPageOperations = useMemo(() => {
|
|
const pageLink = getRedirectionLink();
|
|
|
|
return {
|
|
copyLink: () => {
|
|
copyUrlToClipboard(pageLink).then(() => {
|
|
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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: "Page could not be duplicated. Please try again later.",
|
|
});
|
|
}
|
|
},
|
|
move: async () => {},
|
|
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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: `The page couldn't be marked ${changedPageType}. Please try again.`,
|
|
});
|
|
}
|
|
},
|
|
toggleArchive: async () => {
|
|
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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: "Page could not be restored. Please try again later.",
|
|
});
|
|
}
|
|
} 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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: "Page could not be archived. Please try again later.",
|
|
});
|
|
}
|
|
}
|
|
},
|
|
toggleFavorite: () => {
|
|
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,
|
|
});
|
|
});
|
|
} 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,
|
|
});
|
|
});
|
|
}
|
|
},
|
|
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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: "Page could not be unlocked. Please try again later.",
|
|
});
|
|
}
|
|
} 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,
|
|
});
|
|
setToast({
|
|
type: TOAST_TYPE.ERROR,
|
|
title: "Error!",
|
|
message: "Page could not be locked. Please try again later.",
|
|
});
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}, [
|
|
access,
|
|
addToFavorites,
|
|
archived_at,
|
|
duplicate,
|
|
executeCollaborativeAction,
|
|
getRedirectionLink,
|
|
is_favorite,
|
|
is_locked,
|
|
isFavoriteMenuOpen,
|
|
page.id,
|
|
removePageFromFavorites,
|
|
toggleFavoriteMenu,
|
|
]);
|
|
return {
|
|
pageOperations,
|
|
};
|
|
};
|