From c62cff07d2144e992b6bad797488abb7810a3607 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 21 Feb 2025 22:41:11 +0100 Subject: [PATCH] feat(reader): right to left read --- src/components/reader/BookReader.tsx | 42 ++++++--- .../reader/components/ControlButtons.tsx | 23 ++++- .../reader/hooks/usePageNavigation.ts | 86 +++++++++++++------ .../reader/hooks/useReadingDirection.ts | 28 ++++++ src/components/reader/types.ts | 3 + 5 files changed, 143 insertions(+), 39 deletions(-) create mode 100644 src/components/reader/hooks/useReadingDirection.ts diff --git a/src/components/reader/BookReader.tsx b/src/components/reader/BookReader.tsx index f594640..7d2b82d 100644 --- a/src/components/reader/BookReader.tsx +++ b/src/components/reader/BookReader.tsx @@ -10,6 +10,7 @@ import { NavigationBar } from "./components/NavigationBar"; import { ControlButtons } from "./components/ControlButtons"; import { ImageLoader } from "@/components/ui/image-loader"; import { cn } from "@/lib/utils"; +import { useReadingDirection } from "./hooks/useReadingDirection"; export function BookReader({ book, pages, onClose }: BookReaderProps) { const [isDoublePage, setIsDoublePage] = useState(false); @@ -17,6 +18,7 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { const [isFullscreen, setIsFullscreen] = useState(false); const readerRef = useRef(null); const isLandscape = useOrientation(); + const { direction, toggleDirection, isRTL } = useReadingDirection(); const { currentPage, @@ -33,6 +35,7 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { pages, isDoublePage, onClose, + direction, }); const { preloadPage, getPageUrl, cleanCache } = usePageCache({ @@ -133,7 +136,15 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { return () => { isMounted = false; }; - }, [currentPage, isDoublePage, shouldShowDoublePage, preloadPage, cleanCache, pages.length]); + }, [ + currentPage, + isDoublePage, + shouldShowDoublePage, + preloadPage, + cleanCache, + pages.length, + isRTL, + ]); // Effet pour gérer le mode double page automatiquement en paysage useEffect(() => { @@ -200,6 +211,8 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { console.error("Erreur lors du changement de mode plein écran:", error); } }} + direction={direction} + onToggleDirection={toggleDirection} /> {/* Pages */} @@ -216,7 +229,8 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
@@ -235,7 +249,12 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { {/* Deuxième page en mode double page */} {isDoublePage && shouldShowDoublePage(currentPage) && ( -
+
{nextPageUrl && (
-
- + {/* Barre de navigation */} + +
); diff --git a/src/components/reader/components/ControlButtons.tsx b/src/components/reader/components/ControlButtons.tsx index dd3b70a..6733e90 100644 --- a/src/components/reader/components/ControlButtons.tsx +++ b/src/components/reader/components/ControlButtons.tsx @@ -7,6 +7,7 @@ import { LayoutTemplate, Maximize2, Minimize2, + ArrowLeftRight, } from "lucide-react"; import { cn } from "@/lib/utils"; @@ -22,6 +23,8 @@ export const ControlButtons = ({ onToggleDoublePage, isFullscreen, onToggleFullscreen, + direction, + onToggleDirection, }: ControlButtonsProps) => { return ( <> @@ -52,6 +55,20 @@ export const ControlButtons = ({ )} +