1import { ImageSource } from '../Image.types'; 2 3type ImageHashType = 'blurhash' | 'thumbhash'; 4 5function hashToUri(type: ImageHashType, hash: string): string { 6 const encodedBlurhash = encodeURI(hash).replace(/#/g, '%23').replace(/\?/g, '%3F'); 7 return `${type}:/${encodedBlurhash}`; 8} 9 10/** 11 * Converts a blurhash string (`blurhash:/<hash>/<width>/<height>` or <hash>/<width>/<height>) into an `ImageSource`. 12 * 13 * @return An ImageSource representing the provided blurhash. 14 * */ 15export function resolveBlurhashString(str: string): ImageSource { 16 const [blurhash, width, height] = str.replace(/^blurhash:\//, '').split('/'); 17 return { 18 uri: hashToUri('blurhash', blurhash), 19 width: parseInt(width, 10) || 16, 20 height: parseInt(height, 10) || 16, 21 }; 22} 23 24/** 25 * Converts a thumbhash string (`thumbhash:/<hash>` or `<hash>`) into an `ImageSource`. 26 * 27 * @return An ImageSource representing the provided thumbhash. 28 * */ 29export function resolveThumbhashString(str: string): ImageSource { 30 // ThumbHash may contain slashes that could break the url when the slash is at the beginning. 31 // We replace slashes with backslashes to make sure we don't break the url's path. 32 const thumbhash = str.replace(/^thumbhash:\//, '').replace(/\//g, '\\'); 33 return { 34 uri: hashToUri('thumbhash', thumbhash), 35 }; 36} 37