diff --git a/src/modules/library/Library.types.ts b/src/modules/library/Library.types.ts index cb8763be..ae39fcaf 100644 --- a/src/modules/library/Library.types.ts +++ b/src/modules/library/Library.types.ts @@ -60,3 +60,8 @@ export type LibraryDuplicatesDescriptionWorkerInput>; +}; diff --git a/src/modules/library/contexts/LibraryOptionsContext.tsx b/src/modules/library/contexts/LibraryOptionsContext.tsx index bd70748e..f2dbeb9d 100644 --- a/src/modules/library/contexts/LibraryOptionsContext.tsx +++ b/src/modules/library/contexts/LibraryOptionsContext.tsx @@ -8,12 +8,7 @@ import React, { useContext } from 'react'; import { DEFAULT_CATEGORY_METADATA } from '@/modules/category/services/CategoryMetadata.ts'; -import { LibraryOptions } from '@/modules/library/Library.types.ts'; - -type LibraryOptionsContextType = { - options: LibraryOptions; - setOptions: React.Dispatch>; -}; +import { LibraryOptionsContextType } from '@/modules/library/Library.types.ts'; export const LibraryOptionsContext = React.createContext({ options: DEFAULT_CATEGORY_METADATA, diff --git a/src/modules/navigation-bar/NavigationBar.types.ts b/src/modules/navigation-bar/NavigationBar.types.ts index 362ced0b..b8d2975a 100644 --- a/src/modules/navigation-bar/NavigationBar.types.ts +++ b/src/modules/navigation-bar/NavigationBar.types.ts @@ -22,3 +22,35 @@ export interface NavbarItem { IconComponent: OverridableComponent>; show: 'mobile' | 'desktop' | 'both'; } + +export type NavbarContextType = { + history: string[]; + + // AppBar title + title: string | React.ReactNode; + setTitle: (title: NavbarContextType['title'], browserTitle?: string) => void; + + appBarHeight: number; + setAppBarHeight: React.Dispatch>; + + // AppBar action buttons + action: any; + setAction: React.Dispatch>; + + // Allow default navbar to be overrided + override: INavbarOverride; + setOverride: React.Dispatch>; + + // NavBar + isCollapsed: boolean; + setIsCollapsed: React.Dispatch>; + + navBarWidth: number; + setNavBarWidth: React.Dispatch>; + + readerNavBarWidth: number; + setReaderNavBarWidth: React.Dispatch>; + + bottomBarHeight: number; + setBottomBarHeight: React.Dispatch>; +}; diff --git a/src/modules/navigation-bar/contexts/NavbarContext.tsx b/src/modules/navigation-bar/contexts/NavbarContext.tsx index 4b32d3d4..df2250dd 100644 --- a/src/modules/navigation-bar/contexts/NavbarContext.tsx +++ b/src/modules/navigation-bar/contexts/NavbarContext.tsx @@ -8,39 +8,7 @@ import React, { useContext } from 'react'; -import { INavbarOverride } from '@/modules/navigation-bar/NavigationBar.types.ts'; - -type NavbarContextType = { - history: string[]; - - // AppBar title - title: string | React.ReactNode; - setTitle: (title: NavbarContextType['title'], browserTitle?: string) => void; - - appBarHeight: number; - setAppBarHeight: React.Dispatch>; - - // AppBar action buttons - action: any; - setAction: React.Dispatch>; - - // Allow default navbar to be overrided - override: INavbarOverride; - setOverride: React.Dispatch>; - - // NavBar - isCollapsed: boolean; - setIsCollapsed: React.Dispatch>; - - navBarWidth: number; - setNavBarWidth: React.Dispatch>; - - readerNavBarWidth: number; - setReaderNavBarWidth: React.Dispatch>; - - bottomBarHeight: number; - setBottomBarHeight: React.Dispatch>; -}; +import { NavbarContextType } from '@/modules/navigation-bar/NavigationBar.types.ts'; export const NavBarContext = React.createContext({ history: [], diff --git a/src/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopChapterNavigation.tsx b/src/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopChapterNavigation.tsx index 6c0c986e..7032a7da 100644 --- a/src/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopChapterNavigation.tsx +++ b/src/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopChapterNavigation.tsx @@ -10,29 +10,26 @@ import Stack from '@mui/material/Stack'; import { useTranslation } from 'react-i18next'; import Box from '@mui/material/Box'; import MenuItem from '@mui/material/MenuItem'; -import { ContextType, useLayoutEffect } from 'react'; +import { useLayoutEffect } from 'react'; import Popover from '@mui/material/Popover'; import { bindPopover, bindTrigger, usePopupState } from 'material-ui-popup-state/hooks'; import FormControl from '@mui/material/FormControl'; import InputLabel from '@mui/material/InputLabel'; import { Link } from 'react-router-dom'; import { Select } from '@/modules/core/components/inputs/Select.tsx'; -import { ReaderStateChaptersContext } from '@/modules/reader/contexts/state/ReaderStateChaptersContext.tsx'; import { ReaderChapterList } from '@/modules/reader/components/overlay/navigation/ReaderChapterList.tsx'; import { ReaderNavBarDesktopNextPreviousButton } from '@/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopNextPreviousButton.tsx'; import { getOptionForDirection } from '@/modules/theme/services/ThemeCreator.ts'; import { ReaderService } from '@/modules/reader/services/ReaderService.ts'; import { ReaderControls } from '@/modules/reader/services/ReaderControls.ts'; +import { ReaderStateChapters } from '@/modules/reader/types/Reader.types.ts'; export const ReaderNavBarDesktopChapterNavigation = ({ currentChapter, previousChapter, nextChapter, chapters = [], -}: Pick< - ContextType, - 'chapters' | 'currentChapter' | 'previousChapter' | 'nextChapter' ->) => { +}: Pick) => { const { t } = useTranslation(); const readerThemeDirection = ReaderService.useGetThemeDirection(); const openChapter = ReaderControls.useOpenChapter(); diff --git a/src/modules/reader/components/settings/layout/ReaderLayoutSettings.tsx b/src/modules/reader/components/settings/layout/ReaderLayoutSettings.tsx index 7455e313..d71d8e1e 100644 --- a/src/modules/reader/components/settings/layout/ReaderLayoutSettings.tsx +++ b/src/modules/reader/components/settings/layout/ReaderLayoutSettings.tsx @@ -7,11 +7,9 @@ */ import Stack from '@mui/material/Stack'; -import { ContextType } from 'react'; import { ReaderSettingReadingMode } from '@/modules/reader/components/settings/layout/ReaderSettingReadingMode.tsx'; import { ReaderSettingReadingDirection } from '@/modules/reader/components/settings/layout/ReaderSettingReadingDirection.tsx'; import { ReaderSettingTapZoneLayout } from '@/modules/reader/components/settings/layout/ReaderSettingTapZoneLayout.tsx'; -import { ReaderTapZoneContext } from '@/modules/reader/contexts/ReaderTapZoneContext.tsx'; import { ReaderSettingTapZoneInvertMode } from '@/modules/reader/components/settings/layout/ReaderSettingTapZoneInvertMode.tsx'; import { ReaderSettingPageScaleMode } from '@/modules/reader/components/settings/layout/ReaderSettingPageScaleMode.tsx'; import { ReaderSettingStretchPage } from '@/modules/reader/components/settings/layout/ReaderSettingStretchPage.tsx'; @@ -19,6 +17,7 @@ import { ReaderSettingsTypeProps } from '@/modules/reader/types/Reader.types.ts' import { ReaderSettingPageGap } from '@/modules/reader/components/settings/layout/ReaderSettingPageGap.tsx'; import { ReaderSettingWidth } from '@/modules/reader/components/settings/layout/ReaderSettingWidth.tsx'; import { DefaultSettingFootnote } from '@/modules/reader/components/settings/DefaultSettingFootnote.tsx'; +import { TReaderTapZoneContext } from '@/modules/reader/types/TapZoneLayout.types.ts'; export const ReaderLayoutSettings = ({ setShowPreview, @@ -27,7 +26,7 @@ export const ReaderLayoutSettings = ({ isDefaultable, onDefault, }: ReaderSettingsTypeProps & { - setShowPreview: ContextType['setShowPreview']; + setShowPreview: TReaderTapZoneContext['setShowPreview']; }) => ( diff --git a/src/modules/reader/contexts/ReaderOverlayContext.tsx b/src/modules/reader/contexts/ReaderOverlayContext.tsx index 9b2aba86..28cdcc68 100644 --- a/src/modules/reader/contexts/ReaderOverlayContext.tsx +++ b/src/modules/reader/contexts/ReaderOverlayContext.tsx @@ -6,12 +6,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import React, { createContext, useContext } from 'react'; - -type TReaderOverlayContext = { - isVisible: boolean; - setIsVisible: React.Dispatch>; -}; +import { createContext, useContext } from 'react'; +import { TReaderOverlayContext } from '@/modules/reader/types/ReaderOverlay.types.ts'; export const ReaderOverlayContext = createContext({ isVisible: false, diff --git a/src/modules/reader/contexts/ReaderProgressBarContext.tsx b/src/modules/reader/contexts/ReaderProgressBarContext.tsx index 605a95ed..dfb57a1b 100644 --- a/src/modules/reader/contexts/ReaderProgressBarContext.tsx +++ b/src/modules/reader/contexts/ReaderProgressBarContext.tsx @@ -7,13 +7,7 @@ */ import { createContext, useContext } from 'react'; - -type TReaderProgressBarContext = { - isMaximized: boolean; - setIsMaximized: (visible: boolean) => void; - isDragging: boolean; - setIsDragging: (isDragging: boolean) => void; -}; +import { TReaderProgressBarContext } from '@/modules/reader/types/ReaderProgressBar.types.ts'; export const ReaderProgressBarContext = createContext({ isMaximized: false, diff --git a/src/modules/reader/contexts/ReaderScrollbarContext.tsx b/src/modules/reader/contexts/ReaderScrollbarContext.tsx index 1b0ae065..52396f56 100644 --- a/src/modules/reader/contexts/ReaderScrollbarContext.tsx +++ b/src/modules/reader/contexts/ReaderScrollbarContext.tsx @@ -7,13 +7,7 @@ */ import { createContext, useContext } from 'react'; - -type TReaderScrollbarContext = { - scrollbarXSize: number; - setScrollbarXSize: (size: number) => void; - scrollbarYSize: number; - setScrollbarYSize: (size: number) => void; -}; +import { TReaderScrollbarContext } from '@/modules/reader/types/Reader.types.ts'; export const ReaderScrollbarContext = createContext({ scrollbarXSize: 0, diff --git a/src/modules/reader/contexts/ReaderTapZoneContext.tsx b/src/modules/reader/contexts/ReaderTapZoneContext.tsx index 1b6b9930..8069e63b 100644 --- a/src/modules/reader/contexts/ReaderTapZoneContext.tsx +++ b/src/modules/reader/contexts/ReaderTapZoneContext.tsx @@ -7,11 +7,7 @@ */ import { createContext, useContext } from 'react'; - -type TReaderTapZoneContext = { - showPreview: boolean; - setShowPreview: (showPreview: boolean) => void; -}; +import { TReaderTapZoneContext } from '@/modules/reader/types/TapZoneLayout.types.ts'; export const ReaderTapZoneContext = createContext({ showPreview: false, diff --git a/src/modules/reader/contexts/state/ReaderStateChaptersContextProvider.tsx b/src/modules/reader/contexts/state/ReaderStateChaptersContextProvider.tsx index e731af08..a485971e 100644 --- a/src/modules/reader/contexts/state/ReaderStateChaptersContextProvider.tsx +++ b/src/modules/reader/contexts/state/ReaderStateChaptersContextProvider.tsx @@ -6,13 +6,15 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ContextType, ReactNode, useMemo, useState } from 'react'; +import { ReactNode, useMemo, useState } from 'react'; import { ReaderStateChaptersContext } from '@/modules/reader/contexts/state/ReaderStateChaptersContext.tsx'; - -type TContext = ContextType; +import { ReaderStateChapters } from '@/modules/reader/types/Reader.types.ts'; export const ReaderStateChaptersContextProvider = ({ children }: { children: ReactNode }) => { - const [state, setState] = useState>({ mangaChapters: [], chapters: [] }); + const [state, setState] = useState>({ + mangaChapters: [], + chapters: [], + }); const value = useMemo( () => ({ diff --git a/src/modules/reader/contexts/state/ReaderStateMangaContext.tsx b/src/modules/reader/contexts/state/ReaderStateMangaContext.tsx index 55912465..0b460e77 100644 --- a/src/modules/reader/contexts/state/ReaderStateMangaContext.tsx +++ b/src/modules/reader/contexts/state/ReaderStateMangaContext.tsx @@ -7,12 +7,7 @@ */ import { createContext, useContext } from 'react'; -import { TMangaReader } from '@/modules/manga/Manga.types.ts'; - -type TReaderStateMangaContext = { - manga: TMangaReader | undefined; - setManga: (manga: TMangaReader | undefined) => void; -}; +import { TReaderStateMangaContext } from '@/modules/reader/types/Reader.types.ts'; export const ReaderStateMangaContext = createContext({ manga: undefined, diff --git a/src/modules/reader/contexts/state/ReaderStateMangaContextProvider.tsx b/src/modules/reader/contexts/state/ReaderStateMangaContextProvider.tsx index 17cd8769..06159aad 100644 --- a/src/modules/reader/contexts/state/ReaderStateMangaContextProvider.tsx +++ b/src/modules/reader/contexts/state/ReaderStateMangaContextProvider.tsx @@ -6,11 +6,12 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ContextType, ReactNode, useMemo, useState } from 'react'; +import { ReactNode, useMemo, useState } from 'react'; import { ReaderStateMangaContext } from '@/modules/reader/contexts/state/ReaderStateMangaContext.tsx'; +import { TReaderStateMangaContext } from '@/modules/reader/types/Reader.types.ts'; export const ReaderStateMangaContextProvider = ({ children }: { children: ReactNode }) => { - const [manga, setManga] = useState['manga']>(); + const [manga, setManga] = useState(); const value = useMemo(() => ({ manga, setManga }), [manga]); diff --git a/src/modules/reader/contexts/state/ReaderStatePagesContextProvider.tsx b/src/modules/reader/contexts/state/ReaderStatePagesContextProvider.tsx index a078f582..b27e6999 100644 --- a/src/modules/reader/contexts/state/ReaderStatePagesContextProvider.tsx +++ b/src/modules/reader/contexts/state/ReaderStatePagesContextProvider.tsx @@ -6,25 +6,24 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ContextType, ReactNode, useMemo, useState } from 'react'; +import { ReactNode, useMemo, useState } from 'react'; import { ReaderStatePagesContext } from '@/modules/reader/contexts/state/ReaderStatePagesContext.tsx'; import { createPageData } from '@/modules/reader/utils/ReaderPager.utils.tsx'; import { ReaderTransitionPageMode } from '@/modules/reader/types/Reader.types.ts'; - -type TContext = ContextType; +import { ReaderStatePages } from '@/modules/reader/types/ReaderProgressBar.types.ts'; export const ReaderStatePagesContextProvider = ({ children }: { children: ReactNode }) => { - const [totalPages, setTotalPages] = useState(0); - const [currentPageIndex, setCurrentPageIndex] = useState(0); - const [pageToScrollToIndex, setPageToScrollToIndex] = useState(0); - const [pageUrls, setPageUrls] = useState([]); - const [pageLoadStates, setPageLoadStates] = useState([{ loaded: false }]); - const [pages, setPages] = useState([createPageData('', 0)]); - const [transitionPageMode, setTransitionPageMode] = useState( + const [totalPages, setTotalPages] = useState(0); + const [currentPageIndex, setCurrentPageIndex] = useState(0); + const [pageToScrollToIndex, setPageToScrollToIndex] = useState(0); + const [pageUrls, setPageUrls] = useState([]); + const [pageLoadStates, setPageLoadStates] = useState([{ loaded: false }]); + const [pages, setPages] = useState([createPageData('', 0)]); + const [transitionPageMode, setTransitionPageMode] = useState( ReaderTransitionPageMode.NONE, ); const [retryFailedPagesKeyPrefix, setRetryFailedPagesKeyPrefix] = - useState(''); + useState(''); const value = useMemo( () => ({ diff --git a/src/modules/reader/contexts/state/ReaderStateSettingsContext.tsx b/src/modules/reader/contexts/state/ReaderStateSettingsContext.tsx index 4a5fa922..154c2f97 100644 --- a/src/modules/reader/contexts/state/ReaderStateSettingsContext.tsx +++ b/src/modules/reader/contexts/state/ReaderStateSettingsContext.tsx @@ -7,14 +7,9 @@ */ import { createContext, useContext } from 'react'; -import { IReaderSettingsWithDefaultFlag } from '@/modules/reader/types/Reader.types.ts'; +import { TReaderStateSettingsContext } from '@/modules/reader/types/Reader.types.ts'; import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/modules/reader/services/ReaderSettingsMetadata.ts'; -type TReaderStateSettingsContext = { - settings: IReaderSettingsWithDefaultFlag; - setSettings: (settings: IReaderSettingsWithDefaultFlag) => void; -}; - export const ReaderStateSettingsContext = createContext({ settings: DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG, setSettings: () => undefined, diff --git a/src/modules/reader/contexts/state/ReaderStateSettingsContextProvider.tsx b/src/modules/reader/contexts/state/ReaderStateSettingsContextProvider.tsx index 9d771b45..042d9acc 100644 --- a/src/modules/reader/contexts/state/ReaderStateSettingsContextProvider.tsx +++ b/src/modules/reader/contexts/state/ReaderStateSettingsContextProvider.tsx @@ -6,12 +6,13 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ContextType, ReactNode, useMemo, useState } from 'react'; +import { ReactNode, useMemo, useState } from 'react'; import { ReaderStateSettingsContext } from '@/modules/reader/contexts/state/ReaderStateSettingsContext.tsx'; import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/modules/reader/services/ReaderSettingsMetadata.ts'; +import { TReaderStateSettingsContext } from '@/modules/reader/types/Reader.types.ts'; export const ReaderStateSettingsContextProvider = ({ children }: { children: ReactNode }) => { - const [settings, setSettings] = useState['settings']>( + const [settings, setSettings] = useState( DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG, ); diff --git a/src/modules/reader/services/ReaderControls.ts b/src/modules/reader/services/ReaderControls.ts index 569fc029..60300cd6 100644 --- a/src/modules/reader/services/ReaderControls.ts +++ b/src/modules/reader/services/ReaderControls.ts @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ContextType, MutableRefObject, useCallback, useMemo } from 'react'; +import { MutableRefObject, useCallback, useMemo } from 'react'; import { Direction, useTheme } from '@mui/material/styles'; import { useTranslation } from 'react-i18next'; import { TFunction } from 'i18next'; @@ -28,7 +28,7 @@ import { READING_DIRECTION_TO_THEME_DIRECTION, } from '@/modules/reader/constants/ReaderSettings.constants.tsx'; import { isEndOfPageInViewport, isPageInViewport } from '@/modules/reader/utils/ReaderPager.utils.tsx'; -import { ReaderOverlayContext, useReaderOverlayContext } from '@/modules/reader/contexts/ReaderOverlayContext.tsx'; +import { useReaderOverlayContext } from '@/modules/reader/contexts/ReaderOverlayContext.tsx'; import { useReaderTapZoneContext } from '@/modules/reader/contexts/ReaderTapZoneContext.tsx'; import { TapZoneRegionType } from '@/modules/reader/types/TapZoneLayout.types.ts'; import { ReaderTapZoneService } from '@/modules/reader/services/ReaderTapZoneService.ts'; @@ -40,6 +40,7 @@ import { useMetadataServerSettings } from '@/modules/settings/services/ServerSet import { TChapterReader } from '@/modules/chapter/Chapter.types.ts'; import { awaitConfirmation } from '@/modules/core/utils/AwaitableDialog.tsx'; import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts'; +import { TReaderOverlayContext } from '@/modules/reader/types/ReaderOverlay.types.ts'; const getScrollDirectionInvert = ( scrollDirection: ScrollDirection, @@ -83,7 +84,7 @@ export class ReaderControls { themeDirection: Direction, element: HTMLElement, openChapter: ReturnType<(typeof ReaderControls)['useOpenChapter']>, - setIsOverlayVisible: ContextType['setIsVisible'], + setIsOverlayVisible: TReaderOverlayContext['setIsVisible'], scrollAmountPercentage: number = ReaderScrollAmount.LARGE, ): void { if (!element) { diff --git a/src/modules/reader/types/Reader.types.ts b/src/modules/reader/types/Reader.types.ts index 66cd32d3..6249286d 100644 --- a/src/modules/reader/types/Reader.types.ts +++ b/src/modules/reader/types/Reader.types.ts @@ -11,6 +11,7 @@ import { TapZoneInvertMode, TapZoneLayouts } from '@/modules/reader/types/TapZon import { TChapterReader } from '@/modules/chapter/Chapter.types.ts'; import { ReaderService } from '@/modules/reader/services/ReaderService.ts'; import { ReaderStatePages } from '@/modules/reader/types/ReaderProgressBar.types.ts'; +import { TMangaReader } from '@/modules/manga/Manga.types.ts'; export enum ProgressBarType { HIDDEN, @@ -240,3 +241,20 @@ export enum ReaderResumeMode { END, LAST_READ, } + +export type TReaderScrollbarContext = { + scrollbarXSize: number; + setScrollbarXSize: (size: number) => void; + scrollbarYSize: number; + setScrollbarYSize: (size: number) => void; +}; + +export type TReaderStateMangaContext = { + manga: TMangaReader | undefined; + setManga: (manga: TMangaReader | undefined) => void; +}; + +export type TReaderStateSettingsContext = { + settings: IReaderSettingsWithDefaultFlag; + setSettings: (settings: IReaderSettingsWithDefaultFlag) => void; +}; diff --git a/src/modules/reader/types/ReaderOverlay.types.ts b/src/modules/reader/types/ReaderOverlay.types.ts index bfa2aa04..dad3d10c 100644 --- a/src/modules/reader/types/ReaderOverlay.types.ts +++ b/src/modules/reader/types/ReaderOverlay.types.ts @@ -19,3 +19,8 @@ interface ReaderNavBarBaseProps extends BaseReaderOverlayProps { export interface ReaderBottomBarMobileProps extends ReaderNavBarBaseProps {} export interface ReaderNavBarDesktopProps extends ReaderNavBarBaseProps {} + +export type TReaderOverlayContext = { + isVisible: boolean; + setIsVisible: React.Dispatch>; +}; diff --git a/src/modules/reader/types/ReaderProgressBar.types.ts b/src/modules/reader/types/ReaderProgressBar.types.ts index 09ada296..c2790d51 100644 --- a/src/modules/reader/types/ReaderProgressBar.types.ts +++ b/src/modules/reader/types/ReaderProgressBar.types.ts @@ -65,3 +65,10 @@ export interface CurrentPageSlotProps extends Pick void; boxProps?: BoxProps; } + +export type TReaderProgressBarContext = { + isMaximized: boolean; + setIsMaximized: (visible: boolean) => void; + isDragging: boolean; + setIsDragging: (isDragging: boolean) => void; +}; diff --git a/src/modules/reader/types/TapZoneLayout.types.ts b/src/modules/reader/types/TapZoneLayout.types.ts index cfc3c87b..0af552c7 100644 --- a/src/modules/reader/types/TapZoneLayout.types.ts +++ b/src/modules/reader/types/TapZoneLayout.types.ts @@ -34,3 +34,8 @@ export interface TapZoneInvertMode { vertical: boolean; horizontal: boolean; } + +export type TReaderTapZoneContext = { + showPreview: boolean; + setShowPreview: (showPreview: boolean) => void; +};