{"version":3,"file":"review-Jqol8oMg.js","sources":["../../../app/javascript/components/common/dropdown_pill/DropdownPill.tsx","../../../app/javascript/components/ProCheckbox.jsx","../../../app/javascript/components/review_tiles/filters/RatingFilter.tsx","../../../app/javascript/components/review_tiles/filters/ReviewFilters.tsx","../../../app/javascript/components/fields/InvisibleRadioButton.tsx","../../../app/javascript/components/fields/withRadioGroup.tsx","../../../app/javascript/components/review_tiles/filters/SharedWithSupplierFilter.tsx","../../../app/javascript/components/review_tiles/filters/SupplierReplyFilter.tsx","../../../app/javascript/components/review_tiles/filters/ReviewFiltersContainer.tsx","../../../app/javascript/components/common/callout/Callout.tsx","../../../app/javascript/components/common/button/GetMoreReviewsButton.tsx","../../../app/javascript/components/common/callout/ReviewVisibilityCallout.tsx","../../../app/javascript/components/supplier_show/prop_shapes/star_ratings.ts","../../../app/javascript/components/supplier_show/prop_shapes/review.ts"],"sourcesContent":["import React from 'react'\n\n// Parent components can use this interface to ensure they have the properties needed to sync multiple dropdowns\nexport interface DropdownPillSyncProps {\n isExpanded: boolean\n id: string\n onClick: (id: string | null) => void\n}\n\ninterface DropdownPillBaseProps {\n labelText: string\n children?: React.ReactNode\n canClickOnContent?: boolean\n style?: string\n}\n\ntype DropdownPillProps = DropdownPillBaseProps & Partial<DropdownPillSyncProps>\n\nconst toExpandIcon = <i className='fa-solid fa-chevron-down' />\nconst toCollapseIcon = <i className='fa-solid fa-chevron-up' />\n\n/**\n * Button that expands or hides its children\n * @param id Identify the element to parent handlers\n * @param labelText Label for the Button\n * @param children The elements to show or hide\n * @param onClick Passes the component id as an argument\n * @param canClickOnContent Flag to indicate whether clicking on child content should trigger click handler\n * @param isExpanded Flag to inedicate whether content should be displayed or not\n * @param style Class to apply to container\n */\nexport const DropdownPill: React.FC<DropdownPillProps> = ({\n id = null,\n labelText,\n children,\n onClick = () => {},\n canClickOnContent = true,\n isExpanded = false,\n style\n}) => {\n const icon = isExpanded ? toCollapseIcon : toExpandIcon\n\n const handleClick = (): void => {\n onClick(id)\n }\n\n const contentToggle = (): void => {\n if (canClickOnContent) {\n handleClick()\n }\n }\n\n const dropdownContent = isExpanded\n ? <div onClick={contentToggle}>{children}</div>\n : <div className='hidden'>{children}</div>\n\n return (\n <div className={style}>\n <button className='dropdown-pill-button' onClick={handleClick}>{labelText}{icon}</button>\n <div className='dropdown-pill-children'>\n {dropdownContent}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport const ProCheckbox = ({ children, isChecked, setIsChecked, name }) => {\n const handleChange = () => {\n setIsChecked(!isChecked)\n }\n\n return (\n <label className='procurated-checkbox'>\n <input\n type='checkbox'\n name={name}\n checked={isChecked}\n onChange={handleChange}\n id={name}\n />\n {children}\n </label>\n )\n}\n\nProCheckbox.propTypes = {\n isChecked: PropTypes.bool.isRequired,\n setIsChecked: PropTypes.func.isRequired,\n name: PropTypes.string.isRequired\n}\n","import React, { useState } from 'react'\nimport { DropdownPill, DropdownPillSyncProps } from 'components/common/dropdown_pill/DropdownPill'\nimport { ProCheckbox } from 'components/ProCheckbox'\n\nenum ReviewRating {\n Star5 = '5',\n Star4 = '4',\n Star3 = '3',\n Star2 = '2',\n Star1 = '1'\n}\n\nexport type RatingSelections = ReviewRating[]\n\ninterface RatingFilterBaseProps {\n onChange: (selections: RatingSelections) => void\n}\n\ntype RatingFilterProps = RatingFilterBaseProps & Partial<DropdownPillSyncProps>\n\nexport const AllReviewRatingSelectors = Object.values(ReviewRating)\n\nconst sortReviewSelections = (ratings: RatingSelections): RatingSelections => ratings.sort(\n (a, b) => (AllReviewRatingSelectors.indexOf(a) - AllReviewRatingSelectors.indexOf(b))\n)\n\nexport const RatingFilter: React.FC<RatingFilterProps> = (props) => {\n const { onChange } = props\n const [isAllSelected, setIsAllSelected] = useState<boolean>(true)\n const [selections, setSelections] = useState<RatingSelections>(AllReviewRatingSelectors)\n\n const syncProps: DropdownPillSyncProps = {\n id: props.id ?? 'none',\n isExpanded: props.isExpanded ?? false,\n onClick: props.onClick ?? (() => { console.error('Dropdown onClick handler not set') })\n }\n\n const handleChange = (selections: RatingSelections): void => {\n const sortedSelections = sortReviewSelections(selections)\n setSelections(sortedSelections)\n onChange(sortedSelections)\n }\n\n const toggleAllChecked = (): void => {\n const wasAllSelected = isAllSelected\n const updatedSelection = wasAllSelected ? [] : AllReviewRatingSelectors\n setIsAllSelected(!wasAllSelected)\n handleChange(updatedSelection)\n }\n\n const updateSelection = (selectedItem: ReviewRating) => () => {\n setIsAllSelected(false)\n const updatedSelections = selections.includes(selectedItem)\n // remove item from array\n ? selections.filter(i => i !== selectedItem)\n // add item to array\n : [selectedItem, ...selections]\n handleChange(updatedSelections)\n }\n\n const rating5 = ReviewRating.Star5\n const rating4 = ReviewRating.Star4\n const rating3 = ReviewRating.Star3\n const rating2 = ReviewRating.Star2\n const rating1 = ReviewRating.Star1\n\n const ratingsFilterLabel = (): string => {\n if (isAllSelected || selections.length === 0) { return 'Rating' }\n if (selections.length === AllReviewRatingSelectors.length) { return 'All Ratings' }\n if (selections.length === 1) {\n if (selections[0] === ReviewRating.Star1) {\n return '1 Star'\n } else {\n return `${selections[0]} Stars`\n }\n }\n const [lastValue, ...rest] = selections\n const commaSeparated = rest.reverse().join(',')\n return `${commaSeparated} & ${lastValue} Stars`\n }\n\n return (\n <DropdownPill labelText={ratingsFilterLabel()} canClickOnContent={false} {...syncProps}>\n <div className='review-ratings-filter review-filter'>\n <div className='review-ratings-checklist'>\n <ProCheckbox isChecked={isAllSelected} setIsChecked={toggleAllChecked} name='all'>All Ratings</ProCheckbox>\n <ProCheckbox isChecked={selections.includes(rating5)} setIsChecked={updateSelection(rating5)} name='5star'>5 Stars</ProCheckbox>\n <ProCheckbox isChecked={selections.includes(rating4)} setIsChecked={updateSelection(rating4)} name='4star'>4 Stars</ProCheckbox>\n <ProCheckbox isChecked={selections.includes(rating3)} setIsChecked={updateSelection(rating3)} name='3star'>3 Stars</ProCheckbox>\n <ProCheckbox isChecked={selections.includes(rating2)} setIsChecked={updateSelection(rating2)} name='2star'>2 Stars</ProCheckbox>\n <ProCheckbox isChecked={selections.includes(rating1)} setIsChecked={updateSelection(rating1)} name='1star'>1 Star</ProCheckbox>\n </div>\n </div>\n </DropdownPill>\n )\n}\n","import React, { useState } from 'react'\nimport { DropdownPillSyncProps } from 'components/common/dropdown_pill/DropdownPill'\n\ninterface ReviewFiltersProps {\n dropdownFilters: React.ReactElement[]\n}\n\ntype IdState = string | null\n\nexport const ReviewFilters: React.FC<ReviewFiltersProps> = ({ dropdownFilters }) => {\n const [expandedFilterKey, setExpandedFilterKey] = useState<IdState>(null)\n\n const handleShouldOpen = (id: IdState): void => {\n setExpandedFilterKey(id)\n }\n\n const handleShouldClose = (_id: IdState): void => {\n setExpandedFilterKey(null)\n }\n\n // Inject handlers and id into review filters.\n // Note that if the review filter is not a Dropdown component,\n // then it must pass the injected props down to the dropdown component\n const reviewFilters = dropdownFilters?.map((filter, index) => {\n const { id } = filter?.props\n const filterId = id ?? `${index}`\n const isExpanded = expandedFilterKey === filterId\n const onClick = isExpanded ? handleShouldClose : handleShouldOpen\n const syncProps: DropdownPillSyncProps = {\n id: filterId,\n isExpanded,\n onClick\n }\n return React.cloneElement(filter, { ...syncProps })\n })\n\n return (\n <div className='review-filters'>\n {reviewFilters}\n </div>\n )\n}\n","import React from 'react'\n\nexport interface InvisibleRadioButtonProps {\n label: string\n optionValue: string\n selectedValue: string\n groupName?: string\n}\n\n/**\n * Example with two radio buttons (in the same group)\n * const selectedOption = 'option-2'\n * <InvisibleRadioButton itemLabel='Option 1' itemType='option-1' selectionType={selectedOption} groupName='group' />\n * <InvisibleRadioButton itemLabel='Option 2' itemType='option-1' selectionType={selectedOption} groupName='group'/>\n * @param label User visible label\n * @param optionValue Option value to pass when this item is selected\n * @param selectedValue The currently selected value (to indicate whether the button is active or not)\n * @param groupName The name of the group this radio button belongs to\n * @constructor\n */\nexport const InvisibleRadioButton: React.FC<InvisibleRadioButtonProps> = (\n { label, optionValue, selectedValue, groupName }\n) => {\n const group = groupName ?? 'invisible-radio-group'\n const isActive = optionValue === selectedValue\n\n const itemClass = isActive ? 'item active' : 'item'\n\n return (\n <label className='invisible-radio'>\n <input className='invisible-radio' type='radio' name={group} value={optionValue} defaultChecked={isActive} />\n <span className={itemClass}>{label}</span>\n </label>\n )\n}\n","import React from 'react'\nimport { InvisibleRadioButton, InvisibleRadioButtonProps } from 'components/fields/InvisibleRadioButton'\n\nconst withRadioGroup = (groupName: string) => function InvisibleRadioButtonWithGroupName (props: InvisibleRadioButtonProps) {\n return <InvisibleRadioButton {...props} groupName={groupName} />\n}\n\nexport default withRadioGroup\n","import React, { useContext, useState } from 'react'\nimport { AuthContext, verifiedAgencyUser } from 'components/common/auth/AuthContext'\nimport { DropdownPill, DropdownPillSyncProps } from 'components/common/dropdown_pill/DropdownPill'\nimport withRadioGroup from 'components/fields/withRadioGroup'\n\nconst SharedWithSupplierSelectionMap = {\n all: 'Visibility',\n shared: 'Shared with Supplier',\n notShared: 'Not Shared with Supplier'\n} as const\nexport type SharedWithSupplierSelectionMapKey = keyof typeof SharedWithSupplierSelectionMap\n\ninterface SharedWithSupplierFilterBaseProps {\n onChange: (selection: SharedWithSupplierSelectionMapKey) => void\n}\n\ntype SharedWithSupplierFilterProps = SharedWithSupplierFilterBaseProps & Partial<DropdownPillSyncProps>\n\nconst ShareFilterItem = withRadioGroup('share')\n\nexport const SharedWithSupplierFilter: React.FC<SharedWithSupplierFilterProps> = ({ onChange, ...dropdownProps }) => {\n const [selection, setSelection] = useState<SharedWithSupplierSelectionMapKey>('all')\n\n const label = SharedWithSupplierSelectionMap[selection]\n\n const authContext = useContext(AuthContext)\n const isAgencyUser = verifiedAgencyUser(authContext)\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n const selection = (e.target.value in SharedWithSupplierSelectionMap) ? e.target.value as SharedWithSupplierSelectionMapKey : 'all'\n setSelection(selection)\n onChange(selection)\n }\n\n const syncProps: DropdownPillSyncProps = {\n id: dropdownProps.id ?? 'none',\n isExpanded: dropdownProps.isExpanded ?? false,\n onClick: dropdownProps.onClick ?? (() => { console.error('Dropdown onClick handler not set') })\n }\n\n return (\n <>\n {isAgencyUser &&\n <DropdownPill labelText={label} {...syncProps}>\n <div className='shared-with-supplier-filters review-filter' onChange={handleChange}>\n <ShareFilterItem label='All Visibility Types' optionValue='all' selectedValue={selection} />\n <ShareFilterItem label='Shared with Supplier' optionValue='shared' selectedValue={selection} />\n <ShareFilterItem label='Not Shared with Supplier' optionValue='notShared' selectedValue={selection} />\n </div>\n </DropdownPill>}\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { DropdownPill, DropdownPillSyncProps } from 'components/common/dropdown_pill/DropdownPill'\nimport withRadioGroup from 'components/fields/withRadioGroup'\n\nconst ReplySelectionMap = {\n all: 'Replies',\n withReplies: 'With Replies',\n withoutReplies: 'Without Replies'\n} as const\nexport type ReplySelectionMapKey = keyof typeof ReplySelectionMap\n\ninterface SupplierReplyFilterBaseProps {\n onChange: (selection: ReplySelectionMapKey) => void\n}\n\ntype SupplierReplyFilterProps = SupplierReplyFilterBaseProps & Partial<DropdownPillSyncProps>\n\nconst ReplyFilterItem = withRadioGroup('reply')\n\nexport const SupplierReplyFilter: React.FC<SupplierReplyFilterProps> = ({ onChange, ...dropdownProps }) => {\n const [selection, setSelection] = useState<ReplySelectionMapKey>('all')\n\n const label = ReplySelectionMap[selection]\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n const selection = (e.target.value in ReplySelectionMap) ? e.target.value as ReplySelectionMapKey : 'all'\n setSelection(selection)\n onChange(selection)\n }\n\n const syncProps: DropdownPillSyncProps = {\n id: dropdownProps.id ?? 'none',\n isExpanded: dropdownProps.isExpanded ?? false,\n onClick: dropdownProps.onClick ?? (() => { console.error('Dropdown onClick handler not set') })\n }\n\n return (\n <DropdownPill labelText={label} {...syncProps}>\n <div className='supplier-reply-filters review-filter' onChange={handleChange}>\n <ReplyFilterItem label='All Reply Types' optionValue='all' selectedValue={selection} />\n <ReplyFilterItem label='With Replies' optionValue='withReplies' selectedValue={selection} />\n <ReplyFilterItem label='Without Replies' optionValue='withoutReplies' selectedValue={selection} />\n </div>\n </DropdownPill>\n )\n}\n","import React, { useEffect, useState, useContext } from 'react'\nimport PropTypes from 'prop-types'\n\nimport {\n RatingFilter, AllReviewRatingSelectors, type RatingSelections,\n ReviewFilters,\n SharedWithSupplierFilter,\n SupplierReplyFilter, type ReplySelectionMapKey, SharedWithSupplierSelectionMapKey\n} from 'components/review_tiles/filters'\nimport { AuthContext, verifiedAgencyUser, AuthState } from 'components/common/auth/AuthContext'\n\nconst ReplyFilterMap = {\n all: {},\n withReplies: { replied_to: true },\n withoutReplies: { replied_to: false }\n} as const\ntype ReplyFilterMapKey = keyof typeof ReplyFilterMap\ntype ReplyFilterMapValue = typeof ReplyFilterMap[ReplyFilterMapKey]\n\nconst SharedWithSupplierFilterMap = {\n all: {},\n shared: { shared: true },\n notShared: { shared: false }\n} as const\ntype SharedWithSupplierFilterMapKey = keyof typeof SharedWithSupplierFilterMap\ntype SharedWithSupplierFilterMapValue = typeof SharedWithSupplierFilterMap[SharedWithSupplierFilterMapKey]\n\ninterface RatingSelectionParam {\n stars: RatingSelections\n}\n\nexport type EmptyReviewFilterParams = Record<never, never>\n\nexport interface ReviewFilterContainerParams {\n reply_to?: boolean\n shared?: boolean\n stars?: RatingSelections\n}\n\ninterface ReviewFiltersContainerProps {\n handleFiltersQuery: (query: ReviewFilterContainerParams) => void\n}\n\nconst ratingSelectionsToParam = (selections: RatingSelections): RatingSelectionParam => {\n return { stars: selections }\n}\n\nexport const ReviewFiltersContainer: React.FC<ReviewFiltersContainerProps> = ({ handleFiltersQuery }) => {\n const [replyParams, setReplyParams] = useState<ReplyFilterMapValue>(ReplyFilterMap.all)\n const [sharedParams, setSharedParams] = useState<SharedWithSupplierFilterMapValue>(SharedWithSupplierFilterMap.all)\n const [ratings, setRatings] = useState<RatingSelections>(AllReviewRatingSelectors)\n\n const handleReplyFilterChange = (selection: ReplySelectionMapKey): void => {\n const replySelection = (selection in ReplyFilterMap) ? selection : 'all'\n setReplyParams(ReplyFilterMap[replySelection])\n }\n\n const handleSharedWithSupplierFilterChange = (selection: SharedWithSupplierSelectionMapKey): void => {\n const shareSelection = (selection in SharedWithSupplierFilterMap) ? selection : 'all'\n setSharedParams(SharedWithSupplierFilterMap[shareSelection])\n }\n\n const handleRatingFilterChange = (selections: RatingSelections): void => {\n setRatings(selections.length === 0 ? AllReviewRatingSelectors : selections)\n }\n\n const authContext = useContext<AuthState>(AuthContext)\n\n const agencyUserSharedWithSupplierFilter = verifiedAgencyUser(authContext)\n ? (<SharedWithSupplierFilter key='1' onChange={handleSharedWithSupplierFilterChange} />)\n : null\n\n const dropdownFilters = [\n <SupplierReplyFilter key='0' onChange={handleReplyFilterChange} />,\n agencyUserSharedWithSupplierFilter,\n <RatingFilter key='2' onChange={handleRatingFilterChange} />\n ].filter(Boolean) as React.ReactElement[]\n\n const reviewFilterParams = (): ReviewFilterContainerParams => {\n return { ...replyParams, ...sharedParams, ...ratingSelectionsToParam(ratings) }\n }\n\n useEffect(() => {\n handleFiltersQuery(reviewFilterParams())\n }, [replyParams, sharedParams, ratings])\n\n return (\n <div className='canary-review-filters'>\n <ReviewFilters dropdownFilters={dropdownFilters} />\n </div>\n )\n}\n\nReviewFiltersContainer.propTypes = {\n handleFiltersQuery: PropTypes.func.isRequired\n}\n","import React from 'react'\n\ninterface CalloutProps {\n callout?: string\n}\n\nexport const Callout: React.FC<CalloutProps> = (props) => {\n const calloutTextPresent = props.callout !== null && props.callout !== ''\n\n const calloutText = (): string => {\n if (calloutTextPresent) {\n return props.callout as string\n } else {\n return 'NOT PROVIDED'\n }\n }\n\n const calloutClasses = (): string => {\n if (calloutTextPresent) {\n return 'color-pro-steel-grey-600 font-bold'\n } else {\n return 'color-pro-steel-grey-500'\n }\n }\n\n return (\n <div className={`pro-callout pro-rounded pro-text-xs color-pro-blue-700 display-inline-block ${calloutClasses()}`}>\n {calloutText()}\n </div>\n )\n}\n","import React from 'react'\nimport { businessInfoReviewCollectionPath } from 'components/routes/path'\n\ninterface GetMoreReviewsButtonProps {\n slug: string\n}\n\nexport const GetMoreReviewsButton: React.FC<GetMoreReviewsButtonProps> = ({ slug }) => {\n const buttonText: string = 'Get More Reviews'\n\n return (\n <span>\n <a\n className='button icon-button pro-rounded pro-orange-400 pro-closest-shadow supplier-profile-button'\n href={businessInfoReviewCollectionPath(slug)}\n target='_blank'\n rel='noreferrer'\n >\n {buttonText}\n </a>\n </span>\n )\n}\n","import React, { useContext } from 'react'\nimport { AuthContext, AuthState, isSupplierOwner } from 'components/common/auth/AuthContext'\nimport { GetMoreReviewsButton } from 'components/common/button/GetMoreReviewsButton'\n\ninterface ReviewVisibilityCalloutProps {\n proSupplier: boolean\n slug: string\n}\n\nexport const ReviewVisibilityCallout: React.FC<ReviewVisibilityCalloutProps> = ({ proSupplier, slug }) => {\n const context: AuthState = useContext(AuthContext)\n\n const tooltipContent: string = `\n <div>\n <b>Where are the reviews?</b>\n </div>\n <br />\n <div>\n An individual review appears on your view of your supplier profile when the author explicitly chooses to make \n their review visible to you. This option creates a space where buyers can feel comfortable sharing their honest experiences\n with each other, and consider this as a channel to share praise and actionable feedback with you. For more on why \n we do this, check out <a class='tooltip-link' href='/resources/the-procurated-promise'>The Procurated Promise</a>.\n </div>\n `\n\n return (\n <>\n <div className='review-visibility-callout-container'>\n <span\n className='pro-tooltip-link body-tooltip label-tooltip'\n tabIndex={2}\n data-tooltip='true'\n data-allow-html='true'\n data-position='right'\n data-alignment='center'\n data-disable-hover='true'\n title={tooltipContent}\n >\n Where are the reviews? <i className='far fa-question-circle' />\n </span>\n {isSupplierOwner(context) && <GetMoreReviewsButton slug={slug} />}\n </div>\n </>\n )\n}\n\nReviewVisibilityCallout.defaultProps = {\n proSupplier: false\n}\n","import PropTypes from 'prop-types'\nimport { SingleStarRating } from 'components/common/rating/types'\n\nexport default PropTypes.shape({\n overall_rating: PropTypes.number.isRequired,\n price_rating: PropTypes.number.isRequired,\n quality_rating: PropTypes.number.isRequired,\n service_rating: PropTypes.number.isRequired,\n timeliness_rating: PropTypes.number.isRequired\n})\n\nexport interface StarRatings {\n overall_rating: SingleStarRating\n price_rating: SingleStarRating\n quality_rating: SingleStarRating\n service_rating: SingleStarRating\n timeliness_rating: SingleStarRating\n}\n","import PropTypes from 'prop-types'\nimport StarRatingsShape from './star_ratings'\nimport type { StarRatings } from './star_ratings'\n\ninterface Author {\n contribution_count: number\n name: string\n organization?: string\n thumbnail: string\n}\n\ninterface ExternalId {\n source: string\n external_id: string\n}\n\nexport interface ReviewReply {\n id: number\n text: string\n updatedAt?: Date\n}\n\ntype ReviewStatus =\n | 'archived'\n | 'draft'\n | 'published'\n | 'quarantined'\n | 'submitted'\n | 'unknown_author'\n | 'unpublished'\n\ninterface SupplierExternalId {\n external_id: string\n source: string\n}\n\nexport interface Review {\n author: Author\n auto_published: boolean\n body: string\n can_direct_message: boolean\n can_edit: boolean\n contract?: string\n contract_vehicle?: string\n external_ids: ExternalId[]\n id: number\n net_promoter: number\n overall_rating: number\n price_rating: number\n quality_rating: number\n review_date: string\n review_reply?: ReviewReply\n service_rating: number\n share_with_supplier: boolean\n source: string\n star_ratings: StarRatings\n supplier_external_ids: SupplierExternalId[]\n supplier_id?: number\n supplier_logo_url?: string\n supplier_name?: string\n supplier_slug?: string\n status: ReviewStatus\n timeliness_rating: number\n title: string\n tracking?: string\n}\n\nconst authorShape = PropTypes.shape({\n contribution_count: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n organization: PropTypes.string,\n thumbnail: PropTypes.string.isRequired\n})\n\nconst supplierExternalIdsShape = PropTypes.shape({\n external_id: PropTypes.string.isRequired,\n source: PropTypes.string.isRequired\n})\n\nexport default PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n body: PropTypes.string.isRequired,\n author: authorShape.isRequired,\n auto_published: PropTypes.bool.isRequired,\n can_direct_message: PropTypes.bool.isRequired,\n can_edit: PropTypes.bool.isRequired,\n contract: PropTypes.string,\n contract_vehicle: PropTypes.string,\n net_promoter: PropTypes.number.isRequired,\n overall_rating: PropTypes.number.isRequired,\n price_rating: PropTypes.number.isRequired,\n quality_rating: PropTypes.number.isRequired,\n review_date: PropTypes.string.isRequired,\n service_rating: PropTypes.number.isRequired,\n share_with_supplier: PropTypes.bool.isRequired,\n source: PropTypes.string.isRequired,\n star_ratings: StarRatingsShape.isRequired,\n supplier_external_ids: PropTypes.arrayOf(supplierExternalIdsShape.isRequired),\n supplier_id: PropTypes.number,\n supplier_name: PropTypes.string,\n supplier_slug: PropTypes.string,\n supplier_logo_url: PropTypes.string,\n timeliness_rating: PropTypes.number.isRequired,\n tracking: PropTypes.string,\n external_ids: PropTypes.array.isRequired\n})\n"],"names":["toExpandIcon","jsx","toCollapseIcon","DropdownPill","id","labelText","children","onClick","canClickOnContent","isExpanded","style","icon","handleClick","contentToggle","dropdownContent","jsxs","ProCheckbox","isChecked","setIsChecked","name","handleChange","PropTypes","ReviewRating","AllReviewRatingSelectors","sortReviewSelections","ratings","a","b","RatingFilter","props","onChange","isAllSelected","setIsAllSelected","useState","selections","setSelections","syncProps","sortedSelections","toggleAllChecked","wasAllSelected","updatedSelection","updateSelection","selectedItem","updatedSelections","i","rating5","rating4","rating3","rating2","rating1","ratingsFilterLabel","lastValue","rest","ReviewFilters","dropdownFilters","expandedFilterKey","setExpandedFilterKey","handleShouldOpen","handleShouldClose","_id","reviewFilters","filter","index","filterId","React","InvisibleRadioButton","label","optionValue","selectedValue","groupName","group","isActive","itemClass","withRadioGroup","SharedWithSupplierSelectionMap","ShareFilterItem","SharedWithSupplierFilter","dropdownProps","selection","setSelection","authContext","useContext","AuthContext","isAgencyUser","verifiedAgencyUser","e","Fragment","ReplySelectionMap","ReplyFilterItem","SupplierReplyFilter","ReplyFilterMap","SharedWithSupplierFilterMap","ratingSelectionsToParam","ReviewFiltersContainer","handleFiltersQuery","replyParams","setReplyParams","sharedParams","setSharedParams","setRatings","handleReplyFilterChange","replySelection","handleSharedWithSupplierFilterChange","shareSelection","handleRatingFilterChange","agencyUserSharedWithSupplierFilter","reviewFilterParams","useEffect","Callout","calloutTextPresent","calloutText","calloutClasses","GetMoreReviewsButton","slug","businessInfoReviewCollectionPath","ReviewVisibilityCallout","proSupplier","context","isSupplierOwner","StarRatingsShape","authorShape","supplierExternalIdsShape","ReviewShape"],"mappings":"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"}