import { FC, Fragment, useCallback, useEffect, useMemo, useState } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; // hooks import { useView, useViewDetail } from "hooks/store"; import useToast from "hooks/use-toast"; // components import { ViewRoot, ViewCreateEditForm, ViewEditDropdown, ViewLayoutRoot, ViewFiltersDropdown, ViewFiltersEditDropdown, ViewDisplayFiltersDropdown, ViewAppliedFiltersRoot, ViewDuplicateConfirmationModal, ViewDeleteConfirmationModal, } from "./"; // ui import { Loader } from "@plane/ui"; // constants import { ELocalViews, EViewLayouts, EViewPageType, TViewCRUD, viewDefaultFilterParametersByViewTypeAndLayout, } from "constants/view"; // types import { TViewOperations } from "./types"; import { TViewTypes } from "@plane/types"; type TGlobalViewRoot = { workspaceSlug: string; projectId: string | undefined; viewId: string; viewType: TViewTypes; viewPageType: EViewPageType; baseRoute: string; }; type TViewOperationsToggle = { type: "DUPLICATE" | "DELETE" | undefined; viewId: string | undefined; }; export const GlobalViewRoot: FC = observer((props) => { // router const router = useRouter(); const { workspaceSlug, projectId, viewId, viewType, viewPageType, baseRoute } = props; // hooks const viewStore = useView(workspaceSlug, projectId, viewType); const viewDetailStore = useViewDetail(workspaceSlug, projectId, viewId, viewType); const { setToastAlert } = useToast(); // states const [viewOperationsToggle, setViewOperationsToggle] = useState({ type: undefined, viewId: undefined, }); const handleViewOperationsToggle = useCallback( (type: TViewOperationsToggle["type"], viewId: string | undefined) => setViewOperationsToggle({ type, viewId }), [] ); const viewOperations: TViewOperations = useMemo( () => ({ localViewCreateEdit: (viewId: string | undefined, status: TViewCRUD) => { viewStore?.localViewHandler(viewId, status); }, fetch: async () => { try { await viewStore?.fetch(workspaceSlug, projectId); } catch { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again later or contact the support team.", }); } }, create: async () => { try { await viewStore?.create(); handleViewOperationsToggle(undefined, undefined); setToastAlert({ type: "success", title: "Success!", message: "View created successfully.", }); } catch { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again later or contact the support team.", }); } }, update: async () => { try { await viewDetailStore?.saveChanges(); handleViewOperationsToggle(undefined, undefined); setToastAlert({ type: "success", title: "Success!", message: "View updated successfully.", }); } catch { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again later or contact the support team.", }); } }, remove: async (viewId: string) => { try { await viewStore?.remove(viewId); handleViewOperationsToggle(undefined, undefined); setToastAlert({ type: "success", title: "Success!", message: "View removed successfully.", }); } catch { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again later or contact the support team.", }); } }, duplicate: async (viewId: string) => { try { await viewStore?.duplicate(viewId); handleViewOperationsToggle(undefined, undefined); setToastAlert({ type: "success", title: "Success!", message: "View removed successfully.", }); } catch { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again later or contact the support team.", }); } }, }), [viewStore, viewDetailStore, handleViewOperationsToggle, setToastAlert, workspaceSlug, projectId] ); const applyFIltersFromRouter = () => { if (workspaceSlug && viewId && Object.values(ELocalViews).includes(viewId as ELocalViews)) { const routerQueryParams = { ...router.query }; // eslint-disable-next-line @typescript-eslint/no-unused-vars const { ["workspaceSlug"]: _workspaceSlug, ["viewId"]: _viewId, ...filters } = routerQueryParams; const acceptedFilters = viewDefaultFilterParametersByViewTypeAndLayout( viewPageType, EViewLayouts.SPREADSHEET, "filters" ); Object.keys(filters).forEach((key) => { const filterKey: any = key; const filterValue = filters[key]?.toString() || undefined; if (filterKey && filterValue && acceptedFilters.includes(filterKey)) { const _filterValues = filterValue.split(","); _filterValues.forEach((element) => { console.log("filterKey", filterKey); console.log("element", element); viewDetailStore?.setFilters(filterKey, element); }); } }); } // eslint-disable-next-line react-hooks/exhaustive-deps }; // fetch all views useEffect(() => { const fetchViews = async () => { await viewStore?.fetch( workspaceSlug, projectId, viewStore?.viewIds.length > 0 ? "view-mutation-loader" : "view-loader" ); }; if (workspaceSlug && viewType && viewStore) fetchViews(); }, [workspaceSlug, projectId, viewType, viewStore]); // fetch view by id useEffect(() => { const fetchViewByViewId = async () => { await viewStore?.fetchById(workspaceSlug, projectId, viewId); // applyFIltersFromRouter(); }; if (workspaceSlug && viewId && viewType && viewStore) { fetchViewByViewId(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [workspaceSlug, projectId, viewId, viewType, viewStore]); console.log("viewStore? -->", viewStore?.viewMapCEN?.id); return (
{viewStore?.loader && viewStore?.loader === "view-loader" ? (
) : ( <>
{viewStore?.loader === "view-detail-loader" ? (
) : (
)} )} {/* create edit modal */} {viewStore?.viewMapCEN?.id && ( )} {viewOperationsToggle.type && viewOperationsToggle.viewId && ( {["DUPLICATE"].includes(viewOperationsToggle.type) && ( )} {["DELETE"].includes(viewOperationsToggle.type) && ( )} )}
); });