import React, { useCallback, useState, useEffect } 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 { MovieDetails } from '../../../server/models/Movie'; import { useToasts } from 'react-toast-notifications'; import axios from 'axios'; import { MediaStatus, MediaRequestStatus, } from '../../../server/constants/media'; import DownloadIcon from '../../assets/download.svg'; const messages = defineMessages({ requestadmin: 'Your request will be immediately approved. Do you wish to continue?', cancelrequest: 'This will remove your request. Are you sure you want to continue?', }); interface RequestModalProps extends React.HTMLAttributes { tmdbId: number; onCancel?: () => void; onComplete?: (newStatus: MediaStatus) => void; onUpdating?: (isUpdating: boolean) => void; } const MovieRequestModal: React.FC = ({ onCancel, onComplete, tmdbId, onUpdating, ...props }) => { const [isUpdating, setIsUpdating] = useState(false); const { addToast } = useToasts(); const { data, error } = useSWR(`/api/v1/movie/${tmdbId}`, { revalidateOnMount: true, }); const intl = useIntl(); const { user, hasPermission } = useUser(); useEffect(() => { if (onUpdating) { onUpdating(isUpdating); } }, [isUpdating, onUpdating]); const sendRequest = useCallback(async () => { setIsUpdating(true); const response = await axios.post('/api/v1/request', { mediaId: data?.id, mediaType: 'movie', }); if (response.data) { if (onComplete) { onComplete(response.data.media.status); } addToast( {data?.title} succesfully requested! , { appearance: 'success', autoDismiss: true } ); setIsUpdating(false); } }, [data, onComplete, addToast]); const activeRequest = data?.mediaInfo?.requests?.[0]; const cancelRequest = async () => { setIsUpdating(true); const response = await axios.delete( `/api/v1/request/${activeRequest?.id}` ); if (response.status === 204) { if (onComplete) { onComplete(MediaStatus.UNKNOWN); } addToast( {data?.title} request cancelled! , { appearance: 'success', autoDismiss: true } ); setIsUpdating(false); } }; const isOwner = activeRequest ? activeRequest.requestedBy.id === user?.id || hasPermission(Permission.MANAGE_REQUESTS) : false; const text = hasPermission(Permission.MANAGE_REQUESTS) ? intl.formatMessage(messages.requestadmin) : undefined; if (activeRequest?.status === MediaRequestStatus.PENDING) { return ( cancelRequest() : undefined} okDisabled={isUpdating} title={`Pending request for ${data?.title}`} okText={isUpdating ? 'Cancelling...' : 'Cancel Request'} okButtonType={'danger'} cancelText="Close" iconSvg={} {...props} > There is currently a pending request from{' '} {activeRequest.requestedBy.username}. ); } return ( } {...props} > {text} ); }; export default MovieRequestModal;