cart
Version:
Headless cart management library
195 lines (145 loc) • 8.76 kB
Markdown
<h1 align="center">Cart</h1>
<p align="center">Headless cart management library</p>

<p align="center">
<a href="#contributors" target="_blank">
<!-- prettier-ignore-start -->
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
<img alt="All Contributors: 2" src="https://img.shields.io/badge/all_contributors-2-21bb42.svg" />
<!-- ALL-CONTRIBUTORS-BADGE:END -->
<!-- prettier-ignore-end -->
</a>
<a href="https://codecov.io/gh/mcnaveen/Cart" target="_blank">
<img alt="Codecov Test Coverage" src="https://codecov.io/gh/mcnaveen/Cart/branch/main/graph/badge.svg"/>
</a>
<a href="https://github.com/mcnaveen/Cart/blob/main/.github/CODE_OF_CONDUCT.md" target="_blank">
<img alt="Contributor Covenant" src="https://img.shields.io/badge/code_of_conduct-enforced-21bb42" />
</a>
<a href="https://github.com/mcnaveen/Cart/blob/main/LICENSE.md" target="_blank">
<img alt="License: MIT" src="https://img.shields.io/github/license/mcnaveen/Cart?color=21bb42">
</a>
<img alt="Style: Prettier" src="https://img.shields.io/badge/style-prettier-21bb42.svg" />
<img alt="TypeScript: Strict" src="https://img.shields.io/badge/typescript-strict-21bb42.svg" />
</p>
> ⚠️ Expect some breaking changes, Use at your own risk
### 🛒 Demo
- [View React Demo](https://stackblitz-starters-dt9zzc.stackblitz.io/)
- [Nextjs App Directory Demo](https://stackblitzstarterskcruvd-uufb--3000--d6c42aca.local-credentialless.webcontainer.io/)
### :package: Requirements
- React or Nextjs Project ⚛️
### :sparkles: Installation
- Install using the below command (with your package manager of choice)
```bash
# npm
npm install cart --save
# yarn
yarn add cart
#pnpm
pnpm add cart
# bun
bun install cart
```
---
### :bulb: Usage Example
```jsx
import React from "react";
import { useCart } from "cart";
const item = {
productId: "123",
name: "Product 1",
quantity: 1,
price: 10,
};
function Cart() {
const {
addToCart,
cartItems,
clearCart,
decreaseItem,
toggleCart,
isCartOpen,
} = useCart();
return (
<div>
<p>{isCartOpen ? "Open" : "Closed"}</p>
<button onClick={() => toggleCart()}>Toggle</button>
<button onClick={() => addToCart(item)}>Add</button>
<button onClick={() => clearCart()}>Clear</button>
<button onClick={() => decreaseItem("123", 1)}>Decrease</button>
<p>{JSON.stringify(cartItems)}</p>
</div>
);
}
export default Cart;
```
### :bulb: SSR Example
```jsx
import { useCart, withSSR } from "cart";
import React from "react";
const item = {
productId: "123",
name: "Product 1",
quantity: 1,
price: 10,
};
function MyCart() {
const cart = withSSR(useCart, (state) => state);
const handleToggle = () => {
cart?.toggleCart();
};
const itemadd = () => {
cart?.addToCart(item);
};
return (
<div>
<p>{cart?.isCartOpen ? "Open" : "Closed"}</p>
<button onClick={() => handleToggle()}>Toggle</button>
<button onClick={() => itemadd()}>Add</button>
<button onClick={() => cart?.clearCart()}>Clear</button>
<button onClick={() => cart?.decreaseItem("123", 1)}>Decrease</button>
<p>{JSON.stringify(cart?.cartItems)}</p>
</div>
);
}
export default MyCart;
```
---
### API Reference
| Name | Type | Default Value | Description | Example |
| ---------------- | ---------- | ------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `isCartOpen` | `boolean` | `false` | Indicates whether the cart is open or not. | `isCartOpen ? "Yes" : "No"` |
| `toggleCart` | `function` | - | Toggles the visibility of the shopping cart. | `toggleCart();` |
| `openCart` | `function` | - | Sets the cart open state to `true`. | `openCart();` |
| `closeCart` | `function` | - | Sets the cart open state to `false`. | `closeCart();` |
| `cartItems` | `array` | `[]` | An array of items in the cart. | `cartItems.map((item) => ( <div key={item.productId}> <p>{item.name}</p> <p>Quantity: {item.quantity}</p> <p>Price: ${item.price}</p> </div> ))` |
| `addToCart` | `function` | - | Adds an item to the shopping cart or updates its quantity if already in the cart. | `addToCart({ productId: 'product1', name: 'Product 1', quantity: 2, price: 20 });` |
| `decreaseItem` | `function` | - | Decreases the quantity of an item in the shopping cart or removes it if the quantity becomes zero. | `decreaseItem('product1', 1);` |
| `removeFromCart` | `function` | - | Removes an item from the shopping cart. | `removeFromCart('product1');` |
| `clearCart` | `function` | - | Clears all items from the shopping cart. | `clearCart();` |
#### :pray: Credits
Huge thanks to [Peter Krumins](https://github.com/pkrumins) for the package name `cart`.
Please checkout [Browserling](https://www.browserling.com/) - Online cross-browser testing platform.
(Btw, This is not a sponsored message, Just my way of saying thank you)
#### Contributors
<!-- spellchecker: disable -->
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.joshuakgoldberg.com/"><img src="https://avatars.githubusercontent.com/u/3335181?v=4?s=100" width="100px;" alt="Josh Goldberg ✨"/><br /><sub><b>Josh Goldberg ✨</b></sub></a><br /><a href="#tool-JoshuaKGoldberg" title="Tools">🔧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mcnaveen"><img src="https://avatars.githubusercontent.com/u/8493007?v=4?s=100" width="100px;" alt="MC Naveen"/><br /><sub><b>MC Naveen</b></sub></a><br /><a href="https://github.com/mcnaveen/Cart/commits?author=mcnaveen" title="Code">💻</a> <a href="#content-mcnaveen" title="Content">🖋</a> <a href="https://github.com/mcnaveen/Cart/commits?author=mcnaveen" title="Documentation">📖</a> <a href="#ideas-mcnaveen" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-mcnaveen" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-mcnaveen" title="Maintenance">🚧</a> <a href="#projectManagement-mcnaveen" title="Project Management">📆</a> <a href="#tool-mcnaveen" title="Tools">🔧</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
<!-- spellchecker: enable -->
<!-- You can remove this notice if you don't want it 🙂 no worries! -->
#### :green_heart: Message
I hope you find this useful.
If you have any questions, please create an issue.
---
> 💙 This package is based on [@JoshuaKGoldberg](https://github.com/JoshuaKGoldberg)'s [create-typescript-app](https://github.com/JoshuaKGoldberg/create-typescript-app).