@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.
- package/Api/CartItemCountChanged.gql.ts +4 -0
- package/Api/CartItemCountChanged.graphql +9 -0
- package/CHANGELOG.md +324 -0
- package/README.md +102 -0
- package/components/AddToCartButton/AddToCartButton.tsx +127 -0
- package/components/ApolloCartError/ApolloCartErrorAlert.tsx +36 -0
- package/components/ApolloCartError/ApolloCartErrorFullPage.tsx +1 -0
- package/components/CartFab/CartFab.gql.ts +12 -0
- package/components/CartFab/CartFab.graphql +6 -0
- package/components/CartFab/CartFab.tsx +67 -0
- package/components/CartFab/CartTotalQuantity.gql.ts +4 -0
- package/components/CartFab/CartTotalQuantity.graphql +3 -0
- package/components/CartItemSummary/GetCartItemSummary.gql.ts +12 -0
- package/components/CartItemSummary/GetCartItemSummary.graphql +6 -0
- package/components/CartItemSummary/index.tsx +133 -0
- package/components/CartStartCheckout/CartStartCheckout.gql.ts +4 -0
- package/components/CartStartCheckout/CartStartCheckout.graphql +7 -0
- package/components/CartStartCheckout/CartStartCheckout.tsx +63 -0
- package/components/CartSummary/CartSummary.gql.ts +4 -0
- package/components/CartSummary/CartSummary.graphql +15 -0
- package/components/CartSummary/GetCartSummary.gql.ts +12 -0
- package/components/CartSummary/GetCartSummary.graphql +5 -0
- package/components/CartSummary/index.tsx +139 -0
- package/components/CartTotals/CartTotals.gql.ts +4 -0
- package/components/CartTotals/CartTotals.graphql +51 -0
- package/components/CartTotals/CartTotals.tsx +187 -0
- package/components/CartTotals/GetCartTotals.gql.ts +12 -0
- package/components/CartTotals/GetCartTotals.graphql +5 -0
- package/components/EmptyCart/EmptyCart.tsx +56 -0
- package/components/index.ts +24 -0
- package/hooks/CreateEmptyCart.gql.ts +10 -0
- package/hooks/CreateEmptyCart.graphql +3 -0
- package/hooks/CurrentCartId.gql.ts +10 -0
- package/hooks/CurrentCartId.graphql +6 -0
- package/hooks/CurrentCartId.graphqls +11 -0
- package/hooks/CustomerCart.gql.ts +10 -0
- package/hooks/CustomerCart.graphql +7 -0
- package/hooks/UseCartRedirect.gql.ts +12 -0
- package/hooks/UseCartRedirect.graphql +5 -0
- package/hooks/UseMergeCustomerCart.gql.ts +13 -0
- package/hooks/UseMergeCustomerCart.graphql +6 -0
- package/hooks/index.ts +8 -0
- package/hooks/useAssignCurrentCartId.ts +18 -0
- package/hooks/useCartIdCreate.ts +22 -0
- package/hooks/useCartQuery.ts +37 -0
- package/hooks/useClearCurrentCartId.ts +18 -0
- package/hooks/useCurrentCartId.ts +6 -0
- package/hooks/useDisplayInclTax.ts +7 -0
- package/hooks/useFormGqlMutationCart.ts +28 -0
- package/hooks/useMergeCustomerCart.ts +49 -0
- package/index.ts +4 -0
- package/next-env.d.ts +4 -0
- package/package.json +42 -0
- package/tsconfig.json +5 -0
- 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,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,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,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,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,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
|
+
}
|