diff --git a/apps/app/components/ui/empty-state.tsx b/apps/app/components/ui/empty-state.tsx index 26b621d985a..098c3f15293 100644 --- a/apps/app/components/ui/empty-state.tsx +++ b/apps/app/components/ui/empty-state.tsx @@ -7,7 +7,7 @@ import { PrimaryButton } from "components/ui"; type Props = { title: string; - description: React.ReactNode | string; + description?: React.ReactNode; image: any; primaryButton?: { icon?: any; @@ -34,7 +34,7 @@ export const EmptyState: React.FC = ({
{primaryButton?.text}
{title}
-

{description}

+ {description &&

{description}

}
{primaryButton && ( diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/[cycleId].tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/[cycleId].tsx index 0da8f797c44..de6ad561ee0 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/[cycleId].tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/cycles/[cycleId].tsx @@ -22,8 +22,10 @@ import useUserAuth from "hooks/use-user-auth"; // components import { AnalyticsProjectModal } from "components/analytics"; // ui -import { CustomMenu, SecondaryButton } from "components/ui"; +import { CustomMenu, EmptyState, SecondaryButton } from "components/ui"; import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; +// images +import emptyCycle from "public/empty-state/cycle.svg"; // helpers import { truncateText } from "helpers/string.helper"; import { getDateRangeStatus } from "helpers/date-time.helper"; @@ -52,14 +54,14 @@ const SingleCycle: React.FC = () => { : null ); - const { data: cycleDetails } = useSWR( - cycleId ? CYCLE_DETAILS(cycleId as string) : null, + const { data: cycleDetails, error } = useSWR( + workspaceSlug && projectId && cycleId ? CYCLE_DETAILS(cycleId.toString()) : null, workspaceSlug && projectId && cycleId ? () => cycleServices.getCycleDetails( - workspaceSlug as string, - projectId as string, - cycleId as string + workspaceSlug.toString(), + projectId.toString(), + cycleId.toString() ) : null ); @@ -159,31 +161,48 @@ const SingleCycle: React.FC = () => {
} > - setTransferIssuesModal(false)} - isOpen={transferIssuesModal} - /> - setAnalyticsModal(false)} /> -
- {cycleStatus === "completed" && ( - setTransferIssuesModal(true)} /> - )} - router.push(`/${workspaceSlug}/projects/${projectId}/cycles`), + }} /> -
- + ) : ( + <> + setTransferIssuesModal(false)} + isOpen={transferIssuesModal} + /> + setAnalyticsModal(false)} + /> +
+ {cycleStatus === "completed" && ( + setTransferIssuesModal(true)} /> + )} + +
+ + + )} ); diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx index d5f7c8ec622..35697ee0fd7 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/issues/[issueId].tsx @@ -15,8 +15,10 @@ import { ProjectAuthorizationWrapper } from "layouts/auth-layout"; // components import { IssueDetailsSidebar, IssueMainContent } from "components/issues"; // ui -import { Loader } from "components/ui"; +import { EmptyState, Loader } from "components/ui"; import { Breadcrumbs } from "components/breadcrumbs"; +// images +import emptyIssue from "public/empty-state/issue.svg"; // types import { IIssue } from "types"; import type { NextPage } from "next"; @@ -45,7 +47,11 @@ const IssueDetailsPage: NextPage = () => { const { user } = useUserAuth(); - const { data: issueDetails, mutate: mutateIssueDetails } = useSWR( + const { + data: issueDetails, + mutate: mutateIssueDetails, + error, + } = useSWR( workspaceSlug && projectId && issueId ? ISSUE_DETAILS(issueId as string) : null, workspaceSlug && projectId && issueId ? () => @@ -125,7 +131,17 @@ const IssueDetailsPage: NextPage = () => { } > - {issueDetails && projectId ? ( + {error ? ( + router.push(`/${workspaceSlug}/projects/${projectId}/issues`), + }} + /> + ) : issueDetails && projectId ? (
diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/[moduleId].tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/[moduleId].tsx index 71c3bb6554f..57319262625 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/[moduleId].tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/modules/[moduleId].tsx @@ -20,8 +20,10 @@ import { ExistingIssuesListModal, IssuesFilterView, IssuesView } from "component import { ModuleDetailsSidebar } from "components/modules"; import { AnalyticsProjectModal } from "components/analytics"; // ui -import { CustomMenu, SecondaryButton } from "components/ui"; +import { CustomMenu, EmptyState, SecondaryButton } from "components/ui"; import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; +// images +import emptyModule from "public/empty-state/module.svg"; // helpers import { truncateText } from "helpers/string.helper"; // types @@ -60,7 +62,7 @@ const SingleModule: React.FC = () => { : null ); - const { data: moduleDetails } = useSWR( + const { data: moduleDetails, error } = useSWR( moduleId ? MODULE_DETAILS(moduleId as string) : null, workspaceSlug && projectId ? () => @@ -162,22 +164,37 @@ const SingleModule: React.FC = () => {
} > - setAnalyticsModal(false)} /> - -
- -
- - + {error ? ( + router.push(`/${workspaceSlug}/projects/${projectId}/modules`), + }} + /> + ) : ( + <> + setAnalyticsModal(false)} + /> +
+ +
+ + + )} ); diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/pages/[pageId].tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/pages/[pageId].tsx index b26be661efe..ed52f447ad7 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/pages/[pageId].tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/pages/[pageId].tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useRef, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; @@ -28,7 +28,16 @@ import { CreateLabelModal } from "components/labels"; import { CreateBlock } from "components/pages/create-block"; // ui import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; -import { CustomSearchSelect, Loader, TextArea, ToggleSwitch, Tooltip } from "components/ui"; +import { + CustomSearchSelect, + EmptyState, + Loader, + TextArea, + ToggleSwitch, + Tooltip, +} from "components/ui"; +// images +import emptyPage from "public/empty-state/page.svg"; // icons import { ArrowLeftIcon, @@ -40,7 +49,7 @@ import { XMarkIcon, ChevronDownIcon, } from "@heroicons/react/24/outline"; -import { ColorPalletteIcon, ClipboardIcon } from "components/icons"; +import { ColorPalletteIcon } from "components/icons"; // helpers import { render24HourFormatTime, renderShortDate } from "helpers/date-time.helper"; import { copyTextToClipboard, truncateText } from "helpers/string.helper"; @@ -82,7 +91,7 @@ const SinglePage: NextPage = () => { : null ); - const { data: pageDetails } = useSWR( + const { data: pageDetails, error } = useSWR( workspaceSlug && projectId && pageId ? PAGE_DETAILS(pageId as string) : null, workspaceSlug && projectId ? () => @@ -267,13 +276,6 @@ const SinglePage: NextPage = () => { ); }; - const handleNewBlock = useCallback(() => { - setCreateBlockForm(true); - scrollToRef.current?.scrollIntoView({ - behavior: "smooth", - }); - }, [setCreateBlockForm, scrollToRef]); - const handleShowBlockToggle = async () => { if (!workspaceSlug || !projectId) return; @@ -311,22 +313,21 @@ const SinglePage: NextPage = () => { }); }; - const options = - labels?.map((label) => ({ - value: label.id, - query: label.name, - content: ( -
- - {label.name} -
- ), - })) ?? []; + const options = labels?.map((label) => ({ + value: label.id, + query: label.name, + content: ( +
+ + {label.name} +
+ ), + })); useEffect(() => { if (!pageDetails) return; @@ -346,11 +347,21 @@ const SinglePage: NextPage = () => { breadcrumbs={ - + } > - {pageDetails ? ( + {error ? ( + router.push(`/${workspaceSlug}/projects/${projectId}/pages`), + }} + /> + ) : pageDetails ? (
diff --git a/apps/app/pages/[workspaceSlug]/projects/[projectId]/views/[viewId].tsx b/apps/app/pages/[workspaceSlug]/projects/[projectId]/views/[viewId].tsx index b1cbf97f2e4..3597f113fa0 100644 --- a/apps/app/pages/[workspaceSlug]/projects/[projectId]/views/[viewId].tsx +++ b/apps/app/pages/[workspaceSlug]/projects/[projectId]/views/[viewId].tsx @@ -12,11 +12,13 @@ import { IssueViewContextProvider } from "contexts/issue-view.context"; // components import { IssuesFilterView, IssuesView } from "components/core"; // ui -import { CustomMenu, PrimaryButton } from "components/ui"; +import { CustomMenu, EmptyState, PrimaryButton } from "components/ui"; import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs"; // icons import { PlusIcon } from "@heroicons/react/24/outline"; import { StackedLayersIcon } from "components/icons"; +// images +import emptyView from "public/empty-state/view.svg"; // helpers import { truncateText } from "helpers/string.helper"; // fetch-keys @@ -40,7 +42,7 @@ const SingleView: React.FC = () => { : null ); - const { data: viewDetails } = useSWR( + const { data: viewDetails, error } = useSWR( workspaceSlug && projectId && viewId ? VIEW_DETAILS(viewId as string) : null, workspaceSlug && projectId && viewId ? () => @@ -101,9 +103,21 @@ const SingleView: React.FC = () => {
} > -
- -
+ {error ? ( + router.push(`/${workspaceSlug}/projects/${projectId}/views`), + }} + /> + ) : ( +
+ +
+ )} );