{"version":3,"sources":["webpack://web/./Scripts/react/libs/deals/feature/DiscountedProductsInGroup.tsx","webpack://web/./Scripts/react/search/search.tsx","webpack://web/./Scripts/react/search/index.tsx"],"names":["DiscountedProductsInGroup","groupId","numericGroupId","parseInt","search","useLocation","params","URLSearchParams","searchSource","Array","from","filter","x","toLowerCase","_a","_b","useGetDiscountedProductsQuery","fetchPolicy","variables","groupuid","searchsource","loading","newData","data","previousData","_c","getDiscountedProducts","discountedProducts","useMemo","results","length","window","location","replace","Id","showLoading","searchResultsScaffold","stullerMetadata","useEffect","pageTitle","document","title","body","scrollIntoView","_jsx","LoadingIndicator","Object","children","_jsxs","className","Breadcrumbs","crumbs","EncodedText","Url","allowHtml","dangerouslySetInnerHTML","__html","id","map","productResult","index","ProductResultCard","showDiscounts","onProductSelected","position","directToPDP","toString","style","fontSize","Button","tag","color","href","SearchInner","pathname","usePathname","startsWith","slice","useGetSearchNavigationQuery","error","getSearchNavigation","context","useUserContext","SearchPresentationContext","includes","PresentationContext","canonicalLink","querySelector","newHref","origin","protocol","host","setAttribute","isDealsOrSalesEvent","categoryPermalinkId","CategoryId","IsContentOnlyDisplayTemplate","categoryPermalinkUrl","CategoryPermalinkUrl","queryReturnedBadJson","networkError","name","CustomApolloErrorNames","isContentOnlyDisplayTemplate","PageTitle","RedirectUrl","BrowserRedirect","url","NotFoundPage","DynamicErrorPage","addQuerystringHack","Permalink","categoryId","CmsContentProvider","ProductNavigationContext","value","ProductNavigationInner","navProps","scaffold","ContentOnlyView","contentId","ContentId","reactApp","initPathname","useState","trackInitial","setTrackInitial","groupid","get","Switch","Route","path","ROUTES","TrackComponentLoad","EmbeddedSvgLoader","render","skipTracking"],"mappings":"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","file":"search.1b52f0d65c9d62b9f314.react.bundle.js","sourcesContent":["import { ReactElement, useMemo, useEffect } from 'react'\nimport { SearchScaffoldViewModel, useGetDiscountedProductsQuery, DiscountedProductResult } from '@web/shared-data-access-queries'\nimport { ProductResultCard } from '@web/product-navigation-feature'\nimport { LoadingIndicator, Breadcrumbs, BreadcrumbViewModel, Button } from '@web/shared-ui-components'\nimport { useLocation } from 'react-router-dom'\n\ninterface DiscountedProductsInGroupProps {\n  groupId: string\n}\n\nfunction DiscountedProductsInGroup ({ groupId }: DiscountedProductsInGroupProps): ReactElement | null {\n  const numericGroupId = parseInt(groupId)\n  const { search } = useLocation()\n  const params = new URLSearchParams(search)\n  const searchSource = Array.from(params).filter(x => x[0].toLowerCase() === 'searchsource')?.[0]?.[1]\n  const { loading, data: newData, previousData } = useGetDiscountedProductsQuery({\n    fetchPolicy: 'no-cache',\n    variables: {\n      groupuid: numericGroupId,\n      searchsource: searchSource\n    }\n  })\n  const data = ((loading && newData == null) ? previousData : newData)?.getDiscountedProducts\n\n  const discountedProducts = useMemo(() => {\n    const results = data?.results\n    if (results != null && results.length === 1) {\n      window.location.replace(`/products/details?iid=${results[0].Id}&gid=${groupId}&recommendationSource=Web_Overstock`)\n    }\n    return data?.results\n  }, [data?.results])\n\n  const showLoading = useMemo(() => loading || (data != null && data?.results.length <= 1), [data?.results, loading])\n\n  const breadcrumbs: BreadcrumbViewModel[] = [\n    { EncodedText: 'Deals', Url: '/deals' },\n    { EncodedText: 'Items on sale' }\n  ]\n\n  const searchResultsScaffold: SearchScaffoldViewModel = useMemo(() => window.stullerMetadata?.searchResultsScaffold, [])\n  const pageHeader = 'Discounted Products In Group'\n\n  useEffect(() => {\n    if (searchResultsScaffold.pageTitle != null) {\n      window.document.title = searchResultsScaffold.pageTitle\n    }\n  }, [searchResultsScaffold.pageTitle])\n\n  // scroll to the top of the page every time the component rerenders\n  useEffect(() => {\n    window.document.body.scrollIntoView()\n  })\n\n  return (\n    <LoadingIndicator loading={showLoading}>\n      {!showLoading &&\n        <>\n          <div className='u-flex-grid-row'>\n            <div className='col-12'>\n              <Breadcrumbs crumbs={breadcrumbs} allowHtml />\n            </div>\n            <div className='col-12'>\n              <h1 className='searchResultsForLabel' dangerouslySetInnerHTML={{ __html: pageHeader }} />\n            </div>\n          </div>\n          <div className='productResults'>\n            <div id='results'>\n              <div className='productResultGrid u-flex-grid-row pt-4'>\n                {discountedProducts?.map((productResult, index) =>\n                  <ProductResultCard<DiscountedProductResult>\n                    key={`${productResult?.Id.toString() ?? index}-productCard`}\n                    productResult={productResult}\n                    searchSource={null}\n                    showDiscounts\n                    onProductSelected={() => null}\n                    position={index}\n                    className='u-flex-grid-col-xl-3 u-flex-grid-col-lg-4 u-flex-grid-col-sm-6 col-12'\n                    directToPDP\n                    groupId={numericGroupId}\n                  />\n                )}\n              </div>\n            </div>\n          </div>\n          <div className='col-xs-12'>\n            <div className='col-sm-6 col-sm-offset-3 text-center c-bg-gray-lt-3 py-4 mt-4 position-relative u-border-radius-medium'>\n              <div className='f-roboto-light pb-5 view-all-title' style={{ fontSize: '22px' }}>\n                Want to view items not included in the current sale?\n              </div>\n              <Button tag='a' color='primary' href={`/products/${numericGroupId}/?groupId=${numericGroupId}`}>\n                View All Available Items\n              </Button>\n            </div>\n          </div>\n        </>}\n    </LoadingIndicator>\n  )\n}\n\nexport { DiscountedProductsInGroup }\n","import { ReactElement, useEffect, useState, useMemo } from 'react'\nimport { useLocation, Switch, Route } from 'react-router-dom'\nimport {\n  useGetSearchNavigationQuery,\n  SearchScaffoldViewModel\n} from '@web/shared-data-access-queries'\nimport {\n  BrowserRedirect,\n  EmbeddedSvgLoader,\n  LoadingIndicator,\n  NotFoundPage,\n  DynamicErrorPage,\n  CmsContentProvider,\n  TrackComponentLoad\n} from '@web/shared-ui-components'\nimport { ContentOnlyView, ProductNavigationInner, Permalink, ProductNavigationContext } from '@web/product-navigation-feature'\nimport { CustomApolloErrorNames } from '@web/shared-data-access-apollo'\nimport { ROUTES, SearchPresentationContext } from '@web/product-navigation-types'\nimport { DiscountedProductsInGroup } from 'libs/deals/feature/DiscountedProductsInGroup'\nimport { useUserContext } from '@web/shared-data-access-context'\n\n// TODO: Fold SearchInner back into Search when Context wrapper isn't needed\nfunction Search (): ReactElement {\n  const { loading, context } = useUserContext()\n  const { pathname, search } = useLocation()\n  const initPathname = useMemo(() => pathname, [])\n  const [trackInitial, setTrackInitial] = useState(false)\n\n  // look for some param in the query string...\n  const params = useMemo(() => new URLSearchParams(search), [search])\n  const groupid = useMemo(() => params.get('groupid'), [params])\n\n  useEffect(() => {\n    setTrackInitial(true)\n  }, [])\n\n  return (\n    <Switch>\n      <Route path={ROUTES.DiscountedProductsInGroup}>\n        {context != null && groupid &&\n          <TrackComponentLoad trackInitial={trackInitial}>\n            <DiscountedProductsInGroup groupId={groupid} />\n          </TrackComponentLoad>}\n      </Route>\n      <Route path={[ROUTES.Articles, ROUTES.Browse, ROUTES.Search, initPathname]}>\n        <TrackComponentLoad trackInitial={trackInitial}>\n          <EmbeddedSvgLoader />\n          <LoadingIndicator loading={loading}>\n            {context != null && <SearchInner />}\n          </LoadingIndicator>\n        </TrackComponentLoad>\n      </Route>\n      <Route path='*' render={() => <BrowserRedirect url={pathname + search} addQuerystringHack replace />} />\n    </Switch>\n  )\n}\n\nfunction SearchInner (): ReactElement | null {\n  /**\n   * this query is going to get hit for every back button (i.e. will pile up requests and not cancel subsequent calls)\n   * one solution would be to introduce a(nother) in-between component that would rerender where the query aborts need to happen\n   */\n  const searchResultsScaffold: SearchScaffoldViewModel = useMemo(() => window.stullerMetadata?.searchResultsScaffold, [])\n  const { pathname, search } = useLocation()\n  const usePathname = pathname.startsWith('/') ? pathname.slice(1) : pathname\n  const params = new URLSearchParams(search)\n  const { loading, data: newData, previousData, error } = useGetSearchNavigationQuery({\n    fetchPolicy: 'no-cache',\n    variables: {\n      pathname: usePathname, // String argument must only be the current path (without leading slash)\n      search: params.toString()\n    }\n  })\n  const data = ((loading && newData == null) ? previousData : newData)?.getSearchNavigation\n  const { context } = useUserContext()\n\n  // Scroll to the top of the page every time the component rerenders\n  useEffect(() => {\n    window.document.body.scrollIntoView()\n    if (data != null && [SearchPresentationContext.Browse, SearchPresentationContext.Deals].includes(data?.PresentationContext)) {\n      const canonicalLink = document.querySelector('link[rel=\"canonical\"]')\n      if (canonicalLink != null) {\n        // Construct the new URL without query parameters\n        const origin = (window.location.origin != null && window.location.origin !== '')\n          ? window.location.origin\n          : (window.location.protocol + '//' + window.location.host)\n        const path = window.location.pathname.replace(/\\/$/, '') // Remove trailing slash if needed\n        const newHref = origin + path\n\n        // Update the href attribute\n        canonicalLink.setAttribute('href', newHref.toLowerCase())\n      }\n    }\n  })\n\n  const isDealsOrSalesEvent = useMemo(() => data != null && [\n    SearchPresentationContext.Deals,\n    SearchPresentationContext.SalesEvent,\n    SearchPresentationContext.StullerFirstSale\n  ].includes(data.PresentationContext), [data?.PresentationContext])\n\n  const categoryPermalinkId = useMemo(() => {\n    if (context != null && data?.CategoryId != null && !data?.IsContentOnlyDisplayTemplate && !isDealsOrSalesEvent) {\n      return data.CategoryId\n    } else {\n      return null\n    }\n  }, [context, data?.CategoryId, data?.IsContentOnlyDisplayTemplate, isDealsOrSalesEvent])\n  const categoryPermalinkUrl = data?.CategoryPermalinkUrl ?? 'http://webadmin.stuller.com/mvc/Category.mvc'\n\n  const queryReturnedBadJson = useMemo(() => error?.networkError?.name === CustomApolloErrorNames.JSON_RESPONSE_TYPE_ERR, [error])\n  const isContentOnlyDisplayTemplate = data?.IsContentOnlyDisplayTemplate ?? false\n\n  useEffect(() => {\n    if (searchResultsScaffold.pageTitle != null) {\n      window.document.title = searchResultsScaffold.pageTitle\n    }\n  }, [])\n\n  useEffect(() => {\n    if (data?.PageTitle != null) {\n      window.document.title = data.PageTitle\n    }\n  }, [data?.PageTitle])\n\n  if (data?.RedirectUrl != null && data.RedirectUrl !== '') {\n    return <BrowserRedirect url={data.RedirectUrl} replace />\n  }\n\n  return (\n    <LoadingIndicator loading={loading}>\n      {!loading && data == null && error == null && <NotFoundPage />}\n      {error != null && !queryReturnedBadJson && <DynamicErrorPage />}\n      {queryReturnedBadJson && <BrowserRedirect url={`${pathname}${search}`} replace addQuerystringHack />}\n      <div id='catalog'>\n        {categoryPermalinkId != null && <Permalink categoryId={categoryPermalinkId} categoryPermalinkUrl={categoryPermalinkUrl} />}\n      </div>\n      {data != null &&\n        <CmsContentProvider categoryId={data.CategoryId}>\n          {!isContentOnlyDisplayTemplate &&\n            <ProductNavigationContext.Provider value={data}>\n              <ProductNavigationInner navProps={data} scaffold={searchResultsScaffold} />\n            </ProductNavigationContext.Provider>}\n          {isContentOnlyDisplayTemplate &&\n            <ContentOnlyView\n              contentId={data.ContentId}\n            />}\n        </CmsContentProvider>}\n    </LoadingIndicator>\n  )\n}\n\nexport { Search }\n","import { Search } from './search'\nimport { reactApp } from '@web/shared-ui-components'\n\nreactApp(Search, '#search-react-container', { skipTracking: true })\n"],"sourceRoot":""}