// Based on https://github.com/spark-solutions/spree2vuestorefront/blob/d88d85ae1bcd2ec99b13b81cd2e3c25600a0216e/src/utils/index.ts import type { ImageStyle, SpreeProductImage } from '../types' const getImageUrl = ( image: SpreeProductImage, minWidth: number, _: number ): string | null => { // every image is still resized in vue-storefront-api, no matter what getImageUrl returns if (image) { const { attributes: { styles }, } = image const bestStyleIndex = styles.reduce( (bSIndex: number | null, style: ImageStyle, styleIndex: number) => { // assuming all images are the same dimensions, just scaled if (bSIndex === null) { return 0 } const bestStyle = styles[bSIndex] const widthDiff = +bestStyle.width - minWidth const minWidthDiff = +style.width - minWidth if (widthDiff < 0 && minWidthDiff > 0) { return styleIndex } if (widthDiff > 0 && minWidthDiff < 0) { return bSIndex } return Math.abs(widthDiff) < Math.abs(minWidthDiff) ? bSIndex : styleIndex }, null ) if (bestStyleIndex !== null) { return styles[bestStyleIndex].url } } return null } export default getImageUrl