|
|
|
@ -1,4 +1,4 @@
|
|
|
|
import { getCurrentWindow } from '@tauri-apps/api/window';
|
|
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
|
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
|
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
|
|
import type { ViewerSettings } from '../types';
|
|
|
|
import type { ViewerSettings } from '../types';
|
|
|
|
import type { ChapterData } from '../types';
|
|
|
|
import type { ChapterData } from '../types';
|
|
|
|
@ -144,6 +144,15 @@ export function MangaViewer({
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, [slotIndex, chapter.prev_chapter, boundaryWarning, onNavigate]);
|
|
|
|
}, [slotIndex, chapter.prev_chapter, boundaryWarning, onNavigate]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const toggleFullscreen = useCallback(async () => {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
const isFull = await invoke<boolean>('toggle_fullscreen');
|
|
|
|
|
|
|
|
setIsFullscreen(isFull);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
console.error('Failed to toggle fullscreen:', e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
// Keyboard navigation
|
|
|
|
// Keyboard navigation
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
const handler = (e: KeyboardEvent) => {
|
|
|
|
const handler = (e: KeyboardEvent) => {
|
|
|
|
@ -172,7 +181,7 @@ export function MangaViewer({
|
|
|
|
};
|
|
|
|
};
|
|
|
|
window.addEventListener('keydown', handler);
|
|
|
|
window.addEventListener('keydown', handler);
|
|
|
|
return () => window.removeEventListener('keydown', handler);
|
|
|
|
return () => window.removeEventListener('keydown', handler);
|
|
|
|
}, [goNext, goPrev, showSettings, settings.direction]);
|
|
|
|
}, [goNext, goPrev, showSettings, settings.direction, toggleFullscreen]);
|
|
|
|
|
|
|
|
|
|
|
|
// Auto-hide toolbar
|
|
|
|
// Auto-hide toolbar
|
|
|
|
const resetToolbarTimer = useCallback(() => {
|
|
|
|
const resetToolbarTimer = useCallback(() => {
|
|
|
|
@ -190,24 +199,6 @@ export function MangaViewer({
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}, []);
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
const toggleFullscreen = async () => {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
const win = getCurrentWindow();
|
|
|
|
|
|
|
|
const isFull = await win.isFullscreen();
|
|
|
|
|
|
|
|
await win.setFullscreen(!isFull);
|
|
|
|
|
|
|
|
setIsFullscreen(!isFull);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
console.error("Native fullscreen failed, using DOM fallback", e);
|
|
|
|
|
|
|
|
if (!document.fullscreenElement) {
|
|
|
|
|
|
|
|
containerRef.current?.requestFullscreen().catch(console.error);
|
|
|
|
|
|
|
|
setIsFullscreen(true);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
document.exitFullscreen().catch(console.error);
|
|
|
|
|
|
|
|
setIsFullscreen(false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const bgMap = {
|
|
|
|
const bgMap = {
|
|
|
|
black: '#000000',
|
|
|
|
black: '#000000',
|
|
|
|
white: '#f8f8f8',
|
|
|
|
white: '#f8f8f8',
|
|
|
|
|