diff --git a/app/src/components/CheckoutSheet.tsx b/app/src/components/CheckoutSheet.tsx new file mode 100644 index 0000000..bbdbffb --- /dev/null +++ b/app/src/components/CheckoutSheet.tsx @@ -0,0 +1,135 @@ +import type { JSX } from "react"; +import { useMemo, useState } from "react"; +import { View } from "react-native"; +import { useRouter } from "expo-router"; +import { BottomSheet, Button, Spinner, Typography, useThemeColor } from "heroui-native"; +import { PRODUCTS, RESOLVERS } from "@/data/mock"; +import { useModals } from "@/state/modals"; +import { ResolverCard } from "@/components/ResolverCard"; + +export function CheckoutSheet(): JSX.Element { + const router = useRouter(); + const accentColor = useThemeColor("accent"); + const { isCheckoutSheetOpen, checkoutListingId, checkoutStep, closeCheckoutSheet, confirmOrder } = + useModals(); + const [resolverId, setResolverId] = useState(0); + + const listing = useMemo( + () => PRODUCTS.find((product) => product.id === checkoutListingId) ?? PRODUCTS[0], + [checkoutListingId], + ); + + const handleViewOrders = () => { + closeCheckoutSheet(); + router.push("/orders"); + }; + + const handleContinueShopping = () => { + closeCheckoutSheet(); + router.push("/browse"); + }; + + return ( + { + if (!open) closeCheckoutSheet(); + }} + > + + + + {checkoutStep === "review" && ( + + + Place Order + + + {listing.emoji} + + + + {listing.name} + + + {listing.seller} + + + + + + + Payment + + + {listing.price} + + ≈ {listing.usd} USD + + + + + + + Dispute Protection + + {RESOLVERS.map((item) => ( + setResolverId(item.id)} + /> + ))} + + + + + + + + )} + + {checkoutStep === "pending" && ( + + + Confirming on Solana… + + {"Approve the transaction in your wallet.\nThis takes a few seconds."} + + + )} + + {checkoutStep === "success" && ( + + + + + + Order Placed! + + {`${listing.price} is now held in secure escrow.\nThe seller has been notified.`} + + + + + + + + )} + + + + ); +}