diff --git a/src/components/common/ViewModeButton.tsx b/src/components/common/ViewModeButton.tsx new file mode 100644 index 0000000..81ce0f9 --- /dev/null +++ b/src/components/common/ViewModeButton.tsx @@ -0,0 +1,36 @@ +import { useDisplayPreferences } from "@/hooks/useDisplayPreferences"; +import { useTranslate } from "@/hooks/useTranslate"; +import { LayoutGrid, List } from "lucide-react"; +import { Button } from "@/components/ui/button"; + +interface ViewModeButtonProps { + onToggle?: (viewMode: "grid" | "list") => void; +} + +export function ViewModeButton({ onToggle }: ViewModeButtonProps) { + const { viewMode, handleViewModeToggle } = useDisplayPreferences(); + const { t } = useTranslate(); + + const handleClick = async () => { + const newViewMode = viewMode === "grid" ? "list" : "grid"; + await handleViewModeToggle(newViewMode); + onToggle?.(newViewMode); + }; + + const Icon = viewMode === "grid" ? List : LayoutGrid; + const label = viewMode === "grid" ? t("books.display.list") : t("books.display.grid"); + + return ( + + ); +} + diff --git a/src/components/library/PaginatedSeriesGrid.tsx b/src/components/library/PaginatedSeriesGrid.tsx index 39078e0..e0af2c4 100644 --- a/src/components/library/PaginatedSeriesGrid.tsx +++ b/src/components/library/PaginatedSeriesGrid.tsx @@ -87,12 +87,6 @@ export function PaginatedSeriesGrid({ }); }; - const handleCompactToggle = async (newCompactState: boolean) => { - await updateUrlParams({ - page: "1", - compact: newCompactState.toString(), - }); - }; const handlePageSizeChange = async (size: number) => { await updateUrlParams({ @@ -125,7 +119,7 @@ export function PaginatedSeriesGrid({
+ {t("navigation.volume", { number: book.metadata.number })} +
+ )} ++ {book.metadata.summary} +
+ )} + + {/* Métadonnées */} ++ {Math.round(progressPercentage)}% {t("books.completed")} +
+{t("books.empty")}
+{getShowingText()}
diff --git a/src/contexts/PreferencesContext.tsx b/src/contexts/PreferencesContext.tsx index 73daa2a..c929c47 100644 --- a/src/contexts/PreferencesContext.tsx +++ b/src/contexts/PreferencesContext.tsx @@ -39,6 +39,11 @@ export function PreferencesProvider({ setPreferences({ ...defaultPreferences, ...data, + displayMode: { + ...defaultPreferences.displayMode, + ...(data.displayMode || {}), + viewMode: data.displayMode?.viewMode || defaultPreferences.displayMode.viewMode, + }, }); } catch (error) { logger.error({ err: error }, "Erreur lors de la récupération des préférences"); diff --git a/src/hooks/useDisplayPreferences.ts b/src/hooks/useDisplayPreferences.ts index baf8780..e1ad160 100644 --- a/src/hooks/useDisplayPreferences.ts +++ b/src/hooks/useDisplayPreferences.ts @@ -30,10 +30,25 @@ export function useDisplayPreferences() { } }; + const handleViewModeToggle = async (viewMode: "grid" | "list") => { + try { + await updatePreferences({ + displayMode: { + ...preferences.displayMode, + viewMode, + }, + }); + } catch (error) { + logger.error({ err: error }, "Erreur lors de la mise à jour du mode d'affichage"); + } + }; + return { isCompact: preferences.displayMode.compact, itemsPerPage: preferences.displayMode.itemsPerPage, + viewMode: preferences.displayMode.viewMode || "grid", handleCompactToggle, handlePageSizeChange, + handleViewModeToggle, }; } diff --git a/src/i18n/messages/en/common.json b/src/i18n/messages/en/common.json index 0d6f89a..1ce634d 100644 --- a/src/i18n/messages/en/common.json +++ b/src/i18n/messages/en/common.json @@ -325,9 +325,14 @@ "progress": "Page {{current}}/{{total}}", "offline": "Unavailable offline" }, + "pages": "page", + "pages_plural": "pages", + "completed": "completed", "display": { "showing": "Showing books {start} to {end} of {total}", - "page": "Page {current} of {total}" + "page": "Page {current} of {total}", + "grid": "Grid view", + "list": "List view" }, "filters": { "showAll": "Show all", diff --git a/src/i18n/messages/fr/common.json b/src/i18n/messages/fr/common.json index 7ba289b..8c1931b 100644 --- a/src/i18n/messages/fr/common.json +++ b/src/i18n/messages/fr/common.json @@ -323,9 +323,14 @@ "progress": "Page {{current}}/{{total}}", "offline": "Indisponible hors ligne" }, + "pages": "page", + "pages_plural": "pages", + "completed": "complété", "display": { "showing": "Affichage des tomes {start} à {end} sur {total}", - "page": "Page {current} sur {total}" + "page": "Page {current} sur {total}", + "grid": "Vue grille", + "list": "Vue liste" }, "filters": { "showAll": "Afficher tout", diff --git a/src/lib/services/preferences.service.ts b/src/lib/services/preferences.service.ts index 844b475..89e0771 100644 --- a/src/lib/services/preferences.service.ts +++ b/src/lib/services/preferences.service.ts @@ -29,11 +29,17 @@ export class PreferencesService { return { ...defaultPreferences }; } + const displayMode = preferences.displayMode as UserPreferences["displayMode"]; + return { showThumbnails: preferences.showThumbnails, cacheMode: preferences.cacheMode as "memory" | "file", showOnlyUnread: preferences.showOnlyUnread, - displayMode: preferences.displayMode as UserPreferences["displayMode"], + displayMode: { + ...defaultPreferences.displayMode, + ...displayMode, + viewMode: displayMode?.viewMode || defaultPreferences.displayMode.viewMode, + }, background: preferences.background as unknown as BackgroundPreferences, komgaMaxConcurrentRequests: preferences.komgaMaxConcurrentRequests, readerPrefetchCount: preferences.readerPrefetchCount, diff --git a/src/types/preferences.ts b/src/types/preferences.ts index e2f56c8..e271aad 100644 --- a/src/types/preferences.ts +++ b/src/types/preferences.ts @@ -22,6 +22,7 @@ export interface UserPreferences { displayMode: { compact: boolean; itemsPerPage: number; + viewMode: "grid" | "list"; }; background: BackgroundPreferences; komgaMaxConcurrentRequests: number; @@ -36,6 +37,7 @@ export const defaultPreferences: UserPreferences = { displayMode: { compact: false, itemsPerPage: 20, + viewMode: "grid", }, background: { type: "default",