import {UseWatchPageVideoResponse} from '@app/videos/requests/use-watch-page-video'; import {MediaPlayIcon} from '@common/icons/media/media-play'; import {getWatchLink} from '@app/videos/watch-page/get-watch-link'; import {Button} from '@common/ui/buttons/button'; import {Link, useParams} from 'react-router-dom'; import {AnimatePresence, m} from 'framer-motion'; import {Skeleton} from '@common/ui/skeleton/skeleton'; import {opacityAnimation} from '@common/ui/animation/opacity-animation'; import clsx from 'clsx'; import {Video} from '@app/titles/models/video'; import {useSettings} from '@common/core/settings/use-settings'; import React, {Fragment} from 'react'; import {EpisodeSelector} from '@app/videos/watch-page/episode-selector'; import {MediaEpisodesIcon} from '@common/icons/media/media-episodes'; import {Trans} from '@common/i18n/trans'; import {useNavigate} from '@common/utils/hooks/use-navigate'; import { Menu, MenuItem, MenuTrigger, } from '@common/ui/navigation/menu/menu-trigger'; const className = 'flex items-center flex-wrap gap-14'; interface Props { data: UseWatchPageVideoResponse | undefined; } export function WatchPageAlternativeVideos({data}: Props) { const navigate = useNavigate(); const {streaming} = useSettings(); const title = data?.title; const episode = data?.episode; const video = data?.video; const showEpisodeSelector = title && episode && video && (video.type === 'embed' || video.type === 'external'); if (!showEpisodeSelector && !streaming.show_video_selector) { return null; } return (
{streaming.show_video_selector && (
{data ? ( ) : ( )}
)} {showEpisodeSelector && ( { navigate(getWatchLink(episode.primary_video)); }} trigger={ } /> )}
); } interface VideoDropdownProps { videos: Video[]; className?: string; } function VideoDropdown({videos, className}: VideoDropdownProps) { const navigate = useNavigate(); return ( {videos.map(video => ( } endSection={} onSelected={() => navigate(getWatchLink(video))} > {video.name} ))} ); } interface VideoListProps { videos: Video[]; } function VideoList({videos}: VideoListProps) { const {videoId} = useParams(); if (videos.length < 2) { return null; } return ( {videos.map(video => ( ))} ); } interface QualityBadgeProps { video: Video; } function QualityBadge({video}: QualityBadgeProps) { if (!video.quality || video.quality === 'default') { return null; } return ( {video.quality} ); } function Skeletons() { return ( ); }