From 379c49b2cd6d081cbe593c969b6f2128b60407c9 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 2 Mar 2025 10:46:23 +0000 Subject: feat(web): Show list stats in the sidebar --- .../dashboard/lists/CollapsibleBookmarkLists.tsx | 7 ++ .../web/components/dashboard/lists/ListOptions.tsx | 8 +- apps/web/components/dashboard/sidebar/AllLists.tsx | 107 +++++++++++++-------- 3 files changed, 80 insertions(+), 42 deletions(-) (limited to 'apps/web') diff --git a/apps/web/components/dashboard/lists/CollapsibleBookmarkLists.tsx b/apps/web/components/dashboard/lists/CollapsibleBookmarkLists.tsx index 77a67f5f..522bb1d6 100644 --- a/apps/web/components/dashboard/lists/CollapsibleBookmarkLists.tsx +++ b/apps/web/components/dashboard/lists/CollapsibleBookmarkLists.tsx @@ -1,6 +1,8 @@ import { useEffect, useState } from "react"; import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { FullPageSpinner } from "@/components/ui/full-page-spinner"; +import { api } from "@/lib/trpc"; +import { keepPreviousData } from "@tanstack/react-query"; import { augmentBookmarkListsWithInitialData, @@ -13,6 +15,7 @@ type RenderFunc = (params: { item: ZBookmarkListTreeNode; level: number; open: boolean; + numBookmarks?: number; }) => React.ReactNode; type IsOpenFunc = (list: ZBookmarkListTreeNode) => boolean; @@ -44,6 +47,9 @@ function ListItem({ useEffect(() => { setOpen((curr) => curr || isAnyChildOpen(node, isOpenFunc)); }, [node, isOpenFunc]); + const { data: listStats } = api.lists.stats.useQuery(undefined, { + placeholderData: keepPreviousData, + }); return ( @@ -51,6 +57,7 @@ function ListItem({ item: node, level, open, + numBookmarks: listStats?.stats.get(node.item.id), })} {node.children diff --git a/apps/web/components/dashboard/lists/ListOptions.tsx b/apps/web/components/dashboard/lists/ListOptions.tsx index a7217954..0e24d6a2 100644 --- a/apps/web/components/dashboard/lists/ListOptions.tsx +++ b/apps/web/components/dashboard/lists/ListOptions.tsx @@ -1,5 +1,3 @@ -"use client"; - import { useState } from "react"; import { DropdownMenu, @@ -17,8 +15,12 @@ import DeleteListConfirmationDialog from "./DeleteListConfirmationDialog"; export function ListOptions({ list, + isOpen, + onOpenChange, children, }: { + isOpen?: boolean; + onOpenChange?: (open: boolean) => void; list: ZBookmarkList; children?: React.ReactNode; }) { @@ -29,7 +31,7 @@ export function ListOptions({ const [editModalOpen, setEditModalOpen] = useState(false); return ( - + pathName.includes(node.item.id), [pathName], ); + + const [selectedListId, setSelectedListId] = useState(null); + return (
  • @@ -49,45 +54,69 @@ export default function AllLists({ path={`/dashboard/favourites`} linkClassName="py-0.5" /> + ( + 0 && ( + + ) + } + logo={ + + {node.item.icon} + + } + name={node.item.name} + path={`/dashboard/lists/${node.item.id}`} + right={ + { + if (open) { + setSelectedListId(node.item.id); + } else { + setSelectedListId(null); + } + }} + list={node.item} + > + - - } - linkClassName="group py-0.5" - style={{ marginLeft: `${level * 1}rem` }} - /> - )} - /> - } + + {numBookmarks} + + + + + } + linkClassName="group py-0.5" + style={{ marginLeft: `${level * 1}rem` }} + /> + )} + />
); } -- cgit v1.2.3-70-g09d2