Skip to content

Commit 430fc49

Browse files
committed
feat(categories): add category-list component and page for categories
1 parent 81bb46a commit 430fc49

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import type { Metadata } from "next";
2+
3+
import { Heading } from "@/components/ui";
4+
import { PROJECT_NAME } from "@/config/constants";
5+
import { CategoryList } from "@/components/categories";
6+
7+
export const metadata: Metadata = {
8+
title: `Categories - ${PROJECT_NAME}`,
9+
description: "All categories in one place",
10+
};
11+
12+
export default async function CategoriesPage() {
13+
return (
14+
<main className="max-w-screen-xl mx-auto p-4 flex flex-col gap-4">
15+
<Heading title="Categories" subtitle="All categories in one place" />
16+
<CategoryList />
17+
</main>
18+
);
19+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"use client";
2+
3+
import Link from "next/link";
4+
import { Card, CardHeader } from "@heroui/react";
5+
import { formatDistanceToNow } from "date-fns";
6+
import { Folder, Timer } from "lucide-react";
7+
import { useCategoryStore } from "@/stores/categories";
8+
import { capitalize } from "@/lib/utils";
9+
import type { Category } from "@/types";
10+
11+
export default function CategoryList() {
12+
const categories = useCategoryStore((state) => state.categories);
13+
14+
return (
15+
<section className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
16+
{categories.map((category) => (
17+
<CategoryCard key={category.id} category={category} />
18+
))}
19+
</section>
20+
);
21+
}
22+
23+
function CategoryCard({ category }: { category: Category }) {
24+
return (
25+
<article className="group">
26+
<Link href={`/resources/categories/${category.slug}`}>
27+
<Card className="bg-white dark:bg-neutral-950 !outline-none shadow-none rounded-xl border-2 border-neutral-200 dark:border-neutral-800 group-hover:border-neutral-300 dark:group-hover:border-neutral-700">
28+
<CardHeader className="flex items-center justify-between">
29+
<div className="flex items-center gap-3">
30+
<Folder className="w-5 h-5 text-neutral-950 dark:text-white" />
31+
<span className="text-sm font-medium text-neutral-950 dark:text-white">
32+
{capitalize(category.name)}
33+
</span>
34+
</div>
35+
<div className="flex justify-end items-center gap-2 text-xs text-neutral-500">
36+
<Timer size={16} />
37+
{formatDistanceToNow(new Date(category.created_at), {
38+
addSuffix: true,
39+
})}
40+
</div>
41+
</CardHeader>
42+
</Card>
43+
</Link>
44+
</article>
45+
);
46+
}

src/components/categories/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export { default as CategoryDrawer } from "./category-drawer";
2+
export { default as CategoryList } from "./category-list";

0 commit comments

Comments
 (0)