import variables from 'config/variables'; import { useState, memo } from 'react'; import Favourite from './Favourite'; import { MdInfo, MdLocationOn, MdPhotoCamera, MdCrop as Resolution, MdGetApp as Download, MdVisibility as Views, MdIosShare as Share, MdSource as Source, MdFavorite as MdFavourite, MdCategory as Category, MdVisibilityOff as VisibilityOff, } from 'react-icons/md'; import { Tooltip } from 'components/Elements'; import Modal from 'react-modal'; import { ShareModal } from 'components/Elements'; import ExcludeModal from './ExcludeModal'; /** * It takes a URL, fetches the resource, and returns a URL to the resource. * @param {string} url The URL to fetch. * @returns A promise that resolves to a blob URL. */ const toDataURL = async (url) => { const res = await fetch(url); return URL.createObjectURL(await res.blob()); }; /** * It takes a string, makes it lowercase, removes commas, and replaces spaces with dashes. * @param {string} text The string to format. * @returns A function that takes a string and returns a string. */ const formatText = (text) => { return text.toLowerCase().replaceAll(',', '').replaceAll(' ', '-'); }; /** * It downloads an image from a URL and saves it to the user's computer. * @param {object} info The photo information. */ const downloadImage = async (info) => { const link = document.createElement('a'); link.href = await toDataURL(info.url); link.download = `mue-${formatText(info.credit)}-${formatText(info.location)}.jpg`; // image is more likely to be webp or avif btw document.body.appendChild(link); link.click(); document.body.removeChild(link); variables.stats.postEvent('feature', 'Background download'); }; function PhotoInformation({ info, url, api }) { const [width, setWidth] = useState(0); const [height, setHeight] = useState(0); const [usePhotoMap, setPhotoMap] = useState(false); const [useMapIcon, setMapIcon] = useState(true); const [showExtraInfo, setshowExtraInfo] = useState(false); //const [showOld, setShowOld] = useState(true); const [other, setOther] = useState(false); const [shareModal, openShareModal] = useState(false); const [excludeModal, openExcludeModal] = useState(false); const [favouriteTooltipText, setFavouriteTooltipText] = useState( variables.getMessage('widgets.quote.favourite'), ); if (info.hidden === true || !info.credit) { return null; } let credit = info.credit; let photo = variables.getMessage('widgets.background.credit'); // unsplash credit if (info.photographerURL && info.photographerURL !== '' && !info.offline && api) { photo = ( {photo} ); credit = ( <> {info.credit} > ); } // get resolution const img = new Image(); img.onload = (event) => { setWidth(event.target.width); setHeight(event.target.height); }; img.src = url; // info is still there because we want the favourite button to work if (localStorage.getItem('photoInformation') === 'false') { return (