From c429ca7b36e0f5e29b78a9ce5de7efd37e1cbc45 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:34:28 +0530 Subject: [PATCH] refactor: recents widget for scalability (#6453) Co-authored-by: pushya22 <130810100+pushya22@users.noreply.github.com> --- packages/types/src/home.d.ts | 4 ++-- .../components/home/widgets/recents/index.tsx | 24 ++++++++++++------- .../components/home/widgets/recents/page.tsx | 17 ++++++++++--- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/types/src/home.d.ts b/packages/types/src/home.d.ts index c93fb44800..68fcd4d1de 100644 --- a/packages/types/src/home.d.ts +++ b/packages/types/src/home.d.ts @@ -1,7 +1,7 @@ import { TLogoProps } from "./common"; import { TIssuePriorities } from "./issues"; -export type TRecentActivityFilterKeys = "all item" | "issue" | "page" | "project"; +export type TRecentActivityFilterKeys = "all item" | "issue" | "page" | "project" | "workspace_page"; export type THomeWidgetKeys = "quick_links" | "recents" | "my_stickies" | "quick_tutorial" | "new_at_plane"; export type THomeWidgetProps = { @@ -39,7 +39,7 @@ export type TIssueEntityData = { export type TActivityEntityData = { id: string; - entity_name: "page" | "project" | "issue"; + entity_name: "page" | "project" | "issue" | "workspace_page"; entity_identifier: string; visited_at: string; entity_data: TPageEntityData | TProjectEntityData | TIssueEntityData; diff --git a/web/core/components/home/widgets/recents/index.tsx b/web/core/components/home/widgets/recents/index.tsx index 9801e47947..02d3ae38d4 100644 --- a/web/core/components/home/widgets/recents/index.tsx +++ b/web/core/components/home/widgets/recents/index.tsx @@ -22,15 +22,21 @@ const WIDGET_KEY = EWidgetKeys.RECENT_ACTIVITY; const workspaceService = new WorkspaceService(); const filters: { name: TRecentActivityFilterKeys; icon?: React.ReactNode }[] = [ { name: "all item" }, - { name: "issue", icon: }, - { name: "page", icon: }, - { name: "project", icon: }, + { name: "issue", icon: }, + { name: "page", icon: }, + { name: "workspace_page", icon: }, + { name: "project", icon: }, ]; -export const RecentActivityWidget: React.FC = observer((props) => { - const { workspaceSlug } = props; +type TRecentWidgetProps = THomeWidgetProps & { + presetFilter?: TRecentActivityFilterKeys; + showFilterSelect?: boolean; +}; + +export const RecentActivityWidget: React.FC = observer((props) => { + const { presetFilter, showFilterSelect = true, workspaceSlug } = props; // state - const [filter, setFilter] = useState(filters[0].name); + const [filter, setFilter] = useState(presetFilter ?? filters[0].name); // ref const ref = useRef(null); // store hooks @@ -55,6 +61,7 @@ export const RecentActivityWidget: React.FC = observer((props) const resolveRecent = (activity: TActivityEntityData) => { switch (activity.entity_name) { case "page": + case "workspace_page": return ; case "project": return ; @@ -72,7 +79,7 @@ export const RecentActivityWidget: React.FC = observer((props)
Recents
- + {showFilterSelect && }
@@ -89,8 +96,7 @@ export const RecentActivityWidget: React.FC = observer((props) >
Recents
- - + {showFilterSelect && }
{isLoading && } diff --git a/web/core/components/home/widgets/recents/page.tsx b/web/core/components/home/widgets/recents/page.tsx index d69940760f..8cff40588d 100644 --- a/web/core/components/home/widgets/recents/page.tsx +++ b/web/core/components/home/widgets/recents/page.tsx @@ -1,10 +1,16 @@ import { useRouter } from "next/navigation"; import { FileText } from "lucide-react"; +// plane types import { TActivityEntityData, TPageEntityData } from "@plane/types"; +// plane ui import { Avatar, Logo } from "@plane/ui"; +// plane utils import { getFileURL } from "@plane/utils"; +// components import { ListItem } from "@/components/core/list"; +// helpers import { calculateTimeAgo } from "@/helpers/date-time.helper"; +// hooks import { useMember } from "@/hooks/store"; type BlockProps = { @@ -12,15 +18,20 @@ type BlockProps = { ref: React.RefObject; workspaceSlug: string; }; + export const RecentPage = (props: BlockProps) => { const { activity, ref, workspaceSlug } = props; // router const router = useRouter(); - // hooks + // store hooks const { getUserDetails } = useMember(); // derived values - const pageDetails: TPageEntityData = activity.entity_data as TPageEntityData; + const pageDetails = activity.entity_data as TPageEntityData; const ownerDetails = getUserDetails(pageDetails?.owned_by); + const pageLink = pageDetails.project_id + ? `/${workspaceSlug}/projects/${pageDetails.project_id}/pages/${pageDetails.id}` + : `/${workspaceSlug}/pages/${pageDetails.id}`; + return ( { onItemClick={(e) => { e.preventDefault(); e.stopPropagation(); - router.push(`/${workspaceSlug}/projects/${pageDetails?.project_id}/pages/${pageDetails.id}`); + router.push(pageLink); }} /> );