methods/img.js

import _config from './../lib/config'

/**
 * @method
 * @memberof ecomUtils
 * @name img
 * @description Returns img object (with url and alt) from product body or pictures list.
 * @param {object|array} product - Product body object or list of picture objects
 * @param {string} [pictureId] - ObjectID of preferred picture to find in the list
 * @param {string} [size=$ecomConfig.get('default_img_size')] - Preferred image size
 * (generally `normal`) to find on picture object
 * @returns {object|undefined}
 *
 * @example
 * const product = { 'pictures': [ { 'small': { 'url': 'https://ecom.com/imgs/100px/64gb.jpg'}, 'big': { 'url': 'https://ecom.com/imgs/700px/64gb.jpg' }, '_id': '694890155127368133600000' }, { 'small': { 'url': 'https://ecom.com/imgs/100px/e-5-64gb.jpg' }, 'big': { 'url': 'https://ecom.com/imgs/700px/e-5-64gb.jpg' }, '_id': '694890155127368133600001' }, { 'small': { 'url': 'https://ecom.com/imgs/100px/5-64gb.jpg' }, 'big': { 'url': 'https://ecom.com/imgs/700px/5-64gb.jpg' }, '_id': '694890155127368133600002' } ], 'name': 'Smartphone Xiaomi' }
 * const id = '694890155127368133600001'
 * const size = 'big'
 * ecomUtils.img(product, id, size)
 * // => {url: 'https://ecom.com/imgs/700px/e-5-64gb.jpg'}
 */
const img = (product, pictureId, size) => {
  if (!size) {
    size = _config.get('default_img_size') || 'normal'
  }
  if (product) {
    // product object has 'pictures'
    // cart item object has 'picture'
    let { pictures, picture } = product
    if (!picture) {
      if (!pictures) {
        if (Array.isArray(product)) {
          // received list of pictures ?
          pictures = product
        } else {
          // received picture object ?
          picture = product
        }
      }
    }
    if (Array.isArray(pictures)) {
      // select one img object from product pictures
      picture = (pictureId && pictures.filter(pic => pic._id === pictureId)[0]) || pictures[0]
    }

    let img
    if (typeof picture === 'object' && picture !== null) {
      img = picture[size]
      if (!img) {
        // try predefined any size
        let sizes
        switch (size) {
          case 'small':
            sizes = ['normal', 'big']
            break
          case 'normal':
            sizes = ['big', 'zoom', 'small']
            break
          case 'big':
            sizes = ['zoom', 'normal']
            break
          case 'zoom':
            sizes = ['big']
            break
          default:
            sizes = ['big', 'zoom', 'normal', 'small']
        }
        for (let i = 0; i < sizes.length; i++) {
          const size = sizes[i]
          if (picture[size]) {
            return picture[size]
          }
        }
        // last try with custom sizes
        for (const size in picture) {
          if (picture[size] && picture[size].url) {
            return picture[size]
          }
        }
      }
    }
    return img
  }
  return undefined
}

export default img