import { useEffect, useMemo, useState } from 'react' import Button from '@material-ui/core/Button' import Dialog from '@material-ui/core/Dialog' import { torrentsHost, torrentUploadHost } from 'utils/Hosts' import axios from 'axios' import { useTranslation } from 'react-i18next' import debounce from 'lodash/debounce' import useChangeLanguage from 'utils/useChangeLanguage' import { useMediaQuery } from '@material-ui/core' import CircularProgress from '@material-ui/core/CircularProgress' import usePreviousState from 'utils/usePreviousState' import { checkImageURL, getMoviePosters, chechTorrentSource, parseTorrentTitle } from './helpers' import { ButtonWrapper, Content, Header } from './style' import RightSideComponent from './RightSideComponent' import LeftSideComponent from './LeftSideComponent' export default function AddDialog({ handleClose, hash: originalHash, title: originalTitle, name: originalName, poster: originalPoster, }) { const { t } = useTranslation() const [torrentSource, setTorrentSource] = useState(originalHash || '') const [title, setTitle] = useState(originalTitle || '') const [posterUrl, setPosterUrl] = useState(originalPoster || '') const [isPosterUrlCorrect, setIsPosterUrlCorrect] = useState(false) const [isTorrentSourceCorrect, setIsTorrentSourceCorrect] = useState(false) const [posterList, setPosterList] = useState() const [isUserInteractedWithPoster, setIsUserInteractedWithPoster] = useState(false) const [currentLang] = useChangeLanguage() const [selectedFile, setSelectedFile] = useState() const [posterSearchLanguage, setPosterSearchLanguage] = useState(currentLang === 'ru' ? 'ru' : 'en') const [isLoadingButton, setIsLoadingButton] = useState(false) const [skipDebounce, setSkipDebounce] = useState(false) const [isEditMode, setIsEditMode] = useState(false) const fullScreen = useMediaQuery('@media (max-width:930px)') useEffect(() => { if (originalHash) { setIsEditMode(true) checkImageURL(posterUrl).then(correctImage => { correctImage ? setIsPosterUrlCorrect(true) : removePoster() }) } // This is needed only on mount // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const posterSearch = useMemo( () => (movieName, language, { shouldRefreshMainPoster = false } = {}) => { if (!movieName) { setPosterList() removePoster() return } getMoviePosters(movieName, language).then(urlList => { if (urlList) { setPosterList(urlList) if (!shouldRefreshMainPoster && isUserInteractedWithPoster) return const [firstPoster] = urlList checkImageURL(firstPoster).then(correctImage => { if (correctImage) { setIsPosterUrlCorrect(true) setPosterUrl(firstPoster) } else removePoster() }) } else { setPosterList() if (isUserInteractedWithPoster) return removePoster() } }) }, [isUserInteractedWithPoster], ) const delayedPosterSearch = useMemo(() => debounce(posterSearch, 700), [posterSearch]) const prevTitleState = usePreviousState(title) const prevTorrentSourceState = usePreviousState(torrentSource) useEffect(() => { // if torrentSource is updated then we are checking that source is valid and getting title from the source const torrentSourceChanged = torrentSource !== prevTorrentSourceState const isCorrectSource = chechTorrentSource(torrentSource) if (!isCorrectSource) return setIsTorrentSourceCorrect(false) setIsTorrentSourceCorrect(true) if (torrentSourceChanged) { parseTorrentTitle(selectedFile || torrentSource, newTitle => { if (!newTitle) return setSkipDebounce(true) setTitle(newTitle) }) } }, [prevTorrentSourceState, selectedFile, torrentSource]) useEffect(() => { // if title exists and title was changed then search poster. const titleChanged = title !== prevTitleState if (!titleChanged) return if (skipDebounce) { posterSearch(title, posterSearchLanguage) setSkipDebounce(false) } else { title === '' ? removePoster() : delayedPosterSearch(title, posterSearchLanguage) } }, [title, prevTitleState, delayedPosterSearch, posterSearch, posterSearchLanguage, skipDebounce]) const removePoster = () => { setIsPosterUrlCorrect(false) setPosterUrl('') } useEffect(() => { if (!selectedFile && !torrentSource) { setTitle('') setPosterList() removePoster() setIsUserInteractedWithPoster(false) } }, [selectedFile, torrentSource]) const handleSave = () => { setIsLoadingButton(true) if (isEditMode) { axios .post(torrentsHost(), { action: 'set', hash: originalHash, title: title === '' ? originalName : title, poster: posterUrl, }) .finally(handleClose) } else if (selectedFile) { // file save const data = new FormData() data.append('save', 'true') data.append('file', selectedFile) title && data.append('title', title) posterUrl && data.append('poster', posterUrl) axios.post(torrentUploadHost(), data).finally(handleClose) } else { // link save axios .post(torrentsHost(), { action: 'add', link: torrentSource, title, poster: posterUrl, save_to_db: true }) .finally(handleClose) } } return (
{t(isEditMode ? 'EditTorrent' : 'AddNewTorrent')}
{!isEditMode && ( )}
) }