| import { useStore, useStoreUpdate } from '../../store/cart-context'; | import { useStore, useStoreUpdate } from '../../store/cart-context'; | ||||
| const ProductCard = ({ product }) => { | const ProductCard = ({ product }) => { | ||||
| const { t } = useTranslation('products'); | |||||
| const { addCartValue } = useStoreUpdate(); | |||||
| const { cartStorage } = useStore(); | |||||
| const addProductToCart = (quantity) => addCartValue(product, quantity); | |||||
| const inCart = cartStorage?.some( | |||||
| (item) => item.product.customID === product.customID | |||||
| ) | |||||
| const { t } = useTranslation('products'); | |||||
| const { addCartValue } = useStoreUpdate(); | |||||
| const { cartStorage } = useStore(); | |||||
| const addProductToCart = (quantity) => addCartValue(product, quantity); | |||||
| const inCart = | |||||
| cartStorage.length > 0 | |||||
| ? cartStorage?.some((item) => item.product.customID === product.customID) | |||||
| ? true | ? true | ||||
| : false; | |||||
| return ( | |||||
| <Box | |||||
| : false | |||||
| : false; | |||||
| return ( | |||||
| <Box | |||||
| sx={{ | |||||
| width: '100%', | |||||
| height: '100%', | |||||
| border: 'none', | |||||
| mb: '15px', | |||||
| backgroundColor: '#F5ECD4', | |||||
| }} | |||||
| > | |||||
| <Box width="100%" sx={{ cursor: 'pointer' }}> | |||||
| <NextLink | |||||
| style={{ cursor: 'pointer' }} | |||||
| href={`/products/${product.customID}`} | |||||
| passHref | |||||
| > | |||||
| <a> | |||||
| <Image | |||||
| src={product.image} | |||||
| alt="product image" | |||||
| width={500} | |||||
| height={390} | |||||
| /> | |||||
| </a> | |||||
| </NextLink> | |||||
| </Box> | |||||
| <Box | |||||
| width="100%" | |||||
| sx={{ | |||||
| display: 'flex', | |||||
| flexDirection: 'column', | |||||
| }} | |||||
| > | |||||
| <Typography | |||||
| sx={{ height: '100px' }} | |||||
| fontSize="24px" | |||||
| align="center" | |||||
| pt={1} | |||||
| pb={3} | |||||
| > | |||||
| {product.name} | |||||
| </Typography> | |||||
| <Typography | |||||
| sx={{ | |||||
| height: { xs: '200px', sm: '250px', md: '250px', lg: '200px' }, | |||||
| }} | |||||
| align="center" | |||||
| fontSize="18px" | |||||
| m={2} | |||||
| > | |||||
| {product.description.length > 250 | |||||
| ? product.description.slice(0, 250) + '...' | |||||
| : product.description} | |||||
| </Typography> | |||||
| <Typography fontSize="24px" align="center" pt={4}> | |||||
| ${product.price} | |||||
| </Typography> | |||||
| <Box textAlign="center" mt={1}> | |||||
| <Button | |||||
| disableRipple | |||||
| disableFocusRipple | |||||
| disabled={inCart} | |||||
| onClick={() => addProductToCart(1)} | |||||
| sx={{ | sx={{ | ||||
| width: '100%', | |||||
| height: '100%', | |||||
| border: 'none', | |||||
| mb: '15px', | |||||
| backgroundColor: '#F5ECD4', | |||||
| '&.Mui-disabled': { | |||||
| backgroundColor: '#f2d675', | |||||
| color: '#464646', | |||||
| }, | |||||
| '&:hover': { | |||||
| backgroundColor: '#f2d675', | |||||
| color: '#464646', | |||||
| boxShadow: 'none', | |||||
| }, | |||||
| backgroundColor: '#CBA213', | |||||
| height: 50, | |||||
| width: 150, | |||||
| color: 'white', | |||||
| }} | }} | ||||
| > | |||||
| <Box width="100%" sx={{ cursor: 'pointer' }}> | |||||
| <NextLink | |||||
| style={{ cursor: 'pointer' }} | |||||
| href={`/products/${product.customID}`} | |||||
| passHref | |||||
| > | |||||
| <a> | |||||
| <Image | |||||
| src={product.image} | |||||
| alt="product image" | |||||
| width={500} | |||||
| height={390} | |||||
| /> | |||||
| </a> | |||||
| </NextLink> | |||||
| </Box> | |||||
| <Box | |||||
| width="100%" | |||||
| sx={{ | |||||
| display: 'flex', | |||||
| flexDirection: 'column', | |||||
| }} | |||||
| > | |||||
| <Typography | |||||
| sx={{ height: '100px' }} | |||||
| fontSize="24px" | |||||
| align="center" | |||||
| pt={1} | |||||
| pb={3} | |||||
| > | |||||
| {product.name} | |||||
| </Typography> | |||||
| <Typography | |||||
| sx={{ | |||||
| height: { xs: '200px', sm: '250px', md: '250px', lg: '200px' }, | |||||
| }} | |||||
| align="center" | |||||
| fontSize="18px" | |||||
| m={2} | |||||
| > | |||||
| {product.description.length > 250 | |||||
| ? product.description.slice(0, 250) + '...' | |||||
| : product.description} | |||||
| </Typography> | |||||
| <Typography fontSize="24px" align="center" pt={4}> | |||||
| ${product.price} | |||||
| </Typography> | |||||
| <Box textAlign="center" mt={1}> | |||||
| <Button | |||||
| disableRipple | |||||
| disableFocusRipple | |||||
| disabled={inCart} | |||||
| onClick={() => addProductToCart(1)} | |||||
| sx={{ | |||||
| '&.Mui-disabled': { | |||||
| backgroundColor: '#f2d675', | |||||
| color: '#464646', | |||||
| }, | |||||
| '&:hover': { | |||||
| backgroundColor: '#f2d675', | |||||
| color: '#464646', | |||||
| boxShadow: 'none', | |||||
| }, | |||||
| backgroundColor: '#CBA213', | |||||
| height: 50, | |||||
| width: 150, | |||||
| color: 'white', | |||||
| }} | |||||
| > | |||||
| {inCart ? t('products:in') : t('products:add')} | |||||
| </Button> | |||||
| </Box> | |||||
| </Box> | |||||
| > | |||||
| {inCart ? t('products:in') : t('products:add')} | |||||
| </Button> | |||||
| </Box> | </Box> | ||||
| ); | |||||
| </Box> | |||||
| </Box> | |||||
| ); | |||||
| }; | }; | ||||
| export default ProductCard; | export default ProductCard; |
| import ProductInfo from './ProductInfo'; | import ProductInfo from './ProductInfo'; | ||||
| interface FeaturedProductProps { | interface FeaturedProductProps { | ||||
| side: string; | |||||
| bColor: string; | |||||
| product: ProductDataDB; | |||||
| side: string; | |||||
| bColor: string; | |||||
| product: ProductDataDB; | |||||
| } | } | ||||
| const FeaturedProduct: React.FC<FeaturedProductProps> = ({ product, bColor, side }) => { | |||||
| const matches = useMediaQuery('(min-width: 900px)'); | |||||
| const data = { name: product.name, description: product.description }; | |||||
| const { addCartValue } = useStoreUpdate(); | |||||
| const { cartStorage } = useStore(); | |||||
| const addProductToCart = (quantity: number) => addCartValue(product, quantity); | |||||
| const [inCart, setInCart] = useState(false); | |||||
| const FeaturedProduct: React.FC<FeaturedProductProps> = ({ | |||||
| product, | |||||
| bColor, | |||||
| side, | |||||
| }) => { | |||||
| const matches = useMediaQuery('(min-width: 900px)'); | |||||
| const data = { name: product.name, description: product.description }; | |||||
| const { addCartValue } = useStoreUpdate(); | |||||
| const { cartStorage } = useStore(); | |||||
| const addProductToCart = (quantity: number) => | |||||
| addCartValue(product, quantity); | |||||
| const [inCart, setInCart] = useState(false); | |||||
| useEffect(() => { | |||||
| if (cartStorage) { | |||||
| if ( | |||||
| cartStorage?.some((item: FeaturedProductProps) => item.product.customID === product.customID) | |||||
| ) | |||||
| setInCart(true); | |||||
| } | |||||
| }, [cartStorage, product.customID]); | |||||
| useEffect(() => { | |||||
| if (cartStorage.length > 0) { | |||||
| if ( | |||||
| cartStorage?.some((item) => item.product.customID === product.customID) | |||||
| ) | |||||
| setInCart(true); | |||||
| } | |||||
| }, [cartStorage, product.customID]); | |||||
| return ( | |||||
| <Box | |||||
| sx={{ | |||||
| width: '100%', | |||||
| backgroundColor: bColor === 'dark' ? 'primary.main' : 'primary.light', | |||||
| display: 'flex', | |||||
| flexDirection: { xs: 'column', md: 'row' }, | |||||
| padding: '30px 0 30px 0', | |||||
| alignItems: { md: 'center' }, | |||||
| }} | |||||
| > | |||||
| <Container | |||||
| maxWidth="xl" | |||||
| sx={{ display: { md: 'flex' }, alignItems: { md: 'center' } }} | |||||
| > | |||||
| {side === 'left' ? ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| ) : !matches ? ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| ) : ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| )} | |||||
| {side === 'left' ? ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| ) : !matches ? ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| ) : ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| )} | |||||
| </Container> | |||||
| </Box> | |||||
| ); | |||||
| return ( | |||||
| <Box | |||||
| sx={{ | |||||
| width: '100%', | |||||
| backgroundColor: bColor === 'dark' ? 'primary.main' : 'primary.light', | |||||
| display: 'flex', | |||||
| flexDirection: { xs: 'column', md: 'row' }, | |||||
| padding: '30px 0 30px 0', | |||||
| alignItems: { md: 'center' }, | |||||
| }} | |||||
| > | |||||
| <Container | |||||
| maxWidth="xl" | |||||
| sx={{ display: { md: 'flex' }, alignItems: { md: 'center' } }} | |||||
| > | |||||
| {side === 'left' ? ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| ) : !matches ? ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| ) : ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| )} | |||||
| {side === 'left' ? ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| ) : !matches ? ( | |||||
| <ProductInfo | |||||
| bColor={bColor} | |||||
| data={data} | |||||
| addProductToCart={addProductToCart} | |||||
| inCart={inCart} | |||||
| ></ProductInfo> | |||||
| ) : ( | |||||
| <ProductImage image={product.image}></ProductImage> | |||||
| )} | |||||
| </Container> | |||||
| </Box> | |||||
| ); | |||||
| }; | }; | ||||
| export default FeaturedProduct; | export default FeaturedProduct; |