From c5d45c1bac03799421ab4ad696d7456530e2584d Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 27 Jul 2021 09:45:24 +0100 Subject: [PATCH] Merge pull request #4337 from overleaf/msm-fix-binary-file-multiple-request Fix for Binary file view repeatedly requesting content GitOrigin-RevId: af41539ccb92c609bc5f61f49ff09370c10481f6 --- .../file-view/components/file-view-text.js | 33 ++++++++++--------- .../file-view/components/file-view.js | 22 +++++-------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/services/web/frontend/js/features/file-view/components/file-view-text.js b/services/web/frontend/js/features/file-view/components/file-view-text.js index 92a475627a..022c6f4591 100644 --- a/services/web/frontend/js/features/file-view/components/file-view-text.js +++ b/services/web/frontend/js/features/file-view/components/file-view-text.js @@ -11,8 +11,12 @@ export default function FileViewText({ file, onLoad, onError }) { const [textPreview, setTextPreview] = useState('') const [shouldShowDots, setShouldShowDots] = useState(false) + const [inFlight, setInFlight] = useState(false) useEffect(() => { + if (inFlight) { + return + } let path = `/project/${projectId}/file/${file.id}` fetch(path, { method: 'HEAD' }) .then(response => { @@ -30,27 +34,26 @@ export default function FileViewText({ file, onLoad, onError }) { if (maxSize != null) { path += `?range=0-${maxSize}` } - fetch(path) - .then(response => { - response.text().then(text => { - if (truncated) { - text = text.replace(/\n.*$/, '') - } + return fetch(path).then(response => { + return response.text().then(text => { + if (truncated) { + text = text.replace(/\n.*$/, '') + } - setTextPreview(text) - onLoad() - setShouldShowDots(truncated) - }) - }) - .catch(err => { - onError() - console.error(err) + setTextPreview(text) + onLoad() + setShouldShowDots(truncated) }) + }) }) .catch(err => { + console.error(err) onError() }) - }, [projectId, file.id, onError, onLoad]) + .finally(() => { + setInFlight(false) + }) + }, [projectId, file.id, onError, onLoad, inFlight]) return (
{textPreview && ( diff --git a/services/web/frontend/js/features/file-view/components/file-view.js b/services/web/frontend/js/features/file-view/components/file-view.js index 13b678efa3..6e222929f6 100644 --- a/services/web/frontend/js/features/file-view/components/file-view.js +++ b/services/web/frontend/js/features/file-view/components/file-view.js @@ -1,4 +1,4 @@ -import { useState } from 'react' +import { useState, useCallback } from 'react' import PropTypes from 'prop-types' import { useTranslation } from 'react-i18next' @@ -21,18 +21,16 @@ export default function FileView({ file, storeReferencesKeys }) { const isUnpreviewableFile = !imageExtensions.includes(extension) && !textExtensions.includes(extension) - function handleLoading() { - if (contentLoading) { - setContentLoading(false) - } - } + const handleLoad = useCallback(() => { + setContentLoading(false) + }, []) - function handleError() { + const handleError = useCallback(() => { if (!hasError) { setContentLoading(false) setHasError(true) } - } + }, [hasError]) const content = ( <> @@ -41,16 +39,12 @@ export default function FileView({ file, storeReferencesKeys }) { )} {textExtensions.includes(extension) && ( - + )} )