From 1170c52c8dc532f7447d0f10093bd3531767f57e Mon Sep 17 00:00:00 2001
From: Rafi Zadanly <zadanlyr@gmail.com>
Date: Mon, 19 Feb 2024 13:16:08 +0700
Subject: Add link to product on cart item

---
 src-migrate/modules/cart/components/Item.tsx | 56 +++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 10 deletions(-)

(limited to 'src-migrate/modules/cart/components/Item.tsx')

diff --git a/src-migrate/modules/cart/components/Item.tsx b/src-migrate/modules/cart/components/Item.tsx
index 48e568e0..7a4c22cc 100644
--- a/src-migrate/modules/cart/components/Item.tsx
+++ b/src-migrate/modules/cart/components/Item.tsx
@@ -1,17 +1,18 @@
 import style from '../styles/item.module.css'
 
-import Image from 'next/image'
-import React from 'react'
 import { Skeleton, SkeletonProps, Tooltip } from '@chakra-ui/react'
 import { InfoIcon } from 'lucide-react'
+import Image from 'next/image'
 
 import { PROMO_CATEGORY } from '~/constants/promotion'
 
 import formatCurrency from '~/libs/formatCurrency'
 import { CartItem as CartItemProps } from '~/types/cart'
 
-import CartItemPromo from './ItemPromo'
+import Link from 'next/link'
+import { createSlug } from '~/libs/slug'
 import CartItemAction from './ItemAction'
+import CartItemPromo from './ItemPromo'
 import CartItemSelect from './ItemSelect'
 
 type Props = {
@@ -20,8 +21,6 @@ type Props = {
 }
 
 const CartItem = ({ item, editable = true }: Props) => {
-  const image = item?.image || item?.parent?.image
-
   return (
     <div className={style.wrapper}>
       {item.cart_type === 'promotion' && (
@@ -47,13 +46,12 @@ const CartItem = ({ item, editable = true }: Props) => {
       <div className={style.mainProdWrapper}>
         {editable && <CartItemSelect item={item} />}
         <div className='w-4' />
-        <div className={style.image}>
-          {image && <Image src={image} alt={item.name} width={128} height={128} />}
-          {!image && <div className={style.noImage}>No Image</div>}
-        </div>
+
+        <CartItem.Image item={item} />
 
         <div className={style.details}>
-          <div className={style.name}>{item.name}</div>
+          <CartItem.Name item={item} />
+
           <div className='mt-2 flex justify-between w-full'>
             <div className='flex flex-col gap-y-1'>
               {item.cart_type === 'promotion' && (
@@ -97,6 +95,44 @@ const CartItem = ({ item, editable = true }: Props) => {
   )
 }
 
+CartItem.Image = function CartItemImage({ item }: { item: CartItemProps }) {
+  const image = item?.image || item?.parent?.image
+
+  return (
+    <>
+      {item.cart_type === 'promotion' && (
+        <div className={style.image}>
+          {image && <Image src={image} alt={item.name} width={128} height={128} />}
+          {!image && <div className={style.noImage}>No Image</div>}
+        </div>
+      )}
+
+      {item.cart_type === 'product' && (
+        <Link href={createSlug('/shop/product/', item.name, item.id.toString())} className={style.image}>
+          {image && <Image src={image} alt={item.name} width={128} height={128} />}
+          {!image && <div className={style.noImage}>No Image</div>}
+        </Link>
+      )}
+    </>
+  )
+}
+
+CartItem.Name = function CartItemName({ item }: { item: CartItemProps }) {
+  return (
+    <>
+      {item.cart_type === 'promotion' && (
+        <div className={style.name}>{item.name}</div>
+      )}
+
+      {item.cart_type === 'product' && (
+        <Link href={createSlug('/shop/product/', item.name, item.id.toString())} className={style.name}>
+          {item.name}
+        </Link>
+      )}
+    </>
+  )
+}
+
 CartItem.Skeleton = function CartItemSkeleton(props: SkeletonProps & { count: number }) {
   return Array.from({ length: props.count }).map((_, index) => (
     <Skeleton key={index}
-- 
cgit v1.2.3

