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}
- />
- >
+
+
);
}