/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import IconButton from '@mui/material/IconButton'; import Stack from '@mui/material/Stack'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import { bindMenu, bindTrigger, usePopupState } from 'material-ui-popup-state/hooks'; import MenuItem from '@mui/material/MenuItem'; import { useTranslation } from 'react-i18next'; import Menu from '@mui/material/Menu'; import Link from '@mui/material/Link'; import { Link as RouterLink } from 'react-router-dom'; import { alpha } from '@mui/material/styles'; import Slide from '@mui/material/Slide'; import { forwardRef, memo } from 'react'; import { CustomTooltip } from '@/features/core/components/CustomTooltip.tsx'; import { TypographyMaxLines } from '@/features/core/components/texts/TypographyMaxLines.tsx'; import { makeToast } from '@/features/core/utils/Toast.ts'; import { MobileHeaderProps } from '@/features/reader/types/ReaderOverlay.types.ts'; import { LoadingPlaceholder } from '@/features/core/components/feedback/LoadingPlaceholder'; import { AppRoutes } from '@/features/core/AppRoute.constants.ts'; import { ReaderStateChapters, TReaderScrollbarContext, TReaderStateMangaContext, } from '@/features/reader/types/Reader.types.ts'; import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx'; import { useReaderStateMangaContext } from '@/features/reader/contexts/state/ReaderStateMangaContext.tsx'; import { useReaderStateChaptersContext } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx'; import { useReaderScrollbarContext } from '@/features/reader/contexts/ReaderScrollbarContext.tsx'; import { ReaderLibraryButton } from '@/features/reader/components/overlay/navigation/ReaderLibraryButton.tsx'; import { ReaderBookmarkButton } from '@/features/reader/components/overlay/navigation/ReaderBookmarkButton.tsx'; import { FALLBACK_CHAPTER } from '@/features/chapter/Chapter.constants.ts'; import { FALLBACK_MANGA } from '@/features/manga/Manga.constants.ts'; import { ReaderExitButton } from '@/features/reader/components/overlay/navigation/ReaderExitButton.tsx'; import { requestManager } from '@/lib/requests/RequestManager.ts'; const DEFAULT_MANGA = { ...FALLBACK_MANGA, title: '' }; const BaseReaderOverlayHeaderMobile = forwardRef< HTMLDivElement, MobileHeaderProps & Pick & Pick & Pick >(({ isVisible, manga, currentChapter, scrollbarYSize }, ref) => { const { t } = useTranslation(); const popupState = usePopupState({ popupId: 'reader-overlay-more-menu', variant: 'popover' }); const { id: mangaId, title } = manga ?? DEFAULT_MANGA; const { id: chapterId, name, realUrl, isBookmarked } = currentChapter ?? FALLBACK_CHAPTER; return ( `max(env(safe-area-inset-top), ${theme.spacing(2)})`, backgroundColor: (theme) => alpha(theme.palette.background.paper, 0.95), pointerEvents: 'all', boxShadow: 2, }} > {manga && currentChapter ? ( <> {title} {name} ) : ( )} {t('global.button.open_browser')} {t('global.button.open_webview')} { await navigator.clipboard.writeText(title); makeToast(t('global.label.copied_clipboard'), 'info'); }} > {t('global.label.share')} ); }); export const ReaderOverlayHeaderMobile = withPropsFrom( memo(BaseReaderOverlayHeaderMobile), [useReaderStateMangaContext, useReaderStateChaptersContext, useReaderScrollbarContext], ['manga', 'currentChapter', 'scrollbarYSize'], );