@chec/react-commercejs-hooks
Version:
ReactJS hooks for using Commerce.js with React projects
148 lines (121 loc) • 8.06 kB
Markdown
<h1 align="center">
React hooks for Commerce.js
</h1>
<p align="center">
A library of React hooks that can be used to integrate Commerce.js and interface with the Chec Dashboard.
</p>
<p align="center">
<a href="https://npmjs.org/package/@chec/react-commercejs-hooks">
<img src="https://img.shields.io/npm/v/@chec/react-commercejs-hooks.svg" alt="Version" />
</a>
<a href="https://npmjs.org/package/@chec/react-commercejs-hooks">
<img src="https://img.shields.io/npm/dw/@chec/react-commercejs-hooks.svg" alt="Downloads/week" />
</a>
<a href="https://github.com/chec/react-commercejs-hooks/blob/master/LICENSE.md">
<img src="https://img.shields.io/npm/l/@chec/react-commercejs-hooks" alt="License" />
</a>
<br>
<a href="https://commercejs.com">commercejs.com</a> | <a href="https://twitter.com/commercejs"></a> | <a href="http://slack.commercejs.com">Slack</a>
</p>
## Installation
Use your favourite package manager:
```shell
yarn add /react-commercejs-hooks
# OR
npm install --save /react-commercejs-hooks
```
## Usage
Access to the Commerce.js SDK is provided with a context provider. This is used by the various hooks in this library to
access data from the Chec API. Ensure that you wrap any component that uses a Commerce.js hook in the CommerceContext
component:
```js
import { CommerceContext } from '@chec/react-commercejs-hooks';
export default function MyComponent() {
return (
// Provide CommerceContext with your public key
<CommerceContext publicKey="pk_123abc">
<ProductList />
</CommerceContext>
);
}
```
The arguments for the Commerce.js SDK are supported as props on the `CommerceContext` component:
| Prop | Purpose |
| ---- | ------- |
| publicKey | Your Chec public key, the first argument when using Commerce.js |
| debug | A boolean indicating whether the Commerce.js SDK should emit debug information to the console. The second argument of Commerce.js |
| options | An object with various options. This is the third argument of the Commerce.js SDK |
You can use the Commerce.js SDK in any component that is a child of the `CommerceContext` component by using the
`useCommerce` hook:
```js
import { useEffect } from 'react';
import { useCommerce } from '@chec/react-commercejs-hooks';
export default function ProductList() {
const { commerce } = useCommerce();
useEffect(() => {
if (!commerce) {
return;
}
commerce.products.list().then(products => {
// ...
})
}, [commerce]);
}
```
### Checkout hooks
This library provides many hooks for use with the checkout, but in order to use them, you must put components within a
checkout context by using the `CheckoutProvider` component. In the following example, a checkout is created from a
Commerce.js cart ID, passed in as a prop:
```js
import { CheckoutProvider } from '@chec/react-commercejs-hooks/checkout';
export default function Checkout({ cartId }) {
return (
<CheckoutProvider id={cartId}>
<LineItemSummary />
<CustomerFields />
<PaymentSummary />
<PaymentForm />
</CheckoutProvider>
);
}
```
The following hooks are available for use within a checkout, and are all exported from
`/react-commercejs-hooks/checkout`:
| Hook | Purpose |
| ---- | ------- |
| `useCheckout()` | Provides the checkout (token) object that was fetched by Commerce.js (when available). The object structure of this is available [here](https://commercejs.com/docs/api/#checkout) |
| `useAllCountries()` | Provides all countries that Commerce.js supports. See [list all countries](https://commercejs.com/docs/sdk/checkout#list-all-countries) in the docs. |
| `useAllSubdivisions()` | Provides all subdivisions based on a country that Commerce.js supports. See [list all subdivisions for a country](https://commercejs.com/docs/api/#list-all-subdivisions-for-a-country) in the docs. |
| `useIsFree()` | Checks whether a checkout has a zero payable balance. Returns a boolean, or null when the checkout is not available |
| `useCheckQuantity()` | Checks that a requested quantity is available for a line item ID. Variant and option IDs may also be provided if necessary. See [check requested quantity](https://commercejs.com/docs/api/#check-requested-quantity) in the docs. |
| `useCheckVariant()` | Checks that the provided variant ID and option ID is valid for the provided line item ID. See [check variant](https://commercejs.com/docs/api/#check-variant) in the docs. |
| `useConditionals()` | Provides the "conditionals" attribute from the checkout, indicating what conditional flags apply for the current checkout |
| `useLineItems()` | Provides the line items in the checkout |
| `useLocationFromIp()` | Provides geographic information about the user from their IP address. Returns the discovered location information, or null if the checkout is not available. See [get buyer's location from IP](https://commercejs.com/docs/api/#get-buyer-039-s-location-from-ip) in the docs for more information. |
| `useShippingCountries()` | Provides the countries that are eligible for shipping based on the product selection in the checkout |
| `useShippingOptions(country, region)` | Provides the shipping options that can be selected for the given country (and region if provided) based on the product selection in the checkout |
| `useShippingSubdivisions(countryCode)` | Provides subdivisions of the given country code |
| `useShippingSummary()` | Provides detail of the chosen shipping method in the checkout |
| `useTotals()` | Provides the total cost of the checkout, and various subtotals within the checkout |
| `useCapture()` | Provides a callback that can be used to capture the checkout, with the given detail if provided |
| `useCaptureWithStripe()` | Extends the functionality of `useCapture` to provide integrated Stripe support, assuming that this hook is used within Elements context (from `react-stripe-js`) |
| `useSetProductVariant()` | Provides a callback that can be used to set a variant on a product within the checkout |
| `useSetShippingOption()` | Provides a callback that can be used to set the chosen shipping option for the checkout |
| `useSetTaxZone()` | Sets the tax zone for the checkout and updates the live object. See [set tax zone](https://commercejs.com/docs/api/#set-tax-zone) in the docs. |
| `useRegenerateCheckout()` | Regenerate a checkout from the properties provided to the context. Can be useful to update the checkout when a cart changes in the same page. |
### Cart hooks
Cart hooks provided by this library leverage Vercel's `swr` library: https://swr.vercel.app/. This provides efficient
request usage while maintaining data state across components and pages, all without having to wrap components in a React
context provider. Cart hooks must still be used within the [`CommerceContext`](#usage) though.
The following hooks are available for use for carts, and are all exported from `/react-commercejs-hooks/cart`. The
arguments for most cart update methods are the same as Commerce.js functions, which are detailed in the
[docs](https://commercejs.com/docs):
| Hook | Purpose |
| ---- | ------- |
| `useCart()` | Provides the active cart, or a cart for a specific ID if specified. The object structure of this is available [here](https://commercejs.com/docs/api/#carts) |
| `useActiveCartId()` | Provides the ID of the active cart - tracked in the users browser |
| `useAddToCart()` | Provides a callback that can be used to add a product to the cart. Takes a product ID and an optional quantity of items to add |
| `useUpdateCart()` | Provides a callback that can be used to update line items in the cart. Takes the same arguments as `commerce.cart.update` in Commerce.js |
| `useRemoveFromCart()` | Provides a callback that can be used to remove a given line item (by ID) from the cart |
| `useEmptyCart()` | Provides a callback that can be used to empty the cart |
| `useCreateNewCart()` | Provides a callback that can be used to replace the current cart with a new empty cart |