/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import { useCallback, useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import { useTranslation } from "@plane/i18n"; import { EmptyStateDetailed } from "@plane/propel/empty-state"; import type { TInboxIssueCurrentTab } from "@plane/types"; import { EInboxIssueCurrentTab } from "@plane/types"; import { EHeaderVariant, Header, Loader } from "@plane/ui"; import { cn } from "@plane/utils"; import { InboxSidebarLoader } from "@/components/ui/loader/layouts/project-inbox/inbox-sidebar-loader"; import { useProject } from "@/hooks/store/use-project"; import { useProjectInbox } from "@/hooks/store/use-project-inbox"; import { useAppRouter } from "@/hooks/use-app-router"; import { useIntersectionObserver } from "@/hooks/use-intersection-observer"; import { FiltersRoot } from "@/components/inbox/inbox-filter"; import { InboxIssueAppliedFilters } from "@/components/inbox/inbox-filter/applied-filters/root"; import { ExternalContoursListItem } from "./list-item"; type Props = { workspaceSlug: string; projectId: string; inboxIssueId: string | undefined; setIsMobileSidebar: (value: boolean) => void; }; const tabNavigationOptions: { key: TInboxIssueCurrentTab; i18n_label: string }[] = [ { key: EInboxIssueCurrentTab.OPEN, i18n_label: "external_contours_page.tabs.open" }, { key: EInboxIssueCurrentTab.CLOSED, i18n_label: "external_contours_page.tabs.closed" }, ]; export const ExternalContoursSidebar = observer(function ExternalContoursSidebar(props: Props) { const { workspaceSlug, projectId, inboxIssueId, setIsMobileSidebar } = props; const router = useAppRouter(); const containerRef = useRef(null); const [elementRef, setElementRef] = useState(null); const { t } = useTranslation(); const { currentProjectDetails } = useProject(); const { currentTab, handleCurrentTab, loader, filteredInboxIssueIds, inboxIssuePaginationInfo, fetchInboxPaginationIssues, getAppliedFiltersCount, } = useProjectInbox(); const fetchNextPages = useCallback(() => { if (!workspaceSlug || !projectId) return; fetchInboxPaginationIssues(workspaceSlug.toString(), projectId.toString()); }, [workspaceSlug, projectId, fetchInboxPaginationIssues]); useIntersectionObserver(containerRef, elementRef, fetchNextPages, "20%"); useEffect(() => { if (workspaceSlug && projectId && currentTab && filteredInboxIssueIds.length > 0 && inboxIssueId === undefined) { router.push( `/${workspaceSlug}/projects/${projectId}/external-contours?currentTab=${currentTab}&inboxIssueId=${filteredInboxIssueIds[0]}` ); } }, [currentTab, filteredInboxIssueIds, inboxIssueId, projectId, router, workspaceSlug]); return (
{tabNavigationOptions.map((option) => (
{ if (currentTab !== option.key) { handleCurrentTab(workspaceSlug, projectId, option.key); router.push(`/${workspaceSlug}/projects/${projectId}/external-contours?currentTab=${option.key}`); } }} >
{t(option.i18n_label)}
{option.key === EInboxIssueCurrentTab.OPEN && currentTab === option.key && (
{inboxIssuePaginationInfo?.total_results || 0}
)}
))}
{loader === "filter-loading" && !inboxIssuePaginationInfo?.next_page_results ? ( ) : (
{filteredInboxIssueIds.length > 0 ? ( filteredInboxIssueIds.map((inboxId) => ( )) ) : (
{getAppliedFiltersCount > 0 ? ( ) : currentTab === EInboxIssueCurrentTab.OPEN ? ( ) : ( )}
)}
{inboxIssuePaginationInfo?.next_page_results && ( )}
)}
); });