{"version":3,"sources":["src/js/product/productPage.js","src/js/product/product-reviews.js","src/js/api/reviews.js","src/js/util/ellipsis.js"],"names":["API","$","document","ready","log","length","then","_ref","carousel","productCarousel","console","productReviews","products","_ref2","productPage","default","_ref3","leasing","remaining","BASE_URL","$reviewsContainer","productId","data","mustacheTitle","html","mustacheReview","reviews","page","setRating","$star","persist","prevAll","add","addClass","nextAll","removeClass","rating","closest","next","text","concat","$box","find","addReviews","arguments","undefined","limit","Promise","resolve","get","Reviews","response","append","Mustache","render","$vote","addedIds","map","res","uuid","addedReviews","filter","review","item","eq","includes","total","count","each","i","el","after","hasClass","fullContent","content","substring","on","e","remove","this","Ellipsis","$el","reviewId","processVotes","localStorage","getItem","preventDefault","stopPropagation","ls","vote","action","getToken","token","post","setItem","Number","not","star","target","$container","currentTarget","parseInt","children","parseFloat","number"],"mappings":"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","file":"hashed/21.e7f7bd2a.chunk.js","sourcesContent":["'use strict';\n\nimport $ from 'jquery';\nimport productReviews from './product-reviews';\n\nexport default function(API) {\n\t$(document).ready(() => {\n\n\t\tAPI.log('INIT Product');\n\n\t\tif( $('.product-carousel').length ){\n\n\t\t\timport('./product-carousel').then(({ productCarousel: carousel }) => {\n\t\t\t\tcarousel('.product-carousel');\n\t\t\t\tconsole.log('IMPORT carousel');\n\t\t\t});\n\n\t\t}\n\n\t\tproductReviews();\n\n\t\t// Init product cards\n\t\tconst products = $('.v4-product-card');\n\n\t\timport('./product-page').then(({ default: productPage }) => {\n\t\t\tproductPage(products);\n\t\t\tconsole.log('IMPORT product page');\n\t\t});\n\n\t\tif ($('.form-leasing').length) {\n\t\t\timport('./leasing').then(({ default: leasing }) => {\n\t\t\t\tleasing();\n\t\t\t});\n\t\t}\n\n\t});\n}\n","'use strict';\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport * as Reviews from '../api/reviews';\nimport * as Ellipsis from '../util/ellipsis';\n\nconst $reviewsContainer = $('.js-reviews-container'),\n\tproductId = $reviewsContainer.data('product'),\n\tmustacheTitle = $('.js-review-title').html(),\n\tmustacheReview = $('.js-review-container').html(),\n\treviews = {},\n\treviewsInPage = 4;\n\nlet remaining;\nlet page = 1;\n\n/**\n * @param {jQuery} $star\n * @param {Boolean} persist\n */\nconst setRating = ($star, persist) => {\n\t$star.prevAll().add($star).addClass('fill');\n\t$star.nextAll().removeClass('fill');\n\tif (persist) {\n\t\tconst rating = $star.data('value');\n\t\tif (rating) {\n\t\t\t$star.closest('.product-review-stars')\n\t\t\t\t.data('rating', rating)\n\t\t\t\t.next('.product-review-rating')\n\t\t\t\t.text(`${rating} / 5`);\n\t\t}\n\t}\n}\n\nconst clearRating = $stars =>\n\t$stars.children().removeClass('fill').next('.product-review-rating').text('');\n\nexport default () => {\n\tconst $box = $('.product-review-box');\n\tconst $star = $box.find('.product-review-star');\n\n\t$star.on('mouseenter', (e) => {\n\t\tconst star = $(e.target);\n\t\tsetRating(star);\n\t});\n\n\t$star.on('click', (e) => {\n\t\tconst star = $(e.target);\n\t\tsetRating(star, true);\n\t});\n\n\t$box.find('.product-review-stars').on('mouseleave', (e) => {\n\t\tconst $container = $(e.currentTarget);\n\t\tconst {rating} = $container.data();\n\t\tif (parseInt(rating) === 0 || !rating) {\n\t\t\tclearRating($container);\n\t\t} else {\n\t\t\tconst $star = $container.find(`.product-review-star[data-value=\"${rating}\"]`);\n\t\t\tsetRating($star);\n\t\t}\n\t});\n\n\t// Product page reviews\n\tif ($reviewsContainer.length > 0) {\n\n\t\t$('.js-review-container').html('');\n\t\t$('.js-review-title').html('');\n\n\t\tReviews.getAverage(productId).then(response => {\n\t\t\treviews.total = response;\n\n\t\t\tif (response.count > 1 || response.count === 1 && parseFloat(response.number) > 2) { // Show only reviews if more than 1 or 1 over 2 given stars\n\t\t\t\t$('.js-review-title').html(Mustache.render(mustacheTitle, response));\n\n\t\t\t\taddReviews();\n\n\t\t\t\t// Load more button\n\t\t\t\t$reviewsContainer.find('.js-load-more').on('click', function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tpage++;\n\t\t\t\t\taddReviews();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n * Get reviews from stage using promise\n */\n\tfunction addReviews () {\n\t\tReviews.getReviews(productId, page, reviewsInPage).then(response => {\n\t\t\t$('.js-review-container').append(Mustache.render(mustacheReview, response));\n\n\t\t\tconst addedIds = response.map(res => res.uuid);\n\t\t\tconst addedReviews = $('.js-review-item').filter(review => {\n\t\t\t\tconst item = $('.js-review-item').eq(review);\n\t\t\t\tif (addedIds.includes(item.data('id'))) {\n\t\t\t\t\treturn item;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Load more count\n\t\t\tremaining = reviews.total.count - $reviewsContainer.find('.js-review-item').length;\n\t\t\tremaining > 0 ? $reviewsContainer.find('.js-load-more span').html(remaining) : $reviewsContainer.find('.js-load-more').addClass('hidden');\n\n\t\t\t$.each($reviewsContainer.find('.js-review-item'), function (i) {\n\t\t\t\tEllipsis.truncate($(this).find('.js-ellipsis'), 120, '...');\n\t\t\t});\n\n\t\t\tvoting(addedReviews);\n\t\t\t$reviewsContainer.removeClass('hidden');\n\t\t});\n\t}\n\n\t/**\n * Enable voting for review if there is comment or text review\n * @param {object} $vote HTML object of new review\n */\n\tfunction voting ($vote) {\n\t\tif ($vote.length > 0) {\n\t\t\t$.each($vote, function (i) {\n\t\t\t\tconst $el = $(this),\n\t\t\t\t\treviewId = $el.data('id');\n\n\t\t\t\tfunction processVotes () {\n\t\t\t\t\t$el.find('.button').removeClass('selected');\n\t\t\t\t\tif (localStorage.getItem(`intersport-review-${$el.data('id')}`) === 'upvote') {\n\t\t\t\t\t\t$el.find('.button[data-value=\"upvote\"]').addClass('selected');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (localStorage.getItem(`intersport-review-${$el.data('id')}`) === 'downvote') {\n\t\t\t\t\t\t$el.find('.button[data-value=\"downvote\"]').addClass('selected');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocessVotes();\n\n\t\t\t\t$el.find('.button').on('click', function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tif (!$(this).hasClass('selected')) {\n\t\t\t\t\t\tlet ls = localStorage.getItem(`intersport-review-${$el.data('id')}`);\n\t\t\t\t\t\tconst vote = $(this).data('value');\n\t\t\t\t\t\tconst action = (ls === 'upvote' && vote === 'downvote') ||(ls === 'downvote' && vote === 'upvote') ? 'change' : 'add';\n\t\t\t\t\t\tReviews.vote(reviewId, vote, action);\n\t\t\t\t\t\tlocalStorage.setItem(`intersport-review-${$el.data('id')}`, vote);\n\t\t\t\t\t\t$(this).find('.count').text(Number($(this).find('.count').text()) + 1);\n\t\t\t\t\t\tif (action === 'change') {\n\t\t\t\t\t\t\t$el.find('.button').not($(this)).find('.count').text(Number($el.find('.button').not($(this)).find('.count').text()) - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessVotes();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n}\n","'use strict';\nimport Promise from 'bluebird';\nimport $ from 'jquery';\nimport getToken from './token';\n\nconst BASE_URL = '/fi/api/v1/reviews/';\n\nexport const getReviews = (productId, page = 1, limit = 4) => {\n\treturn Promise.resolve($.get(`${BASE_URL}?productId=${productId}&page=${page}&limit=${limit}`));\n}\n\nexport const getAverage = (productId) => {\n\treturn Promise.resolve($.get(`${BASE_URL}?productId=${productId}&average=true`));\n}\n\nexport const vote = (reviewId, vote, action) => {\n\tgetToken().then(token => Promise.resolve($.post(`${BASE_URL}vote/${reviewId}/${vote}`, { token, action })));\n}","'use strict';\nimport $ from 'jquery';\n\n/**\n * Ellipsis truncate\n * @param {object} el html element\n * @param {integer} limit character count\n * @param {string} after string to show after truncate (usually '...')\n */\nexport const truncate = (el, limit, after) => {\n\tif (!el || !limit || el.hasClass('ellipsed')) return;\n\n\tel = $(el);\n\tconst fullContent = el.html();\n\tlet content = el.text().substring(0, limit);\n\n\tif (content.length > 0) {\n\t\tif (el.text().length > limit) {\n\t\t\tcontent = after ? content + after : content;\n\t\t\tel.html('