@jetshop/template-trend 5.8.3 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.linaria-cache/packages/template-trend/src/components/Auth/LogInPage.linaria.css +4 -4
  2. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/Address.linaria.css +1 -1
  3. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/CustomerType.linaria.css +1 -1
  4. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/LoginFields.linaria.css +1 -1
  5. package/.linaria-cache/packages/template-trend/src/components/Auth/Signup/SignUpPage.linaria.css +2 -2
  6. package/.linaria-cache/packages/template-trend/src/components/Auth/UI/Form.linaria.css +2 -2
  7. package/.linaria-cache/packages/template-trend/src/components/Cart/CartButton.linaria.css +2 -2
  8. package/.linaria-cache/packages/template-trend/src/components/Cart/CartFlyout.linaria.css +7 -7
  9. package/.linaria-cache/packages/template-trend/src/components/Cart/CartItem.linaria.css +7 -7
  10. package/.linaria-cache/packages/template-trend/src/components/Cart/FreeShipping.linaria.css +2 -2
  11. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/CategoryHeader.linaria.css +8 -8
  12. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/ActiveFilters.linaria.css +6 -6
  13. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Filter.linaria.css +4 -4
  14. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/FilterDrawer.linaria.css +4 -4
  15. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/FilterDropdownMenu.linaria.css +1 -1
  16. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/ActiveCarot.linaria.css +1 -1
  17. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/FilterButton.linaria.css +5 -5
  18. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/ListAccordion.linaria.css +1 -1
  19. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/Mobile/shared/styles.linaria.css +1 -1
  20. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/Filters/RangeFilters.linaria.css +2 -2
  21. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductCard.linaria.css +1 -1
  22. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductGrid.linaria.css +2 -2
  23. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/ProductGridWindow.linaria.css +2 -2
  24. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/StandardCategoryPage.linaria.css +2 -2
  25. package/.linaria-cache/packages/template-trend/src/components/CategoryPage/WindowedCategoryPage.linaria.css +3 -3
  26. package/.linaria-cache/packages/template-trend/src/components/ContentPage/ContentPage.linaria.css +3 -3
  27. package/.linaria-cache/packages/template-trend/src/components/CookieConsent.linaria.css +1 -1
  28. package/.linaria-cache/packages/template-trend/src/components/Forms/GlobalError.linaria.css +1 -1
  29. package/.linaria-cache/packages/template-trend/src/components/Forms/Input.linaria.css +4 -4
  30. package/.linaria-cache/packages/template-trend/src/components/Forms/InputStatus.linaria.css +3 -3
  31. package/.linaria-cache/packages/template-trend/src/components/Forms/Success.linaria.css +1 -1
  32. package/.linaria-cache/packages/template-trend/src/components/Layout/Container.linaria.css +1 -1
  33. package/.linaria-cache/packages/template-trend/src/components/Layout/Content/index.linaria.css +1 -1
  34. package/.linaria-cache/packages/template-trend/src/components/Layout/Footer/Footer.linaria.css +3 -3
  35. package/.linaria-cache/packages/template-trend/src/components/Layout/Footer/SocialLinks.linaria.css +2 -2
  36. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Categories/MobileCategories.linaria.css +6 -6
  37. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/CategoryMenu.linaria.css +1 -1
  38. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/CategoryMenuContainer.linaria.css +2 -2
  39. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/SubMenuSection.linaria.css +1 -1
  40. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/CategoryMenu/SubMenuWrapper.linaria.css +5 -5
  41. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/ChannelSelector.linaria.css +2 -2
  42. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/ChannelSelectorModal.linaria.css +2 -2
  43. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/Selector.linaria.css +5 -5
  44. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Header.linaria.css +7 -7
  45. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/Logo.linaria.css +1 -1
  46. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/LogoSearchBar.linaria.css +1 -1
  47. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/MobileMenu.linaria.css +6 -6
  48. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/RecommendedChannel/ChannelBanner.linaria.css +5 -5
  49. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/RecommendedChannel/RecommendedChannelSelector.linaria.css +9 -9
  50. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/SearchBar.linaria.css +3 -3
  51. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/SearchButton.linaria.css +1 -1
  52. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/TopNav.linaria.css +1 -1
  53. package/.linaria-cache/packages/template-trend/src/components/Layout/MaxWidth.linaria.css +1 -1
  54. package/.linaria-cache/packages/template-trend/src/components/Layout/Notifications.linaria.css +1 -1
  55. package/.linaria-cache/packages/template-trend/src/components/LoadingPage.linaria.css +1 -1
  56. package/.linaria-cache/packages/template-trend/src/components/MyPages/CustomerNameHeader.linaria.css +1 -1
  57. package/.linaria-cache/packages/template-trend/src/components/MyPages/DeleteAccount.linaria.css +1 -1
  58. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPages.linaria.css +1 -1
  59. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPagesSidebar.linaria.css +1 -1
  60. package/.linaria-cache/packages/template-trend/src/components/MyPages/MyPagesStartPage.linaria.css +2 -2
  61. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/ListOrder.linaria.css +1 -1
  62. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/ListDetail.linaria.css +4 -4
  63. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/OrderTotals.linaria.css +1 -1
  64. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderDetail/ShippingPayment.linaria.css +1 -1
  65. package/.linaria-cache/packages/template-trend/src/components/MyPages/Orders/OrderListPage.linaria.css +1 -1
  66. package/.linaria-cache/packages/template-trend/src/components/MyPages/ProfileDeliveryAddresses.linaria.css +1 -1
  67. package/.linaria-cache/packages/template-trend/src/components/MyPages/ProfilePage.linaria.css +4 -4
  68. package/.linaria-cache/packages/template-trend/src/components/NavigationTree/NavTree.linaria.css +2 -2
  69. package/.linaria-cache/packages/template-trend/src/components/Newsletter/NewsletterField.linaria.css +3 -3
  70. package/.linaria-cache/packages/template-trend/src/components/NotFoundPage.linaria.css +1 -1
  71. package/.linaria-cache/packages/template-trend/src/components/Pagination/Pagination.linaria.css +1 -1
  72. package/.linaria-cache/packages/template-trend/src/components/ProductList/AddToCart.linaria.css +1 -1
  73. package/.linaria-cache/packages/template-trend/src/components/ProductList/Favourite.linaria.css +1 -1
  74. package/.linaria-cache/packages/template-trend/src/components/ProductList/Favourites.linaria.css +2 -2
  75. package/.linaria-cache/packages/template-trend/src/components/ProductList/Product.linaria.css +2 -2
  76. package/.linaria-cache/packages/template-trend/src/components/ProductPage/AddToCart/AddToCartForm.linaria.css +3 -3
  77. package/.linaria-cache/packages/template-trend/src/components/ProductPage/AddToCart/ProductToast.linaria.css +9 -9
  78. package/.linaria-cache/packages/template-trend/src/components/ProductPage/Campaigns.linaria.css +2 -2
  79. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ConfigurationSelector.linaria.css +1 -1
  80. package/.linaria-cache/packages/template-trend/src/components/ProductPage/Images/ImageContainer.linaria.css +1 -1
  81. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/IncludedInPackages.linaria.css +1 -1
  82. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/PackageProduct.linaria.css +2 -2
  83. package/.linaria-cache/packages/template-trend/src/components/ProductPage/PackageProduct/PackageProductItem.linaria.css +1 -1
  84. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductInfo.linaria.css +3 -3
  85. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductInfoAccordion.linaria.css +3 -3
  86. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductPage.linaria.css +1 -1
  87. package/.linaria-cache/packages/template-trend/src/components/ProductPage/ProductPageLoadingState.linaria.css +3 -3
  88. package/.linaria-cache/packages/template-trend/src/components/ProductPage/RelatedProducts.linaria.css +1 -1
  89. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/NotifyWhenBack.linaria.css +5 -5
  90. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/StockOrb.linaria.css +1 -1
  91. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/StockStatusIndicator.linaria.css +1 -1
  92. package/.linaria-cache/packages/template-trend/src/components/ProductPage/StockStatus/WarehouseStock.linaria.css +2 -2
  93. package/.linaria-cache/packages/template-trend/src/components/ProductPage/VariantSelector.linaria.css +3 -3
  94. package/.linaria-cache/packages/template-trend/src/components/ProductPage/styledComponents.linaria.css +1 -1
  95. package/.linaria-cache/packages/template-trend/src/components/SearchPage/CategoryList.linaria.css +7 -0
  96. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchMeta.linaria.css +1 -1
  97. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchPage.linaria.css +3 -3
  98. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchResults.linaria.css +3 -3
  99. package/.linaria-cache/packages/template-trend/src/components/SearchPage/SearchTerm.linaria.css +1 -1
  100. package/.linaria-cache/packages/template-trend/src/components/SearchPage/WindowedSearchResults.linaria.css +4 -4
  101. package/.linaria-cache/packages/template-trend/src/components/StartPage/CategoryList.linaria.css +6 -6
  102. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/Row.linaria.css +3 -3
  103. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageCampaign.linaria.css +7 -7
  104. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageCategories.linaria.css +3 -3
  105. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageHTMLContent.linaria.css +1 -1
  106. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageHero.linaria.css +6 -6
  107. package/.linaria-cache/packages/template-trend/src/components/StartPage/Content/StartPageProductGrid.linaria.css +2 -2
  108. package/.linaria-cache/packages/template-trend/src/components/StartPage/StartPage.linaria.css +2 -2
  109. package/.linaria-cache/packages/template-trend/src/components/Store/Store.linaria.css +1 -1
  110. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreList.linaria.css +5 -5
  111. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreLocator.linaria.css +5 -5
  112. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreMap.linaria.css +1 -1
  113. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreMarker.linaria.css +1 -1
  114. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/StoreSearch.linaria.css +1 -1
  115. package/.linaria-cache/packages/template-trend/src/components/StoreLocator/UserLocation.linaria.css +1 -1
  116. package/.linaria-cache/packages/template-trend/src/components/ui/Badge.linaria.css +1 -1
  117. package/.linaria-cache/packages/template-trend/src/components/ui/Button.linaria.css +3 -3
  118. package/.linaria-cache/packages/template-trend/src/components/ui/CloseButton.linaria.css +1 -1
  119. package/.linaria-cache/packages/template-trend/src/components/ui/Headings.linaria.css +2 -2
  120. package/.linaria-cache/packages/template-trend/src/components/ui/Spinner.linaria.css +1 -1
  121. package/.linaria-cache/packages/ui/Breadcrumbs/Breadcrumbs.linaria.css +2 -2
  122. package/.linaria-cache/packages/ui/Button/Button.linaria.css +2 -2
  123. package/.linaria-cache/packages/ui/Button/SecondaryButton.linaria.css +1 -1
  124. package/.linaria-cache/packages/ui/Button/TrendButton.linaria.css +1 -1
  125. package/.linaria-cache/packages/ui/ChannelSelector/ChannelSelector.linaria.css +1 -1
  126. package/.linaria-cache/packages/ui/ChannelSelector/ChannelSelectorButtons.linaria.css +2 -2
  127. package/.linaria-cache/packages/ui/ChannelSelector/LargeSelector.linaria.css +1 -1
  128. package/.linaria-cache/packages/ui/ChannelSelector/MiniSelector.linaria.css +1 -1
  129. package/.linaria-cache/packages/ui/ChannelSelector/Region.linaria.css +3 -0
  130. package/.linaria-cache/packages/ui/Checkbox/Checkbox.linaria.css +4 -4
  131. package/.linaria-cache/packages/ui/Checkbox/CheckboxGroup.linaria.css +2 -2
  132. package/.linaria-cache/packages/ui/DropdownMenu/DropdownMenu.linaria.css +2 -2
  133. package/.linaria-cache/packages/ui/ErrorBoundary/Generic.linaria.css +1 -1
  134. package/.linaria-cache/packages/ui/Gallery/Gallery.linaria.css +2 -2
  135. package/.linaria-cache/packages/ui/JetshopText.linaria.css +1 -1
  136. package/.linaria-cache/packages/ui/Loading/LoadingBar.linaria.css +2 -2
  137. package/.linaria-cache/packages/ui/Modal/Drawer/Drawer.linaria.css +1 -1
  138. package/.linaria-cache/packages/ui/Modal/ModalRoot.linaria.css +1 -1
  139. package/.linaria-cache/packages/ui/Modal/TargetWrapper.linaria.css +1 -1
  140. package/.linaria-cache/packages/ui/Pagination/Pagination.linaria.css +1 -1
  141. package/.linaria-cache/packages/ui/PreOrderDateSelector/PreOrderDateSelector.linaria.css +1 -1
  142. package/.linaria-cache/packages/ui/Price/Price.linaria.css +1 -1
  143. package/.linaria-cache/packages/ui/ProductList/Badges.linaria.css +7 -7
  144. package/.linaria-cache/packages/ui/ProductSpecifications/ProductSpecifications.linaria.css +1 -1
  145. package/.linaria-cache/packages/ui/Search/SearchField.linaria.css +5 -5
  146. package/.linaria-cache/packages/ui/Search/SearchPage/SearchMeta.linaria.css +1 -1
  147. package/.linaria-cache/packages/ui/Select/Components.linaria.css +8 -8
  148. package/README.md +118 -1944
  149. package/cypress/integration/essentials.spec.js +50 -0
  150. package/package.json +5 -5
  151. package/schema.graphql +22 -8
  152. package/src/components/Auth/ForgotPassword.js +3 -8
  153. package/src/components/Auth/README.md +5 -0
  154. package/src/components/Cart/CartButton.js +40 -44
  155. package/src/components/Cart/CartFlyout.js +8 -5
  156. package/src/components/Cart/CartItem.js +12 -15
  157. package/src/components/Cart/{addMultipleToCart.gql → queries/addMultipleToCart.gql} +1 -1
  158. package/src/components/Cart/{addToCart.gql → queries/addToCart.gql} +1 -1
  159. package/src/components/Cart/{CartFragment.gql → queries/cartFragment.gql} +9 -0
  160. package/src/components/Cart/{CartQuery.gql → queries/cartQuery.gql} +1 -1
  161. package/src/components/Cart/{decrementQuantity.gql → queries/decrementQuantity.gql} +1 -1
  162. package/src/components/Cart/{incrementQuantity.gql → queries/incrementQuantity.gql} +1 -1
  163. package/src/components/Cart/{removeFromCart.gql → queries/removeFromCart.gql} +1 -1
  164. package/src/components/CategoryPage/CategoryPage.js +1 -0
  165. package/src/components/CategoryPage/Filters/ListFilters.js +1 -2
  166. package/src/components/CategoryPage/ProductCard.js +2 -0
  167. package/src/components/CategoryPage/ProductGrid.js +5 -0
  168. package/src/components/CategoryPage/ProductGridFragment.gql +8 -0
  169. package/src/components/CategoryPage/ProductGridWindow.js +19 -12
  170. package/src/components/CategoryPage/README.md +11 -0
  171. package/src/components/CategoryPage/WindowedCategoryPage.js +6 -5
  172. package/src/components/Forms/Input.js +3 -6
  173. package/src/components/Layout/Header/ChannelSelector/ChannelSelector.js +3 -0
  174. package/src/components/Layout/Header/ChannelSelector/ChannelSelectorModal.js +4 -3
  175. package/src/components/Layout/Header/ChannelSelector/Selector.js +2 -0
  176. package/src/components/Layout/Header/RecommendedChannel/RecommendedChannelSelector.js +3 -1
  177. package/src/components/Layout/Header/TopNav.js +13 -11
  178. package/src/components/LogOut.loadable.js +10 -0
  179. package/src/components/MyPages/MyPagesSidebar.js +0 -1
  180. package/src/components/PreviewRoute.loadable.js +10 -0
  181. package/src/components/ProductList/AddToCart.js +8 -5
  182. package/src/components/ProductList/Favourite.js +2 -2
  183. package/src/components/ProductList/FavouriteCount.js +2 -2
  184. package/src/components/ProductList/Favourites.js +17 -12
  185. package/src/components/ProductList/Lister.js +44 -0
  186. package/src/components/ProductList/Product.js +5 -4
  187. package/src/components/ProductList/ProductLists.gql +33 -5
  188. package/src/components/ProductList/SelectVariant.js +6 -10
  189. package/src/components/ProductList/productListQueries.js +3 -0
  190. package/src/components/ProductPage/AddToCart/AddToCartForm.js +19 -18
  191. package/src/components/ProductPage/AddToCart/ProductToast.js +7 -4
  192. package/src/components/ProductPage/PackageProduct/PackageProduct.js +8 -6
  193. package/src/components/ProductPage/VariantSelector.js +1 -1
  194. package/src/components/{StartPage → SearchPage}/CategoryList.js +6 -4
  195. package/src/components/SearchPage/EmptySearchResults.js +1 -1
  196. package/src/components/Shop.js +52 -76
  197. package/src/components/StartPage/Content/Row.js +0 -37
  198. package/src/components/StartPage/Content/StartPageHero.js +9 -1
  199. package/src/components/StartPage/StartPage.js +0 -13
  200. package/src/components/StartPage/StartPageProductGridFragment.gql +8 -0
  201. package/.vscode/launch.json +0 -11
  202. package/cypress/constants.js +0 -5
  203. package/cypress/integration/addToCart/addToCart.spec.js +0 -27
  204. package/cypress/integration/addToCart/disabledVariations.spec.js +0 -17
  205. package/cypress/integration/addToCart/newslettersubscriber.spec.js +0 -24
  206. package/cypress/integration/addToCart/notifyWhenBackInStock.spec.js +0 -20
  207. package/cypress/integration/addToCart/productConfigurations.spec.js +0 -35
  208. package/cypress/integration/addToCart/productVariations.spec.js +0 -42
  209. package/cypress/integration/addToCart/sizePriceChange.spec.js +0 -20
  210. package/cypress/integration/analytics/gtag.spec.js +0 -90
  211. package/cypress/integration/analytics/releware.spec.js +0 -95
  212. package/cypress/integration/auth/login.spec.js +0 -18
  213. package/cypress/integration/auth/signup.spec.js +0 -98
  214. package/cypress/integration/category_page_spec.js +0 -73
  215. package/cypress/integration/filters.spec.js +0 -103
  216. package/cypress/integration/getbyarticlenumber.spec.js +0 -28
  217. package/cypress/integration/packages.spec.js +0 -85
  218. package/cypress/integration/prefetch_headers_spec.js +0 -26
  219. package/cypress/integration/product_browsing_spec.js +0 -17
  220. package/cypress/integration/search/autocomplete.spec.js +0 -28
  221. package/cypress/integration/search/search_page.spec.js +0 -39
  222. package/cypress/integration/ssr/categorySSR.js +0 -9
  223. package/cypress/integration/ssr/productSSR.js +0 -9
  224. package/cypress/integration/ssr/startPageSSR.js +0 -5
  225. package/cypress/integration/start_page_spec.js +0 -5
  226. package/cypress/integration/stores_page.spec.js +0 -5
  227. package/src/components/StartPage/Campaign.js +0 -162
  228. package/src/components/StartPage/CampaignHeader.js +0 -101
  229. package/src/components/StartPage/ExtraDetails.js +0 -72
  230. package/src/components/StartPage/Readme.md +0 -88
  231. package/src/components/StartPage/campaign.json +0 -20
  232. package/src/components/StartPage/campaignHeader.json +0 -5
  233. package/src/components/StartPage/categoryList.json +0 -65
  234. package/src/components/StartPage/extraDetails.json +0 -6
  235. package/src/components/StartPage/title.json +0 -3
@@ -0,0 +1,50 @@
1
+ // This file contains essential tests to ensure that the basic purchase flow is working
2
+ // Make sure to update the URLs below to pages that are relevant to your shop
3
+ const CATEGORY_PAGE = '/se/sv/nyheter';
4
+ const PRODUCT_PAGE = '/se/sv/mobler/nice-chair';
5
+
6
+ describe('Start page', () => {
7
+ it('successfully loads', () => {
8
+ cy.visit('/');
9
+ });
10
+ });
11
+
12
+ describe('Category page', () => {
13
+ it('successfully loads', () => {
14
+ cy.visit(CATEGORY_PAGE);
15
+ });
16
+
17
+ it('links to products', () => {
18
+ cy.visit(CATEGORY_PAGE);
19
+ const url = cy.url();
20
+ cy.findAllByTestId('product').first().click();
21
+ cy.url().should('not.be', url);
22
+ });
23
+ });
24
+
25
+ describe('Product page', () => {
26
+ it('successfully loads', () => {
27
+ cy.visit(PRODUCT_PAGE);
28
+ });
29
+
30
+ it('lets you add to cart', () => {
31
+ cy.visit(PRODUCT_PAGE);
32
+ cy.findByTestId('add-to-cart').click();
33
+ // Cart now contains one item
34
+ cy.findByTestId('cart-button').next().contains('1');
35
+ });
36
+ });
37
+
38
+ describe('Cart', () => {
39
+ it('can be successfully opened', () => {
40
+ cy.findByTestId('cart-button').click();
41
+ });
42
+
43
+ it('lets you go to the checkout', () => {
44
+ cy.visit(PRODUCT_PAGE);
45
+ cy.findByTestId('add-to-cart').click();
46
+ cy.findByTestId('cart-button').click();
47
+ cy.findByTestId('checkout-button').click();
48
+ cy.url().should('contain', '/checkout');
49
+ });
50
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jetshop/template-trend",
3
- "version": "5.8.3",
3
+ "version": "5.11.0",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "build": "react-scripts build",
@@ -45,11 +45,11 @@
45
45
  ]
46
46
  },
47
47
  "dependencies": {
48
- "@jetshop/core": "^5.8.3",
48
+ "@jetshop/core": "^5.11.0",
49
49
  "@jetshop/flight-shortcodes": "^2.0.10",
50
- "@jetshop/intl": "^5.8.3",
51
- "@jetshop/react-scripts": "^5.8.3",
52
- "@jetshop/ui": "^5.8.3",
50
+ "@jetshop/intl": "^5.11.0",
51
+ "@jetshop/react-scripts": "^5.11.0",
52
+ "@jetshop/ui": "^5.11.0",
53
53
  "@react-google-maps/api": "~1.7.0",
54
54
  "prop-types": "^15.6.2",
55
55
  "react": "^16.9.0",
package/schema.graphql CHANGED
@@ -1043,10 +1043,17 @@ type Mutation {
1043
1043
 
1044
1044
  """
1045
1045
  This mutation's purpose is to update a existing customer's information. An
1046
- authorization token is needed in the request, in order to be able to delete the customer.
1046
+ authorization token is needed in the request, in order to be able to update the customer.
1047
1047
  """
1048
1048
  updateCustomer(input: CustomerUpdateInput!): CustomerUpdateResponse
1049
1049
 
1050
+ """
1051
+ This mutation's purpose is to update a existing customer's price list using an
1052
+ access code. An authorization token is needed in the request, in order to be
1053
+ able to update the customer.
1054
+ """
1055
+ updateCustomerPriceList(priceListAccessCode: String!): UpdateCustomerPriceListResult
1056
+
1050
1057
  """
1051
1058
  The updatePassword mutation updates the customers password. Both the old password and a new password is a requirement.
1052
1059
  """
@@ -1314,18 +1321,19 @@ type Page implements Document {
1314
1321
  data: Content
1315
1322
 
1316
1323
  """
1317
- If this page was fetched by ID using the `page(id)` query, parent will be
1318
- returned even if it is hidden. If this page was fetched using the `pages`
1319
- query, parent will not be returned if it is hidden
1324
+ * If this page was fetched by ID using the `page(id)` query, `parent` will be returned even if it is hidden.
1325
+ * If this page was fetched using the `pages` query, `parent` will not be returned if it is hidden
1320
1326
  """
1321
1327
  parent: Page
1322
1328
 
1323
1329
  """
1324
- If this page was fetched by ID using the page(id) query, subPages will be
1325
- returned even if they are hidden. If this page was fetched using the pages
1326
- query, subPages will not be returned if they are hidden
1330
+ * If this page was fetched by ID using the `page(id)` query, `subPages` will
1331
+ be returned even if they are hidden. This can be overridden with the
1332
+ `includeHidden` flag.
1333
+ * If this page was fetched using the `pages` query, `subPages` will not be
1334
+ returned if they are hidden. The `includeHidden` flag has no effect on this.
1327
1335
  """
1328
- subPages: [Page!]
1336
+ subPages(includeHidden: Boolean = true): [Page!]
1329
1337
  }
1330
1338
 
1331
1339
  type PagedResult {
@@ -1450,6 +1458,7 @@ type Product implements Document {
1450
1458
  """
1451
1459
  campaigns: [Category]
1452
1460
  hasVariants: Boolean!
1461
+ hasVariantsWithDifferingPrices: Boolean!
1453
1462
  variants: ProductVariants
1454
1463
  images(
1455
1464
  """
@@ -2049,6 +2058,7 @@ input SignUpInput {
2049
2058
  preferences: SignUpPreferencesInput
2050
2059
  consents: [SignUpConsentInput]
2051
2060
  dynamicContent: String
2061
+ priceListAccessCode: String
2052
2062
  }
2053
2063
 
2054
2064
  input SignUpPreferencesCommunicationInput {
@@ -2181,6 +2191,10 @@ type UpdateCartMutation {
2181
2191
  cart: Cart
2182
2192
  }
2183
2193
 
2194
+ type UpdateCustomerPriceListResult {
2195
+ success: Boolean!
2196
+ }
2197
+
2184
2198
  input UpdateCustomerProductListInput {
2185
2199
  id: ID!
2186
2200
  typeId: ID!
@@ -13,7 +13,7 @@ import { activeSegment, smallSection } from './UI/Form';
13
13
  import MaxWidth from '../Layout/MaxWidth';
14
14
  import { cx } from 'linaria';
15
15
 
16
- export default function ForgotPasswordPage(props) {
16
+ export default function ForgotPasswordPage() {
17
17
  return (
18
18
  <MaxWidth style={{ alignItems: 'center', marginTop: '2em' }}>
19
19
  <ForgotPasswordProvider>
@@ -28,13 +28,8 @@ export default function ForgotPasswordPage(props) {
28
28
  }
29
29
 
30
30
  function ForgotPasswordForm() {
31
- const {
32
- submitted,
33
- isSubmitting,
34
- globalError,
35
- isValid,
36
- emailInputProps
37
- } = useForgotPasswordData();
31
+ const { submitted, isSubmitting, globalError, isValid, emailInputProps } =
32
+ useForgotPasswordData();
38
33
 
39
34
  if (submitted) {
40
35
  return (
@@ -0,0 +1,5 @@
1
+ # Auth
2
+
3
+ These components deal with registering and signing in, using Jetshop to keep track of memberships. This is usually used for customer loyalty programs, or for e.g. b2b sales where you need an account to browse the site.
4
+
5
+ If you don't use this feature, feel free to comment out the imports and routes in Shop.js to reduce the bundle size.
@@ -1,14 +1,15 @@
1
+ import React from 'react';
2
+ import { css } from 'linaria';
3
+ import { styled } from 'linaria/react';
4
+
1
5
  import CartProvider from '@jetshop/core/components/Query/CartProvider';
2
6
  import t from '@jetshop/intl';
3
7
  import { Above } from '@jetshop/ui/Breakpoints';
4
8
  import { DrawerTrigger } from '@jetshop/ui/Modal/Drawer/DrawerTrigger';
5
9
  import { FlyoutTrigger } from '@jetshop/ui/Modal/Flyout';
6
- import { styled } from 'linaria/react';
7
- import { css } from 'linaria';
8
- import React, { Fragment } from 'react';
9
- import { ReactComponent as Cart } from '../../svg/Cart.svg';
10
+ import { ReactComponent as CartIcon } from '../../svg/Cart.svg';
10
11
  import Badge from '../ui/Badge';
11
- import cartQuery from './CartQuery.gql';
12
+ import cartQuery from './queries/cartQuery.gql';
12
13
 
13
14
  const Button = styled('button')`
14
15
  padding: 0;
@@ -38,7 +39,7 @@ function CartButton({ target, itemsInCart, className }) {
38
39
  data-testid="cart-button"
39
40
  onClick={target.isOpen ? target.hideTarget : target.showTarget}
40
41
  >
41
- <Cart className="badge-svg-wrapper" />
42
+ <CartIcon className="badge-svg-wrapper" />
42
43
  <span>{t('Cart')}</span>
43
44
  </Button>
44
45
  {itemsInCart > 0 && <Badge text={itemsInCart} />}
@@ -48,45 +49,40 @@ function CartButton({ target, itemsInCart, className }) {
48
49
 
49
50
  function CartButtonFlyout({ className }) {
50
51
  return (
51
- <Fragment>
52
- <CartProvider query={cartQuery}>
53
- {result => {
54
- // Set items in cart to the API result.
55
- // If the result is undefined, fall back to 0
56
- const itemsInCart = result?.data?.cart?.totalQuantity || 0;
52
+ <CartProvider query={cartQuery}>
53
+ {result => {
54
+ const itemsInCart = result?.data?.cart?.totalQuantity || 0;
57
55
 
58
- return (
59
- // Use a flyout for breakpoints above md
60
- // Else use a Drawer
61
- <Above breakpoint="md">
62
- {matches =>
63
- matches ? (
64
- <FlyoutTrigger id="cart-flyout">
65
- {flyout => (
66
- <CartButton
67
- className={className}
68
- target={flyout}
69
- itemsInCart={itemsInCart}
70
- />
71
- )}
72
- </FlyoutTrigger>
73
- ) : (
74
- <DrawerTrigger preventOverflow={true} id="cart-drawer">
75
- {drawer => (
76
- <CartButton
77
- className={className}
78
- target={drawer}
79
- itemsInCart={itemsInCart}
80
- />
81
- )}
82
- </DrawerTrigger>
83
- )
84
- }
85
- </Above>
86
- );
87
- }}
88
- </CartProvider>
89
- </Fragment>
56
+ // Drawer on mobile, flyout on desktop
57
+ return (
58
+ <Above breakpoint="md">
59
+ {matches =>
60
+ matches ? (
61
+ <FlyoutTrigger id="cart-flyout">
62
+ {flyout => (
63
+ <CartButton
64
+ className={className}
65
+ target={flyout}
66
+ itemsInCart={itemsInCart}
67
+ />
68
+ )}
69
+ </FlyoutTrigger>
70
+ ) : (
71
+ <DrawerTrigger preventOverflow={true} id="cart-drawer">
72
+ {drawer => (
73
+ <CartButton
74
+ className={className}
75
+ target={drawer}
76
+ itemsInCart={itemsInCart}
77
+ />
78
+ )}
79
+ </DrawerTrigger>
80
+ )
81
+ }
82
+ </Above>
83
+ );
84
+ }}
85
+ </CartProvider>
90
86
  );
91
87
  }
92
88
 
@@ -1,3 +1,6 @@
1
+ import React from 'react';
2
+ import { styled } from 'linaria/react';
3
+
1
4
  import { useTracker } from '@jetshop/core/analytics/Analytics';
2
5
  import { trackCartCheckoutEvent } from '@jetshop/core/analytics/tracking';
3
6
  import CartProvider from '@jetshop/core/components/Query/CartProvider';
@@ -6,15 +9,15 @@ import { Above } from '@jetshop/ui/Breakpoints';
6
9
  import Drawer, { DrawerTarget } from '@jetshop/ui/Modal/Drawer';
7
10
  import { FlyoutTarget } from '@jetshop/ui/Modal/Flyout';
8
11
  import { Price } from '@jetshop/ui/Price';
12
+ import { useChannelSettings } from '@jetshop/core/hooks/Channels/useChannelSettings';
13
+ import { Currency } from '@jetshop/ui/Price/Currency';
14
+
9
15
  import { theme } from '../Theme';
10
- import React from 'react';
11
- import { styled } from 'linaria/react';
12
16
  import { baseStyles } from '../ui/Button';
13
17
  import CartItem from './CartItem';
14
- import cartQuery from './CartQuery.gql';
15
18
  import FreeShipping from './FreeShipping';
16
- import { useChannelSettings } from '@jetshop/core/hooks/Channels/useChannelSettings';
17
- import { Currency } from '@jetshop/ui/Price/Currency';
19
+
20
+ import cartQuery from './queries/cartQuery.gql';
18
21
 
19
22
  const Flyout = styled('div')`
20
23
  background: white;
@@ -1,18 +1,19 @@
1
+ import React from 'react';
2
+ import { styled } from 'linaria/react';
3
+ import { Link } from 'react-router-dom';
4
+
1
5
  import useDecrementQuantity from '@jetshop/core/components/Mutation/useDecrementQuantity';
2
6
  import useIncrementQuantity from '@jetshop/core/components/Mutation/useIncrementQuantity';
3
7
  import useRemoveFromCart from '@jetshop/core/components/Mutation/useRemoveFromCart';
4
8
  import getCartItemVariant from '@jetshop/core/helpers/getCartItemVariant';
5
9
  import Image from '@jetshop/ui/Image';
6
10
  import { Price } from '@jetshop/ui/Price';
7
- import { ReactComponent as Cross } from '@jetshop/ui/svg/Cross.svg';
8
- import React from 'react';
9
- import { styled } from 'linaria/react';
10
- import { Link } from 'react-router-dom';
11
+ import { ReactComponent as CrossIcon } from '@jetshop/ui/svg/Cross.svg';
11
12
  import { FlyoutTrigger } from '@jetshop/ui/Modal/Flyout';
12
- import removeFromCartMutation from './removeFromCart.gql';
13
- import incrementQuantityMutation from './incrementQuantity.gql';
14
- import decrementQuantityMutation from './decrementQuantity.gql';
15
- import cartQuery from './CartQuery.gql';
13
+ import removeFromCartMutation from './queries/removeFromCart.gql';
14
+ import incrementQuantityMutation from './queries/incrementQuantity.gql';
15
+ import decrementQuantityMutation from './queries/decrementQuantity.gql';
16
+ import cartQuery from './queries/cartQuery.gql';
16
17
 
17
18
  const Wrapper = styled('div')`
18
19
  display: flex;
@@ -103,12 +104,8 @@ const RemoveItem = styled('div')`
103
104
  `;
104
105
 
105
106
  const CartItem = ({ item, className = '' }) => {
106
- const {
107
- isVariant,
108
- variantImage,
109
- variantValues,
110
- hasVariantImage
111
- } = getCartItemVariant(item);
107
+ const { isVariant, variantImage, variantValues, hasVariantImage } =
108
+ getCartItemVariant(item);
112
109
 
113
110
  const { incrementQuantity } = useIncrementQuantity({
114
111
  incrementQuantityMutation,
@@ -196,7 +193,7 @@ const CartItem = ({ item, className = '' }) => {
196
193
  }
197
194
  data-testid="remove-from-cart"
198
195
  >
199
- <Cross />
196
+ <CrossIcon />
200
197
  </button>
201
198
  </RemoveItem>
202
199
 
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  mutation addMultipleToCart($cartId: String, $items: [AddMultipleToCartInput]!) {
4
4
  addMultipleToCart(cartId: $cartId, items: $items) {
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  mutation addToCart($input: AddToCartInput!) {
4
4
  addToCart(input: $input) {
@@ -4,6 +4,7 @@
4
4
  #import "@jetshop/core/data/fragments/CommentsFragment.gql"
5
5
 
6
6
  fragment Cart on Cart {
7
+ __optimistic @client
7
8
  id
8
9
  externalCheckoutUrl
9
10
  totalQuantity
@@ -82,6 +83,14 @@ fragment Cart on Cart {
82
83
  id
83
84
  path
84
85
  }
86
+ customFields {
87
+ key
88
+ type
89
+ title
90
+ ... on CustomStringField {
91
+ stringValue: value
92
+ }
93
+ }
85
94
  images {
86
95
  modifiedDate
87
96
  alt
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  query CartQuery($cartId: String) {
4
4
  cart(id: $cartId) {
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  mutation decrementItemQuantity($input: ChangeByOneItemQuantityInput!) {
4
4
  decrementItemQuantity(input: $input) {
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  mutation incrementItemQuantity($input: ChangeByOneItemQuantityInput!) {
4
4
  incrementItemQuantity(input: $input) {
@@ -1,4 +1,4 @@
1
- #import "./CartFragment.gql"
1
+ #import "./cartFragment.gql"
2
2
 
3
3
  mutation removeFromCart($input: RemoveFromCartInput!) {
4
4
  removeFromCart(input: $input) {
@@ -25,6 +25,7 @@ const CategoryPage = props => {
25
25
  const searchObject = qs.parse(search, { ignoreQueryPrefix: true });
26
26
  const standardPagination = searchObject.standardPagination === 'true';
27
27
 
28
+ // Comment out the one you're not using
28
29
  if (standardPagination) {
29
30
  return <LoadableStandardCategoryPage {...props} />;
30
31
  } else {
@@ -45,8 +45,7 @@ function ListFilter({ filter }) {
45
45
  item.resultCount === 0
46
46
  ? {
47
47
  opacity: 0.4,
48
- cursor: 'not-allowed',
49
- cursor: 'pointer'
48
+ cursor: 'not-allowed'
50
49
  }
51
50
  : { cursor: 'pointer' }
52
51
  }
@@ -69,6 +69,7 @@ export function ProductCard({
69
69
  forwardRef,
70
70
  as = 'li',
71
71
  children,
72
+ loadImageEagerly = false,
72
73
  ...linkProps
73
74
  }) {
74
75
  const hasImages = product.images && product.images.length > 0;
@@ -103,6 +104,7 @@ export function ProductCard({
103
104
  src={product.images[0].url}
104
105
  modifiedDate={product.images[0].modifiedDate}
105
106
  badges={<Badges badges={badges} />}
107
+ critical={loadImageEagerly}
106
108
  ></Image>
107
109
  ) : (
108
110
  <Image src={transparentDataImg} />
@@ -51,6 +51,10 @@ export const Wrapper = styled('ul')`
51
51
  }
52
52
  `;
53
53
 
54
+ export function isAboveFold(index) {
55
+ return index < 4;
56
+ }
57
+
54
58
  export function ProductGrid({
55
59
  products,
56
60
  listName,
@@ -81,6 +85,7 @@ export function ProductGrid({
81
85
  product={product}
82
86
  style={{ opacity: loading ? 0.5 : 1 }}
83
87
  list={listName}
88
+ loadImageEagerly={isAboveFold(index)}
84
89
  {...rest}
85
90
  >
86
91
  <Favourite
@@ -27,4 +27,12 @@ fragment ProductGrid on Product {
27
27
  path
28
28
  }
29
29
  }
30
+ customFields {
31
+ key
32
+ type
33
+ title
34
+ ... on CustomStringField {
35
+ stringValue: value
36
+ }
37
+ }
30
38
  }
@@ -3,7 +3,7 @@ import { trackListEvent } from '@jetshop/core/analytics/tracking';
3
3
  import React, { useEffect, useMemo } from 'react';
4
4
  import { css, cx } from 'linaria';
5
5
  import { ProductCard } from './ProductCard';
6
- import { priceStyle } from './ProductGrid';
6
+ import { isAboveFold, priceStyle } from './ProductGrid';
7
7
  import { WindowGrid } from '@jetshop/ui/WindowGrid';
8
8
 
9
9
  const container = css`
@@ -40,24 +40,31 @@ function ProductGridWindow({
40
40
  }, [listName, products, track]);
41
41
 
42
42
  const renderProduct = useMemo(
43
- () => ({ item: product, style, innerRef }) => (
44
- <div className={defaultStyle} style={style} ref={innerRef}>
45
- <ProductCard
46
- key={product.articleNumber}
47
- product={product}
48
- as="div"
49
- categoryPath={categoryPath}
50
- />
51
- </div>
52
- ),
43
+ () =>
44
+ ({ item: product, style, innerRef }) =>
45
+ (
46
+ <div className={defaultStyle} style={style} ref={innerRef}>
47
+ <ProductCard
48
+ key={product.articleNumber}
49
+ product={product}
50
+ as="div"
51
+ categoryPath={categoryPath}
52
+ loadImageEagerly={isAboveFold(product.index)}
53
+ />
54
+ </div>
55
+ ),
53
56
  [categoryPath]
54
57
  );
55
58
 
59
+ const items = useMemo(() => {
60
+ return products.map((product, index) => ({ ...product, index }));
61
+ }, [products]);
62
+
56
63
  return (
57
64
  <WindowGrid
58
65
  id={id}
59
66
  itemsPerRow={[2, null, 3, 4]}
60
- items={products}
67
+ items={items}
61
68
  prevOffset={prevOffset}
62
69
  className={cx(container, priceStyle)}
63
70
  component={renderProduct}
@@ -0,0 +1,11 @@
1
+ # Category page
2
+ This folder contains two versions of category pages, of which you would usually select one.
3
+
4
+ ## Classic paginated category page
5
+ A category page that uses classic pagination, meaning next/previous buttons to step through pages, showing only one page of products at a time.
6
+
7
+ ## Infinite pagination category page
8
+ A more scroll-friendly version of a category page, where new products are appended to the list when you press the "Load more products" button. In order not to lose performance when rendering a large amount of products, it uses a technique called windowing to only render the products that are in view at the moment. This can cause issues if you have product cards of varying height, so make sure that all images and details showed on the product card result in the same overall height for the product card.
9
+
10
+ ## Read more
11
+ You can find more information about pagination in the [Flight documentation](https://docs.dev.jetshop.se/pagination).
@@ -47,9 +47,10 @@ const WindowedCategory = ({ category, result }) => {
47
47
  const location = useLocation();
48
48
  const params = qs.parse(location.search, { ignoreQueryPrefix: true });
49
49
  const routePath = category?.isDynamic ? null : result?.data?.route?.path;
50
- const categoryPath = useMemo(() => routePath && { path: routePath }, [
51
- routePath
52
- ]);
50
+ const categoryPath = useMemo(
51
+ () => routePath && { path: routePath },
52
+ [routePath]
53
+ );
53
54
 
54
55
  if (!category) {
55
56
  return (
@@ -106,7 +107,7 @@ const WindowedCategory = ({ category, result }) => {
106
107
  {previous.hasProducts && (
107
108
  <ButtonWrapper>
108
109
  <TrendLink
109
- secondary
110
+ className="secondary"
110
111
  onClick={e => {
111
112
  e.preventDefault();
112
113
  previous.fetchProducts();
@@ -135,7 +136,7 @@ const WindowedCategory = ({ category, result }) => {
135
136
  {next.hasProducts && (
136
137
  <ButtonWrapper>
137
138
  <TrendLink
138
- secondary
139
+ className="secondary"
139
140
  onClick={e => {
140
141
  e.preventDefault();
141
142
  next.fetchProducts();
@@ -71,11 +71,8 @@ const InputWithLabel = ({
71
71
  <span>{label || name}</span>
72
72
  {required && <span className="req">{t('(Required)')}</span>}
73
73
  </Label>
74
- <Field
75
- className={cx(disabled && 'disabled')}
76
- id={name}
77
- name={name}
78
- render={({ field, form: { touched, errors } }) => (
74
+ <Field className={cx(disabled && 'disabled')} id={name} name={name}>
75
+ {({ field, form: { touched, errors } }) => (
79
76
  <div>
80
77
  <Input
81
78
  {...props}
@@ -104,7 +101,7 @@ const InputWithLabel = ({
104
101
  )}
105
102
  </div>
106
103
  )}
107
- />
104
+ </Field>
108
105
  {!disableValidation && <ErrorMessage name={name} component={ErrorSpan} />}
109
106
  </Wrapper>
110
107
  );
@@ -13,6 +13,7 @@ const Flyout = styled('div')`
13
13
 
14
14
  const CountryFlag = styled('img')`
15
15
  height: 12px;
16
+ width: 12px;
16
17
  margin-right: 5px;
17
18
  `;
18
19
 
@@ -32,6 +33,8 @@ export default class HeaderChannelSelector extends Component {
32
33
  <CountryFlag
33
34
  src={`https://countryflags.jetshop.io/${selectedChannel.country.code}/flat/32.png`}
34
35
  alt="Country Flag"
36
+ width="16"
37
+ height="12"
35
38
  />
36
39
  {selectedChannel.country.name}
37
40
  </button>