// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
/**
* Copied with modification from src/frontend/components/Cart/CartDetail.tsx
*/
import { router } from "expo-router";
import { ThemedView } from "@/components/ThemedView";
import { ThemedText } from "@/components/ThemedText";
import { Pressable, StyleSheet } from "react-native";
import { useCart } from "@/providers/Cart.provider";
import CheckoutForm from "@/components/CheckoutForm";
import EmptyCart from "@/components/EmptyCart";
import { ThemedScrollView } from "@/components/ThemedScrollView";
import { useCallback, useMemo } from "react";
import { IFormData } from "@/components/CheckoutForm/CheckoutForm";
import Toast from "react-native-toast-message";
import SessionGateway from "@/gateways/Session.gateway";
import { useThemeColor } from "@/hooks/useThemeColor";
export default function Cart() {
const tint = useThemeColor({}, "tint");
const styles = useMemo(() => getStyles(tint), [tint]);
const {
cart: { items },
emptyCart,
placeOrder,
} = useCart();
const onEmptyCart = useCallback(() => {
emptyCart();
Toast.show({
type: "success",
position: "bottom",
text1: "Your cart was emptied",
});
}, [emptyCart]);
const onPlaceOrder = useCallback(
async ({
email,
state,
streetAddress,
country,
city,
zipCode,
creditCardCvv,
creditCardExpirationMonth,
creditCardExpirationYear,
creditCardNumber,
}: IFormData) => {
const { userId } = await SessionGateway.getSession();
await placeOrder({
userId,
email,
address: {
streetAddress,
state,
country,
city,
zipCode,
},
// TODO simplify react native demo for now by hard-coding the selected currency
userCurrency: "USD",
creditCard: {
creditCardCvv,
creditCardExpirationMonth,
creditCardExpirationYear,
creditCardNumber,
},
});
Toast.show({
type: "success",
position: "bottom",
text1: "Your order is Complete!",
text2: "We've sent you a confirmation email.",
});
router.replace("/");
},
[placeOrder],
);
if (!items.length) {
return ;
}
return (
{items.map((item) => (
{item.product.name}
{item.quantity}
))}
Empty Cart
);
}
const getStyles = (tint: string) =>
StyleSheet.create({
container: {
flex: 1,
gap: 20,
justifyContent: "flex-start",
},
emptyCartContainer: {
display: "flex",
alignItems: "flex-end",
},
emptyCart: {
borderRadius: 4,
backgroundColor: "green",
alignItems: "center",
width: 100,
right: 20,
position: "relative",
},
emptyCartText: {
color: "white",
},
cartItem: {
marginLeft: 20,
marginRight: 20,
display: "flex",
flexDirection: "row",
justifyContent: "space-between",
borderStyle: "solid",
borderBottomWidth: 1,
borderColor: tint,
},
bold: {
fontWeight: "bold",
},
});