diff --git a/apps/backoffice/app/(app)/authors/page.tsx b/apps/backoffice/app/(app)/authors/page.tsx index 8e2a373..830ed69 100644 --- a/apps/backoffice/app/(app)/authors/page.tsx +++ b/apps/backoffice/app/(app)/authors/page.tsx @@ -1,5 +1,6 @@ import { fetchAuthors, AuthorsPageDto } from "@/lib/api"; import { getServerTranslations } from "@/lib/i18n/server"; +import { paramString, paramStringOr, paramInt } from "@/lib/searchParams"; import { LiveSearchForm } from "@/app/components/LiveSearchForm"; import { Card, CardContent, OffsetPagination } from "@/app/components/ui"; import Link from "next/link"; @@ -12,11 +13,11 @@ export default async function AuthorsPage({ searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { t } = await getServerTranslations(); - const searchParamsAwaited = await searchParams; - const searchQuery = typeof searchParamsAwaited.q === "string" ? searchParamsAwaited.q : ""; - const sort = typeof searchParamsAwaited.sort === "string" ? searchParamsAwaited.sort : undefined; - const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; - const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 20; + const sp = await searchParams; + const searchQuery = paramStringOr(sp, "q", ""); + const sort = paramString(sp, "sort"); + const page = paramInt(sp, "page", 1); + const limit = paramInt(sp, "limit", 20); const authorsPage = await fetchAuthors( searchQuery || undefined, diff --git a/apps/backoffice/app/(app)/books/page.tsx b/apps/backoffice/app/(app)/books/page.tsx index fba2374..43fc6bb 100644 --- a/apps/backoffice/app/(app)/books/page.tsx +++ b/apps/backoffice/app/(app)/books/page.tsx @@ -5,6 +5,7 @@ import { Card, CardContent, OffsetPagination } from "@/app/components/ui"; import Link from "next/link"; import Image from "next/image"; import { getServerTranslations } from "@/lib/i18n/server"; +import { paramString, paramStringOr, paramInt } from "@/lib/searchParams"; export const dynamic = "force-dynamic"; @@ -14,15 +15,15 @@ export default async function BooksPage({ searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { t } = await getServerTranslations(); - const searchParamsAwaited = await searchParams; - const libraryId = typeof searchParamsAwaited.library === "string" ? searchParamsAwaited.library : undefined; - const searchQuery = typeof searchParamsAwaited.q === "string" ? searchParamsAwaited.q : ""; - const readingStatus = typeof searchParamsAwaited.status === "string" ? searchParamsAwaited.status : undefined; - const format = typeof searchParamsAwaited.format === "string" ? searchParamsAwaited.format : undefined; - const metadataProvider = typeof searchParamsAwaited.metadata === "string" ? searchParamsAwaited.metadata : undefined; - const sort = typeof searchParamsAwaited.sort === "string" ? searchParamsAwaited.sort : undefined; - const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; - const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 20; + const sp = await searchParams; + const libraryId = paramString(sp, "library"); + const searchQuery = paramStringOr(sp, "q", ""); + const readingStatus = paramString(sp, "status"); + const format = paramString(sp, "format"); + const metadataProvider = paramString(sp, "metadata"); + const sort = paramString(sp, "sort"); + const page = paramInt(sp, "page", 1); + const limit = paramInt(sp, "limit", 20); const [libraries] = await Promise.all([ fetchLibraries().catch(() => [] as LibraryDto[]) diff --git a/apps/backoffice/app/(app)/series/page.tsx b/apps/backoffice/app/(app)/series/page.tsx index 5e8df80..d84d876 100644 --- a/apps/backoffice/app/(app)/series/page.tsx +++ b/apps/backoffice/app/(app)/series/page.tsx @@ -1,5 +1,6 @@ import { fetchAllSeries, fetchLibraries, fetchSeriesStatuses, LibraryDto, SeriesDto, SeriesPageDto, getBookCoverUrl } from "@/lib/api"; import { getServerTranslations } from "@/lib/i18n/server"; +import { paramString, paramStringOr, paramInt, paramBool } from "@/lib/searchParams"; import { MarkSeriesReadButton } from "@/app/components/MarkSeriesReadButton"; import { LiveSearchForm } from "@/app/components/LiveSearchForm"; import { Card, CardContent, OffsetPagination } from "@/app/components/ui"; @@ -16,16 +17,16 @@ export default async function SeriesPage({ searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { t } = await getServerTranslations(); - const searchParamsAwaited = await searchParams; - const libraryId = typeof searchParamsAwaited.library === "string" ? searchParamsAwaited.library : undefined; - const searchQuery = typeof searchParamsAwaited.q === "string" ? searchParamsAwaited.q : ""; - const readingStatus = typeof searchParamsAwaited.status === "string" ? searchParamsAwaited.status : undefined; - const sort = typeof searchParamsAwaited.sort === "string" ? searchParamsAwaited.sort : undefined; - const seriesStatus = typeof searchParamsAwaited.series_status === "string" ? searchParamsAwaited.series_status : undefined; - const hasMissing = searchParamsAwaited.has_missing === "true"; - const metadataProvider = typeof searchParamsAwaited.metadata_provider === "string" ? searchParamsAwaited.metadata_provider : undefined; - const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; - const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 20; + const sp = await searchParams; + const libraryId = paramString(sp, "library"); + const searchQuery = paramStringOr(sp, "q", ""); + const readingStatus = paramString(sp, "status"); + const sort = paramString(sp, "sort"); + const seriesStatus = paramString(sp, "series_status"); + const hasMissing = paramBool(sp, "has_missing"); + const metadataProvider = paramString(sp, "metadata_provider"); + const page = paramInt(sp, "page", 1); + const limit = paramInt(sp, "limit", 20); const [libraries, seriesPage, dbStatuses] = await Promise.all([ fetchLibraries().catch(() => [] as LibraryDto[]), diff --git a/apps/backoffice/app/components/DeleteBookButton.tsx b/apps/backoffice/app/components/DeleteBookButton.tsx index 0a6dc66..d1dd475 100644 --- a/apps/backoffice/app/components/DeleteBookButton.tsx +++ b/apps/backoffice/app/components/DeleteBookButton.tsx @@ -1,9 +1,8 @@ "use client"; import { useState } from "react"; -import { createPortal } from "react-dom"; import { useRouter } from "next/navigation"; -import { Button, Icon } from "./ui"; +import { Button, Icon, Modal } from "./ui"; import { useTranslation } from "@/lib/i18n/context"; export function DeleteBookButton({ bookId, libraryId }: { bookId: string; libraryId: string }) { @@ -37,32 +36,24 @@ export function DeleteBookButton({ bookId, libraryId }: { bookId: string; librar {t("bookDetail.delete")} - {showConfirm && createPortal( - <> -
- {t("bookDetail.confirmDelete")} -
-+ {t("bookDetail.confirmDelete")} +
+