summaryrefslogtreecommitdiff
path: root/src/frontend/components/CartDropdown/CartDropdown.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/components/CartDropdown/CartDropdown.tsx')
-rw-r--r--src/frontend/components/CartDropdown/CartDropdown.tsx65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/frontend/components/CartDropdown/CartDropdown.tsx b/src/frontend/components/CartDropdown/CartDropdown.tsx
new file mode 100644
index 0000000..cd0703e
--- /dev/null
+++ b/src/frontend/components/CartDropdown/CartDropdown.tsx
@@ -0,0 +1,65 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+import Link from 'next/link';
+import { useEffect, useRef } from 'react';
+import { CypressFields } from '../../utils/enums/CypressFields';
+import { IProductCartItem } from '../../types/Cart';
+import ProductPrice from '../ProductPrice';
+import * as S from './CartDropdown.styled';
+
+interface IProps {
+ isOpen: boolean;
+ onClose(): void;
+ productList: IProductCartItem[];
+}
+
+const CartDropdown = ({ productList, isOpen, onClose }: IProps) => {
+ const ref = useRef<HTMLDivElement>(null);
+
+ useEffect(() => {
+ const handleClickOutside = (event: Event) => {
+ if (ref.current && !ref.current.contains(event.target as Node)) {
+ onClose();
+ }
+ };
+ // Bind the event listener
+ document.addEventListener('mousedown', handleClickOutside);
+
+ return () => {
+ // Unbind the event listener on clean up
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, [ref, onClose]);
+
+ return isOpen ? (
+ <S.CartDropdown ref={ref} data-cy={CypressFields.CartDropdown}>
+ <div>
+ <S.Header>
+ <S.Title>Shopping Cart</S.Title>
+ <span onClick={onClose}>Close</span>
+ </S.Header>
+ <S.ItemList>
+ {!productList.length && <S.EmptyCart>Your shopping cart is empty</S.EmptyCart>}
+ {productList.map(
+ ({ quantity, product: { name, picture, id, priceUsd = { nanos: 0, currencyCode: 'USD', units: 0 } } }) => (
+ <S.Item key={id} data-cy={CypressFields.CartDropdownItem}>
+ <S.ItemImage src={"/images/products/" + picture} alt={name} />
+ <S.ItemDetails>
+ <S.ItemName>{name}</S.ItemName>
+ <ProductPrice price={priceUsd} />
+ <S.ItemQuantity>Quantity: {quantity}</S.ItemQuantity>
+ </S.ItemDetails>
+ </S.Item>
+ )
+ )}
+ </S.ItemList>
+ </div>
+ <Link href="/cart">
+ <S.CartButton data-cy={CypressFields.CartGoToShopping}>Go to Shopping Cart</S.CartButton>
+ </Link>
+ </S.CartDropdown>
+ ) : null;
+};
+
+export default CartDropdown;