Skip to content

Commit d8ba36c

Browse files
committed
feat: subscription & borrowing query keys
1 parent ddc6b79 commit d8ba36c

File tree

11 files changed

+139
-54
lines changed

11 files changed

+139
-54
lines changed

app/(protected)/books/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,16 @@ export default async function Books({
132132

133133
<Pagination>
134134
<PaginationContent>
135-
<PaginationItem>
136-
<PaginationPrevious href={prevURL} />
137-
</PaginationItem>
138-
<PaginationItem>
139-
<PaginationNext href={nextURL} />
140-
</PaginationItem>
135+
{res.meta.skip > 0 && (
136+
<PaginationItem>
137+
<PaginationPrevious href={prevURL} />
138+
</PaginationItem>
139+
)}
140+
{res.meta.limit <= res.data.length && (
141+
<PaginationItem>
142+
<PaginationNext href={nextURL} />
143+
</PaginationItem>
144+
)}
141145
</PaginationContent>
142146
</Pagination>
143147
</div>

app/(protected)/borrows/page.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { SITE_NAME } from '@/lib/consts'
2525
import { DropdownMenuBorrow } from '@/components/borrows/DropdownMenuBorrow'
2626
import { BtnScanReturnBorrow } from '@/components/borrows/ModalReturnBorrow'
2727
import { TabLink } from '@/components/borrows/TabLink'
28+
import { Badge } from '@/components/ui/badge'
2829

2930
export const metadata: Metadata = {
3031
title: `Borrows · ${SITE_NAME}`,
@@ -129,21 +130,32 @@ export default async function Borrows({
129130
]}
130131
activeHref={`/borrows${status ? `?status=${status}` : ''}`}
131132
/>
133+
<Badge className="ml-4 hidden md:block" variant="outline">
134+
{res.meta.total}
135+
</Badge>
132136
</div>
133137
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
134-
{res.data.map((borrow) => (
135-
<ListCardBorrow key={borrow.id} borrow={borrow} />
138+
{res.data.map((borrow, idx) => (
139+
<ListCardBorrow
140+
key={borrow.id}
141+
borrow={borrow}
142+
idx={skip + idx + 1}
143+
/>
136144
))}
137145
</div>
138146

139147
<Pagination>
140148
<PaginationContent>
141-
<PaginationItem>
142-
<PaginationPrevious href={prevURL} />
143-
</PaginationItem>
144-
<PaginationItem>
145-
<PaginationNext href={nextURL} />
146-
</PaginationItem>
149+
{res.meta.skip > 0 && (
150+
<PaginationItem>
151+
<PaginationPrevious href={prevURL} />
152+
</PaginationItem>
153+
)}
154+
{res.meta.limit <= res.data.length && (
155+
<PaginationItem>
156+
<PaginationNext href={nextURL} />
157+
</PaginationItem>
158+
)}
147159
</PaginationContent>
148160
</Pagination>
149161
</div>

app/(protected)/libraries/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,16 @@ export default async function Libraries({
127127

128128
<Pagination>
129129
<PaginationContent>
130-
<PaginationItem>
131-
<PaginationPrevious href={prevURL} />
132-
</PaginationItem>
133-
<PaginationItem>
134-
<PaginationNext href={nextURL} />
135-
</PaginationItem>
130+
{res.meta.skip > 0 && (
131+
<PaginationItem>
132+
<PaginationPrevious href={prevURL} />
133+
</PaginationItem>
134+
)}
135+
{res.meta.limit <= res.data.length && (
136+
<PaginationItem>
137+
<PaginationNext href={nextURL} />
138+
</PaginationItem>
139+
)}
136140
</PaginationContent>
137141
</Pagination>
138142
</div>

app/(protected)/memberships/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,16 @@ export default async function Memberships({
8888

8989
<Pagination>
9090
<PaginationContent>
91-
<PaginationItem>
92-
<PaginationPrevious href={prevURL} />
93-
</PaginationItem>
94-
<PaginationItem>
95-
<PaginationNext href={nextURL} />
96-
</PaginationItem>
91+
{res.meta.skip > 0 && (
92+
<PaginationItem>
93+
<PaginationPrevious href={prevURL} />
94+
</PaginationItem>
95+
)}
96+
{res.meta.limit <= res.data.length && (
97+
<PaginationItem>
98+
<PaginationNext href={nextURL} />
99+
</PaginationItem>
100+
)}
97101
</PaginationContent>
98102
</Pagination>
99103
</div>

app/(protected)/notifications/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,16 @@ export default async function Notifications({
108108
</ul>
109109
<Pagination>
110110
<PaginationContent>
111-
<PaginationItem>
112-
<PaginationPrevious href={prevURL} />
113-
</PaginationItem>
114-
<PaginationItem>
115-
<PaginationNext href={nextURL} />
116-
</PaginationItem>
111+
{res.meta.skip > 0 && (
112+
<PaginationItem>
113+
<PaginationPrevious href={prevURL} />
114+
</PaginationItem>
115+
)}
116+
{res.meta.limit <= res.data.length && (
117+
<PaginationItem>
118+
<PaginationNext href={nextURL} />
119+
</PaginationItem>
120+
)}
117121
</PaginationContent>
118122
</Pagination>
119123
</div>

app/(protected)/staffs/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,16 @@ export default async function Staffs({
127127

128128
<Pagination>
129129
<PaginationContent>
130-
<PaginationItem>
131-
<PaginationPrevious href={prevURL} />
132-
</PaginationItem>
133-
<PaginationItem>
134-
<PaginationNext href={nextURL} />
135-
</PaginationItem>
130+
{res.meta.skip > 0 && (
131+
<PaginationItem>
132+
<PaginationPrevious href={prevURL} />
133+
</PaginationItem>
134+
)}
135+
{res.meta.limit <= res.data.length && (
136+
<PaginationItem>
137+
<PaginationNext href={nextURL} />
138+
</PaginationItem>
139+
)}
136140
</PaginationContent>
137141
</Pagination>
138142
</div>

app/(protected)/subscriptions/page.tsx

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import Link from 'next/link'
2020
import type { Metadata } from 'next'
2121
import { SITE_NAME } from '@/lib/consts'
2222
import { ListCardSubscription } from '@/components/subscriptions/ListCardSubscription'
23+
import { TabLink } from '@/components/borrows/TabLink'
24+
import { Badge } from '@/components/ui/badge'
2325

2426
export const metadata: Metadata = {
2527
title: `Subscriptions · ${SITE_NAME}`,
@@ -32,12 +34,14 @@ export default async function Subscriptions({
3234
skip?: number
3335
limit?: number
3436
library_id?: string
37+
status?: 'active' | 'expired'
3538
}>
3639
}) {
3740
const sp = await searchParams
3841
const skip = Number(sp?.skip ?? 0)
3942
const limit = Number(sp?.limit ?? 20)
4043
const library_id = sp?.library_id
44+
const status = sp?.status
4145

4246
const headers = await Verify({
4347
from: '/subscriptions',
@@ -49,6 +53,7 @@ export default async function Subscriptions({
4953
sort_in: 'desc',
5054
limit: limit,
5155
skip: skip,
56+
status,
5257
...(library_id ? { library_id } : {}),
5358
},
5459
{
@@ -90,6 +95,19 @@ export default async function Subscriptions({
9095
</Button>
9196
</div>
9297
</nav>
98+
<div className="">
99+
<TabLink
100+
tabs={[
101+
{ name: 'All', href: '/subscriptions' },
102+
{ name: 'Active', href: '/subscriptions?status=active' },
103+
{ name: 'Overdue', href: '/subscriptions?status=expired' },
104+
]}
105+
activeHref={`/subscriptions${status ? `?status=${status}` : ''}`}
106+
/>
107+
<Badge className="ml-4 hidden md:block" variant="outline">
108+
{res.meta.total}
109+
</Badge>
110+
</div>
93111

94112
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
95113
{res.data.map((sub) => (
@@ -99,12 +117,16 @@ export default async function Subscriptions({
99117

100118
<Pagination>
101119
<PaginationContent>
102-
<PaginationItem>
103-
<PaginationPrevious href={prevURL} />
104-
</PaginationItem>
105-
<PaginationItem>
106-
<PaginationNext href={nextURL} />
107-
</PaginationItem>
120+
{res.meta.skip > 0 && (
121+
<PaginationItem>
122+
<PaginationPrevious href={prevURL} />
123+
</PaginationItem>
124+
)}
125+
{res.meta.limit <= res.data.length && (
126+
<PaginationItem>
127+
<PaginationNext href={nextURL} />
128+
</PaginationItem>
129+
)}
108130
</PaginationContent>
109131
</Pagination>
110132
</div>

app/(protected)/users/page.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,16 @@ export default async function Users({
109109

110110
<Pagination>
111111
<PaginationContent>
112-
<PaginationItem>
113-
<PaginationPrevious href={prevURL} />
114-
</PaginationItem>
115-
<PaginationItem>
116-
<PaginationNext href={nextURL} />
117-
</PaginationItem>
112+
{res.meta.skip > 0 && (
113+
<PaginationItem>
114+
<PaginationPrevious href={prevURL} />
115+
</PaginationItem>
116+
)}
117+
{res.meta.limit <= res.data.length && (
118+
<PaginationItem>
119+
<PaginationNext href={nextURL} />
120+
</PaginationItem>
121+
)}
118122
</PaginationContent>
119123
</Pagination>
120124
</div>

components/borrows/ListCardBorrow.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ import {
2121
import clsx from 'clsx'
2222
import Link from 'next/link'
2323

24-
export const ListCardBorrow: React.FC<{ borrow: Borrow }> = ({ borrow }) => {
24+
export const ListCardBorrow: React.FC<{ borrow: Borrow; idx: number }> = ({
25+
borrow,
26+
idx,
27+
}) => {
2528
const isDue = isBorrowDue(borrow)
2629

2730
return (
@@ -42,7 +45,11 @@ export const ListCardBorrow: React.FC<{ borrow: Borrow }> = ({ borrow }) => {
4245
{borrow.book.title}
4346
</abbr>
4447
</CardTitle>
45-
<CardDescription>{borrow.book.code}</CardDescription>
48+
<CardDescription>
49+
<span className="text-muted-foreground/80 font-bold tracking-wider">
50+
#&nbsp;{idx.toString().padStart(4, '0')}
51+
</span>
52+
</CardDescription>
4653
</div>
4754
<Badge
4855
variant={

lib/api/borrow.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type GetListBorrowsQuery = QueryParams<
1515
type GetListBorrowsResponse = Promise<ResList<Borrow>>
1616

1717
export const getListBorrows = async (
18-
query: GetListBorrowsQuery,
18+
{ status, ...query }: GetListBorrowsQuery,
1919
init?: RequestInit
2020
): GetListBorrowsResponse => {
2121
const url = new URL(BORROW_URL)
@@ -25,6 +25,16 @@ export const getListBorrows = async (
2525
}
2626
})
2727

28+
if (status) {
29+
if (status === 'active') {
30+
url.searchParams.append('is_active', 'true')
31+
} else if (status === 'overdue') {
32+
url.searchParams.append('is_overdue', 'true')
33+
} else if (status === 'returned') {
34+
url.searchParams.append('is_returned', 'true')
35+
}
36+
}
37+
2838
const response = await fetch(url.toString(), init)
2939
if (!response.ok) {
3040
const e = await response.json()

0 commit comments

Comments
 (0)