diff --git a/.env.development b/.env.development index b10d4499..1043c226 100644 --- a/.env.development +++ b/.env.development @@ -78,6 +78,7 @@ IMGPROXY_MAX_ANIMATION_FRAME_RESOLUTION=200 IMGPROXY_READ_TIMEOUT=10 IMGPROXY_WRITE_TIMEOUT=10 IMGPROXY_DOWNLOAD_TIMEOUT=9 +IMGPROXY_ENABLE_VIDEO_THUMBNAILS=1 # IMGPROXY_DEVELOPMENT_ERRORS_MODE=1 # IMGPROXY_ENABLE_DEBUG_HEADERS=true diff --git a/components/avatar.js b/components/avatar.js index b000af81..f3ad47ad 100644 --- a/components/avatar.js +++ b/components/avatar.js @@ -5,7 +5,7 @@ import BootstrapForm from 'react-bootstrap/Form' import EditImage from '@/svgs/image-edit-fill.svg' import Moon from '@/svgs/moon-fill.svg' import { useShowModal } from './modal' -import { ImageUpload } from './image' +import { ImageUpload } from './image-upload' export default function Avatar ({ onSuccess }) { const [uploading, setUploading] = useState() diff --git a/components/form.js b/components/form.js index 026e868f..f0b76cd3 100644 --- a/components/form.js +++ b/components/form.js @@ -23,7 +23,7 @@ import textAreaCaret from 'textarea-caret' import ReactDatePicker from 'react-datepicker' import 'react-datepicker/dist/react-datepicker.css' import useDebounceCallback, { debounce } from './use-debounce-callback' -import { ImageUpload } from './image' +import { ImageUpload } from './image-upload' import { AWS_S3_URL_REGEXP } from '@/lib/constants' import { whenRange } from '@/lib/time' import { useFeeButton } from './fee-button' diff --git a/components/image.js b/components/image-upload.js similarity index 55% rename from components/image.js rename to components/image-upload.js index 493f70c5..a2bf1679 100644 --- a/components/image.js +++ b/components/image-upload.js @@ -1,197 +1,10 @@ -import styles from './text.module.css' -import { Fragment, useState, useEffect, useMemo, useCallback, forwardRef, useRef, memo } from 'react' -import { IMGPROXY_URL_REGEXP, MEDIA_DOMAIN_REGEXP } from '@/lib/url' -import { useShowModal } from './modal' -import { useMe } from './me' -import { Dropdown } from 'react-bootstrap' -import { UNKNOWN_LINK_REL, UPLOAD_TYPES_ALLOW, MEDIA_URL } from '@/lib/constants' +import { Fragment, useCallback, forwardRef, useRef } from 'react' +import { UPLOAD_TYPES_ALLOW, MEDIA_URL } from '@/lib/constants' import { useToast } from './toast' import gql from 'graphql-tag' import { useMutation } from '@apollo/client' import piexif from 'piexifjs' -export function decodeOriginalUrl (imgproxyUrl) { - const parts = imgproxyUrl.split('/') - // base64url is not a known encoding in browsers - // so we need to replace the invalid chars - const b64Url = parts[parts.length - 1].replace(/-/g, '+').replace(/_/, '/') - const originalUrl = Buffer.from(b64Url, 'base64').toString('utf-8') - return originalUrl -} - -function LinkRaw ({ href, children, src, rel, onClick, ...props }) { - const isRawURL = /^https?:\/\//.test(children?.[0]) - return ( - // eslint-disable-next-line - {isRawURL || !children ? src : children} - - ) -} - -function ImageOriginal ({ src, topLevel, tab, onClick, ...props }) { - const me = useMe() - const [showImage, setShowImage] = useState(false) - const [showVideo, setShowVideo] = useState(false) - - useEffect(() => { - // make sure it's not a false negative by trying to load URL as - const img = new window.Image() - img.onload = () => setShowImage(true) - img.src = src - const video = document.createElement('video') - video.onloadeddata = () => setShowVideo(true) - video.src = src - - return () => { - img.onload = null - img.src = '' - video.onloadeddata = null - video.src = '' - } - }, [src, showImage]) - - const showMedia = (tab === 'preview' || (me?.privates?.showImagesAndVideos !== false && !me?.privates?.imgproxyOnly)) - - if (showImage && showMedia) { - return ( - onClick(src)} - onError={() => setShowImage(false)} - /> - ) - } else if (showVideo && showMedia) { - return