Fix images from media domain not loaded if imgproxyOnly enabled (#1153)
This commit is contained in:
		
							parent
							
								
									f0403a2bbe
								
							
						
					
					
						commit
						902875bd55
					
				@ -1,6 +1,6 @@
 | 
			
		||||
import styles from './text.module.css'
 | 
			
		||||
import { Fragment, useState, useEffect, useMemo, useCallback, forwardRef, useRef, memo } from 'react'
 | 
			
		||||
import { IMGPROXY_URL_REGEXP } from '@/lib/url'
 | 
			
		||||
import { IMGPROXY_URL_REGEXP, MEDIA_DOMAIN_REGEXP } from '@/lib/url'
 | 
			
		||||
import { useShowModal } from './modal'
 | 
			
		||||
import { useMe } from './me'
 | 
			
		||||
import { Dropdown } from 'react-bootstrap'
 | 
			
		||||
@ -63,7 +63,7 @@ function ImageOriginal ({ src, topLevel, rel, tab, children, onClick, ...props }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ImageProxy ({ src, srcSet: { dimensions, ...srcSetObj } = {}, onClick, topLevel, onError, ...props }) {
 | 
			
		||||
function TrustedImage ({ src, srcSet: { dimensions, ...srcSetObj } = {}, onClick, topLevel, onError, ...props }) {
 | 
			
		||||
  const srcSet = useMemo(() => {
 | 
			
		||||
    if (Object.keys(srcSetObj).length === 0) return undefined
 | 
			
		||||
    // srcSetObj shape: { [widthDescriptor]: <imgproxyUrl>, ... }
 | 
			
		||||
@ -132,7 +132,7 @@ export default function ZoomableImage ({ src, srcSet, ...props }) {
 | 
			
		||||
  const showModal = useShowModal()
 | 
			
		||||
 | 
			
		||||
  // if `srcSet` is falsy, it means the image was not processed by worker yet
 | 
			
		||||
  const [imgproxy, setImgproxy] = useState(!!srcSet || IMGPROXY_URL_REGEXP.test(src))
 | 
			
		||||
  const [trustedDomain, setTrustedDomain] = useState(!!srcSet || IMGPROXY_URL_REGEXP.test(src) || MEDIA_DOMAIN_REGEXP.test(src))
 | 
			
		||||
 | 
			
		||||
  // backwards compatibility:
 | 
			
		||||
  // src may already be imgproxy url since we used to replace image urls with imgproxy urls
 | 
			
		||||
@ -158,13 +158,13 @@ export default function ZoomableImage ({ src, srcSet, ...props }) {
 | 
			
		||||
      </Dropdown.Item>)
 | 
			
		||||
  }), [showModal, originalUrl, styles])
 | 
			
		||||
 | 
			
		||||
  const handleError = useCallback(() => setImgproxy(false), [setImgproxy])
 | 
			
		||||
  const handleError = useCallback(() => setTrustedDomain(false), [setTrustedDomain])
 | 
			
		||||
 | 
			
		||||
  if (!src) return null
 | 
			
		||||
 | 
			
		||||
  if (imgproxy) {
 | 
			
		||||
  if (trustedDomain) {
 | 
			
		||||
    return (
 | 
			
		||||
      <ImageProxy
 | 
			
		||||
      <TrustedImage
 | 
			
		||||
        src={src} srcSet={srcSet}
 | 
			
		||||
        onClick={handleClick} onError={handleError} {...props}
 | 
			
		||||
      />
 | 
			
		||||
 | 
			
		||||
@ -89,5 +89,7 @@ export const URL_REGEXP = /^((https?|ftp):\/\/)?(www.)?(((([a-z]|\d|-|\.|_|~|[\u
 | 
			
		||||
export const WS_REGEXP = /^(wss?:\/\/)([0-9]{1,3}(?:\.[0-9]{1,3}){3}|(?=[^\/]{1,254}(?![^\/]))(?:(?=[a-zA-Z0-9-]{1,63}\.)(?:xn--+)?[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,63})(:([0-9]{1,5}))?(\/[^\s`@#$^&=.?"{}\\]+\/?)*([^\s`@#$^&=?"{}\/\\]+)?(\?[^\s`#$^"{}\\]+)*$/
 | 
			
		||||
 | 
			
		||||
export const IMGPROXY_URL_REGEXP = new RegExp(`^${process.env.NEXT_PUBLIC_IMGPROXY_URL}.*$`)
 | 
			
		||||
export const MEDIA_DOMAIN_REGEXP = new RegExp(`^https?://${process.env.NEXT_PUBLIC_MEDIA_DOMAIN}/.*$`)
 | 
			
		||||
 | 
			
		||||
// this regex is not a bullet proof way of checking if a url points to an image. to be sure, fetch the url and check the mimetype
 | 
			
		||||
export const IMG_URL_REGEXP = /^(https?:\/\/.*\.(?:png|jpg|jpeg|gif))$/
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user