import { useEffect } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; import { mutate } from "swr"; // services import { AnalyticsService } from "services/analytics.service"; import { TrackEventService } from "services/track_event.service"; // hooks import useToast from "hooks/use-toast"; import { useMobxStore } from "lib/mobx/store-provider"; // components import { CustomAnalyticsSidebarHeader, CustomAnalyticsSidebarProjectsList } from "components/analytics"; // ui import { Button } from "@plane/ui"; // icons import { ArrowDownTrayIcon, ArrowPathIcon, CalendarDaysIcon } from "@heroicons/react/24/outline"; import { LayerDiagonalIcon } from "components/icons"; // helpers import { renderShortDate } from "helpers/date-time.helper"; // types import { IAnalyticsParams, IAnalyticsResponse, IExportAnalyticsFormData, IWorkspace } from "types"; // fetch-keys import { ANALYTICS } from "constants/fetch-keys"; type Props = { analytics: IAnalyticsResponse | undefined; params: IAnalyticsParams; fullScreen: boolean; isProjectLevel: boolean; }; const analyticsService = new AnalyticsService(); const trackEventService = new TrackEventService(); export const CustomAnalyticsSidebar: React.FC = observer( ({ analytics, params, fullScreen, isProjectLevel = false }) => { const router = useRouter(); const { workspaceSlug, projectId, cycleId, moduleId } = router.query; const { setToastAlert } = useToast(); const { user: userStore, project: projectStore, cycle: cycleStore, module: moduleStore } = useMobxStore(); const user = userStore.currentUser; const projects = workspaceSlug ? projectStore.projects[workspaceSlug.toString()] : undefined; const projectDetails = workspaceSlug && projectId ? projectStore.getProjectById(workspaceSlug.toString(), projectId.toString()) ?? undefined : undefined; const trackExportAnalytics = () => { if (!user) return; const eventPayload: any = { workspaceSlug: workspaceSlug?.toString(), params: { x_axis: params.x_axis, y_axis: params.y_axis, group: params.segment, project: params.project, }, }; if (projectDetails) { const workspaceDetails = projectDetails.workspace as IWorkspace; eventPayload.workspaceId = workspaceDetails.id; eventPayload.workspaceName = workspaceDetails.name; eventPayload.projectId = projectDetails.id; eventPayload.projectIdentifier = projectDetails.identifier; eventPayload.projectName = projectDetails.name; } if (cycleDetails || moduleDetails) { const details = cycleDetails || moduleDetails; eventPayload.workspaceId = details?.workspace_detail?.id; eventPayload.workspaceName = details?.workspace_detail?.name; eventPayload.projectId = details?.project_detail.id; eventPayload.projectIdentifier = details?.project_detail.identifier; eventPayload.projectName = details?.project_detail.name; } if (cycleDetails) { eventPayload.cycleId = cycleDetails.id; eventPayload.cycleName = cycleDetails.name; } if (moduleDetails) { eventPayload.moduleId = moduleDetails.id; eventPayload.moduleName = moduleDetails.name; } trackEventService.trackAnalyticsEvent( eventPayload, cycleId ? "CYCLE_ANALYTICS_EXPORT" : moduleId ? "MODULE_ANALYTICS_EXPORT" : projectId ? "PROJECT_ANALYTICS_EXPORT" : "WORKSPACE_ANALYTICS_EXPORT", user ); }; const exportAnalytics = () => { if (!workspaceSlug) return; const data: IExportAnalyticsFormData = { x_axis: params.x_axis, y_axis: params.y_axis, }; if (params.segment) data.segment = params.segment; if (params.project) data.project = params.project; analyticsService .exportAnalytics(workspaceSlug.toString(), data) .then((res) => { setToastAlert({ type: "success", title: "Success!", message: res.message, }); trackExportAnalytics(); }) .catch(() => setToastAlert({ type: "error", title: "Error!", message: "There was some error in exporting the analytics. Please try again.", }) ); }; const cycleDetails = cycleId ? cycleStore.getCycleById(cycleId.toString()) : undefined; const moduleDetails = moduleId ? moduleStore.getModuleById(moduleId.toString()) : undefined; // fetch cycle details useEffect(() => { if (!workspaceSlug || !projectId || !cycleId || cycleDetails) return; cycleStore.fetchCycleWithId(workspaceSlug.toString(), projectId.toString(), cycleId.toString()); }, [cycleId, cycleDetails, cycleStore, projectId, workspaceSlug]); // fetch module details useEffect(() => { if (!workspaceSlug || !projectId || !moduleId || moduleDetails) return; moduleStore.fetchModuleDetails(workspaceSlug.toString(), projectId.toString(), moduleId.toString()); }, [moduleId, moduleDetails, moduleStore, projectId, workspaceSlug]); const selectedProjects = params.project && params.project.length > 0 ? params.project : projects?.map((p) => p.id); return (
{analytics ? analytics.total : "..."} Issues
{isProjectLevel && (
{renderShortDate( (cycleId ? cycleDetails?.created_at : moduleId ? moduleDetails?.created_at : projectDetails?.created_at) ?? "" )}
)}
{fullScreen ? ( <> {!isProjectLevel && selectedProjects && selectedProjects.length > 0 && ( selectedProjects.includes(p.id)) ?? []} /> )} ) : null}
); } );