Skip to content

Commit 9363c3d

Browse files
committed
feat: memberships page
1 parent f43d932 commit 9363c3d

File tree

2 files changed

+80
-37
lines changed

2 files changed

+80
-37
lines changed

app/(protected)/memberships/page.tsx

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,11 @@ import {
1414
PaginationNext,
1515
PaginationPrevious,
1616
} from '@/components/ui/pagination'
17-
import {
18-
Table,
19-
TableBody,
20-
TableCell,
21-
TableHead,
22-
TableHeader,
23-
TableRow,
24-
} from '@/components/ui/table'
2517
import { getListMemberships } from '@/lib/api/membership'
2618
import Link from 'next/link'
2719
import type { Metadata } from 'next'
2820
import { SITE_NAME } from '@/lib/consts'
21+
import { ListCardMembership } from '@/components/memberships/ListCardMembership'
2922

3023
export const metadata: Metadata = {
3124
title: `Memberships · ${SITE_NAME}`,
@@ -87,35 +80,11 @@ export default async function Memberships({
8780
</div>
8881
</nav>
8982

90-
<Table>
91-
{/* <TableCaption>List of books available in the library.</TableCaption> */}
92-
<TableHeader>
93-
<TableRow>
94-
<TableHead>Name</TableHead>
95-
<TableHead>Library</TableHead>
96-
<TableHead>Duration</TableHead>
97-
<TableHead>Borrow Limit</TableHead>
98-
<TableHead>Borrow Period</TableHead>
99-
<TableHead>Active Limit</TableHead>
100-
<TableHead>Fine per Day</TableHead>
101-
<TableHead>Price</TableHead>
102-
</TableRow>
103-
</TableHeader>
104-
<TableBody>
105-
{res.data.map((m) => (
106-
<TableRow key={m.id}>
107-
<TableCell>{m.name}</TableCell>
108-
<TableCell>{m.library.name}</TableCell>
109-
<TableCell>{m.duration} D</TableCell>
110-
<TableCell>{m.usage_limit ?? '-'}</TableCell>
111-
<TableCell>{m.loan_period} D</TableCell>
112-
<TableCell>{m.active_loan_limit}</TableCell>
113-
<TableCell>{m.fine_per_day ?? '-'} Pts</TableCell>
114-
<TableCell>{m.price ?? '-'}</TableCell>
115-
</TableRow>
116-
))}
117-
</TableBody>
118-
</Table>
83+
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
84+
{res.data.map((m) => (
85+
<ListCardMembership key={m.id} membership={m} />
86+
))}
87+
</div>
11988

12089
<Pagination>
12190
<PaginationContent>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { Book, Calendar, CircleDollarSign, Clock, Gavel } from 'lucide-react'
2+
3+
import {
4+
Card,
5+
CardContent,
6+
CardDescription,
7+
CardFooter,
8+
CardHeader,
9+
CardTitle,
10+
} from '@/components/ui/card'
11+
import { Membership } from '@/lib/types/membership'
12+
import { Badge } from '../ui/badge'
13+
14+
export const ListCardMembership: React.FC<{ membership: Membership }> = ({
15+
membership,
16+
}) => {
17+
return (
18+
<Card
19+
key={membership.id}
20+
className={`relative ${true ? 'border-primary' : ''}`}
21+
>
22+
{true && (
23+
<Badge className="absolute -top-2 -right-2 bg-primary">Popular</Badge>
24+
)}
25+
<CardHeader>
26+
{/* <Link
27+
href={`/memberships/${membership.id}`}
28+
className="flex justify-between items-start min-h-20"
29+
> */}
30+
<div>
31+
<CardTitle className="text-lg line-clamp-2">
32+
{membership.name}
33+
</CardTitle>
34+
<CardDescription>{membership.library.name}</CardDescription>
35+
</div>
36+
{/* </Link> */}
37+
</CardHeader>
38+
<CardContent className="space-y-3">
39+
<div className="flex items-center gap-2 text-sm">
40+
<Calendar className="size-4 text-muted-foreground" />
41+
<span>
42+
Duration: {membership.duration} Days{' '}
43+
{membership.usage_limit > 0
44+
? ` - ${membership.usage_limit} Books`
45+
: ''}
46+
</span>
47+
</div>
48+
<div className="flex items-center gap-2 text-sm">
49+
<Book className="size-4 text-muted-foreground" />
50+
<span>Up to {membership.active_loan_limit} Books a time</span>
51+
</div>
52+
<div className="flex items-center gap-2 text-sm">
53+
<Clock className="size-4 text-muted-foreground" />
54+
<span>Borrow for {membership.loan_period} Days</span>
55+
</div>
56+
<div className="flex items-center gap-2 text-sm">
57+
<Gavel className="size-4 text-muted-foreground" />
58+
<span>
59+
Late Return Fine: {membership.fine_per_day ?? '-'} Pts/day
60+
</span>
61+
</div>
62+
<div className="flex items-center gap-2 text-sm">
63+
<CircleDollarSign className="size-4 text-muted-foreground" />
64+
<span>Price: {membership.price ?? '-'} Pts</span>
65+
</div>
66+
</CardContent>
67+
<CardFooter>
68+
{/* <BtnReturnBook variant="outline" className="w-full" borrow={borrow}>
69+
Return Book
70+
</BtnReturnBook> */}
71+
</CardFooter>
72+
</Card>
73+
)
74+
}

0 commit comments

Comments
 (0)