From 82e03978b89938219958032efb1448cc76baa181 Mon Sep 17 00:00:00 2001 From: Saumit Date: Sat, 27 Sep 2025 02:14:26 +0530 Subject: Initial snapshot - OpenTelemetry demo 2.1.3 -f --- .../components/ProductCard/ProductCard.styled.ts | 36 ++++++++++++ .../components/ProductCard/ProductCard.tsx | 65 ++++++++++++++++++++++ src/frontend/components/ProductCard/index.ts | 4 ++ 3 files changed, 105 insertions(+) create mode 100644 src/frontend/components/ProductCard/ProductCard.styled.ts create mode 100644 src/frontend/components/ProductCard/ProductCard.tsx create mode 100644 src/frontend/components/ProductCard/index.ts (limited to 'src/frontend/components/ProductCard') diff --git a/src/frontend/components/ProductCard/ProductCard.styled.ts b/src/frontend/components/ProductCard/ProductCard.styled.ts new file mode 100644 index 0000000..50d2f7a --- /dev/null +++ b/src/frontend/components/ProductCard/ProductCard.styled.ts @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +import styled from 'styled-components'; +import RouterLink from 'next/link'; + +export const Link = styled(RouterLink)` + text-decoration: none; +`; + +export const Image = styled.div<{ $src: string }>` + width: 100%; + height: 150px; + background: url(${({ $src }) => $src}) no-repeat center; + background-size: 100% auto; + + ${({ theme }) => theme.breakpoints.desktop} { + height: 300px; + } +`; + +export const ProductCard = styled.div` + cursor: pointer; +`; + +export const ProductName = styled.p` + margin: 0; + margin-top: 10px; + font-size: ${({ theme }) => theme.sizes.dSmall}; +`; + +export const ProductPrice = styled.p` + margin: 0; + font-size: ${({ theme }) => theme.sizes.dMedium}; + font-weight: ${({ theme }) => theme.fonts.bold}; +`; diff --git a/src/frontend/components/ProductCard/ProductCard.tsx b/src/frontend/components/ProductCard/ProductCard.tsx new file mode 100644 index 0000000..0744e21 --- /dev/null +++ b/src/frontend/components/ProductCard/ProductCard.tsx @@ -0,0 +1,65 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +import { CypressFields } from '../../utils/enums/CypressFields'; +import { Product } from '../../protos/demo'; +import ProductPrice from '../ProductPrice'; +import * as S from './ProductCard.styled'; +import { useState, useEffect } from 'react'; +import { useNumberFlagValue } from '@openfeature/react-sdk'; + +interface IProps { + product: Product; +} + +async function getImageWithHeaders(requestInfo: Request) { + const res = await fetch(requestInfo); + return await res.blob(); +} + +const ProductCard = ({ + product: { + id, + picture, + name, + priceUsd = { + currencyCode: 'USD', + units: 0, + nanos: 0, + }, + }, +}: IProps) => { + const imageSlowLoad = useNumberFlagValue('imageSlowLoad', 0); + const [imageSrc, setImageSrc] = useState(''); + + useEffect(() => { + const headers = new Headers(); + headers.append('x-envoy-fault-delay-request', imageSlowLoad.toString()); + headers.append('Cache-Control', 'no-cache') + const requestInit = { + method: "GET", + headers: headers + }; + const image_url ='/images/products/' + picture + const requestInfo = new Request(image_url, requestInit); + getImageWithHeaders(requestInfo).then(blob => { + setImageSrc(URL.createObjectURL(blob)); + }); + }, [imageSlowLoad, picture]); + + return ( + + + +
+ {name} + + + +
+
+
+ ); +}; + +export default ProductCard; diff --git a/src/frontend/components/ProductCard/index.ts b/src/frontend/components/ProductCard/index.ts new file mode 100644 index 0000000..ba9de7a --- /dev/null +++ b/src/frontend/components/ProductCard/index.ts @@ -0,0 +1,4 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +export { default } from './ProductCard'; -- cgit v1.2.3