{"version":3,"file":"diContainer.7079882eaf5a1d8ef432.bundle.js","mappings":"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","sources":["webpack://elc-service-ratings-reviews/./src/internal/constants/PowerReviews.ts","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/ViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/ComputeRoundedValueFor.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingSelectedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/ProductReview.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingsLoadedUseCase.tsx","webpack://elc-service-ratings-reviews/./src/internal/controllers/ProductRatingViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/GenerateRandomIntegerUpTo.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/NoValue.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/ServiceReviews.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/RatingsReviewsBaseController.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/ProductReviewsViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/UsableValues.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewProduct.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewDetails.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/ReviewDetailsViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/ConfigRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/InventoryStatuses.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/PowerReviewsProduct.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/ProductRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/Config.ts","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/Api.ts","webpack://elc-service-ratings-reviews/./src/api/RatingsAndReviewsApiSdk.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/PowerReviewsInitializedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/ReadReviewsClickedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/WriteReviewClickedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/ProductFullLoadedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/UpdateReviewConfigUseCase.ts","webpack://elc-service-ratings-reviews/./src/service-setup/ServiceBusController.ts","webpack://elc-service-ratings-reviews/./src/service-setup/ConfigStore.tsx","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewSnippet.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/Review.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/RatingsRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingsReviewsServiceStartedUseCase.ts","webpack://elc-service-ratings-reviews/./src/service-setup/diContainer.tsx","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/decorators/Decorators.ts"],"sourcesContent":["export const PRODUCT_REVIEWS_CLASS = 'js-reviews-wrapper';\nexport const ENTER_KEY = 'Enter';\nexport const ENTER_KEY_CODE = 'NumpadEnter';\nexport const REVIEW_DISPLAY = 'pr-review-display';\nexport const REVIEW_SNIPPET = 'pr-review-snippet';\nexport const QUESTION_DISPLAY = 'pr-questiondisplay';\nexport const SNAPSHOT_TYPE = 'SIMPLE';\nexport const enum PAGINATION_TYPE {\n DEFAULT = 'DEFAULT',\n VERTICAL = 'VERTICAL'\n}\nexport const REVIEW_COMPONENTS = {\n ReviewDisplay: REVIEW_DISPLAY,\n ReviewSnippet: REVIEW_SNIPPET\n};\nexport const AVERAGE_RATING = 'averageRating';\nexport const POWER_REVIEWS_SCRIPT = '//ui.powerreviews.com/stable/4.1/ui.js';\nexport const POWER_REVIEWS_API_LINK = 'https://readservices-b2c.powerreviews.com';\nexport const TOTAL_NUMBER_OF_STARS = 5;\nexport const HELPFUL_YES_CLASS = 'pr-helpful-yes';\nexport const HELPFUL_NO_CLASS = 'pr-helpful-no';\nexport const FLAG_REVIEW_CLASS = 'pr-rd-flag-review-container';\nexport const SORT_BY_ID = 'pr-rd-sort-by';\nexport const MULTI_SELECT_CLASS = 'pr-multiselect';\nexport const MULTI_SELECT_ITEM_CLASS = 'pr-multiselect-item';\nexport const MULTI_SELECT_BUTTON_LABEL_CLASS = 'pr-multiselect-button-label';\nexport const REVIEWS_SEARCH_CLASS = 'pr-rd-search-reviews-input';\nexport const REVIEWS_SEARCH_BUTTON_CLASS = 'pr-rd-search-reviews-icon-button';\nexport const ASK_AND_ANSWER_BUTTON_ID = 'pr-question-form-link';\nexport const ASK_AND_ANSWER_FORM_ID = 'pr-question-form-content';\nexport const ASK_AND_ANSWER_SEARCH_CLASS = 'pr-qa-display-searchbar';\nexport const ASK_AND_ANSWER_SEARCH_BUTTON_CLASS = 'pr-qa-search-btn';\nexport const ASK_AND_ANSWER_SORT_BY_ID = 'pr-qa-sort-by';\nexport const ASK_AND_ANSWER_SHOW_MORE_CLASS = 'pr-qa-display-show-more-questions';\nexport const DEFAULT_AVERAGE_RATING = 0;\nexport const DEFAULT_REVIEW_COUNT = 0;\nexport const DEFAULT_ANSWERED_QUESTIONS = 0;\nexport const DEFAULT_REVIEW_TITLE = 'Reviews';\nexport const REVIEW_SNAPSHOT_ID = 'pr-review-snapshot';\nexport const REVIEWS_RATING_CLASS = 'pr-histogram-stars';\nexport const REVIEWS_PAGINATION_NEXT_BUTTON = 'pr-rd-pagination-btn--next';\nexport const REVIEWS_PAGINATION_PREV_BUTTON = 'pr-rd-pagination-btn--prev';\nexport const REVIEWS_ACTIVE_RATING_FILTER_SELECTOR = '[class*=pr-hist-filter]';\nexport enum ReviewPaginationOption {\n NEXT = 'next',\n PREVIOUS = 'previous'\n}\n\nexport enum ReviewClickEventSelectors {\n WRITE_REVIEW = '.pr-snippet-write-review-link',\n REVIEW_HELPFUL_YES = '#pr-review-display .pr-helpful-yes',\n REVIEW_HELPFUL_NO = '#pr-review-display .pr-helpful-no',\n FLAG_REVIEW = '.pr-rd-flag-review-container',\n MULTI_SELECT = '.pr-multiselect-item',\n REVIEW_SEARCH = '.pr-rd-search-reviews-icon-button',\n ASK_AND_ANSWER_BUTTON = '#pr-question-form-link',\n ASK_AND_ANSWER_SEARCH = '.pr-qa-search-btn',\n ASK_AND_ANSWER_HELPFUL_YES = '#pr-questiondisplay .pr-helpful-yes',\n ASK_AND_ANSWER_HELPFUL_NO = '#pr-questiondisplay .pr-helpful-no',\n ASK_AND_ANSWER_SHOW_MORE = '.pr-qa-display-show-more-questions',\n REVIEWS_RATING = '.pr-histogram-stars',\n REVIEWS_PAGINATION = '.pr-rd-pagination-btn'\n}\n","import { observable } from 'mobx';\nimport {\n IComponentViewController,\n IViewControllerData,\n ViewControllerLoadedMethod\n} from '@estee/elc-universal-utils';\n\nexport class ViewController implements IComponentViewController {\n public id?: string;\n public dataState?: IViewControllerData;\n public loaded?: ViewControllerLoadedMethod;\n public configMergeStrategy?: Function;\n @observable public isLoading: boolean = true;\n\n public setSSRState = (data?: IViewControllerData) => {\n this.dataState = data;\n };\n\n public setId = (id?: string) => {\n this.id = id && btoa(unescape(encodeURIComponent(id)));\n };\n\n public get data(): IViewControllerData {\n return {};\n }\n}\n","const DEFAULT_NUMBER_OF_DIGITS = 1;\n\nexport const computeRoundedValueFor = (\n number: number,\n numberOfDigits: number = DEFAULT_NUMBER_OF_DIGITS\n) => {\n const roundMultiplier = Math.pow(10, numberOfDigits);\n\n return Math.round(number * roundMultiplier) / roundMultiplier;\n};\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ProductRatingViewController } from '../controllers/ProductRatingViewController';\n\nexport class RatingSelectedUseCase {\n private selectedIndex: number;\n private productRatingViewController: ProductRatingViewController;\n\n constructor(selectedIndex: number) {\n this.selectedIndex = selectedIndex;\n this.productRatingViewController = diContainer.get(\n serviceNames.productRatingViewController\n );\n }\n\n public execute = () => {\n this.productRatingViewController.setRating(this.selectedIndex);\n };\n}\n","// tslint:disable-next-line:export-name\nexport const DEFAULT_NUMBER_OF_STARS = 5;\nexport const REVIEW_CATEGORY = 'product reviews / ask answer';\n","import { query, serviceQueries } from '@estee/elc-service-bus';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { observable } from 'mobx';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { IProduct } from '~interfaces/IRating';\n\nexport class RatingsLoadedUseCase {\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n\n constructor(productId: string) {\n this.productId = productId;\n this.productRepository = diContainer.get(serviceNames.productRepository);\n }\n\n public execute = async () => {\n // tslint:disable-next-line: await-promise\n const products = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: {\n productIds: [this.productId]\n }\n });\n\n this.productRepository.setProducts(products as IProduct[]);\n };\n}\n","import { ViewController } from '@estee/elc-service';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { observable, computed, action } from 'mobx';\nimport { AVERAGE_RATING } from '~constants/PowerReviews';\nimport { computeRoundedValueFor } from '~utils/ComputeRoundedValueFor';\nimport { IProduct } from '~interfaces/IRating';\nimport { RatingSelectedUseCase } from '../use-cases/RatingSelectedUseCase';\nimport { DEFAULT_NUMBER_OF_STARS, REVIEW_CATEGORY } from '../constants/ProductReview';\nimport { RatingsLoadedUseCase } from '../use-cases/RatingsLoadedUseCase';\nimport { ProductRepository } from '../repositories/ProductRepository';\nimport { NO_VALUE } from '../constants/NoValue';\nimport { RatingsRepository } from '../repositories/RatingsRepository';\nimport { Review } from '../domain/entities/Review';\nimport { ISocialProofReviewConfig } from '~exported/product-rating/ProductRating';\nimport { generateRandomIntegerUpTo } from '~utils/GenerateRandomIntegerUpTo';\n\nexport interface IProductRatingViewControllerInitializeProps {\n productId: string;\n numberOfStars: number;\n productRating?: number;\n reviewsNumber?: number;\n product: IProduct;\n socialProofReviews: ISocialProofReviewConfig;\n}\n\ninterface IProductRating {\n averageRating: number;\n reviewCount: number;\n}\n\nexport class ProductRatingViewController extends ViewController {\n @observable public selectedRatingIndex: number = -1;\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n @observable private numberOfStars: number = DEFAULT_NUMBER_OF_STARS;\n @observable public numberOfReviews: number;\n @observable private ratingsRepository: RatingsRepository;\n @observable private hasLoaded: boolean = false;\n @observable private productItem: IProduct;\n private defaultRating: IProductRating;\n @observable private reviews: Review[];\n @observable private socialProofReviewConfig: ISocialProofReviewConfig;\n\n constructor(productRepository: ProductRepository, ratingsRepository: RatingsRepository) {\n super();\n this.productRepository = productRepository;\n this.ratingsRepository = ratingsRepository;\n }\n\n @computed\n public get data() {\n return {\n selectedRatingIndex: this.selectedRatingIndex,\n percentageRating: this.percentageRating,\n onSelectRating: this.onSelectRating,\n onReadReviewsClick: this.onReadReviewsClick,\n onWriteReviewClick: this.onWriteReviewClick,\n numberOfReviews: this.rating?.reviewCount,\n averageRating: this.rating?.averageRating,\n loaded: this.hasLoaded,\n reviews: this.reviews,\n filteredSocialProofReview: this.filteredSocialProofReview\n };\n }\n\n @computed\n public get rating(): IProductRating {\n return (\n this.ratingsRepository.productRatings[this.productId] ||\n this.productLevelReviews ||\n this.defaultRating\n );\n }\n\n @computed\n public get product() {\n return this.productItem || this.productRepository.getProductById(this.productId);\n }\n\n @action\n public loaded = async (props: IProductRatingViewControllerInitializeProps) => {\n this.isLoading = true;\n\n this.defaultRating = {\n reviewCount: props.reviewsNumber || 0,\n averageRating: computeRoundedValueFor(props.productRating || 0)\n };\n\n this.productItem = props.product || null;\n\n const { numberOfStars, productId } = props;\n this.numberOfStars = numberOfStars;\n this.productId = productId;\n\n if (!props.product) {\n const ratingsLoadedUseCase = new RatingsLoadedUseCase(this.productId);\n await ratingsLoadedUseCase.execute();\n }\n this.ratingsRepository.getProductRating(productId);\n\n this.socialProofReviewConfig = props.socialProofReviews;\n if (this.socialProofReviewConfig?.enabled) {\n this.reviews = await this.ratingsRepository.getProductReviews(this.productId);\n }\n\n this.isLoading = false;\n this.hasLoaded = true;\n };\n\n @computed\n private get percentageRating() {\n const defaultVal = undefined;\n\n if (this.rating && AVERAGE_RATING in this.rating) {\n const { averageRating } = this.rating;\n\n return averageRating === NO_VALUE\n ? defaultVal\n : (averageRating * 100) / this.numberOfStars;\n }\n\n return defaultVal;\n }\n\n @action\n public onSelectRating = (index: number) => {\n this.selectedRatingIndex = index;\n\n const ratingSelectedUseCase = new RatingSelectedUseCase(index);\n ratingSelectedUseCase.execute();\n };\n\n @action\n public onReadReviewsClick = () => {\n emit(events.READ_REVIEWS_LINK_CLICKED, this.getReviewPayload());\n };\n\n @action\n public onWriteReviewClick = () => {\n emit(events.WRITE_REVIEWS_LINK_CLICKED, this.getReviewPayload());\n };\n\n @computed\n private get productLevelReviews() {\n if (!this.product) {\n return null;\n }\n\n return {\n reviewCount: this.product.reviews.numberOfReviews,\n averageRating: this.product.reviews.averageRating\n };\n }\n\n private getReviewPayload() {\n const { productId, displayName } = this.product;\n\n return {\n id: productId,\n name: displayName,\n reviewCategory: REVIEW_CATEGORY\n };\n }\n\n @action\n public setRating = (index: number) => {\n this.numberOfReviews = this.numberOfReviews + 1;\n };\n\n private getReviewHeadline = (maxCharacters: number) => {\n const { minNumberOfStars } = this.socialProofReviewConfig || {};\n const filteredReviews = this.reviews?.filter(\n ({ rating, headline }) => rating >= minNumberOfStars && headline.length <= maxCharacters\n );\n\n return filteredReviews?.[generateRandomIntegerUpTo(filteredReviews?.length)]?.headline;\n };\n\n @computed\n public get filteredSocialProofReview() {\n const { maxNumberOfCharacters } = this.socialProofReviewConfig || {};\n\n return {\n desktopHeadline: this.getReviewHeadline(maxNumberOfCharacters?.longHeadline) ?? '',\n mobileHeadline: this.getReviewHeadline(maxNumberOfCharacters?.shortHeadline) ?? ''\n };\n }\n}\n","export const generateRandomIntegerUpTo = (max: number) => Math.floor(Math.random() * max);\n","// tslint:disable:export-name\nexport const NO_VALUE: number = -3.1415926535;\n","export const SERVICE_REVIEWS_CLASS = 'elc-review-detail-wrapper';\nexport const REVIEW_CATEGORY = 'service reviews';\n","import { ViewController } from '@estee/elc-service';\nimport { emit, events } from '@estee/elc-service-bus';\nimport * as PowerReviewsConstants from '~constants/PowerReviews';\nimport { IReviewsPayload } from '~interfaces/IReviews';\nimport { SERVICE_REVIEWS_CLASS } from '~constants/ServiceReviews';\n\nexport interface IEventHandlerType {\n id: string;\n name: string;\n reviewCategory: string;\n}\n\nexport class RatingsReviewsBaseController extends ViewController {\n private productReviewsContainer: HTMLElement | null;\n private eventHandlerData: IEventHandlerType;\n\n public addReviewsEventHandlers(eventHandlerData: IEventHandlerType) {\n this.eventHandlerData = eventHandlerData;\n this.productReviewsContainer = (\n document.querySelector(\n `.${PowerReviewsConstants.PRODUCT_REVIEWS_CLASS}, .${SERVICE_REVIEWS_CLASS}`\n )\n );\n if (!this.productReviewsContainer) {\n return;\n }\n this.productReviewsContainer.addEventListener('click', this.handleReviewsClickEventHandler);\n this.productReviewsContainer.addEventListener(\n 'change',\n this.handleReviewsChangeEventHandler\n );\n this.productReviewsContainer.addEventListener('keyup', this.handleReviewsKeyupEventHandler);\n }\n\n private handleReviewsClickEventHandler = (event: MouseEvent) => {\n const { id, name, reviewCategory } = this.eventHandlerData;\n const eventTarget = event.target;\n\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory\n };\n\n const selector = Object.keys(PowerReviewsConstants.ReviewClickEventSelectors).find(\n (key) => {\n return !!eventTarget.closest(\n PowerReviewsConstants.ReviewClickEventSelectors[\n key as keyof typeof PowerReviewsConstants.ReviewClickEventSelectors\n ]\n );\n }\n );\n if (selector) {\n this.handleReviewClickEvents[\n PowerReviewsConstants.ReviewClickEventSelectors[\n selector as keyof typeof PowerReviewsConstants.ReviewClickEventSelectors\n ]\n ]({ eventTarget, payload });\n }\n };\n\n private handleReviewClickEvents: {\n [key in PowerReviewsConstants.ReviewClickEventSelectors]: (params: {\n eventTarget: HTMLElement;\n payload: IReviewsPayload;\n }) => void;\n } = {\n [PowerReviewsConstants.ReviewClickEventSelectors.WRITE_REVIEW]: (params) => {\n emit(events.WRITE_REVIEW_STARTED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_HELPFUL_YES]: (params) => {\n emit(events.REVIEWS_HELPFUL_YES_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_HELPFUL_NO]: (params) => {\n emit(events.REVIEWS_HELPFUL_NO_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.FLAG_REVIEW]: (params) => {\n emit(events.REVIEWS_FLAG_REVIEW_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.MULTI_SELECT]: (params) => {\n this.handleMultiSelectItem(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_SEARCH]: (params) => {\n this.handleReviewsSearch(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_BUTTON]: (params) => {\n this.handleAskAndAnswerButton(params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_SEARCH]: (params) => {\n this.handleAskAndAnswerSearch(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_HELPFUL_YES]: (params) => {\n emit(events.ASK_AND_ANSWER_HELPFUL_YES_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_HELPFUL_NO]: (params) => {\n emit(events.ASK_AND_ANSWER_HELPFUL_NO_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_SHOW_MORE]: (params) => {\n emit(events.ASK_AND_ANSWER_SHOW_MORE_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_RATING]: (params) => {\n this.handleReviewsRating(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_PAGINATION]: (params) => {\n this.handleReviewsPagination(params.eventTarget);\n }\n };\n\n private handleAskAndAnswerButton = (payload: IReviewsPayload) => {\n if (!document.getElementById(PowerReviewsConstants.ASK_AND_ANSWER_FORM_ID)) {\n emit(events.ASK_AND_ANSWER_CLICKED, payload);\n }\n };\n\n private handleReviewsChangeEventHandler = (event: Event) => {\n const eventTarget = event.target;\n const { id, name, reviewCategory } = this.eventHandlerData;\n const { SORT_BY_ID, ASK_AND_ANSWER_SORT_BY_ID } = PowerReviewsConstants;\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: (eventTarget).value\n };\n switch (eventTarget && eventTarget.id) {\n case SORT_BY_ID: {\n emit(events.REVIEWS_SORT_BY_CHANGED, payload);\n break;\n }\n case ASK_AND_ANSWER_SORT_BY_ID: {\n emit(events.ASK_AND_ANSWERS_SORT_BY_CHANGED, payload);\n break;\n }\n default:\n }\n };\n\n private handleReviewsKeyupEventHandler = (event: KeyboardEvent) => {\n const eventTarget = event.target;\n const { REVIEWS_SEARCH_CLASS, ASK_AND_ANSWER_SEARCH_CLASS, ENTER_KEY, ENTER_KEY_CODE } =\n PowerReviewsConstants;\n const isEnterKey = event.code === ENTER_KEY_CODE || event.key === ENTER_KEY;\n\n if (!!eventTarget.closest(`.${REVIEWS_SEARCH_CLASS}`) && isEnterKey) {\n this.handleReviewsSearch(eventTarget);\n } else if (!!eventTarget.closest(`.${ASK_AND_ANSWER_SEARCH_CLASS}`) && isEnterKey) {\n this.handleAskAndAnswerSearch(eventTarget);\n }\n };\n\n private handleMultiSelectItem(eventTarget: HTMLElement) {\n const { MULTI_SELECT_CLASS, MULTI_SELECT_ITEM_CLASS } = PowerReviewsConstants;\n const multiSelectParent = eventTarget && eventTarget.closest(`.${MULTI_SELECT_CLASS}`);\n const currentItem = eventTarget && eventTarget.closest(`.${MULTI_SELECT_ITEM_CLASS}`);\n const { id, name, reviewCategory } = this.eventHandlerData;\n\n if (currentItem && currentItem.hasAttribute('data-selected')) {\n currentItem.removeAttribute('data-selected');\n\n return;\n }\n currentItem && currentItem.setAttribute('data-selected', '');\n\n const selectedFlags = this.getMultiSelectedItems(multiSelectParent);\n const multiSelectButtonText = this.getMultiSelectButtonText(multiSelectParent);\n\n if (selectedFlags.length > 0) {\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: `${multiSelectButtonText} | ${selectedFlags.join(',')}`\n };\n emit(events.REVIEWS_FILTER_CLICKED, payload);\n }\n }\n\n private getMultiSelectButtonText(multiSelectParent: Element | null) {\n const multiSelectButton =\n multiSelectParent &&\n multiSelectParent.querySelector(\n `.${PowerReviewsConstants.MULTI_SELECT_BUTTON_LABEL_CLASS}`\n );\n\n return multiSelectButton && multiSelectButton.textContent;\n }\n\n private getMultiSelectedItems(multiSelectParent: Element | null) {\n const multiSelectItems =\n multiSelectParent &&\n multiSelectParent.querySelectorAll(`.${PowerReviewsConstants.MULTI_SELECT_ITEM_CLASS}`);\n const selectedFlags: string[] = [];\n multiSelectItems &&\n multiSelectItems.forEach((selectItem) => {\n if (selectItem.hasAttribute('data-selected')) {\n const selectedFlagContainer = selectItem && selectItem.querySelector('span');\n const selectedFlagText =\n selectedFlagContainer && selectedFlagContainer.textContent;\n selectedFlagText && selectedFlags.push(selectedFlagText);\n }\n });\n\n return selectedFlags;\n }\n\n private handleReviewsSearch(eventTarget: HTMLElement) {\n const searchParent =\n eventTarget && eventTarget.closest(`.${PowerReviewsConstants.REVIEWS_SEARCH_CLASS}`);\n const searchBox = searchParent && searchParent.querySelector('input');\n const searchValue = searchBox && searchBox.value;\n const { id, name, reviewCategory } = this.eventHandlerData;\n if (!searchValue) {\n return;\n }\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: searchValue\n };\n emit(events.REVIEWS_SEARCH_CLICKED, payload);\n }\n\n private handleAskAndAnswerSearch(eventTarget: HTMLElement) {\n const searchParent =\n eventTarget &&\n eventTarget.closest(`.${PowerReviewsConstants.ASK_AND_ANSWER_SEARCH_CLASS}`);\n const searchBox = searchParent && searchParent.querySelector('input');\n const searchValue = searchBox && searchBox.value;\n const { id, name, reviewCategory } = this.eventHandlerData;\n if (!searchValue) {\n return;\n }\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: searchValue\n };\n emit(events.ASK_AND_ANSWER_SEARCH_CLICKED, payload);\n }\n\n private handleReviewsRating(eventTarget: HTMLElement) {\n const isActiveFilter = !!eventTarget.closest(PowerReviewsConstants.REVIEWS_ACTIVE_RATING_FILTER_SELECTOR);\n\n let selectedValue;\n\n if (!isActiveFilter) {\n const ratingsElements = document.getElementsByClassName(\n PowerReviewsConstants.REVIEWS_RATING_CLASS\n );\n const ratingsElementsArray = Array.from(ratingsElements);\n\n const targetRatingElement = eventTarget.closest(\n PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_RATING\n );\n\n if (targetRatingElement) {\n const ratingIndex = ratingsElementsArray.indexOf(targetRatingElement);\n const rating = PowerReviewsConstants.TOTAL_NUMBER_OF_STARS - ratingIndex;\n\n selectedValue = `${rating} star`;\n\n const payload: IReviewsPayload = {\n ...this.eventHandlerData,\n selectedValue\n };\n\n emit(events.REVIEWS_RATING_CLICKED, payload);\n }\n }\n }\n\n private emitReviewsPaginationClicked(\n optionSelection: PowerReviewsConstants.ReviewPaginationOption\n ) {\n const payload: IReviewsPayload = {\n ...this.eventHandlerData,\n selectedValue: optionSelection\n };\n\n emit(events.REVIEWS_PAGINATION_CLICKED, payload);\n }\n\n private handleReviewsPagination(eventTarget: HTMLElement) {\n const isNextButton = eventTarget.className.includes(\n PowerReviewsConstants.REVIEWS_PAGINATION_NEXT_BUTTON\n );\n\n const isPrevButton = eventTarget.className.includes(\n PowerReviewsConstants.REVIEWS_PAGINATION_PREV_BUTTON\n );\n\n if (isNextButton) {\n this.emitReviewsPaginationClicked(PowerReviewsConstants.ReviewPaginationOption.NEXT);\n } else if (isPrevButton) {\n this.emitReviewsPaginationClicked(\n PowerReviewsConstants.ReviewPaginationOption.PREVIOUS\n );\n }\n }\n\n public removeReviewsEventHandlers() {\n if (!this.productReviewsContainer) {\n return;\n }\n this.productReviewsContainer.removeEventListener(\n 'click',\n this.handleReviewsClickEventHandler\n );\n this.productReviewsContainer.removeEventListener(\n 'change',\n this.handleReviewsChangeEventHandler\n );\n this.productReviewsContainer.removeEventListener(\n 'keyup',\n this.handleReviewsKeyupEventHandler\n );\n }\n}\n","import { emit, events } from '@estee/elc-service-bus';\nimport { observable, computed, action } from 'mobx';\nimport { ConfigStore } from '~setup/ConfigStore';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport * as Constants from '~constants/PowerReviews';\nimport { IRatingsReviewsConfig } from '~interfaces/IRating';\nimport { RatingsLoadedUseCase } from '~use-cases/RatingsLoadedUseCase';\nimport { IProductReviews } from '~exported/product-reviews/ProductReviews';\nimport { RatingsReviewsBaseController } from './RatingsReviewsBaseController';\nimport { REVIEW_CATEGORY } from '~constants/ProductReview';\n\nexport class ProductReviewsViewController extends RatingsReviewsBaseController {\n @observable public isLoading: boolean = true;\n @observable public config: IRatingsReviewsConfig;\n @observable public productRepository: ProductRepository;\n @observable public powerReviewsScript: HTMLScriptElement;\n @observable public activeTab: string = 'tab-1';\n\n constructor(configStore: ConfigStore, productRepository: ProductRepository) {\n super();\n this.config = configStore.config;\n this.productRepository = productRepository;\n }\n\n public initialize(props: IProductReviews) {\n const { config } = props;\n this.config = { ...this.config, ...config };\n }\n\n @computed\n get data() {\n return {\n isLoading: this.isLoading,\n activeTab: this.activeTab\n };\n }\n\n @computed\n public get productId() {\n return this.productRepository.productId || this.config.productId;\n }\n\n @computed\n public get product() {\n return this.productRepository.getProductById(this.productId);\n }\n\n @computed\n public get numberOfReviewsValue(): number {\n return this.product && this.product.reviews && this.product.reviews.numberOfReviews;\n }\n\n @action\n public setPaginationType = (paginationType: string) => {\n this.productRepository.setPaginationType(paginationType);\n };\n\n @action\n public setPrDisclosureCode = (prDisclosureCode: string) => {\n this.productRepository.setPrDisclosureCode(prDisclosureCode);\n };\n\n @action\n public onTabClick = (event: React.MouseEvent) => {\n const target = event.target;\n this.activeTab = target.dataset.tab || '';\n };\n\n @action\n public loadReviews = (powerReviewsScript: HTMLScriptElement) => {\n this.isLoading = false;\n // tslint:disable-next-line: no-floating-promises\n this.loaded().then(() => {\n this.loadPowerReviewsScripts(powerReviewsScript);\n this.addReviewsEventHandlers({\n id: this.productId,\n name: this.product?.displayName || '',\n reviewCategory: REVIEW_CATEGORY\n });\n });\n };\n\n public handleProductReviewsUnmount = () => {\n this.removeReviewsEventHandlers();\n };\n\n @action\n public loadPowerReviewsScripts = (powerReviewsScript: HTMLScriptElement) => {\n const bodyFirstScript = document.querySelector('body > script');\n const parentNode = bodyFirstScript.parentNode;\n powerReviewsScript.type = 'text/javascript';\n powerReviewsScript.src = Constants.POWER_REVIEWS_SCRIPT;\n powerReviewsScript.defer = true;\n powerReviewsScript.async = true;\n powerReviewsScript.onload = () => {\n this.emitReviewsInit();\n };\n parentNode.insertBefore(powerReviewsScript, bodyFirstScript.nextSibling);\n\n this.powerReviewsScript = powerReviewsScript;\n };\n\n public showReviews = () => {\n const prScript = document.createElement('script');\n if (!this.powerReviewsScript) {\n this.loadReviews(prScript);\n }\n };\n\n public loaded = async () => {\n if (this.productId) {\n const ratingsLoadedUseCase = new RatingsLoadedUseCase(this.productId);\n await ratingsLoadedUseCase.execute();\n }\n\n return Promise.resolve();\n };\n\n public emitReviewsInit = () => {\n emit(events.SPP_POWER_REVIEWS_INIT, this.productId);\n };\n}\n","export interface ICopyUsableValues {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport const copyUsableValues = (source: ICopyUsableValues, target: ICopyUsableValues) => {\n Object.keys(source).forEach((key) => {\n if (source[key] !== null && source[key] !== undefined) {\n target[key] = source[key];\n }\n });\n};\n","import { copyUsableValues } from '../../utils/UsableValues';\r\nimport { IReviewDetailsData } from './ReviewDetails';\r\n\r\nexport class ReviewProduct {\r\n public name: string;\r\n public image_url: string;\r\n public description: string;\r\n public category_name: string;\r\n public url: string;\r\n public manufacturer_id?: string;\r\n public price?: string;\r\n public upc?: string;\r\n public brand_name?: string;\r\n public in_stock?: boolean;\r\n\r\n public static toJson(data: IReviewDetailsData) {\r\n const reviewProduct = new ReviewProduct();\r\n const mappingData = {\r\n name: data.name,\r\n url: data.url,\r\n image_url: data.imageUrl,\r\n description: data.description,\r\n category_name: data.categoryName,\r\n manufacturer_id: data.manufacturerId,\r\n upc: data.upc,\r\n brand_name: data.brandName,\r\n price: data.price\r\n };\r\n copyUsableValues(mappingData, reviewProduct);\r\n\r\n return reviewProduct;\r\n }\r\n}\r\n","import { ReviewProduct } from './ReviewProduct';\nimport { copyUsableValues } from '../../utils/UsableValues';\n\ninterface IReviewComponents {\n ReviewSnippet?: string;\n ReviewImageSnippet?: string;\n ReviewDetails?: string;\n}\n\nexport interface IReviewDetailsData {\n apiKey: string;\n merchantId: string;\n merchantGroupId: string;\n locale: string;\n pageId: string;\n name: string;\n imageUrl: string;\n description: string;\n categoryName: string;\n manufacturerId?: string;\n upc?: string;\n brandName?: string;\n price?: string;\n inStock?: boolean;\n url: string;\n reviewWrapperUrl: string;\n components?: IReviewComponents;\n onRender?(): boolean;\n onSubmit?(): boolean;\n}\n\nexport class ReviewDetails {\n public api_key: string;\n public merchant_id: string;\n public merchant_group_id: string;\n public locale: string;\n public page_id: string;\n public product: string;\n public review_wrapper_url: string;\n public components: IReviewComponents;\n public on_render: void;\n public on_submit: void;\n\n public static toJson(data: IReviewDetailsData) {\n const reviewDetails = new ReviewDetails();\n const mappingData = {\n api_key: data.apiKey,\n merchant_id: data.merchantId,\n merchant_group_id: data.merchantGroupId,\n locale: data.locale,\n page_id: data.pageId,\n product: ReviewProduct.toJson(data),\n review_wrapper_url: data.reviewWrapperUrl,\n components: data.components,\n on_render: data.onRender,\n on_submit: data.onSubmit\n };\n copyUsableValues(mappingData, reviewDetails);\n\n return reviewDetails;\n }\n}\n","import { action } from 'mobx';\nimport {\n POWER_REVIEWS_SCRIPT,\n REVIEW_COMPONENTS,\n REVIEW_SNAPSHOT_ID\n} from '~constants/PowerReviews';\nimport { IReviewDetailsData, ReviewDetails } from '~domain/entities/ReviewDetails';\nimport { IReviewDetailsConfig } from '~exported/review-details/ReviewDetails';\nimport { ConfigStore } from '~setup/ConfigStore';\nimport { RatingsReviewsBaseController } from './RatingsReviewsBaseController';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { REVIEW_CATEGORY } from '~constants/ServiceReviews';\nimport { IPowerReviews } from '~interfaces/IPowerReviews';\n\ndeclare let POWERREVIEWS: IPowerReviews;\n\ninterface IReviewDetailsControllerData {\n config: IReviewDetailsConfig;\n reviewDetailsRef: React.RefObject;\n}\n\nexport class ReviewDetailsViewController extends RatingsReviewsBaseController {\n private isReviewLoaded: boolean;\n private reviewDetailsData: IReviewDetailsData;\n private configs: ConfigStore;\n private reviewDetailsRef: React.RefObject;\n private isProductInfoVisible: boolean;\n\n constructor(configStore: ConfigStore) {\n super();\n this.configs = configStore;\n }\n\n @action\n public loaded = async (props: IReviewDetailsControllerData) => {\n this.reviewDetailsData = props.config;\n const payload = {\n id: this.reviewDetailsData.pageId,\n name: this.reviewDetailsData.name,\n reviewCategory: REVIEW_CATEGORY\n };\n this.reviewDetailsRef = props.reviewDetailsRef;\n this.isProductInfoVisible = props.config.showPageInfo;\n this.showReviewOverlay();\n this.addReviewsEventHandlers(payload);\n emit(events.REVIEW_OVERLAY_OPENED, payload);\n };\n\n private showReviewOverlay() {\n if (this.isReviewLoaded) {\n this.renderOverlay();\n\n return;\n }\n this.loadPowerReviews();\n }\n\n private loadPowerReviews() {\n const script = document.getElementsByTagName('script')[0];\n const powerReviewsScript = document.createElement('script');\n powerReviewsScript.type = 'text/javascript';\n powerReviewsScript.async = true;\n powerReviewsScript.src = POWER_REVIEWS_SCRIPT;\n powerReviewsScript.onload = () => {\n this.isReviewLoaded = true;\n this.showReviewOverlay();\n };\n\n script.parentNode && script.parentNode.insertBefore(powerReviewsScript, script);\n }\n\n private renderOverlay() {\n const reviewsConfig = {\n ...this.configs.config.ratingsReviewsConfig,\n components: REVIEW_COMPONENTS\n };\n const reviewDisplayParams = ReviewDetails.toJson({\n ...reviewsConfig,\n ...this.reviewDetailsData\n });\n POWERREVIEWS.display.render(reviewDisplayParams);\n this.isProductInfoVisible && this.observeReviewDetails();\n }\n\n private observeReviewDetails = () => {\n const reviewDetailsContainer = this.reviewDetailsRef.current;\n if (reviewDetailsContainer === null) {\n return;\n }\n const mutationObserver: MutationObserver = new MutationObserver(this.onReviewDetailsLoaded);\n const config = {\n childList: true,\n subtree: true\n };\n\n mutationObserver.observe(reviewDetailsContainer, config);\n };\n\n private onReviewDetailsLoaded = (\n mutationList: MutationRecord[],\n mutationObserver: MutationObserver\n ) => {\n for (const mutation of mutationList) {\n if ((mutation.target).querySelector(`#${REVIEW_SNAPSHOT_ID}`)) {\n this.appendProductDetails();\n mutationObserver.disconnect();\n break;\n }\n }\n };\n\n // Hacky code to inject product/service info into review details as Power Reviews doesn't support this\n private appendProductDetails() {\n const reviewSnapShotContainer = document.getElementById(REVIEW_SNAPSHOT_ID);\n if (!reviewSnapShotContainer) {\n return;\n }\n const imageElement = document.createElement('img');\n const productElement = document.createElement('p');\n const descriptionElement = document.createElement('p');\n const productInfoWrapper = document.createElement('div');\n\n imageElement.src = this.reviewDetailsData.imageUrl;\n imageElement.alt = this.reviewDetailsData.name;\n imageElement.className = 'elc-pr-review-product-image';\n\n productElement.innerHTML = this.reviewDetailsData.name;\n productElement.className = 'elc-pr-review-product-name';\n\n descriptionElement.innerHTML = this.reviewDetailsData.description;\n descriptionElement.className = 'elc-pr-review-product-description';\n\n productInfoWrapper.className = 'elc-pr-review-product-wrapper';\n productInfoWrapper.appendChild(productElement);\n productInfoWrapper.appendChild(descriptionElement);\n\n reviewSnapShotContainer.prepend(imageElement, productInfoWrapper);\n }\n\n public handleUnmount() {\n this.removeReviewsEventHandlers();\n emit(events.REVIEW_OVERLAY_CLOSED, {\n id: this.reviewDetailsData.pageId,\n name: this.reviewDetailsData.name || '',\n reviewCategory: 'service reviews'\n });\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\nimport { Config } from '~domain/entities/Config';\n\nexport class ConfigRepository {\n private config: Config;\n\n constructor() {\n this.config = diContainer.get(serviceNames.config);\n }\n\n public getConfigs = async (configs: string[]) => {\n const config = await query(serviceQueries.GET_CONFIG, configs);\n\n this.config.updateConfig(config);\n };\n}\n","export enum InventoryStatuses {\n Active = 'Active',\n TempOutOfStock = 'Temporarily out of stock',\n ComingSoon = 'Coming Soon',\n SoldOut = 'Sold Out',\n FreePromo = 'Free Promo',\n DoNotDisplay = 'Do Not Display',\n Inactive = 'Inactive',\n PreOrder = 'Pre Order'\n}\n","import {\n IProduct,\n IVariant,\n IRatingsReviewsConfig,\n IComponents,\n IPRProductProduct,\n ISkuData\n} from '../../interfaces/IRating';\nimport {\n REVIEW_DISPLAY,\n QUESTION_DISPLAY,\n SNAPSHOT_TYPE,\n PAGINATION_TYPE\n} from '../../constants/PowerReviews';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { REVIEW_CATEGORY } from '../../constants/ServiceReviews';\nimport { InventoryStatuses } from '../../constants/InventoryStatuses';\n\nexport class PowerReviewsProduct {\n public api_key: string;\n public locale: string;\n public merchant_group_id: string;\n public merchant_id: string;\n public page_id: string;\n public review_wrapper_url: string;\n public components: IComponents = {\n ReviewDisplay: REVIEW_DISPLAY,\n QuestionDisplay: QUESTION_DISPLAY\n };\n public REVIEW_DISPLAY_SNAPSHOT_TYPE: string;\n public REVIEW_DISPLAY_PAGINATION_TYPE = PAGINATION_TYPE.DEFAULT;\n public variants: IVariant[];\n public product: IPRProductProduct;\n public on_submit: () => void;\n\n public static fromJson(\n data: IProduct,\n ratingsReviewsConfig: IRatingsReviewsConfig,\n paginationType: string,\n selectedSkuId?: string,\n prDisclosureCode?: string\n ): PowerReviewsProduct {\n const prProduct = new PowerReviewsProduct();\n\n const {\n apiKey,\n locale,\n merchantGroupId,\n merchantId,\n pageId,\n reviewWrapperUrl,\n reviewDisplaySnapshotType,\n brandName\n } = ratingsReviewsConfig;\n\n const {\n productId,\n displayName,\n productUrl,\n shortDescription,\n defaultCategory,\n defaultSku: { price, originalPrice },\n skus,\n defaultSku\n } = data;\n\n const baseUrl = `${window.location.protocol}//${document.location.hostname}`;\n const prPageId = pageId || productId;\n\n prProduct.api_key = apiKey;\n prProduct.locale = locale;\n prProduct.merchant_group_id = merchantGroupId;\n prProduct.merchant_id = merchantId;\n prProduct.page_id = prPageId;\n prProduct.review_wrapper_url = prProduct.reviewUrl(\n reviewWrapperUrl,\n prPageId,\n prDisclosureCode\n );\n prProduct.REVIEW_DISPLAY_SNAPSHOT_TYPE = reviewDisplaySnapshotType || SNAPSHOT_TYPE;\n\n // Converting boolean to string as requested by PowerReviews\n const inStock = prProduct.isInStock(data, selectedSkuId).toString();\n\n prProduct.product = {\n name: displayName,\n url: baseUrl.concat(productUrl),\n image_url: prProduct.getDefaultImage(defaultSku),\n description: shortDescription,\n category_name: defaultCategory.id,\n brand_name: brandName,\n price: price || originalPrice,\n in_stock: inStock\n };\n\n if (skus.length > 1) {\n prProduct.product.variants = prProduct.productVariants(data);\n } else {\n prProduct.product.upc = defaultSku.upc;\n }\n\n if (paginationType === PAGINATION_TYPE.VERTICAL) {\n prProduct.REVIEW_DISPLAY_PAGINATION_TYPE = paginationType;\n }\n\n prProduct.on_submit = function () {\n prProduct.onPrFormSubmit(data);\n };\n\n return prProduct;\n }\n\n private isInStock(data: IProduct, selectedSkuId?: string) {\n const { isOutOfStock, skus } = data;\n\n if (selectedSkuId) {\n const selectedSku = skus.find((sku) => sku.skuId === selectedSkuId);\n if (selectedSku) {\n return selectedSku.inventoryStatus === InventoryStatuses.Active;\n }\n }\n\n return !isOutOfStock;\n }\n\n private onPrFormSubmit(data: IProduct) {\n const payLoad = {\n id: data.productId,\n name: data.displayName,\n reviewCategory: REVIEW_CATEGORY\n };\n emit(events.ASK_AND_ANSWER_SUBMITTED, { ...payLoad });\n }\n\n private reviewUrl(reviewWrapperUrl: string, pageId: string, prDisclosureCode?: string): string {\n const url = reviewWrapperUrl || '/review/create';\n let queryString = `?pr_page_id=${pageId}`;\n if (prDisclosureCode) {\n queryString = `${queryString}&pr_disclosure_code=${prDisclosureCode}`;\n }\n\n return `${url}${queryString}`;\n }\n\n private productVariants(data: IProduct) {\n const isShaded = data.isShaded;\n\n return data.skus.reduce((variantAcc: IVariant[], sku) => {\n variantAcc.push({\n name: this.getVariantName(sku, isShaded) || '',\n image_url: this.getDefaultImage(sku),\n upc: sku.upc,\n page_id_variant: sku.perlgem.SKU_BASE_ID\n });\n\n return variantAcc;\n }, []);\n }\n\n private getVariantName(sku: ISkuData, isShaded: boolean) {\n if (isShaded) {\n return sku.shades.length && sku.shades[0].name;\n }\n\n return sku.sizes.length && sku.sizes[0].value;\n }\n\n private getDefaultImage(sku: ISkuData) {\n const baseUrl = `${window.location.protocol}//${document.location.hostname}`;\n const { defaultLargeImage, defaultMediumImage } = sku;\n\n if (defaultLargeImage && defaultLargeImage.src) {\n return baseUrl.concat(defaultLargeImage.src);\n }\n\n if (defaultMediumImage && defaultMediumImage.src) {\n return baseUrl.concat(defaultMediumImage.src);\n }\n\n return '';\n }\n}\n","import { action, observable } from 'mobx';\nimport { IProduct } from '../interfaces/IRating';\nimport { PowerReviewsProduct } from '../domain/entities/PowerReviewsProduct';\nimport { Config } from '../domain/entities/Config';\n\nexport class ProductRepository {\n @observable public products: IProduct[] = [];\n @observable public productId: string = '';\n @observable public selectedSkuId: string = '';\n @observable public configService: Config;\n @observable public paginationType: string = '';\n @observable public prDisclosureCode: string;\n\n constructor(configService: Config) {\n this.configService = configService;\n }\n\n @action\n public updateProductId = (productId: string) => {\n this.productId = productId;\n };\n\n @action\n public setPaginationType = (paginationType: string) => {\n this.paginationType = paginationType;\n };\n\n @action\n public setSelectedSkuId = (skuId: string) => {\n this.selectedSkuId = skuId;\n };\n\n @action\n public setPrDisclosureCode = (prDisclosureCode: string) => {\n this.prDisclosureCode = prDisclosureCode;\n };\n\n @action\n public setProducts = (products: IProduct[]) => {\n const listOfProducts = [...this.products, ...products];\n\n this.products = listOfProducts.filter(\n (product, index, arr) =>\n arr.findIndex((i) => i.productId === product.productId) === index\n );\n };\n\n public getProductById = (productId: string) =>\n this.products.find((prod: IProduct) => prod.productId === productId);\n\n public getPowerReviewsProduct(products: IProduct[]) {\n const {\n ratingsReviewsConfig,\n brand: { literal: brandName },\n i18n\n } = this.configService.config;\n\n const localeDependentIdsFiltered = ratingsReviewsConfig.localeDependentIds?.filter(\n (localeDependentId) => localeDependentId.locale === i18n.locale\n );\n if (localeDependentIdsFiltered?.length > 0) {\n ratingsReviewsConfig.locale = localeDependentIdsFiltered[0].power_reviews_locale;\n ratingsReviewsConfig.merchantId = localeDependentIdsFiltered[0].merchant_id;\n }\n\n return PowerReviewsProduct.fromJson(\n products[0],\n { ...ratingsReviewsConfig, brandName },\n this.paginationType,\n this.selectedSkuId,\n this.prDisclosureCode\n );\n }\n}\n","import { observable, action } from 'mobx';\nimport { IBrand, IRatingsReviewsConfig, Ii18n } from '../../interfaces/IRating';\n\nexport interface IConfig {\n ratingsReviewsConfig: IRatingsReviewsConfig;\n brand: IBrand;\n i18n: Ii18n;\n}\nexport class Config {\n @observable public config: IConfig;\n\n @action\n public updateConfig(config: Partial) {\n this.config = { ...this.config, ...config };\n }\n}\n","import { HeaderType, HeaderObject, root } from '@estee/elc-universal-utils';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nexport const AUTHORIZATION_HEADER_NAME = 'AuthorizationToken';\nexport const BUSINESS_UNIT_HEADER_NAME = 'Business-Unit';\n\nexport interface IError {\n status: number;\n}\nexport interface IDataMapperOperations {\n [key: string]: Function | undefined;\n request?(request: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n response?(response: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n}\nexport interface IDataMappings {\n [key: string]: IDataMapperOperations;\n}\nexport interface IResponse {\n data: T;\n reponseHeaders: Headers | {};\n}\nexport interface IPayload {\n url: string;\n body?: {};\n options?: {};\n headers?: {};\n returnAsPlainText?: boolean;\n}\nexport interface IGetPayload {\n url: string;\n options?: {};\n headers?: {};\n params?: {};\n}\nexport interface IRequestOptions {\n debounceInterval?: number;\n bypassCache?: boolean;\n}\nexport interface IHttpTransport {\n addGlobalHeaders(header: HeaderObject): void;\n removeGlobalHeader(headerName: string): void;\n delete(payload: string | IPayload): Promise>;\n post(payload: IPayload): Promise>;\n patch(payload: IPayload): Promise>;\n put(payload: IPayload): Promise>;\n get(payload: string | IGetPayload, IRequestOptions?: IRequestOptions): Promise>;\n}\nexport interface IDataMapper {\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapRequest(name: string, request: Object): {};\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapResponse(name: string, response: Object): {};\n dataMappings?: IDataMappings;\n}\n\nexport interface IConfig {\n cartId?: string;\n httpTransport: IHttpTransport;\n dataMapper?: IDataMapper;\n businessUnitId?: string;\n drupalDomain?: string;\n}\n\nexport class Api {\n protected bearerToken: string;\n protected httpTransport: IHttpTransport;\n protected businessUnitId: string | undefined;\n private logger: ELCLogger;\n\n constructor(configStore: IConfig, serviceName: string, serviceVersion: string) {\n this.httpTransport = configStore.httpTransport;\n this.businessUnitId = configStore.businessUnitId;\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n }\n\n public addHeader(header: HeaderObject) {\n this.httpTransport.addGlobalHeaders(header);\n }\n\n public removeHeader(headerName: HeaderType) {\n this.httpTransport.removeGlobalHeader(headerName);\n }\n\n public setBearerToken(bearerToken: string) {\n if (bearerToken) {\n this.addHeader({\n [AUTHORIZATION_HEADER_NAME]: `${bearerToken}`\n });\n } else {\n this.removeHeader(AUTHORIZATION_HEADER_NAME);\n }\n }\n protected delete = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.delete(payload);\n } catch (e) {\n this.handleError(e, 'delete', payload);\n }\n\n return response;\n };\n\n protected get = async (\n payload: IGetPayload | string,\n { debounceInterval = 200, bypassCache = false }: IRequestOptions = {}\n ) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.get(payload, {\n debounceInterval,\n bypassCache\n });\n } catch (e) {\n this.handleError(e, 'get', payload);\n }\n\n return response;\n };\n\n protected patch = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.patch(payload);\n } catch (e) {\n this.handleError(e, 'patch', payload);\n }\n\n return response;\n };\n\n protected post = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n try {\n response = await this.httpTransport.post(payload);\n } catch (e) {\n this.handleError(e, 'post', payload);\n }\n\n return response;\n };\n protected put = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.put(payload);\n } catch (e) {\n this.handleError(e, 'put', payload);\n }\n\n return response;\n };\n\n private handleError = (e: Error, requestType: string, originalPayload: IPayload | string) => {\n this.logger.error({\n triggerType: TriggerType.api,\n message: `${e}`,\n payload: {\n context: {\n subdomain: root.site && root.site.client && root.site.client.subdomain,\n originalPayload,\n requestType\n },\n error: e\n }\n });\n };\n}\n","import { Api, IConfig } from '@estee/elc-service';\nimport { POWER_REVIEWS_API_LINK } from '../internal/constants/PowerReviews';\nimport { ConfigStore } from '../service-setup/ConfigStore';\n\nenum ApiResource {\n Snippet = 'snippet',\n Reviews = 'reviews'\n}\n\nexport interface IReviewSnippetApiSdkConfig extends IConfig {\n configStore: ConfigStore;\n}\n\ninterface IResultData {\n data: {\n results: T[];\n };\n}\n\nexport interface IRatingSnippetsApiResult {\n page_id: string;\n rollup: IRollupJsonData;\n}\n\nexport interface IReviewsApiResult {\n page_id: string;\n reviews: IReviewJsonData[];\n}\n\nexport interface IReviewJsonData {\n details: IReviewDetailsJsonData;\n metrics: IReviewMetricsJsonData;\n}\n\ninterface IReviewMetricsJsonData {\n rating: number;\n}\n\ninterface IReviewDetailsJsonData {\n headline: string;\n}\n\ninterface IRollupJsonData {\n average_rating: number;\n review_count: number;\n answered_questions: number;\n}\n\nexport class RatingsAndReviewsApiSdk extends Api {\n private config: IReviewSnippetApiSdkConfig;\n\n constructor(config: IReviewSnippetApiSdkConfig, serviceName: string, serviceVersion: string) {\n super(config, serviceName, serviceVersion);\n this.config = config;\n }\n\n private buildUrl(pageIds: string[], resource: ApiResource) {\n const { merchantId, locale, apiKey } = this.config.configStore.config.ratingsReviewsConfig;\n const joinedPageIds = pageIds.join(',');\n\n return `${POWER_REVIEWS_API_LINK}/m/${merchantId}/l/${locale}/product/${joinedPageIds}/${resource}?apikey=${apiKey}`;\n }\n\n public async getRatingSnippetsData(pageIds: string[]): Promise {\n try {\n const url = this.buildUrl(pageIds, ApiResource.Snippet);\n const response: IResultData = await this.httpTransport.get({\n url\n });\n\n return response.data.results;\n } catch (err) {\n throw err;\n }\n }\n\n public async getReviewsData(pageId: string): Promise {\n try {\n const url = this.buildUrl([pageId], ApiResource.Reviews);\n const response: IResultData = await this.httpTransport.get({ url });\n\n return response.data.results;\n } catch (err) {\n throw err;\n }\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { observable } from 'mobx';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { IPowerReviews, IPowerReviewsProduct, IProduct } from '~interfaces/IRating';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\n\ndeclare let POWERREVIEWS: IPowerReviews;\n\nexport class PowerReviewsInitializedUseCase {\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n\n constructor(productId: string) {\n this.productId = productId;\n this.productRepository = diContainer.get(serviceNames.productRepository);\n }\n\n private renderReviews(powerReviewsProduct: IPowerReviewsProduct) {\n POWERREVIEWS.display.render(powerReviewsProduct);\n const reviewSection = document.querySelector('.spp-reviews-wrapper');\n if (reviewSection) {\n reviewSection.classList.remove('hidden');\n }\n }\n\n public execute = async () => {\n const products = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { productIds: [this.productId] }\n });\n\n const powerReviewsProduct: IPowerReviewsProduct = this.productRepository.getPowerReviewsProduct(\n products\n );\n\n this.renderReviews(powerReviewsProduct);\n };\n}\n","export class ReadReviewsClickedUseCase {\n public execute = () => {\n // This class name is being passed by the Drupal file sd_spp_reviews_v1.mustache\n const reviewsSection = document.querySelector('.js-product-reviews');\n\n if (reviewsSection) {\n reviewsSection.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n }\n };\n}\n","import { ConfigStore } from '~setup/ConfigStore';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { IReviewsPayload } from '~interfaces/IReviews';\n\nexport class WriteReviewClickedUseCase {\n private reviewInfo: IReviewsPayload;\n private configStore: ConfigStore;\n constructor(reviewInfo: IReviewsPayload) {\n this.configStore = diContainer.get(serviceNames.configStore);\n this.reviewInfo = reviewInfo;\n }\n public execute = () => {\n const config = this.configStore.config;\n const reviewWrapperUrl =\n config.ratingsReviewsConfig && config.ratingsReviewsConfig.reviewWrapperUrl;\n const createReviewLink: HTMLElement | null = document.querySelector(\n '.pr-snippet-write-review-link'\n );\n const { reviewInfo } = this;\n const reviewLink = reviewInfo && reviewInfo.reviewLink;\n const defaultReviewPath = `${reviewWrapperUrl}?pr_page_id=${reviewInfo.id}`;\n if (createReviewLink) {\n createReviewLink.click();\n\n return;\n }\n window.location.assign(reviewLink || defaultReviewPath);\n };\n}\n","import { ProductRepository } from '~repositories/ProductRepository';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\n\nexport class ProductFullLoadedUseCase {\n private productRepository: ProductRepository;\n private productId: string;\n private skuId: string;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(productId: string, skuId: string) {\n this.productRepository = diContainer.get(serviceNames.productRepository);\n this.productId = productId;\n this.skuId = skuId;\n }\n\n public execute = () => {\n this.productRepository.updateProductId(this.productId);\n this.productRepository.setSelectedSkuId(this.skuId);\n };\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ConfigStore } from '../../service-setup/ConfigStore';\nimport { IReviewUpdateConfig } from '../../internal/interfaces/IReviewUpdateConfig';\n\nexport class UpdateReviewConfigUseCase {\n private configStore: ConfigStore;\n private newConfig: IReviewUpdateConfig;\n\n constructor(updateConfig: IReviewUpdateConfig) {\n this.configStore = diContainer.get(serviceNames.configStore);\n this.newConfig = updateConfig;\n }\n\n public execute = async (): Promise => {\n this.configStore.updateConfig({\n ratingsReviewsConfig: this.newConfig\n });\n };\n}\n","import { PowerReviewsInitializedUseCase } from '~use-cases/PowerReviewsInitializedUseCase';\nimport { ReadReviewsClickedUseCase } from '~use-cases/ReadReviewsClickedUseCase';\nimport { WriteReviewClickedUseCase } from '~use-cases/WriteReviewClickedUseCase';\nimport { ProductFullLoadedUseCase } from '~use-cases/ProductFullLoadedUseCase';\nimport { UpdateReviewConfigUseCase } from '~use-cases/UpdateReviewConfigUseCase';\nimport { IReviewUpdateConfig } from '../internal/interfaces/IReviewUpdateConfig';\nimport { IReviewsPayload } from '~interfaces/IReviews';\nimport { RatingsRepository } from '~repositories/RatingsRepository';\n\ninterface IProductFullLoaded {\n productId: string;\n skuId: string;\n}\nexport class ServiceBusController {\n private ratingsRepository: RatingsRepository;\n\n constructor(ratingsRepository: RatingsRepository) {\n this.ratingsRepository = ratingsRepository;\n }\n\n public powerReviewsInitialized = async (productId: string) => {\n const powerReviewsInitializedUseCase = new PowerReviewsInitializedUseCase(productId);\n await powerReviewsInitializedUseCase.execute();\n };\n\n public readReviewsLinkClicked = () => {\n const readReviewsLinkClickedUseCase = new ReadReviewsClickedUseCase();\n readReviewsLinkClickedUseCase.execute();\n };\n\n public writeReviewsLinkClicked = (reviewInfo: IReviewsPayload) => {\n const writeReviewsLinkClickedUseCase = new WriteReviewClickedUseCase(reviewInfo);\n writeReviewsLinkClickedUseCase.execute();\n };\n\n public productFullLoaded = ({ productId, skuId }: IProductFullLoaded) => {\n const productFullLoadedUseCase = new ProductFullLoadedUseCase(productId, skuId);\n productFullLoadedUseCase.execute();\n };\n\n public updateReviewConfig = async (config: IReviewUpdateConfig) => {\n const updateReviewConfigUseCase = new UpdateReviewConfigUseCase(config);\n await updateReviewConfigUseCase.execute();\n };\n\n public getReviewSnippets = async (pageIds: string[]) => {\n return this.ratingsRepository.getProductsRating(pageIds);\n };\n}\n","import { observable, action } from 'mobx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Config = any;\n\nexport class ConfigStore {\n @observable public config: Config = {};\n\n constructor(config: Config) {\n this.updateConfig(config);\n }\n\n @action\n public updateConfig(config: Config) {\n this.config = { ...config };\n }\n}\n","import { IRatingSnippetsApiResult } from '../../../api/RatingsAndReviewsApiSdk';\nimport { TOTAL_NUMBER_OF_STARS } from '../../constants/PowerReviews';\nimport { computeRoundedValueFor } from '../../utils/ComputeRoundedValueFor';\n\nexport class ReviewSnippet {\n public pageId: string;\n public averageRating: number = 0;\n public reviewCount: number;\n public answeredQuestions: number;\n\n public static fromJson(data: IRatingSnippetsApiResult): ReviewSnippet {\n const reviewSnippet = new ReviewSnippet();\n reviewSnippet.pageId = data.page_id;\n reviewSnippet.averageRating = computeRoundedValueFor(data.rollup.average_rating || 0);\n reviewSnippet.reviewCount = data.rollup.review_count;\n reviewSnippet.answeredQuestions = data.rollup.answered_questions;\n\n return reviewSnippet;\n }\n\n public get reviewPercentage() {\n return (this.averageRating / TOTAL_NUMBER_OF_STARS) * 100;\n }\n}\n","import { IReviewJsonData } from '../../../api/RatingsAndReviewsApiSdk';\n\nexport class Review {\n public headline: string;\n public rating: number;\n\n public static fromJson(data: IReviewJsonData) {\n const review = new Review();\n const {\n details: { headline },\n metrics: { rating }\n } = data;\n\n review.headline = headline;\n review.rating = rating;\n\n return review;\n }\n}\n","import { action, observable } from 'mobx';\n\nimport {\n IReviewJsonData,\n IReviewsApiResult,\n RatingsAndReviewsApiSdk\n} from '../../api/RatingsAndReviewsApiSdk';\nimport { diContainer } from '../../service-setup/diContainer';\nimport serviceNames from '../../../src/service-setup/RatingsReviewsService';\nimport { ReviewSnippet } from '../domain/entities/ReviewSnippet';\nimport { Review } from '../domain/entities/Review';\nimport {\n DEFAULT_ANSWERED_QUESTIONS,\n DEFAULT_AVERAGE_RATING,\n DEFAULT_REVIEW_COUNT\n} from '../constants/PowerReviews';\n\nconst RATINGS_FETCH_DEBOUNCE_TIMEOUT = 300;\n\ninterface IProductsRating {\n [key: string]: ReviewSnippet;\n}\n\ninterface IStashedPromise {\n resolver(productsSnippet: IProductsRating): void;\n rejecter(): void;\n productIds: string[];\n}\n\nexport class RatingsRepository {\n private apiSdk: RatingsAndReviewsApiSdk;\n private stashedProductIds: string[] = [];\n private ratingsQueryTimeout: number;\n private stashedPromises: IStashedPromise[] = [];\n\n @observable public productRatings: IProductsRating = {};\n\n constructor() {\n this.apiSdk = diContainer.get(serviceNames.ratingsReviewsApiSdk);\n }\n\n public getProductsRating = (productIds: string[]) => {\n return this.debounceGetRatings(productIds);\n };\n\n public getProductRating = (productId: string) => {\n return this.getProductsRating([productId]);\n };\n\n public getProductReviews = async (productId: string) => {\n const [reviewsApiResult]: IReviewsApiResult[] = await this.apiSdk.getReviewsData(productId);\n\n return reviewsApiResult.reviews.map((review: IReviewJsonData) => Review.fromJson(review));\n };\n\n @action\n private fetchProductsRating = async () => {\n const stashedProductIds = this.stashedProductIds;\n const stashedPromises = this.stashedPromises;\n this.stashedPromises = [];\n\n if (stashedProductIds.length) {\n this.stashedProductIds = [];\n\n const data = await this.apiSdk.getRatingSnippetsData(stashedProductIds);\n const productRatings = { ...this.productRatings };\n\n this.productRatings = data.reduce((accumulator, dataItem) => {\n accumulator[dataItem.page_id] = ReviewSnippet.fromJson(dataItem);\n\n return accumulator;\n }, productRatings);\n }\n\n this.resolvePromises(stashedPromises);\n };\n\n private createPromise = (productIds: string[]) => {\n return new Promise((resolver, rejecter) => {\n this.stashedPromises.push({\n resolver,\n rejecter,\n productIds\n });\n });\n };\n\n private debounceGetRatings = (productIds: string[]) => {\n const newProductIds = this.getNewProductIdsToStash(productIds);\n\n if (newProductIds.length) {\n clearTimeout(this.ratingsQueryTimeout);\n\n this.stashedProductIds = [...new Set([...this.stashedProductIds, ...newProductIds])];\n this.ratingsQueryTimeout = setTimeout(\n this.fetchProductsRating,\n RATINGS_FETCH_DEBOUNCE_TIMEOUT\n );\n\n return this.createPromise(productIds);\n }\n\n return this.getProductsRatingsById(productIds);\n };\n\n private resolvePromises = (stashedPromises: IStashedPromise[]) => {\n stashedPromises.forEach(this.resolvePromise);\n };\n\n private resolvePromise = (promise: IStashedPromise) => {\n const productReviews = this.getProductsRatingsById(promise.productIds);\n\n promise.resolver(productReviews);\n };\n\n private getProductsRatingsById(productIds: string[]) {\n return productIds.reduce((ratingsList: IProductsRating, productId) => {\n const productRating = this.productRatings[productId];\n const _ratingsList = { ...ratingsList };\n\n _ratingsList[productId] = productRating || this.getEmptyRating(productId);\n\n return _ratingsList;\n }, {});\n }\n\n private getNewProductIdsToStash(productIds: string[]) {\n return productIds.reduce((accumulator: string[], productId) => {\n const newProductIds = [...accumulator];\n\n if (!this.productRatings[productId]) {\n newProductIds.push(productId);\n }\n\n return newProductIds;\n }, []);\n }\n\n private getEmptyRating(pageId: string): ReviewSnippet {\n return ReviewSnippet.fromJson({\n page_id: pageId,\n rollup: {\n average_rating: DEFAULT_AVERAGE_RATING,\n review_count: DEFAULT_REVIEW_COUNT,\n answered_questions: DEFAULT_ANSWERED_QUESTIONS\n }\n });\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ConfigRepository } from '~repositories/ConfigRepository';\n\nexport class RatingsReviewsServiceStartedUseCase {\n private configRepository: ConfigRepository;\n private configs: string[];\n\n constructor(configs: string[]) {\n this.configRepository = diContainer.get(serviceNames.configRepository);\n this.configs = configs;\n }\n\n public execute = async () => {\n await this.configRepository.getConfigs(this.configs);\n };\n}\n","import { root, getServiceVersion, IAppConfig } from '@estee/elc-universal-utils';\nimport { getDecorators } from '@estee/elc-service';\nimport { Container } from 'hypo-container';\nimport { ProductRatingViewController } from '~controllers/ProductRatingViewController';\nimport { ProductReviewsViewController } from '~controllers/ProductReviewsViewController';\nimport { ReviewDetailsViewController } from '~controllers/ReviewDetailsViewController';\nimport { ConfigRepository } from '~repositories/ConfigRepository';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { Config } from '~domain/entities/Config';\nimport { RatingsAndReviewsApiSdk } from '~api/RatingsAndReviewsApiSdk';\nimport { ServiceBusController } from './ServiceBusController';\nimport { RatingsReviewsService } from './RatingsReviewsService';\nimport { ConfigStore } from './ConfigStore';\nimport { RatingsRepository } from '~repositories/RatingsRepository';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { RatingsReviewsServiceStartedUseCase } from '~use-cases/RatingsReviewsServiceStartedUseCase';\n\nexport const diContainer = new Container();\n\nexport const setConfig = (configJSON: IAppConfig) => {\n diContainer.config = configJSON;\n};\n\nasync function serviceInitializer(config: IAppConfig) {\n setConfig(config);\n\n diContainer.get(serviceNames.serviceBusController);\n const useCase = new RatingsReviewsServiceStartedUseCase(['ratingsReviewsConfig', 'brand', 'i18n']);\n await useCase.execute();\n}\n\ndiContainer\n .register(serviceNames.configStore, (c) => new ConfigStore(c.config))\n .register(serviceNames.config, (c) => new Config())\n .register(serviceNames.configRepository, () => new ConfigRepository())\n .register(\n serviceNames.serviceBusController,\n (c) => new ServiceBusController(c.get(serviceNames.ratingsRepository))\n )\n .register(\n serviceNames.ratingsReviewsService,\n () => new RatingsReviewsService(serviceInitializer)\n )\n .register(\n serviceNames.productRatingViewController,\n diContainer.factory(\n (c) =>\n new ProductRatingViewController(\n c.get(serviceNames.productRepository),\n c.get(serviceNames.ratingsRepository)\n )\n )\n )\n .register(\n serviceNames.productReviewsViewController,\n diContainer.factory(\n (c) =>\n new ProductReviewsViewController(\n c.get(serviceNames.config),\n c.get(serviceNames.productRepository)\n )\n )\n )\n .register(serviceNames.ratingsReviewsApiSdk, (c) => {\n const config = {\n httpTransport: c.get(serviceNames.httpTransport),\n configStore: c.get(serviceNames.configStore)\n };\n const reviewSnippetServiceName = serviceNames.ratingsReviewsApiSdk;\n const reviewSnippetServiceVersion = getServiceVersion(reviewSnippetServiceName);\n\n return new RatingsAndReviewsApiSdk(\n config,\n reviewSnippetServiceName,\n reviewSnippetServiceVersion\n );\n })\n .register(serviceNames.httpTransport, (c) => {\n return root.HttpTransport;\n })\n .register(\n serviceNames.productRepository,\n (c) => new ProductRepository(c.get(serviceNames.config))\n )\n .register(serviceNames.ratingsRepository, (c) => new RatingsRepository())\n .register(\n serviceNames.reviewDetailsViewController,\n (c) => new ReviewDetailsViewController(c.get(serviceNames.configStore))\n );\n\nconst { lazyInject } = getDecorators(diContainer);\n\nexport { lazyInject };\n","import { Container } from 'hypo-container';\nexport const getDecorators = (container: Container) => ({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lazyInject: (name?: string) => (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target: any,\n key: string,\n descriptor?: PropertyDescriptor\n ) => {\n const resourceName = name || key;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sbGetter = function (this: any) {\n const resource = container.get(resourceName);\n if (!resource) {\n throw new Error(`The requested ${resourceName} does not exists`);\n }\n\n return resource;\n };\n let propertyDescriptor = descriptor || {};\n if (!descriptor) {\n propertyDescriptor = {\n get: sbGetter\n };\n Object.defineProperty(target, key, propertyDescriptor);\n } else {\n propertyDescriptor.get = sbGetter;\n }\n }\n});\n"],"names":["PRODUCT_REVIEWS_CLASS","ENTER_KEY","ENTER_KEY_CODE","REVIEW_DISPLAY","REVIEW_SNIPPET","QUESTION_DISPLAY","SNAPSHOT_TYPE","PAGINATION_TYPE","REVIEW_COMPONENTS","ReviewDisplay","ReviewSnippet","AVERAGE_RATING","POWER_REVIEWS_SCRIPT","POWER_REVIEWS_API_LINK","TOTAL_NUMBER_OF_STARS","HELPFUL_YES_CLASS","HELPFUL_NO_CLASS","FLAG_REVIEW_CLASS","SORT_BY_ID","MULTI_SELECT_CLASS","MULTI_SELECT_ITEM_CLASS","MULTI_SELECT_BUTTON_LABEL_CLASS","REVIEWS_SEARCH_CLASS","REVIEWS_SEARCH_BUTTON_CLASS","ASK_AND_ANSWER_BUTTON_ID","ASK_AND_ANSWER_FORM_ID","ASK_AND_ANSWER_SEARCH_CLASS","ASK_AND_ANSWER_SEARCH_BUTTON_CLASS","ASK_AND_ANSWER_SORT_BY_ID","ASK_AND_ANSWER_SHOW_MORE_CLASS","DEFAULT_AVERAGE_RATING","DEFAULT_REVIEW_COUNT","DEFAULT_ANSWERED_QUESTIONS","DEFAULT_REVIEW_TITLE","REVIEW_SNAPSHOT_ID","REVIEWS_RATING_CLASS","REVIEWS_PAGINATION_NEXT_BUTTON","REVIEWS_PAGINATION_PREV_BUTTON","REVIEWS_ACTIVE_RATING_FILTER_SELECTOR","ReviewPaginationOption","ReviewClickEventSelectors","ViewController","isLoading","setSSRState","data","this","dataState","setId","id","btoa","unescape","encodeURIComponent","computeRoundedValueFor","number","numberOfDigits","roundMultiplier","Math","pow","round","RatingSelectedUseCase","constructor","selectedIndex","execute","productRatingViewController","setRating","diContainer","get","REVIEW_CATEGORY","RatingsLoadedUseCase","productId","products","query","serviceQueries","filterBy","productIds","productRepository","setProducts","ProductRatingViewController","ratingsRepository","super","selectedRatingIndex","numberOfStars","hasLoaded","loaded","props","defaultRating","reviewCount","reviewsNumber","averageRating","productRating","productItem","product","ratingsLoadedUseCase","getProductRating","socialProofReviewConfig","socialProofReviews","enabled","reviews","getProductReviews","onSelectRating","index","onReadReviewsClick","emit","events","getReviewPayload","onWriteReviewClick","numberOfReviews","getReviewHeadline","maxCharacters","minNumberOfStars","filteredReviews","filter","rating","headline","length","max","floor","random","percentageRating","filteredSocialProofReview","productRatings","productLevelReviews","getProductById","defaultVal","displayName","name","reviewCategory","maxNumberOfCharacters","desktopHeadline","longHeadline","mobileHeadline","shortHeadline","RatingsReviewsBaseController","handleReviewsClickEventHandler","event","eventHandlerData","eventTarget","target","payload","selector","Object","keys","PowerReviews","find","key","closest","handleReviewClickEvents","params","handleMultiSelectItem","handleReviewsSearch","handleAskAndAnswerButton","handleAskAndAnswerSearch","handleReviewsRating","handleReviewsPagination","document","getElementById","handleReviewsChangeEventHandler","selectedValue","value","handleReviewsKeyupEventHandler","isEnterKey","code","addReviewsEventHandlers","productReviewsContainer","querySelector","addEventListener","multiSelectParent","currentItem","hasAttribute","removeAttribute","setAttribute","selectedFlags","getMultiSelectedItems","multiSelectButtonText","getMultiSelectButtonText","join","multiSelectButton","textContent","multiSelectItems","querySelectorAll","forEach","selectItem","selectedFlagContainer","selectedFlagText","push","searchParent","searchBox","searchValue","ratingsElements","getElementsByClassName","ratingsElementsArray","Array","from","targetRatingElement","ratingIndex","indexOf","emitReviewsPaginationClicked","optionSelection","isNextButton","className","includes","isPrevButton","removeReviewsEventHandlers","removeEventListener","ProductReviewsViewController","configStore","activeTab","setPaginationType","paginationType","setPrDisclosureCode","prDisclosureCode","onTabClick","dataset","tab","loadReviews","powerReviewsScript","then","loadPowerReviewsScripts","handleProductReviewsUnmount","bodyFirstScript","parentNode","type","src","defer","async","onload","emitReviewsInit","insertBefore","nextSibling","showReviews","prScript","createElement","Promise","resolve","config","initialize","numberOfReviewsValue","copyUsableValues","source","ReviewProduct","toJson","reviewProduct","mappingData","url","image_url","imageUrl","description","category_name","categoryName","manufacturer_id","manufacturerId","upc","brand_name","brandName","price","ReviewDetails","reviewDetails","api_key","apiKey","merchant_id","merchantId","merchant_group_id","merchantGroupId","locale","page_id","pageId","review_wrapper_url","reviewWrapperUrl","components","on_render","onRender","on_submit","onSubmit","ReviewDetailsViewController","reviewDetailsData","reviewDetailsRef","isProductInfoVisible","showPageInfo","showReviewOverlay","observeReviewDetails","reviewDetailsContainer","current","MutationObserver","onReviewDetailsLoaded","observe","childList","subtree","mutationList","mutationObserver","mutation","appendProductDetails","disconnect","configs","isReviewLoaded","renderOverlay","loadPowerReviews","script","getElementsByTagName","reviewsConfig","ratingsReviewsConfig","reviewDisplayParams","POWERREVIEWS","display","render","reviewSnapShotContainer","imageElement","productElement","descriptionElement","productInfoWrapper","alt","innerHTML","appendChild","prepend","handleUnmount","ConfigRepository","getConfigs","updateConfig","InventoryStatuses","PowerReviewsProduct","QuestionDisplay","REVIEW_DISPLAY_PAGINATION_TYPE","fromJson","selectedSkuId","prProduct","reviewDisplaySnapshotType","productUrl","shortDescription","defaultCategory","defaultSku","originalPrice","skus","baseUrl","window","location","protocol","hostname","prPageId","reviewUrl","REVIEW_DISPLAY_SNAPSHOT_TYPE","inStock","isInStock","toString","concat","getDefaultImage","in_stock","variants","productVariants","onPrFormSubmit","isOutOfStock","selectedSku","sku","skuId","inventoryStatus","Active","payLoad","queryString","isShaded","reduce","variantAcc","getVariantName","page_id_variant","perlgem","SKU_BASE_ID","shades","sizes","defaultLargeImage","defaultMediumImage","ProductRepository","configService","updateProductId","setSelectedSkuId","listOfProducts","arr","findIndex","i","prod","getPowerReviewsProduct","brand","literal","i18n","localeDependentIdsFiltered","localeDependentIds","localeDependentId","power_reviews_locale","Config","AUTHORIZATION_HEADER_NAME","Api","serviceName","serviceVersion","delete","response","reponseHeaders","httpTransport","e","handleError","debounceInterval","bypassCache","patch","post","put","requestType","originalPayload","logger","error","triggerType","TriggerType","message","context","subdomain","businessUnitId","ELCLogger","addHeader","header","addGlobalHeaders","removeHeader","headerName","removeGlobalHeader","setBearerToken","bearerToken","RatingsAndReviewsApiSdk","buildUrl","pageIds","resource","joinedPageIds","getRatingSnippetsData","results","err","getReviewsData","PowerReviewsInitializedUseCase","powerReviewsProduct","renderReviews","reviewSection","classList","remove","ReadReviewsClickedUseCase","reviewsSection","scrollIntoView","behavior","block","WriteReviewClickedUseCase","reviewInfo","createReviewLink","reviewLink","defaultReviewPath","click","assign","ProductFullLoadedUseCase","UpdateReviewConfigUseCase","newConfig","ServiceBusController","powerReviewsInitialized","powerReviewsInitializedUseCase","readReviewsLinkClicked","writeReviewsLinkClicked","productFullLoaded","updateReviewConfig","updateReviewConfigUseCase","getReviewSnippets","getProductsRating","ConfigStore","reviewSnippet","rollup","average_rating","review_count","answeredQuestions","answered_questions","reviewPercentage","Review","review","details","metrics","RatingsRepository","stashedProductIds","stashedPromises","debounceGetRatings","reviewsApiResult","apiSdk","map","fetchProductsRating","accumulator","dataItem","resolvePromises","createPromise","resolver","rejecter","newProductIds","getNewProductIdsToStash","clearTimeout","ratingsQueryTimeout","Set","setTimeout","getProductsRatingsById","resolvePromise","promise","productReviews","ratingsList","_ratingsList","getEmptyRating","RatingsReviewsServiceStartedUseCase","configRepository","Container","setConfig","configJSON","serviceInitializer","useCase","register","c","RatingsReviewsService","factory","reviewSnippetServiceName","reviewSnippetServiceVersion","lazyInject","container","descriptor","resourceName","sbGetter","Error","propertyDescriptor","defineProperty"],"sourceRoot":""}