aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard/sidebar/AllLists.tsx
blob: b6cadea955fd81695a8b6f58696fe62c56ad20dc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"use client";

import { useCallback } from "react";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { Button } from "@/components/ui/button";
import { CollapsibleTriggerTriangle } from "@/components/ui/collapsible";
import { MoreHorizontal, Plus } from "lucide-react";

import type { ZBookmarkList } from "@hoarder/shared/types/lists";
import { ZBookmarkListTreeNode } from "@hoarder/shared/utils/listUtils";

import { CollapsibleBookmarkLists } from "../lists/CollapsibleBookmarkLists";
import { EditListModal } from "../lists/EditListModal";
import { ListOptions } from "../lists/ListOptions";
import SidebarItem from "./SidebarItem";

export default function AllLists({
  initialData,
}: {
  initialData: { lists: ZBookmarkList[] };
}) {
  const pathName = usePathname();
  const isNodeOpen = useCallback(
    (node: ZBookmarkListTreeNode) => pathName.includes(node.item.id),
    [pathName],
  );
  return (
    <ul className="max-h-full gap-y-2 overflow-auto text-sm font-medium">
      <li className="flex justify-between pb-2 font-bold">
        <p>Lists</p>
        <EditListModal>
          <Link href="#">
            <Plus />
          </Link>
        </EditListModal>
      </li>
      <SidebarItem
        logo={<span className="text-lg">📋</span>}
        name="All Lists"
        path={`/dashboard/lists`}
        linkClassName="py-0.5"
      />
      <SidebarItem
        logo={<span className="text-lg">⭐️</span>}
        name="Favourites"
        path={`/dashboard/favourites`}
        linkClassName="py-0.5"
      />

      {
        <CollapsibleBookmarkLists
          initialData={initialData.lists}
          isOpenFunc={isNodeOpen}
          render={({ item: node, level, open }) => (
            <SidebarItem
              collapseButton={
                node.children.length > 0 && (
                  <CollapsibleTriggerTriangle
                    className="absolute left-0 top-1/2 size-2 -translate-y-1/2"
                    open={open}
                  />
                )
              }
              logo={
                <span className="flex">
                  <span className="text-lg"> {node.item.icon}</span>
                </span>
              }
              name={node.item.name}
              path={`/dashboard/lists/${node.item.id}`}
              right={
                <ListOptions list={node.item}>
                  <Button
                    size="none"
                    variant="ghost"
                    className="invisible group-hover:visible"
                  >
                    <MoreHorizontal className="size-4" />
                  </Button>
                </ListOptions>
              }
              linkClassName="group py-0.5"
              style={{ marginLeft: `${level * 1}rem` }}
            />
          )}
        />
      }
    </ul>
  );
}