/* * 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 Card from '@mui/material/Card'; import CardContent from '@mui/material/CardContent'; import Button from '@mui/material/Button'; import { useTranslation } from 'react-i18next'; import Box from '@mui/material/Box'; import CardActionArea from '@mui/material/CardActionArea'; import CardMedia from '@mui/material/CardMedia'; import Collapse from '@mui/material/Collapse'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import { useLayoutEffect, useRef, useState } from 'react'; import parseHtml from 'html-react-parser'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import sanitizeHtml from 'sanitize-html'; import { SpinnerImage } from '@/modules/core/components/SpinnerImage.tsx'; import { TypographyMaxLines } from '@/modules/core/components/TypographyMaxLines.tsx'; import { Metadata } from '@/modules/core/components/Metadata.tsx'; import { MediaQuery } from '@/lib/ui/MediaQuery.tsx'; import { TTrackerManga } from '@/modules/tracker/services/Trackers.ts'; const TrackerMangaCardTitle = ({ title, selected }: { title: string; selected: boolean }) => ( {title} ); const SUMMARY_COLLAPSED_SIZE = 50; const TrackerMangaCardSummary = ({ summary }: { summary: string }) => { const { t } = useTranslation(); const summaryRef = useRef(null); const [isSummaryExpanded, setIsSummaryExpanded] = useState(false); const [showSummaryExpandButton, setShowSummaryExpandButton] = useState(false); const summaryCollapsedSize = showSummaryExpandButton ? SUMMARY_COLLAPSED_SIZE : 0; useLayoutEffect(() => { const shouldCollapseSummary = (summaryRef.current?.clientHeight ?? 0) > SUMMARY_COLLAPSED_SIZE; setShowSummaryExpandButton(shouldCollapseSummary); setIsSummaryExpanded(!shouldCollapseSummary); }, []); return ( <> {summary.length && ( {parseHtml(sanitizeHtml(summary, { disallowedTagsMode: 'escape' }))} )} {summary.length && showSummaryExpandButton && ( )} ); }; const TrackerMangaCardLink = ({ children, url }: { children: React.ReactNode; url: string }) => ( e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} > {children} ); export const TrackerMangaCard = ({ manga, selected, onSelect, }: { manga: TTrackerManga; selected: boolean; onSelect: () => void; }) => { const { t } = useTranslation(); const isMobileWidth = MediaQuery.useIsMobileWidth(); return ( ); };