import React, { useState } from 'react'; import Modal from '../Common/Modal'; import { useUser } from '../../hooks/useUser'; import { Permission } from '../../../server/lib/permissions'; import { defineMessages, useIntl } from 'react-intl'; import { MediaRequest } from '../../../server/entity/MediaRequest'; import useSWR from 'swr'; import { useToasts } from 'react-toast-notifications'; import axios from 'axios'; import type { MediaStatus } from '../../../server/constants/media'; import { TvDetails, SeasonWithEpisodes } from '../../../server/models/Tv'; const messages = defineMessages({ requestadmin: 'Your request will be immediately approved.', cancelrequest: 'This will remove your request. Are you sure you want to continue?', }); interface RequestModalProps { request?: MediaRequest; tmdbId: number; visible?: boolean; onCancel?: () => void; onComplete?: (newStatus: MediaStatus) => void; onUpdating?: (isUpdating: boolean) => void; } const TvRequestModal: React.FC = ({ visible, onCancel, onComplete, request, tmdbId, onUpdating, }) => { const { addToast } = useToasts(); const { data, error } = useSWR( visible ? `/api/v1/tv/${tmdbId}` : null ); const [selectedSeasons, setSelectedSeasons] = useState([]); const intl = useIntl(); const { hasPermission } = useUser(); const sendRequest = async () => { if (selectedSeasons.length === 0) { return; } if (onUpdating) { onUpdating(true); } const response = await axios.post('/api/v1/request', { mediaId: data?.id, tvdbId: data?.externalIds.tvdbId, mediaType: 'tv', seasons: selectedSeasons, }); if (response.data) { if (onComplete) { onComplete(response.data.media.status); } addToast( {data?.name} succesfully requested! , { appearance: 'success', autoDismiss: true } ); if (onUpdating) { onUpdating(false); } } }; const isSelectedSeason = (seasonNumber: number): boolean => { return selectedSeasons.includes(seasonNumber); }; const toggleSeason = (seasonNumber: number): void => { if (selectedSeasons.includes(seasonNumber)) { setSelectedSeasons((seasons) => seasons.filter((sn) => sn !== seasonNumber) ); } else { setSelectedSeasons((seasons) => [...seasons, seasonNumber]); } }; const toggleAllSeasons = (): void => { if ( data && selectedSeasons.length >= 0 && selectedSeasons.length < data?.seasons.filter((season) => season.seasonNumber !== 0).length ) { setSelectedSeasons( data.seasons .filter((season) => season.seasonNumber !== 0) .map((season) => season.seasonNumber) ); } else { setSelectedSeasons([]); } }; const isAllSeasons = (): boolean => { if (!data) { return false; } return ( selectedSeasons.length === data.seasons.filter((season) => season.seasonNumber !== 0).length ); }; const text = hasPermission(Permission.MANAGE_REQUESTS) ? intl.formatMessage(messages.requestadmin) : undefined; return ( sendRequest()} title={`Request ${data?.name}`} okText={ selectedSeasons.length === 0 ? 'Select a season' : `Request ${selectedSeasons.length} seasons` } okDisabled={selectedSeasons.length === 0} okButtonType="primary" iconSvg={ } >
{data?.seasons .filter((season) => season.seasonNumber !== 0) .map((season) => ( ))}
toggleAllSeasons()} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Space') { toggleAllSeasons(); } }} className="group relative inline-flex items-center justify-center flex-shrink-0 h-5 w-10 cursor-pointer focus:outline-none" > Season # Of Episodes Status
toggleSeason(season.seasonNumber)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Space') { toggleSeason(season.seasonNumber); } }} className="group relative inline-flex items-center justify-center flex-shrink-0 h-5 w-10 cursor-pointer focus:outline-none" > {season.seasonNumber === 0 ? 'Extras' : `Season ${season.seasonNumber}`} {season.episodeCount} Available

{text}

); }; export default TvRequestModal;