{"version":3,"file":"index-CLqG_x4x.js","sources":["../../../app/javascript/src/explore/scenes/ShopByRestaurant/scenes/Category/elements/Header/elements/CategoryCarousel/elements/Filter/index.tsx","../../../app/javascript/src/explore/scenes/ShopByRestaurant/scenes/Category/elements/Header/elements/CategoryCarousel/index.tsx","../../../app/javascript/src/explore/scenes/ShopByRestaurant/scenes/Category/elements/Header/index.tsx","../../../app/javascript/src/explore/scenes/ShopByRestaurant/scenes/Category/index.tsx","../../../app/javascript/src/explore/scenes/ShopByRestaurant/index.tsx"],"sourcesContent":["import * as React from 'react';\nimport cls from 'classnames';\nimport { Link } from 'react-router-dom';\n\nimport { Markdown } from 'src/explore/elements/Markdown';\nimport { SvgUse } from 'src/shoppe/elements/SvgUse';\nimport { useRoutes } from 'src/explore/hooks/useRoutes';\n\nimport styles from './index.module.sass';\n\ninterface Props {\n  active: boolean;\n  className?: string;\n  permalink: string;\n  title: string;\n}\n\nexport const Filter: React.FC<Props> = ({ active, className, permalink, title }) => {\n  const routes = useRoutes();\n\n  return (\n    <Link\n      to={routes.shopByRestaurantCategory( active ? '' : permalink )}\n      className={cls( styles.link, 'd-block text-decoration-none', className )}\n    >\n      <SvgUse\n        className={cls( 'd-inline-block', {\n          'text-secondary': active,\n        })}\n        height={32}\n        name={`category-${permalink}`}\n        width={32}\n      />\n\n      <Markdown className={cls( 'd-block mt-2', { 'text-secondary': active })}>{title}</Markdown>\n    </Link>\n  );\n};\n","import React from 'react';\nimport { Carousel } from '@goldbely/explore-component-library';\n\nimport { Filter } from './elements/Filter';\nimport { ICategory } from '../../../../types';\n\nimport styles from './index.module.sass';\n\ninterface CategoryCarouselProps {\n  active: ICategory;\n  categories: ICategory[];\n}\n\nexport const CategoryCarousel = ({ active, categories }: CategoryCarouselProps ) => (\n  <Carousel classNames={{ padding: `${styles.bumper} flex-shrink-0` }} jumpToEdgeChild withFade>\n    {categories.map(( category: ICategory, i: number ) => (\n      <div\n        className={`${styles.category} flex-shrink-0 ${\n          i === 0 ? 'mr-2 mx-md-2' : 'mx-2'\n        } text-center`}\n        key={category.permalink}\n      >\n        <Filter active={active === category} permalink={category.permalink} title={category.name} />\n      </div>\n    ))}\n  </Carousel>\n);\n","import * as React from 'react';\n\nimport { CategoryCarousel } from './elements/CategoryCarousel';\nimport { ICategory } from '../../types';\n\ninterface HeaderProps {\n  categories: ICategory[];\n  page: ICategory;\n}\n\nexport const Header: React.FC<HeaderProps> = ({ categories, page }) => (\n  <header className=\"mb-7 mb-lg-6 spec__shop-by-restaurant-categories\">\n    <h1 className=\"mb-6 mb-md-8 fs-8 fs-md-10 lh-1 text-uppercase\">\n      {categories.find(( category ) => category === page )?.name || 'Shop All Restaurants'}\n    </h1>\n\n    <CategoryCarousel active={page} categories={categories} />\n  </header>\n);\n","import * as React from 'react';\nimport camelCaseKeys from 'camelcase-keys';\nimport { Helmet } from 'react-helmet';\nimport { useLocation } from 'react-router-dom';\n\nimport { FilteredSearch } from 'src/explore/compositions/FilteredSearch';\nimport { MerchantGrid, IMerchant } from 'src/explore/compositions/MerchantGrid';\nimport { ISearchFilter } from 'src/explore/compositions/FilteredSearch/compositions/SearchFilter/types'; // FIXME: import\n\nimport { Header } from './elements/Header';\nimport { ICategory } from './types';\n\nconst ALL_SHOPS_CATEGORY: ICategory = { name: 'Shop All Restaurants', permalink: '' };\n// Order of filters is important!\nconst AVAILABLE_FILTERS: ISearchFilter[] = [ 'region', 'product_tags', 'on_sale' ];\n\ninterface Props {\n  categories: ICategory[];\n  availableFilters?: ISearchFilter[];\n}\n\nexport const Category: React.FC<Props> = ({ availableFilters = AVAILABLE_FILTERS, categories }) => {\n  const location = useLocation();\n  // FIXME: this should be using a router\n  const categorySlug = location.pathname\n    .replace( /\\/restaurants\\/?/, '' )\n    .replace( /categories\\//, '' );\n  let selectedCategory = categories.find(( category ) => category.permalink === categorySlug );\n  if ( selectedCategory === undefined ) {\n    selectedCategory = ALL_SHOPS_CATEGORY;\n  }\n\n  const params =\n    selectedCategory && selectedCategory.permalink !== ''\n      ? { 'categories.name': selectedCategory.name }\n      : {};\n\n  const seoCategoryName =\n    selectedCategory.name === ALL_SHOPS_CATEGORY.name\n      ? 'Top Restaurants & Food Makers'\n      : `Best ${selectedCategory.name}`;\n\n  return (\n    <>\n      <Helmet>\n        <title>{`America’s ${seoCategoryName} — Ship Nationwide on Goldbelly®`}</title>\n        <meta\n          name=\"description\"\n          content={`Order from America’s best ${\n            selectedCategory.name === ALL_SHOPS_CATEGORY.name\n              ? 'restaurants, bakeries, pizzerias, chefs & more gourmet food makers'\n              : selectedCategory.name.toLowerCase()\n          } online — shipped nationwide on Goldbelly®. Guaranteed to arrive fresh. Shop now!`}\n        />\n      </Helmet>\n\n      <div className=\"fs-4\">\n        <nav className=\"container-xl pt-12 pb-4 pb-lg-9 mt-1\">\n          <Header categories={categories} page={selectedCategory} />\n\n          <FilteredSearch<IMerchant>\n            apiPath=\"merchants\"\n            apiResponseParser={( response: any ) => Promise.resolve( response.data )}\n            availableFilters={availableFilters}\n            conditions={{ ...params, has_available_or_coming_soon_products: true }}\n            filterColumnClass=\"col-xl-2\"\n            filteredResultsColumnClass=\"col-xl-10\"\n            loadMore=\"Show More Food Makers\"\n            pageSize={30} // 15 rows\n            syncUrl\n            onRenderContent={({ data }) => (\n              <MerchantGrid\n                className=\"mt-n5 mt-lg-n3\"\n                merchants={camelCaseKeys( data, { deep: true })}\n              />\n            )}\n            onRenderHeader={({ filters: { product_tags }}) =>\n              product_tags && (\n                <h2 className=\"my-4 mt-sm-5 mb-sm-3 fs-6 fs-sm-8 spec__filter-diet-merchant-note\">\n                  {'Some '}\n                  <span className=\"text-secondary\">{( product_tags as any ).capitalize()}</span>\n                  {' Products May Be Available in These Shops'}\n                </h2>\n              )\n            }\n          >\n            <h1 className=\"py-8 text-center\">Sorry, no merchants found.</h1>\n          </FilteredSearch>\n        </nav>\n      </div>\n    </>\n  );\n};\n","import * as React from 'react';\nimport { BrowserRouter, Routes, Route } from 'react-router-dom';\n\nimport { useRoutes } from 'src/explore/hooks/useRoutes';\nimport { ScrollToTop } from 'src/explore/elements/ScrollToTop';\n\nimport { ISearchFilter } from 'src/explore/compositions/FilteredSearch/compositions/SearchFilter/types'; // FIXME: import\nimport { ICategory } from './scenes/Category/types';\nimport { Category } from './scenes/Category';\n\ninterface Props {\n  categories: ICategory[];\n}\n\nconst AVAILABLE_FILTERS: ISearchFilter[] = [ 'region', 'product_tags' ];\n\nconst ShopByRestaurant: React.FC<Props> = ({ categories }) => {\n  const routes = useRoutes();\n\n  return (\n    <BrowserRouter>\n      <ScrollToTop />\n      <Routes>\n        <Route\n          path={routes.shopByRestaurant( '*' )}\n          element={<Category availableFilters={AVAILABLE_FILTERS} categories={categories} />}\n        />\n        <Route\n          path={routes.shopByRestaurantCategory( '*' )}\n          element={<Category availableFilters={AVAILABLE_FILTERS} categories={categories} />}\n        />\n      </Routes>\n    </BrowserRouter>\n  );\n};\n\nexport default ShopByRestaurant;\n"],"names":["Filter","active","className","permalink","title","routes","useRoutes","React.createElement","Link","cls","styles","SvgUse","Markdown","CategoryCarousel","categories","React","Carousel","category","i","Header","page","_a","ALL_SHOPS_CATEGORY","AVAILABLE_FILTERS","Category","availableFilters","categorySlug","useLocation","selectedCategory","params","seoCategoryName","React.Fragment","Helmet","FilteredSearch","response","data","MerchantGrid","camelCaseKeys","product_tags","ShopByRestaurant","BrowserRouter","ScrollToTop","Routes","Route"],"mappings":"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"}