@graphcommerce/magento-cart 3.0.1

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 (55) hide show
  1. package/Api/CartItemCountChanged.gql.ts +4 -0
  2. package/Api/CartItemCountChanged.graphql +9 -0
  3. package/CHANGELOG.md +324 -0
  4. package/README.md +102 -0
  5. package/components/AddToCartButton/AddToCartButton.tsx +127 -0
  6. package/components/ApolloCartError/ApolloCartErrorAlert.tsx +36 -0
  7. package/components/ApolloCartError/ApolloCartErrorFullPage.tsx +1 -0
  8. package/components/CartFab/CartFab.gql.ts +12 -0
  9. package/components/CartFab/CartFab.graphql +6 -0
  10. package/components/CartFab/CartFab.tsx +67 -0
  11. package/components/CartFab/CartTotalQuantity.gql.ts +4 -0
  12. package/components/CartFab/CartTotalQuantity.graphql +3 -0
  13. package/components/CartItemSummary/GetCartItemSummary.gql.ts +12 -0
  14. package/components/CartItemSummary/GetCartItemSummary.graphql +6 -0
  15. package/components/CartItemSummary/index.tsx +133 -0
  16. package/components/CartStartCheckout/CartStartCheckout.gql.ts +4 -0
  17. package/components/CartStartCheckout/CartStartCheckout.graphql +7 -0
  18. package/components/CartStartCheckout/CartStartCheckout.tsx +63 -0
  19. package/components/CartSummary/CartSummary.gql.ts +4 -0
  20. package/components/CartSummary/CartSummary.graphql +15 -0
  21. package/components/CartSummary/GetCartSummary.gql.ts +12 -0
  22. package/components/CartSummary/GetCartSummary.graphql +5 -0
  23. package/components/CartSummary/index.tsx +139 -0
  24. package/components/CartTotals/CartTotals.gql.ts +4 -0
  25. package/components/CartTotals/CartTotals.graphql +51 -0
  26. package/components/CartTotals/CartTotals.tsx +187 -0
  27. package/components/CartTotals/GetCartTotals.gql.ts +12 -0
  28. package/components/CartTotals/GetCartTotals.graphql +5 -0
  29. package/components/EmptyCart/EmptyCart.tsx +56 -0
  30. package/components/index.ts +24 -0
  31. package/hooks/CreateEmptyCart.gql.ts +10 -0
  32. package/hooks/CreateEmptyCart.graphql +3 -0
  33. package/hooks/CurrentCartId.gql.ts +10 -0
  34. package/hooks/CurrentCartId.graphql +6 -0
  35. package/hooks/CurrentCartId.graphqls +11 -0
  36. package/hooks/CustomerCart.gql.ts +10 -0
  37. package/hooks/CustomerCart.graphql +7 -0
  38. package/hooks/UseCartRedirect.gql.ts +12 -0
  39. package/hooks/UseCartRedirect.graphql +5 -0
  40. package/hooks/UseMergeCustomerCart.gql.ts +13 -0
  41. package/hooks/UseMergeCustomerCart.graphql +6 -0
  42. package/hooks/index.ts +8 -0
  43. package/hooks/useAssignCurrentCartId.ts +18 -0
  44. package/hooks/useCartIdCreate.ts +22 -0
  45. package/hooks/useCartQuery.ts +37 -0
  46. package/hooks/useClearCurrentCartId.ts +18 -0
  47. package/hooks/useCurrentCartId.ts +6 -0
  48. package/hooks/useDisplayInclTax.ts +7 -0
  49. package/hooks/useFormGqlMutationCart.ts +28 -0
  50. package/hooks/useMergeCustomerCart.ts +49 -0
  51. package/index.ts +4 -0
  52. package/next-env.d.ts +4 -0
  53. package/package.json +42 -0
  54. package/tsconfig.json +5 -0
  55. package/typePolicies.ts +56 -0
@@ -0,0 +1,67 @@
1
+ import { Fab, FabProps, NoSsr } from '@material-ui/core'
2
+ import {
3
+ iconShoppingBag,
4
+ StyledBadge,
5
+ SvgImageSimple,
6
+ useFixedFabAnimation,
7
+ } from '@graphcommerce/next-ui'
8
+ import { m } from 'framer-motion'
9
+ import PageLink from 'next/link'
10
+ import React from 'react'
11
+ import { useCartQuery } from '../../hooks/useCartQuery'
12
+ import { CartFabDocument } from './CartFab.gql'
13
+ import { CartTotalQuantityFragment } from './CartTotalQuantity.gql'
14
+
15
+ export type CartFabProps = {
16
+ icon?: React.ReactNode
17
+ } & Omit<FabProps, 'children' | 'aria-label'>
18
+
19
+ type CartFabContentProps = CartFabProps & CartTotalQuantityFragment
20
+
21
+ function CartFabContent(props: CartFabContentProps) {
22
+ const { total_quantity, icon, ...fabProps } = props
23
+ const cartIcon = icon ?? (
24
+ <SvgImageSimple src={iconShoppingBag} alt='Shopping Bag' loading='eager' size='large' />
25
+ )
26
+ const { filter } = useFixedFabAnimation()
27
+
28
+ return (
29
+ <m.div style={{ filter }}>
30
+ <PageLink href='/cart' passHref>
31
+ <Fab aria-label='Cart' color='inherit' size='large' {...fabProps}>
32
+ {total_quantity > 0 ? (
33
+ <StyledBadge color='primary' variant='dot'>
34
+ {cartIcon}
35
+ </StyledBadge>
36
+ ) : (
37
+ cartIcon
38
+ )}
39
+ </Fab>
40
+ </PageLink>
41
+ </m.div>
42
+ )
43
+ }
44
+
45
+ /**
46
+ * We give CartFab a bit of special handling. We don't want to make requests for this component
47
+ * whilly nilly. We've imposed some limitations:
48
+ *
49
+ * We use useCartQuery that means that this will only execute when there is a cartId.
50
+ *
51
+ * We use fetchPolicy 'cache-only' so that when the cart comes into existence it will not
52
+ * immediately start fetching. Why? There is a time between creating a cart and adding the first
53
+ * product to the cart. This would mean that it would immediately start executing this query.
54
+ */
55
+ export default function CartFab(props: CartFabProps) {
56
+ const { data } = useCartQuery(CartFabDocument, {
57
+ fetchPolicy: 'cache-only',
58
+ nextFetchPolicy: 'cache-first',
59
+ })
60
+ const qty = data?.cart?.total_quantity ?? 0
61
+
62
+ return (
63
+ <NoSsr fallback={<CartFabContent {...props} total_quantity={0} />}>
64
+ <CartFabContent total_quantity={qty} {...props} />
65
+ </NoSsr>
66
+ )
67
+ }
@@ -0,0 +1,4 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ export type CartTotalQuantityFragment = { total_quantity: number };
@@ -0,0 +1,3 @@
1
+ fragment CartTotalQuantity on Cart @inject(into: ["CartItemCountChanged"]) {
2
+ total_quantity
3
+ }
@@ -0,0 +1,12 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
5
+
6
+ export const CartItemSummaryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CartItemSummary"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cartId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cart"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"cart_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cartId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uid"}},{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"quantity"}},{"kind":"Field","name":{"kind":"Name","value":"product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uid"}},{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"url_key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"thumbnail"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"prices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"discounts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"price"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"row_total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"row_total_including_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"total_item_discount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BundleCartItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"bundle_options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uid"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"values"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uid"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"quantity"}},{"kind":"Field","name":{"kind":"Name","value":"price"}}]}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ConfigurableCartItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurable_options"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurable_product_option_uid"}},{"kind":"Field","name":{"kind":"Name","value":"configurable_product_option_value_uid"}},{"kind":"Field","name":{"kind":"Name","value":"option_label"}},{"kind":"Field","name":{"kind":"Name","value":"value_label"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"DownloadableCartItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"links"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uid"}},{"kind":"Field","name":{"kind":"Name","value":"price"}},{"kind":"Field","name":{"kind":"Name","value":"sample_url"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"samples"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"sample_url"}},{"kind":"Field","name":{"kind":"Name","value":"sort_order"}},{"kind":"Field","name":{"kind":"Name","value":"title"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"shipping_addresses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"selected_shipping_method"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"carrier_code"}},{"kind":"Field","name":{"kind":"Name","value":"method_code"}},{"kind":"Field","name":{"kind":"Name","value":"method_title"}},{"kind":"Field","name":{"kind":"Name","value":"carrier_title"}},{"kind":"Field","name":{"kind":"Name","value":"amount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"available_shipping_methods"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"carrier_code"}},{"kind":"Field","name":{"kind":"Name","value":"method_code"}},{"kind":"Field","name":{"kind":"Name","value":"price_incl_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"price_excl_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"prices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"applied_taxes"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"discounts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"grand_total"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"subtotal_excluding_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"subtotal_including_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"subtotal_with_discount_excluding_tax"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}}]}}]}}]} as unknown as DocumentNode<CartItemSummaryQuery, CartItemSummaryQueryVariables>;
7
+ export type CartItemSummaryQueryVariables = Types.Exact<{
8
+ cartId: Types.Scalars['String'];
9
+ }>;
10
+
11
+
12
+ export type CartItemSummaryQuery = { cart?: Types.Maybe<{ id: string, items?: Types.Maybe<Array<Types.Maybe<{ __typename: 'BundleCartItem', uid: string, quantity: number, bundle_options: Array<Types.Maybe<{ uid: string, label: string, type: string, values: Array<Types.Maybe<{ uid: string, label: string, quantity: number, price: number }>> }>>, product: { __typename: 'BundleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'ConfigurableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'DownloadableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'GroupedProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'SimpleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'VirtualProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> }, prices?: Types.Maybe<{ discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, price: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total_including_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, total_item_discount?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> } | { __typename: 'ConfigurableCartItem', uid: string, quantity: number, configurable_options: Array<Types.Maybe<{ configurable_product_option_uid: string, configurable_product_option_value_uid: string, option_label: string, value_label: string }>>, product: { __typename: 'BundleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'ConfigurableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'DownloadableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'GroupedProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'SimpleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'VirtualProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> }, prices?: Types.Maybe<{ discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, price: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total_including_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, total_item_discount?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> } | { __typename: 'DownloadableCartItem', uid: string, quantity: number, links?: Types.Maybe<Array<Types.Maybe<{ uid: string, price?: Types.Maybe<number>, sample_url?: Types.Maybe<string>, title?: Types.Maybe<string> }>>>, samples?: Types.Maybe<Array<Types.Maybe<{ sample_url?: Types.Maybe<string>, sort_order?: Types.Maybe<number>, title?: Types.Maybe<string> }>>>, product: { __typename: 'BundleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'ConfigurableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'DownloadableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'GroupedProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'SimpleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'VirtualProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> }, prices?: Types.Maybe<{ discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, price: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total_including_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, total_item_discount?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> } | { __typename: 'SimpleCartItem', uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'ConfigurableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'DownloadableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'GroupedProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'SimpleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'VirtualProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> }, prices?: Types.Maybe<{ discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, price: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total_including_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, total_item_discount?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> } | { __typename: 'VirtualCartItem', uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'ConfigurableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'DownloadableProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'GroupedProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'SimpleProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> } | { __typename: 'VirtualProduct', uid: string, url_key?: Types.Maybe<string>, name?: Types.Maybe<string>, thumbnail?: Types.Maybe<{ url?: Types.Maybe<string>, label?: Types.Maybe<string> }> }, prices?: Types.Maybe<{ discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, price: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, row_total_including_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, total_item_discount?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> }>>>, shipping_addresses: Array<Types.Maybe<{ selected_shipping_method?: Types.Maybe<{ carrier_code: string, method_code: string, method_title: string, carrier_title: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>, available_shipping_methods?: Types.Maybe<Array<Types.Maybe<{ carrier_code: string, method_code?: Types.Maybe<string>, price_incl_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, price_excl_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>> }>>, prices?: Types.Maybe<{ __typename: 'CartPrices', applied_taxes?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, grand_total?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_excluding_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_including_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_with_discount_excluding_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> }> };
@@ -0,0 +1,6 @@
1
+ query CartItemSummary($cartId: String!) {
2
+ cart(cart_id: $cartId) {
3
+ ...CartItems
4
+ ...CartTotals
5
+ }
6
+ }
@@ -0,0 +1,133 @@
1
+ import { Divider, makeStyles, Theme } from '@material-ui/core'
2
+ import { Scroller, ScrollerButton, ScrollerProvider } from '@graphcommerce/framer-scroller'
3
+ import { Image } from '@graphcommerce/image'
4
+ import {
5
+ iconChevronLeft,
6
+ iconChevronRight,
7
+ responsiveVal,
8
+ SectionContainer,
9
+ SvgImageSimple,
10
+ UseStyles,
11
+ } from '@graphcommerce/next-ui'
12
+ import clsx from 'clsx'
13
+ import React from 'react'
14
+ import { useCartQuery } from '../../hooks'
15
+ import CartTotals from '../CartTotals/CartTotals'
16
+ import { CartItemSummaryDocument } from './GetCartItemSummary.gql'
17
+
18
+ const useStyles = makeStyles(
19
+ (theme: Theme) => ({
20
+ root: {
21
+ padding: `${theme.spacings.sm} ${theme.spacings.sm}`,
22
+ border: `1px ${theme.palette.divider} solid`,
23
+ borderRadius: 4,
24
+ },
25
+ imageScrollerContainer: {
26
+ display: 'flex',
27
+ alignItems: 'center',
28
+ gap: theme.spacings.sm,
29
+ position: 'relative',
30
+ },
31
+ image: {
32
+ borderRadius: '50%',
33
+ marginRight: theme.spacings.xs,
34
+ border: `5px ${theme.palette.common.white} solid`,
35
+ boxShadow: `0px 0px 2px ${theme.palette.grey[700]}`,
36
+ width: `${responsiveVal(48, 96)} !important`,
37
+ height: `${responsiveVal(48, 96)} !important`,
38
+ display: 'block',
39
+ },
40
+ scrollerContainer: {
41
+ padding: 1,
42
+ },
43
+ scroller: {
44
+ display: 'grid',
45
+ gridAutoFlow: 'column',
46
+ },
47
+ prevNext: {
48
+ position: 'absolute',
49
+ top: '50%',
50
+ transform: 'translateY(-50%)',
51
+ zIndex: 2,
52
+ },
53
+ prev: {
54
+ left: 8,
55
+ },
56
+ next: {
57
+ right: 8,
58
+ },
59
+ costContainer: {
60
+ background: theme.palette.background.default,
61
+ padding: 0,
62
+ },
63
+ sectionHeaderWrapper: {
64
+ marginTop: 0,
65
+ },
66
+ divider: {
67
+ margin: `${theme.spacings.xs} 0 ${theme.spacings.xs} 0`,
68
+ },
69
+ }),
70
+ { name: 'CartItemSummary' },
71
+ )
72
+
73
+ type OrderSummaryProps = UseStyles<typeof useStyles>
74
+
75
+ export default function CartItemSummary(props: OrderSummaryProps) {
76
+ const classes = useStyles(props)
77
+
78
+ const { data } = useCartQuery(CartItemSummaryDocument, { allowUrl: true })
79
+
80
+ if (!data?.cart) return null
81
+
82
+ const { items } = data?.cart
83
+
84
+ return (
85
+ <div className={classes.root}>
86
+ <SectionContainer
87
+ classes={{
88
+ sectionHeaderWrapper: classes.sectionHeaderWrapper,
89
+ }}
90
+ labelLeft='Order summary'
91
+ // labelRight={
92
+ // <PageLink href='/download' passHref>
93
+ // <Link color='secondary'>Download invoice</Link>
94
+ // </PageLink>
95
+ // }
96
+ variantLeft='h6'
97
+ >
98
+ <div className={classes.imageScrollerContainer}>
99
+ <ScrollerProvider scrollSnapAlign='start'>
100
+ <ScrollerButton direction='left' className={clsx(classes.prevNext, classes.prev)}>
101
+ <SvgImageSimple src={iconChevronLeft} />
102
+ </ScrollerButton>
103
+ <div className={classes.scrollerContainer}>
104
+ <Scroller className={classes.scroller}>
105
+ {items?.map((item) => (
106
+ <React.Fragment key={item?.uid}>
107
+ {item?.product?.thumbnail?.url ? (
108
+ <Image
109
+ key={item?.uid}
110
+ alt={item?.product?.thumbnail?.label ?? ''}
111
+ src={item?.product?.thumbnail?.url ?? ''}
112
+ className={classes.image}
113
+ layout='fill'
114
+ sizes={responsiveVal(48, 96)}
115
+ />
116
+ ) : (
117
+ <div />
118
+ )}
119
+ </React.Fragment>
120
+ ))}
121
+ </Scroller>
122
+ </div>
123
+ <ScrollerButton direction='right' className={clsx(classes.prevNext, classes.next)}>
124
+ <SvgImageSimple src={iconChevronRight} />
125
+ </ScrollerButton>
126
+ </ScrollerProvider>
127
+ </div>
128
+ <Divider classes={{ root: classes.divider }} />
129
+ <CartTotals classes={{ costsContainer: classes.costContainer }} />
130
+ </SectionContainer>
131
+ </div>
132
+ )
133
+ }
@@ -0,0 +1,4 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ export type CartStartCheckoutFragment = { prices?: Types.Maybe<{ grand_total?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> };
@@ -0,0 +1,7 @@
1
+ fragment CartStartCheckout on Cart @inject(into: ["CartItemCountChanged"]) {
2
+ prices {
3
+ grand_total {
4
+ ...Money
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,63 @@
1
+ import { makeStyles, Theme } from '@material-ui/core'
2
+ import { Money } from '@graphcommerce/magento-store'
3
+ import { Button, iconChevronRight, responsiveVal, SvgImage } from '@graphcommerce/next-ui'
4
+ import PageLink from 'next/link'
5
+ import React, { PropsWithChildren } from 'react'
6
+ import { CartStartCheckoutFragment } from './CartStartCheckout.gql'
7
+
8
+ const useStyles = makeStyles(
9
+ (theme: Theme) => ({
10
+ checkoutButtonContainer: {
11
+ textAlign: 'center',
12
+ },
13
+ checkoutButton: {
14
+ borderRadius: responsiveVal(40, 50),
15
+ fontSize: 17,
16
+ fontFamily: theme.typography.fontFamily,
17
+ fontWeight: 500,
18
+ marginBottom: theme.spacings.lg,
19
+ marginTop: theme.spacings.lg,
20
+ width: '100%',
21
+ maxHeight: 60,
22
+ maxWidth: 440,
23
+ padding: `${theme.spacings.xs} ${theme.spacings.sm}`,
24
+ },
25
+ checkoutButtonIcon: {
26
+ marginLeft: 0,
27
+ },
28
+ checkoutButtonLabel: {
29
+ fontWeight: theme.typography.fontWeightBold,
30
+ paddingRight: theme.spacings.xxs,
31
+ '& ~ span.MuiButton-endIcon': {
32
+ marginLeft: 6,
33
+ },
34
+ },
35
+ }),
36
+ { name: 'Cart' },
37
+ )
38
+
39
+ export type CartStartCheckoutProps = PropsWithChildren<CartStartCheckoutFragment>
40
+
41
+ export default function CartStartCheckout(props: CartStartCheckoutProps) {
42
+ const { prices, children } = props
43
+
44
+ const hasTotals = (prices?.grand_total?.value ?? 0) > 0
45
+ const classes = useStyles()
46
+ return (
47
+ <div className={classes.checkoutButtonContainer}>
48
+ <PageLink href='/checkout' passHref>
49
+ <Button
50
+ variant='pill'
51
+ color='secondary'
52
+ className={classes.checkoutButton}
53
+ endIcon={<SvgImage src={iconChevronRight} shade='inverted' alt='checkout' />}
54
+ disabled={!hasTotals}
55
+ >
56
+ <span className={classes.checkoutButtonLabel}>Start Checkout</span>{' '}
57
+ {hasTotals && <Money {...prices?.grand_total} />}
58
+ </Button>
59
+ </PageLink>
60
+ {children}
61
+ </div>
62
+ )
63
+ }
@@ -0,0 +1,4 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ export type CartSummaryFragment = { email?: Types.Maybe<string>, id: string, shipping_addresses: Array<Types.Maybe<{ __typename: 'ShippingCartAddress', firstname: string, lastname: string, city: string, company?: Types.Maybe<string>, postcode?: Types.Maybe<string>, street: Array<Types.Maybe<string>>, telephone: string, selected_shipping_method?: Types.Maybe<{ carrier_code: string, method_code: string, carrier_title: string, method_title: string }>, available_shipping_methods?: Types.Maybe<Array<Types.Maybe<{ available: boolean, carrier_code: string, carrier_title: string, error_message?: Types.Maybe<string>, method_code?: Types.Maybe<string>, method_title?: Types.Maybe<string>, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, country: { code: string, label: string }, region?: Types.Maybe<{ code?: Types.Maybe<string>, label?: Types.Maybe<string>, region_id?: Types.Maybe<number> }> }>>, billing_address?: Types.Maybe<{ __typename: 'BillingCartAddress', firstname: string, lastname: string, city: string, company?: Types.Maybe<string>, postcode?: Types.Maybe<string>, street: Array<Types.Maybe<string>>, telephone: string, country: { code: string, label: string }, region?: Types.Maybe<{ code?: Types.Maybe<string>, label?: Types.Maybe<string>, region_id?: Types.Maybe<number> }> }> };
@@ -0,0 +1,15 @@
1
+ fragment CartSummary on Cart {
2
+ email
3
+
4
+ shipping_addresses {
5
+ selected_shipping_method {
6
+ carrier_code
7
+ method_code
8
+ carrier_title
9
+ method_title
10
+ }
11
+ }
12
+
13
+ ...ShippingAddress
14
+ ...BillingAddress
15
+ }
@@ -0,0 +1,12 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
5
+
6
+ export const GetCartSummaryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCartSummary"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"cartId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cart"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"cart_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"cartId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"shipping_addresses"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"selected_shipping_method"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"carrier_code"}},{"kind":"Field","name":{"kind":"Name","value":"method_code"}},{"kind":"Field","name":{"kind":"Name","value":"carrier_title"}},{"kind":"Field","name":{"kind":"Name","value":"method_title"}}]}},{"kind":"Field","name":{"kind":"Name","value":"available_shipping_methods"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"amount"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currency"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}},{"kind":"Field","name":{"kind":"Name","value":"available"}},{"kind":"Field","name":{"kind":"Name","value":"carrier_code"}},{"kind":"Field","name":{"kind":"Name","value":"carrier_title"}},{"kind":"Field","name":{"kind":"Name","value":"error_message"}},{"kind":"Field","name":{"kind":"Name","value":"method_code"}},{"kind":"Field","name":{"kind":"Name","value":"method_title"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CartAddressInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"firstname"}},{"kind":"Field","name":{"kind":"Name","value":"lastname"}},{"kind":"Field","name":{"kind":"Name","value":"city"}},{"kind":"Field","name":{"kind":"Name","value":"company"}},{"kind":"Field","name":{"kind":"Name","value":"country"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"code"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"postcode"}},{"kind":"Field","name":{"kind":"Name","value":"region"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"code"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"region_id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"street"}},{"kind":"Field","name":{"kind":"Name","value":"telephone"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"billing_address"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CartAddressInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"__typename"}},{"kind":"Field","name":{"kind":"Name","value":"firstname"}},{"kind":"Field","name":{"kind":"Name","value":"lastname"}},{"kind":"Field","name":{"kind":"Name","value":"city"}},{"kind":"Field","name":{"kind":"Name","value":"company"}},{"kind":"Field","name":{"kind":"Name","value":"country"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"code"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}},{"kind":"Field","name":{"kind":"Name","value":"postcode"}},{"kind":"Field","name":{"kind":"Name","value":"region"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"code"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"region_id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"street"}},{"kind":"Field","name":{"kind":"Name","value":"telephone"}}]}}]}}]}}]}}]} as unknown as DocumentNode<GetCartSummaryQuery, GetCartSummaryQueryVariables>;
7
+ export type GetCartSummaryQueryVariables = Types.Exact<{
8
+ cartId: Types.Scalars['String'];
9
+ }>;
10
+
11
+
12
+ export type GetCartSummaryQuery = { cart?: Types.Maybe<{ email?: Types.Maybe<string>, id: string, shipping_addresses: Array<Types.Maybe<{ __typename: 'ShippingCartAddress', firstname: string, lastname: string, city: string, company?: Types.Maybe<string>, postcode?: Types.Maybe<string>, street: Array<Types.Maybe<string>>, telephone: string, country: { code: string, label: string }, region?: Types.Maybe<{ code?: Types.Maybe<string>, label?: Types.Maybe<string>, region_id?: Types.Maybe<number> }>, selected_shipping_method?: Types.Maybe<{ carrier_code: string, method_code: string, carrier_title: string, method_title: string }>, available_shipping_methods?: Types.Maybe<Array<Types.Maybe<{ available: boolean, carrier_code: string, carrier_title: string, error_message?: Types.Maybe<string>, method_code?: Types.Maybe<string>, method_title?: Types.Maybe<string>, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>> }>>, billing_address?: Types.Maybe<{ __typename: 'BillingCartAddress', firstname: string, lastname: string, city: string, company?: Types.Maybe<string>, postcode?: Types.Maybe<string>, street: Array<Types.Maybe<string>>, telephone: string, country: { code: string, label: string }, region?: Types.Maybe<{ code?: Types.Maybe<string>, label?: Types.Maybe<string>, region_id?: Types.Maybe<number> }> }> }> };
@@ -0,0 +1,5 @@
1
+ query GetCartSummary($cartId: String!) {
2
+ cart(cart_id: $cartId) {
3
+ ...CartSummary
4
+ }
5
+ }
@@ -0,0 +1,139 @@
1
+ import { Link, makeStyles, Theme, Typography } from '@material-ui/core'
2
+ import { CartAddressMultiLine } from '@graphcommerce/magento-cart-address'
3
+ import { SectionContainer, UseStyles } from '@graphcommerce/next-ui'
4
+ import PageLink from 'next/link'
5
+ import React from 'react'
6
+ import { useCartQuery } from '../../hooks'
7
+ import { GetCartSummaryDocument } from './GetCartSummary.gql'
8
+
9
+ const useStyles = makeStyles(
10
+ (theme: Theme) => ({
11
+ root: {
12
+ borderRadius: 4,
13
+ background: '#FFFADD',
14
+ margin: `${theme.spacings.sm} 0`,
15
+ },
16
+ detailsContainer: {
17
+ padding: theme.spacings.sm,
18
+ gridColumnGap: theme.spacings.xl,
19
+ gridRowGap: theme.spacings.sm,
20
+ display: `grid`,
21
+ [theme.breakpoints.up('sm')]: {
22
+ gridTemplateColumns: `1fr 1fr`,
23
+ marginTop: theme.spacings.xxs,
24
+ },
25
+ },
26
+ sectionHeaderWrapper: {
27
+ marginTop: 0,
28
+ paddingBottom: 8,
29
+ },
30
+ orderNumberLabel: {
31
+ display: 'grid',
32
+ gridTemplateColumns: `2fr 1fr`,
33
+ },
34
+ }),
35
+ { name: 'OrderDetails' },
36
+ )
37
+
38
+ export type CartSummaryProps = {
39
+ children?: React.ReactNode
40
+ editable?: boolean
41
+ } & UseStyles<typeof useStyles>
42
+
43
+ export default function CartSummary(props: CartSummaryProps) {
44
+ const classes = useStyles(props)
45
+ const { children, editable } = props
46
+
47
+ const { data } = useCartQuery(GetCartSummaryDocument, {
48
+ // allowUrl: true,
49
+ fetchPolicy: 'network-only',
50
+ })
51
+
52
+ if (!data?.cart) return null
53
+
54
+ const { email, shipping_addresses, billing_address } = data.cart
55
+
56
+ return (
57
+ <div className={classes.root}>
58
+ <div className={classes.detailsContainer}>
59
+ <div>
60
+ <SectionContainer
61
+ variantLeft='h5'
62
+ labelLeft='Confirmation + Track & trace'
63
+ classes={{ sectionHeaderWrapper: classes.sectionHeaderWrapper }}
64
+ // labelRight={
65
+ // editable ? (
66
+ // <PageLink href='/checkout/edit' passHref>
67
+ // <Link color='secondary' variant='body2'>
68
+ // Edit
69
+ // </Link>
70
+ // </PageLink>
71
+ // ) : undefined
72
+ // }
73
+ />
74
+ <Typography variant='body1'>{email || ''}</Typography>
75
+ </div>
76
+ <div>
77
+ <SectionContainer
78
+ variantLeft='h5'
79
+ labelLeft='Shipping method'
80
+ classes={{ sectionHeaderWrapper: classes.sectionHeaderWrapper }}
81
+ // labelRight={
82
+ // editable ? (
83
+ // <PageLink href='/checkout/edit/shipping' passHref>
84
+ // <Link color='secondary' variant='body2'>
85
+ // Edit
86
+ // </Link>
87
+ // </PageLink>
88
+ // ) : undefined
89
+ // }
90
+ />
91
+ <Typography variant='body1'>
92
+ {shipping_addresses?.[0]?.selected_shipping_method?.carrier_title}
93
+ {shipping_addresses?.[0]?.selected_shipping_method?.method_title}
94
+ </Typography>
95
+ </div>
96
+ {shipping_addresses && (
97
+ <>
98
+ <div>
99
+ <SectionContainer
100
+ variantLeft='h5'
101
+ labelLeft='Shipping address'
102
+ classes={{ sectionHeaderWrapper: classes.sectionHeaderWrapper }}
103
+ // labelRight={
104
+ // editable ? (
105
+ // <PageLink href='/checkout/edit/shipping_address' passHref>
106
+ // <Link color='secondary' variant='body2'>
107
+ // Edit
108
+ // </Link>
109
+ // </PageLink>
110
+ // ) : undefined
111
+ // }
112
+ />
113
+ <CartAddressMultiLine {...shipping_addresses[0]} />
114
+ </div>
115
+ <div>
116
+ <SectionContainer
117
+ variantLeft='h5'
118
+ labelLeft='Billing Address'
119
+ classes={{ sectionHeaderWrapper: classes.sectionHeaderWrapper }}
120
+ labelRight={
121
+ editable ? (
122
+ <PageLink href='/checkout/edit/billing-address' passHref>
123
+ <Link color='secondary' variant='body2'>
124
+ Edit
125
+ </Link>
126
+ </PageLink>
127
+ ) : undefined
128
+ }
129
+ >
130
+ <CartAddressMultiLine {...billing_address} />
131
+ </SectionContainer>
132
+ </div>
133
+ </>
134
+ )}
135
+ </div>
136
+ {children}
137
+ </div>
138
+ )
139
+ }
@@ -0,0 +1,4 @@
1
+ /* eslint-disable */
2
+ import * as Types from '@graphcommerce/graphql';
3
+
4
+ export type CartTotalsFragment = { shipping_addresses: Array<Types.Maybe<{ selected_shipping_method?: Types.Maybe<{ carrier_code: string, method_code: string, method_title: string, carrier_title: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>, available_shipping_methods?: Types.Maybe<Array<Types.Maybe<{ carrier_code: string, method_code?: Types.Maybe<string>, price_incl_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }, price_excl_tax: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>> }>>, prices?: Types.Maybe<{ __typename: 'CartPrices', applied_taxes?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, discounts?: Types.Maybe<Array<Types.Maybe<{ label: string, amount: { currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> } }>>>, grand_total?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_excluding_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_including_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }>, subtotal_with_discount_excluding_tax?: Types.Maybe<{ currency?: Types.Maybe<Types.CurrencyEnum>, value?: Types.Maybe<number> }> }> };
@@ -0,0 +1,51 @@
1
+ fragment CartTotals on Cart @inject(into: ["CartItemCountChanged"]) {
2
+ shipping_addresses {
3
+ selected_shipping_method {
4
+ carrier_code
5
+ method_code
6
+ method_title
7
+ carrier_title
8
+ amount {
9
+ ...Money
10
+ }
11
+ }
12
+ # https://github.com/magento/magento2/pull/31322
13
+ available_shipping_methods {
14
+ carrier_code
15
+ method_code
16
+ price_incl_tax {
17
+ ...Money
18
+ }
19
+ price_excl_tax {
20
+ ...Money
21
+ }
22
+ }
23
+ }
24
+ prices {
25
+ __typename
26
+ applied_taxes {
27
+ amount {
28
+ ...Money
29
+ }
30
+ label
31
+ }
32
+ discounts {
33
+ amount {
34
+ ...Money
35
+ }
36
+ label
37
+ }
38
+ grand_total {
39
+ ...Money
40
+ }
41
+ subtotal_excluding_tax {
42
+ ...Money
43
+ }
44
+ subtotal_including_tax {
45
+ ...Money
46
+ }
47
+ subtotal_with_discount_excluding_tax {
48
+ ...Money
49
+ }
50
+ }
51
+ }