UNPKG

6.84 kBSource Map (JSON)View Raw
1{"version":3,"file":"useImageExists.js","sources":["../src/lib/cached-map.js","../src/hooks/useImageExists.js"],"sourcesContent":["const A_DAY = 1000 * 60 * 60 * 24\n\nfunction cachedMap({ expireAfter = A_DAY, size = 100 } = {}) {\n const cache = new Map()\n\n // Delete the first (oldest) entry if we are above `size`. `cache.size`\n // should never be greater than `size + 1`, so no need for a loop here.\n function trim() {\n if (cache.size > size) {\n cache.delete(cache.keys().next().value)\n }\n }\n\n // We are using delete() then set() to reset the position everytime the\n // access is refreshed. That way, the oldest entry is always at the first\n // position and we don’t need to iterate over the entire cache to find it.\n function update(key, value, lastAccess) {\n cache.delete(key)\n cache.set(key, { value, lastAccess })\n trim()\n }\n\n function get(key) {\n const now = new Date()\n\n const cachedEntry = cache.get(key)\n\n if (!cachedEntry) {\n return null\n }\n\n // Expired: delete the entry\n if (now - cachedEntry.lastAccess > expireAfter) {\n cache.delete(key)\n return null\n }\n\n update(key, cachedEntry.value, now)\n\n return cachedEntry.value\n }\n\n function set(key, value) {\n update(key, value, new Date())\n }\n\n return {\n clear: () => cache.clear(),\n delete: key => cache.delete(key),\n get,\n set,\n }\n}\n\nexport default cachedMap\n","import { useEffect, useMemo, useState } from 'react'\nimport cachedMap from '../lib/cached-map'\n\nconst srcCache = cachedMap()\n\n// Check if a remote image exists and can be loaded within a specific amount of time.\nexport function useImageExists(src, timeUntilFallback = 50) {\n const [exists, setExists] = useState(false)\n const [loading, setLoading] = useState(true)\n const [displayFallback, setDisplayFallback] = useState(false)\n\n useEffect(() => {\n let image = new Image()\n const fallbackTimer = setTimeout(\n () => setDisplayFallback(true),\n timeUntilFallback\n )\n\n const init = () => {\n if (!src) {\n setExists(false)\n setLoading(false)\n return\n }\n\n if (srcCache.get(src)) {\n success()\n return\n }\n\n setExists(false)\n setLoading(true)\n\n // TODO: ensure only one image is loading at a time for a given src.\n image.addEventListener('load', success)\n image.src = src\n }\n\n const success = () => {\n setLoading(false)\n setExists(true)\n srcCache.set(src, true)\n done()\n }\n\n const done = () => {\n clearTimeout(fallbackTimer)\n if (image) {\n image.removeEventListener('load', success)\n image = null\n }\n }\n\n init()\n\n return done\n }, [src, timeUntilFallback])\n\n return useMemo(() => {\n return { src, displayFallback, exists, loading }\n }, [src, displayFallback, exists, loading])\n}\n\n// render prop\nexport const ImageExists = ({ timeUntilFallback, src, children }) =>\n children(useImageExists(src, timeUntilFallback))\n"],"names":["A_DAY","cachedMap","expireAfter","size","cache","Map","trim","delete","keys","next","value","update","key","lastAccess","set","get","now","Date","cachedEntry","clear","srcCache","useImageExists","src","timeUntilFallback","useState","exists","setExists","loading","setLoading","displayFallback","setDisplayFallback","useEffect","image","Image","fallbackTimer","setTimeout","init","success","addEventListener","done","clearTimeout","removeEventListener","useMemo","ImageExists","children"],"mappings":"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"}
\No newline at end of file