{"version":3,"file":"diContainer.34c127207566a6507857.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/constants/InventoryStatuses.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/ConfigRepository.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/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.0/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';\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}\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 public 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 };\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 {\n REVIEWS_SEARCH_CLASS,\n ASK_AND_ANSWER_SEARCH_CLASS,\n ENTER_KEY,\n 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 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 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","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 { 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","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 ): 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(reviewWrapperUrl, prPageId);\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): string {\n const url = reviewWrapperUrl || '/review/create';\n const queryString = `?pr_page_id=${pageId}`;\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\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 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 } = this.configService.config;\n\n return PowerReviewsProduct.fromJson(\n products[0],\n { ...ratingsReviewsConfig, brandName },\n this.paginationType,\n this.selectedSkuId\n );\n }\n}\n","import { observable, action } from 'mobx';\nimport { IBrand, IRatingsReviewsConfig } from '../../interfaces/IRating';\n\nexport interface IConfig {\n ratingsReviewsConfig: IRatingsReviewsConfig;\n brand: IBrand;\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 { PowerReviewsInitializedUseCase } from '~use-cases/PowerReviewsInitializedUseCase';\nimport { ReadReviewsClickedUseCase } from '~use-cases/ReadReviewsClickedUseCase';\nimport { WriteReviewClickedUseCase } from '~use-cases/WriteReviewClickedUseCase';\nimport { ProductFullLoadedUseCase } from '~use-cases/ProductFullLoadedUseCase';\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 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']);\n await useCase.execute();\n}\n\ndiContainer\n .register(\n serviceNames.configStore,\n diContainer.factory((c) => new ConfigStore(c.config))\n )\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","ReviewClickEventSelectors","ViewController","isLoading","setSSRState","data","this","dataState","setId","id","btoa","unescape","encodeURIComponent","observable","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","computed","action","RatingsReviewsBaseController","handleReviewsClickEventHandler","event","eventHandlerData","eventTarget","target","payload","selector","Object","keys","PowerReviews","find","key","closest","handleReviewClickEvents","params","handleMultiSelectItem","handleReviewsSearch","handleAskAndAnswerButton","handleAskAndAnswerSearch","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","removeReviewsEventHandlers","removeEventListener","ProductReviewsViewController","configStore","activeTab","setPaginationType","paginationType","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","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","toJson","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","className","innerHTML","appendChild","prepend","handleUnmount","InventoryStatuses","ConfigRepository","getConfigs","updateConfig","PowerReviewsProduct","QuestionDisplay","REVIEW_DISPLAY_PAGINATION_TYPE","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","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","fromJson","Config","AUTHORIZATION_HEADER_NAME","ApiResource","RatingsAndReviewsApiSdk","serviceName","serviceVersion","delete","response","reponseHeaders","httpTransport","e","handleError","debounceInterval","bypassCache","patch","post","put","requestType","originalPayload","logger","error","triggerType","message","context","subdomain","businessUnitId","ELCLogger","addHeader","header","addGlobalHeaders","removeHeader","headerName","removeGlobalHeader","setBearerToken","bearerToken","buildUrl","pageIds","resource","joinedPageIds","getRatingSnippetsData","Snippet","results","err","getReviewsData","Reviews","PowerReviewsInitializedUseCase","powerReviewsProduct","renderReviews","reviewSection","classList","remove","ReadReviewsClickedUseCase","reviewsSection","scrollIntoView","behavior","block","WriteReviewClickedUseCase","reviewInfo","createReviewLink","reviewLink","defaultReviewPath","click","assign","ProductFullLoadedUseCase","ServiceBusController","powerReviewsInitialized","powerReviewsInitializedUseCase","readReviewsLinkClicked","writeReviewsLinkClicked","productFullLoaded","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","useCase","register","factory","c","RatingsReviewsService","serviceInitializer","reviewSnippetServiceName","reviewSnippetServiceVersion","lazyInject","container","descriptor","resourceName","sbGetter","Error","propertyDescriptor","defineProperty"],"sourceRoot":""}