mirror of
https://github.com/vercel/commerce.git
synced 2025-07-03 19:51:22 +00:00
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
// 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
|