diff --git a/components/AppHeader.tsx b/components/AppHeader.tsx index 12ee0b1..415eaf8 100644 --- a/components/AppHeader.tsx +++ b/components/AppHeader.tsx @@ -1,16 +1,13 @@ -import React from "react"; -import { Item } from "../utils/types"; -import Cart from "./Cart"; +import React, { ReactNode } from "react"; type AppHeaderProps = { - items: Item[]; - onItemsClear(): void; + children: ReactNode; }; -function AppHeader({ items, onItemsClear }: AppHeaderProps) { +function AppHeader({ children }: AppHeaderProps) { return (

MyShopping24

- + {children}
); } diff --git a/components/Cart.tsx b/components/Cart.tsx index ba710d7..6dc78f5 100644 --- a/components/Cart.tsx +++ b/components/Cart.tsx @@ -1,11 +1,9 @@ import React from "react"; -import type { Item } from "../utils/types"; +import { useCartContext } from "../contexts/CartContext"; + +function Cart() { + const { items, onClear } = useCartContext(); -type CartProps = { - items: Item[]; - onClear(): void; -}; -function Cart({ items, onClear }: CartProps) { const totalPrice = items.reduce((prev, item) => prev + item.price, 0); return ( diff --git a/components/ItemDetails.tsx b/components/ItemDetails.tsx index 4f3fa91..aa5327f 100644 --- a/components/ItemDetails.tsx +++ b/components/ItemDetails.tsx @@ -1,15 +1,17 @@ import React from "react"; +import { useCartContext } from "../contexts/CartContext"; import { Item } from "../utils/types"; type ItemDetailsProps = { item: Item; - onAdd(): void; }; -function ItemDetails({ item, onAdd }: ItemDetailsProps) { +function ItemDetails({ item }: ItemDetailsProps) { + const { onItemAdd } = useCartContext(); + return ( <> {item.name} ${item.price} - + ); } diff --git a/contexts/CartContext.tsx b/contexts/CartContext.tsx new file mode 100644 index 0000000..48d8b4d --- /dev/null +++ b/contexts/CartContext.tsx @@ -0,0 +1,44 @@ +import { createContext, ReactNode, useContext, useState } from "react"; +import type { Item } from "../utils/types"; + +type CartContextType = { + items: Item[]; + onClear(): void; + onItemAdd(item: Item): void; +}; +export const CartContext = createContext(null); + +type CartContextProviderProps = { + children: ReactNode; +}; +export function CartContextProvider({ children }: CartContextProviderProps) { + const [items, setItems] = useState([]); + + function onClear() { + setItems([]); + } + + function onItemAdd(item: Item) { + setItems((items) => [...items, item]); + } + + return ( + + {children} + + ); +} + +export function useCartContext() { + return useContext(CartContext); +} + +export function useItems() { + return useCartContext().items; +} diff --git a/pages/[name].tsx b/pages/[name].tsx index 6e2036d..0a9669a 100644 --- a/pages/[name].tsx +++ b/pages/[name].tsx @@ -7,10 +7,7 @@ import styles from "../styles/Home.module.css"; import Link from "next/link"; import ItemDetails from "../components/ItemDetails"; -type ItemPageProps = { - onItemAdd(item: Item): void; -}; -export default function ItemPage({ onItemAdd }: ItemPageProps) { +export default function ItemPage() { const router = useRouter(); const { name } = router.query; @@ -27,7 +24,7 @@ export default function ItemPage({ onItemAdd }: ItemPageProps) {
- onItemAdd(item)} /> + Back diff --git a/pages/_app.tsx b/pages/_app.tsx index c00266f..633417b 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,21 +1,18 @@ import type { AppProps } from "next/app"; -import { useState } from "react"; import AppHeader from "../components/AppHeader"; +import Cart from "../components/Cart"; +import { CartContextProvider } from "../contexts/CartContext"; import "../styles/globals.css"; -import { Item } from "../utils/types"; function MyApp({ Component, pageProps }: AppProps) { - const [items, setItems] = useState([]); - return ( - <> - setItems([])} /> + + + + - setItems((items) => [...items, item])} - {...pageProps} - /> - + + ); }