fogwind před 2 dny
rodič
revize
184b382cae

binární
public/image/30days.webp


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 4 - 3
src/app/(checkout)/checkout/_components/CheckoutProducts/CheckoutProducts.tsx


+ 1 - 1
src/app/(checkout)/checkout/_components/RewardPointsRedeemMoney/RewardPointsRedeemMoney.tsx

@@ -105,7 +105,7 @@ export default function RewardPointsRedeemMoney({
         <>
             {isGuest ?
                 <div className="text-ly-14 p-2.5 bg-ly-middlegray">
-                    Please <button className="underline" onClick={guestUserClick}>LOGIN</button> to use reward points
+                    Please <button className="underline cursor-pointer" onClick={guestUserClick}>LOGIN</button> to use reward points
                 </div>
             :
             <div className="w-full">

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 3 - 3
src/app/(checkout)/checkout/cart/_components/CartWrapper.tsx


+ 18 - 9
src/app/(public)/_components/HomeBestSellers.tsx

@@ -1,16 +1,18 @@
-// import { Swiper, SwiperSlide } from "swiper/react";
-// import { Navigation, Pagination } from "swiper/modules";
+
 import { OpenAddToCartModalButton } from "@/components/common/AddToCartModal/OpenAddToCartModalButton";
 import type { HomeProduct,HomeSection } from "@/types/home/type";
 import Link from "next/link";
 import Image from "next/image";
+import { useStore } from "@utils/hooks/useConfig";
+import { Price } from "@components/theme/ui/Price";
 interface jinGangSectionProps{
   bestSellerSection:HomeSection |undefined;
 }
-// interface HomeBestSellersProps {
-//   bestSellers: HomeProduct[];
-// }
+
 const HomeBestSellers = ({ bestSellerSection }: jinGangSectionProps) => {
+  const {store} = useStore();
+  const currencyCode = store.currentCurrency;
+
   const bestSellers: HomeProduct[] = bestSellerSection?.products ?? [];
   if (!bestSellers || bestSellers.length === 0) return null;
   // 4. 真实数据按每6个拆分一组,替换原来的模拟拆分逻辑
@@ -66,11 +68,18 @@ const HomeBestSellers = ({ bestSellerSection }: jinGangSectionProps) => {
 
             <div className="flex items-center justify-between">
               <div className="flex items-center gap-1">
-                <span className="font-semibold">${product.min_price}</span>
 
-                <span className="text-xs text-gray-500 line-through">
-                  ${product.price}
-                </span>
+                <Price
+                    className="text-ly-18 font-bold"
+                    amount={product.min_price}
+                    currencyCode={currencyCode}
+                />
+
+                <Price
+                    className="text-ly-18 text-ly-gray line-through"
+                    amount={product.price}
+                    currencyCode={currencyCode}
+                />
               </div>
 
               <OpenAddToCartModalButton

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 19 - 80
src/app/(public)/_components/HomeContent.tsx


+ 17 - 4
src/app/(public)/_components/HomeNewArrival.tsx

@@ -3,10 +3,15 @@ import { OpenAddToCartModalButton } from "@/components/common/AddToCartModal/Ope
 import Link from "next/link";
 import Image from "next/image";
 import type {HomeProduct,HomeSection} from "@/types/home/type"
+import { useStore } from "@utils/hooks/useConfig";
+import { Price } from "@components/theme/ui/Price";
 interface newArrivalSectionProps{
   newArrivalSection:HomeSection |undefined;
 }
 const HomeNewArrival = ({ newArrivalSection }: newArrivalSectionProps) => {
+    const {store} = useStore();
+    const currencyCode = store.currentCurrency;
+
    const newArrival: HomeProduct[] = newArrivalSection?.products ?? [];
      if (!newArrival || newArrival.length === 0) return null;
         // 4. 真实数据按每6个拆分一组,替换原来的模拟拆分逻辑
@@ -62,11 +67,19 @@ const HomeNewArrival = ({ newArrivalSection }: newArrivalSectionProps) => {
 
             <div className="flex items-center justify-between">
               <div className="flex items-center gap-1">
-                <span className="font-semibold">${product.min_price}</span>
 
-                <span className="text-xs text-gray-500 line-through">
-                  ${product.price}
-                </span>
+                <Price
+                    className="text-ly-18 font-bold"
+                    amount={product.min_price}
+                    currencyCode={currencyCode}
+                />
+
+                <Price
+                    className="text-ly-18 text-ly-gray line-through"
+                    amount={product.price}
+                    currencyCode={currencyCode}
+                />
+           
               </div>
 
               <OpenAddToCartModalButton

+ 19 - 129
src/app/(public)/_components/MiddleImageSwiper.tsx

@@ -1,140 +1,22 @@
 
 import { Swiper, SwiperSlide } from "swiper/react";
-// import {  Pagination  } from "swiper/modules";
 import { OpenAddToCartModalButton } from "@/components/common/AddToCartModal/OpenAddToCartModalButton";
 import type {HomeProduct,HomeSectionImage} from "@/types/home/type"
 import Link from "next/link";
 import Image from "next/image";
+import { useStore } from "@utils/hooks/useConfig";
+import { Price } from "@components/theme/ui/Price";
 interface zeroWearProps {
   zeroWear: HomeProduct[];
   zeroWearImage:HomeSectionImage[]
 }
-// const productList = [
-//   {
-//     id: 1,
-//     img: "https://picsum.photos/400/500?random=1",
-//     title: "14-36 In Water Wave Hum...",
-//     price: 143.35,
-//   },
-//   {
-//     id: 2,
-//     img: "https://picsum.photos/400/500?random=2",
-//     title: "14-36 In Water Wave Hum.",
-//     price: 143.35,
-//   },
-//   {
-//     id: 3,
-//     img: "https://picsum.photos/400/500?random=3",
-//     title: "14-36 In Water Wave Hum...",
-//     price: 143.35,
-//   },
-//   {
-//     id: 4,
-//     img: "https://picsum.photos/400/500?random=4",
-//     title: "14-36 In Water Wave Hum.",
-//     price: 143.35,
-//   },
-// ];
+
 
 const MiddleImageSwiper = ({ zeroWear,zeroWearImage }: zeroWearProps) => {
-  // zeroWear=[
-  //                   {
-  //                       "id": 55766,
-  //                       "sku": "STW--4*7BobWig--RTG-10, #4--STW--5*5BobWig--12",
-  //                       "name": "[Pack Deal] 10in Natural Black 7*4 Bob Wig and 12in Chocolate Brown 5*5 Bob Wig",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": '368',
-  //                       "min_price":'368' ,
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/2/_/2_wigs_package_deal_natural_black_bob_wig_and_natural_black_bob_wig_1.jpg",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "Asteria Hair [Pack Deal] 10in Natural Black Ready To Go 7*4 Lace Bob Wig and 12in Chocolate Brown 5*5 Lace Closure Bob Wig.",
-  //                       "rating": 5,
-  //                       "review_count": 2
-  //                   },
-  //                   {
-  //                       "id": 55811,
-  //                       "sku": "LD--13*4Wig--24,LB--5*7Wig--RTG--20",
-  //                       "name": "[Pack Deal] 2 Long Length Wig 24Inch Loose Deep 13*4 Lace Wig and 20Inch Body Wave Ready To Go Closure Wig",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": "830",
-  //                       "min_price": "830",
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/l/d/ld_body.png",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "Asteria Hair [Pack Deal] 2 Long Length Wig 24Inch Loose Deep 13*4 Lace Wig and 20Inch Body Wave Ready To Go 5*7 Closure Wig.",
-  //                       "rating": 5,
-  //                       "review_count": 13
-  //                   },
-  //                   {
-  //                       "id": 55651,
-  //                       "sku": "STW--4*7Wig--RTG--16,A025--STW--13*4Bob--RTG--12",
-  //                       "name": "[Pack Deal] 2 Ready To Go Wig 100% Glueless Straight Texture",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": "400",
-  //                       "min_price": "400",
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/b/o/bob_.png",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "Asteria Hair [Pack Deal] 2 Ready To Go Wig 100% Glueless Straight Texture, straight 7*5 ready to go lace wig 16inch and zigzag style 13*4 ready to go lace bob wig 12inch.",
-  //                       "rating": 5,
-  //                       "review_count": 11
-  //                   },
-  //                   {
-  //                       "id": 55681,
-  //                       "sku": "Curly--HDLaceFrontWig--20--250%,LB--4*7BobWig--RTG-10",
-  //                       "name": "[Pack Deal] 20in 250% Density Curly 13*4 HD Lace Wig and 10Inch 7*4 Ready To Go Body Wave Bob Human Hair Wig",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": "650",
-  //                       "min_price": "650",
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/j/c/jc_rtg_lb_.png",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "Asteria Hair [Pack Deal] 20in 250% Density Curly 13*4 HD Lace Wig and 10in 7*4 Ready To Go Body Wave Bob Human Hair Lace Wig.",
-  //                       "rating": 5,
-  //                       "review_count": 4
-  //                   },
-  //                   {
-  //                       "id": 55982,
-  //                       "sku": "JC-5*7Wig-24-180%-RTG,NHC-RTG-LB-4*7BOB-12",
-  //                       "name": "[Pack Deal]2 Ready To Go Wigs Curly 5*7 Lace Wig 24 Inch And BOB Body Wave Wig 4*7 Lace Wigs 12 Inch",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": '738',
-  //                       "min_price": '738',
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/1/_/1_6_16.png",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "This value pack includes two ready-to-wear wigs: a 24-inch curly style with 5*7 lace front and a 12-inch body wave bob with 4*7 lace, both made from human hair for instant perfection and versatile styling.",
-  //                       "rating": 0,
-  //                       "review_count": 0
-  //                   },
-  //                   {
-  //                       "id": 55984,
-  //                       "sku": "NHC-RTG-LB-4*7BOB-12,NHC-RTG-STW-4*7BOB-10",
-  //                       "name": "[Pack Deal]Ready To Go Wigs Bob Straight Wig 4*7 Lace Wigs 10 Inch And BOB Body Wave Wig 4*7 Lace Wigs 12 Inch",
-  //                       "slug": null,
-  //                       "type": "flexible_variant",
-  //                       "price": '398',
-  //                       "min_price": '398',
-  //                       "special_price": null,
-  //                       "image_url": "https://img.asteriahair.com/media/catalog/product/1/_/1_7.png",
-  //                       "is_new": false,
-  //                       "is_featured": false,
-  //                       "short_description": "This value pack includes two ready-to-wear bob wigs: a 10-inch straight style and a 12-inch body wave style, both featuring a 4*7 lace construction and made from human hair, allowing you to effortlessly switch between two fashionable looks.",
-  //                       "rating": 0,
-  //                       "review_count": 0
-  //                   }
-  //               ]
+  
+  const {store} = useStore();
+  const currencyCode = store.currentCurrency;
+
   if (!zeroWear || zeroWear.length === 0) return null;
   const  productList = zeroWear
   const WearImage = zeroWearImage;
@@ -197,10 +79,18 @@ const MiddleImageSwiper = ({ zeroWear,zeroWearImage }: zeroWearProps) => {
                     {/* 价格 + 购物车图标 */}
                     <div className="flex items-center justify-between">
                       <div className="flex items-center gap-1">
-                        <span className="font-semibold">${item.min_price}</span>
-                        <span className="text-xs text-gray-500 line-through">
-                          ${item.price}
-                        </span>
+
+                        <Price
+                            className="text-ly-18 font-bold"
+                            amount={item.min_price}
+                            currencyCode={currencyCode}
+                        />
+
+                        <Price
+                            className="text-ly-18 text-ly-gray line-through"
+                            amount={item.price}
+                            currencyCode={currencyCode}
+                        />
                       </div>
                       {/* 购物车图标 */}
                       <OpenAddToCartModalButton

+ 18 - 32
src/app/(public)/_components/RecommendedProducts.tsx

@@ -4,9 +4,8 @@ import Image from "next/image";
 import Link from "next/link";
 import { OpenAddToCartModalButton } from "@/components/common/AddToCartModal/OpenAddToCartModalButton";
 import type {HomeProduct,HomeSection} from "@/types/home/type"
-// interface recommendedProps {
-//   recommended: HomeProduct[];
-// }
+import { useStore } from "@utils/hooks/useConfig";
+import { Price } from "@components/theme/ui/Price";
 interface newArrivalSectionProps{
   recommendedSection:HomeSection |undefined;
 }
@@ -59,6 +58,10 @@ const mockGetProductApi = async (page: number, pageSize: number) => {
 const PAGE_SIZE = 6;
 
 export default function RecommendedProducts({ recommendedSection }: newArrivalSectionProps) {
+
+  const {store} = useStore();
+  const currencyCode = store.currentCurrency;
+
    const recommended: HomeProduct[] = recommendedSection?.products ?? [];
   // 已渲染的全部商品
   const [productList, _setProductList] = useState<HomeProduct[]>(recommended);
@@ -154,38 +157,21 @@ export default function RecommendedProducts({ recommendedSection }: newArrivalSe
               </span>
             </div>
 
-            {/* 价格 + 购物车按钮 */}
-            {/* <div className="flex items-center justify-between">
-              <div className="flex items-center gap-2">
-                <span className="text-xl font-bold text-black">
-                  ${item.price}
-                </span>
-                <span className="text-sm text-gray-400 line-through">
-                  ${item.originPrice}
-                </span>
-              </div>
-              <button className="w-10 h-10 bg-emerald-600 rounded-lg flex items-center justify-center text-white">
-                <svg
-                  width="18"
-                  height="18"
-                  viewBox="0 0 24 24"
-                  fill="none"
-                  stroke="currentColor"
-                  strokeWidth="2"
-                >
-                  <path d="M6 3h12M3 6h18l-2 11H5L3 6z" />
-                  <circle cx="9" cy="20" r="1" />
-                  <circle cx="15" cy="20" r="1" />
-                </svg>
-              </button>
-            </div> */}
+
             {/* 价格 + 购物车图标 */}
             <div className="flex items-center justify-between">
               <div className="flex items-center gap-1">
-                <span className="font-semibold">${item.min_price}</span>
-                <span className="text-xs text-gray-500 line-through">
-                  ${item.price}
-                </span>
+                <Price
+                    className="text-ly-18 font-bold"
+                    amount={item.min_price}
+                    currencyCode={currencyCode}
+                />
+
+                <Price
+                    className="text-ly-18 text-ly-gray line-through"
+                    amount={item.price}
+                    currencyCode={currencyCode}
+                />
               </div>
               {/* 购物车图标 */}
               <OpenAddToCartModalButton

+ 17 - 17
src/app/(public)/_components/TopImageSwiper.tsx

@@ -1,7 +1,7 @@
-
+import Image from 'next/image';
 import { Swiper, SwiperSlide } from 'swiper/react';
 import Link from 'next/link';
-// import { Navigation, Pagination, Mousewheel, Keyboard } from 'swiper/modules';
+import { Autoplay } from 'swiper/modules';
 // 定义图片类型
 type BannerImageItem = {
   link: string;
@@ -15,35 +15,35 @@ interface TopImageSwiperProps {
 const TopImageSwiper = ({ bannerImages }: TopImageSwiperProps) => {
   // 兜底:没有图片不渲染,防止报错
   if (!bannerImages || bannerImages.length === 0) return null;
-  // ✅ 直接在这里放你的图片数组,想加多少加多少
-  // const images = [
-  //   'https://cdn.asteriahair.com/uploads/202607/01/20260701165056_761989a0fdc11d5e.jpg',
-  //   'https://cdn.asteriahair.com/uploads/202607/01/20260701165110_3fff435adf276b89.jpg',
-  //   'https://cdn.asteriahair.com/uploads/202607/01/20260701165123_c424f6f1d0b29522.jpg',
-  //   'https://cdn.asteriahair.com/uploads/202607/01/20260701165056_761989a0fdc11d5e.jpg',
-  // ];
+
+
 
   return (
     <div className="w-full mx-auto ">
       <Swiper
+        autoplay={{
+          delay: 2500,
+          disableOnInteraction: false,
+        }}
         slidesPerView={1}
         spaceBetween={0}
         loop={true} // 无限轮播
-      
+        modules={[Autoplay]}
         // pagination={{ clickable: true }}
         // mousewheel
         // keyboard={{ enabled: true }}
-        className="h-auto md:h-[80vh]  overflow-hidden"
       >
         {/* ✅ 自动遍历图片数组,一行代码搞定所有图片 */}
         {bannerImages .map((item, index) => (
           <SwiperSlide key={index}>
-            <Link href={item.link}>
-            <img
-                 src={item.image}
-              alt={item.title}
-              className="w-full h-full object-cover"
-            />
+            <Link href={item.link} className="w-full">
+              <Image 
+                  width={1920}
+                  height={680}
+                  src={item.image}
+                  alt={item.title}
+                  className="w-full h-auto object-cover"
+              />
             </Link>
           </SwiperSlide>
         ))}

+ 22 - 76
src/app/(public)/_components/Trending.tsx

@@ -1,57 +1,24 @@
 import { useState, useRef, useEffect } from "react";
 import { Swiper, SwiperSlide } from "swiper/react";
 import type { Swiper as SwiperType } from "swiper/types";
-// import { Navigation } from "swiper/modules";
 import Image from "next/image";
 import Link from "next/link";
 import { OpenAddToCartModalButton } from "@/components/common/AddToCartModal/OpenAddToCartModalButton";
 import type { HomeProduct,HomeSection } from "@/types/home/type";
+import { useStore } from "@utils/hooks/useConfig";
+import { Price } from "@components/theme/ui/Price";
 interface newArrivalSectionProps{
   trendingSection:HomeSection |undefined;
 }
-// // 商品数据,每个卡片携带videoUrl视频地址
-// type ProductItem = {
-//   id: number;
-//   img: string;
-//   title: string;
-//   price: number;
-//   videoUrl: string;
-// };
 
-// const productList: ProductItem[] = [
-//   {
-//     id: 1,
-//     img: "/img/hair-video-1.jpg",
-//     title: "14-36 In Water Wave Human Hair HD Inv...",
-//     price: 146.1,
-//     videoUrl: "/video/hair-demo-1.mp4",
-//   },
-//   {
-//     id: 2,
-//     img: "/img/hair-video-2.jpg",
-//     title: "14-36 In Water Wave Human Hair HD Inv...",
-//     price: 146.1,
-//     videoUrl: "/video/hair-demo-2.mp4",
-//   },
-//   {
-//     id: 3,
-//     img: "/img/hair-video-3.jpg",
-//     title: "14-36 In Water Wave Human Hair HD Inv...",
-//     price: 146.1,
-//     videoUrl: "/video/hair-demo-3.mp4",
-//   },
-//   {
-//     id: 4,
-//     img: "/img/hair-video-4.jpg",
-//     title: "14-36 In Water Wave Human Hair HD Inv...",
-//     price: 146.1,
-//     videoUrl: "/video/hair-demo-4.mp4",
-//   },
-// ];
 const SLIDES_PER_VIEW = 6.5;
 const SLIDES_PER_GROUP = 6;
 const SPACE_BETWEEN = 24;
 const Trending = ({ trendingSection }: newArrivalSectionProps) => {
+
+  const {store} = useStore();
+  const currencyCode = store.currentCurrency;
+
    const trending: HomeProduct[] = trendingSection?.products ?? [];
   // 视频弹窗状态
   const [openVideoModal, setOpenVideoModal] = useState(false);
@@ -171,10 +138,19 @@ const Trending = ({ trendingSection }: newArrivalSectionProps) => {
                   {/* 价格 + 购物车图标 */}
                   <div className="flex items-center justify-between">
                     <div className="flex items-center gap-1">
-                      <span className="font-semibold">${item.min_price}</span>
-                      <span className="text-xs text-gray-500 line-through">
-                        ${item.price}
-                      </span>
+
+                      <Price
+                          className="text-ly-16 font-bold"
+                          amount={item.min_price}
+                          currencyCode={currencyCode}
+                      />
+
+                      <Price
+                          className="text-ly-14 text-ly-gray line-through"
+                          amount={item.price}
+                          currencyCode={currencyCode}
+                      />
+
                     </div>
                     {/* 购物车图标 */}
                     <OpenAddToCartModalButton
@@ -220,18 +196,7 @@ const Trending = ({ trendingSection }: newArrivalSectionProps) => {
           type="button"
           aria-label="Previous"
           onClick={handlePrev}
-          className="
-      absolute
-      left-18
-      top-1/2
-      z-10
-      flex
-      h-10
-      w-10
-      -translate-y-1/2
-      items-center
-      justify-center
-    "
+          className="absolute left-18 top-1/2 z-10 flex h-10 w-10 -translate-y-1/2 items-center justify-center"
         >
           <svg
             xmlns="http://www.w3.org/2000/svg"
@@ -260,18 +225,7 @@ const Trending = ({ trendingSection }: newArrivalSectionProps) => {
           type="button"
           aria-label="Next"
           onClick={handleNext}
-          className="
-      absolute
-      right-6
-      top-1/2
-      z-10
-      flex
-      h-10
-      w-10
-      -translate-y-1/2
-      items-center
-      justify-center
-    "
+          className="absolute right-6 top-1/2 z-10 flex h-10 w-10 -translate-y-1/2 items-center justify-center"
         >
           <svg
             xmlns="http://www.w3.org/2000/svg"
@@ -295,15 +249,7 @@ const Trending = ({ trendingSection }: newArrivalSectionProps) => {
 
       {/* Pagination */}
       {pageCount > 1 && (
-        <div
-          className="
-            mt-4
-            flex
-            items-center
-            justify-center
-            gap-2
-          "
-        >
+        <div className="mt-4 flex items-center justify-center gap-2">
           {Array.from({
             length: pageCount,
           }).map((_, index) => (

+ 2 - 4
src/app/(public)/category/[slug]/_components/ProductListing.tsx

@@ -150,9 +150,7 @@ export default function ProductListing({
    } else {
      params.delete("page"); // page<=1,删掉page参数,URL干净
    }
-    router.replace(`${pathname}?${params.toString()}`, {
-      scroll: false,
-    });
+    router.replace(`${pathname}?${params.toString()}`);
   };
   // 对比筛选对象
   function isFiltersEqual(a: Record<string, string>, b: Record<string, string>) {
@@ -237,7 +235,7 @@ export default function ProductListing({
   }, [currentPage, totalPages]);
   return (
     <> 
-      <div className="flex  justify-between  py-8  w-full mx-auto max-w-[1824px] gap-12">
+      <div className="flex  justify-between  py-8  w-full mx-auto max-w-456 gap-12">
         <Suspense fallback={<p>Loading Filter...</p>}>
           <NewMobileFilter
             filterAttributesPromise={filterAttributesPromise}

+ 5 - 5
src/components/common/AddToCartModal/AddToCartModal.tsx

@@ -250,7 +250,7 @@ export default function AddToCartModal() {
             body={
                 <div className="box-border w-full p-6 bg-white rounded-xl">
                     <div className="flex justify-end">
-                        <button className="flex-none w-6 h-6" onClick={closeModal}>
+                        <button className="flex-none w-6 h-6 cursor-pointer" onClick={closeModal}>
                             <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" className="h-6 transition-all ease-in-out hover:scale-110"><path strokeLinecap="round" strokeLinejoin="round" d="M6 18 18 6M6 6l12 12"></path></svg>
                         </button>
                     </div>
@@ -303,10 +303,10 @@ export default function AddToCartModal() {
                                 })}
                                 
                             </Swiper>
-                            <button className="addtocartmodal-main-swiper-prev-btn group [&.disable]:bg-black/50 bg-white z-1 absolute left-3 top-1/2 -translate-y-1/2 flex items-center justify-center w-10 h-10 rounded-full">
+                            <button className="cursor-pointer addtocartmodal-main-swiper-prev-btn group [&.disable]:bg-black/50 bg-white z-1 absolute left-3 top-1/2 -translate-y-1/2 flex items-center justify-center w-10 h-10 rounded-full">
                                 <svg className="w-6 h-6 stroke-black group-[.disable]:stroke-white" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="square"  d="M15 18L9 12L15 6"></path></svg>
                             </button>
-                            <button className="addtocartmodal-main-swiper-next-btn group [&.disable]:bg-black/50 bg-white z-1 absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center w-10 h-10 rounded-full">
+                            <button className="cursor-pointer addtocartmodal-main-swiper-next-btn group [&.disable]:bg-black/50 bg-white z-1 absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center w-10 h-10 rounded-full">
                                 <svg className="w-6 h-6 stroke-black group-[.disable]:stroke-white" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none"><path strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="square"  d="M9 18L15 12L9 6"></path></svg>
                             </button>
                         </div>
@@ -348,13 +348,13 @@ export default function AddToCartModal() {
                             </div>
                             <div className="flex-none">
                                 <div className="flex justify-between gap-3">
-                                    <button className="flex-1 flex justify-center items-center h-12 text-ly-16 font-bold text-white rounded-3xl bg-ly-deepgreen" 
+                                    <button className="cursor-pointer flex-1 flex justify-center items-center h-12 text-ly-16 font-bold text-white rounded-3xl bg-ly-deepgreen" 
                                         type="button"
                                         onClick={buyNowHandler}
                                     >
                                         Buy now
                                     </button>
-                                    <button className="flex-1 flex justify-center items-center h-12 text-ly-16 font-bold text-white rounded-3xl bg-ly-middlegreen" 
+                                    <button className="cursor-pointer flex-1 flex justify-center items-center h-12 text-ly-16 font-bold text-white rounded-3xl bg-ly-middlegreen" 
                                         type="button"
                                         onClick={addToCartHandler}
                                     >

+ 1 - 1
src/components/common/AddToCartModal/OpenAddToCartModalButton.tsx

@@ -93,7 +93,7 @@ export const OpenAddToCartModalButton: FC<OpenAddToCartModalButtonProps> = ({
     };
     return (
         <button onClick={openDialog} disabled={baseInfoLoading || optionsLoading}
-            className={clsx(className ? className : "flex justify-center items-center h-8 w-8 bg-ly-middlegreen rounded-lg")}
+            className={clsx("cursor-pointer",className ? className : "flex justify-center items-center h-8 w-8 bg-ly-middlegreen rounded-lg")}
         >
             {baseInfoLoading || optionsLoading ? (
                 <LoadingSpinner colorClassName={"text-ly-green"} />

+ 1 - 2
src/components/common/AddToCartModal/ProductOptionsInAddToCartModal.tsx

@@ -20,7 +20,6 @@ export default function ProductOptionsInAddToCartModal({
     }) => void;
 }) {
 
-    const classNameOptionValueBtn = "text-ly-16 leading-ly-24 border border-solid rounded-lg p-3 bg-white";
     // 处理选项点击
     const handleOptionClick = (optionId: number, valueId: number) => {
         onOptionClick({
@@ -42,7 +41,7 @@ export default function ProductOptionsInAddToCartModal({
                                 <button key={value.id}
                                     type="button"
                                     onClick={() => !isDisabled && handleOptionClick(option.id, value.id)}
-                                    className={clsx(classNameOptionValueBtn, {
+                                    className={clsx("text-ly-16 leading-ly-24 border border-solid rounded-lg p-3 bg-white cursor-pointer", {
                                         'border-ly-green text-ly-green': isSelected,
                                         'border-black text-black': !isSelected,
                                         'opacity-40 cursor-not-allowed strokeline-bg-disabled': isDisabled

+ 1 - 1
src/lib/restApiClient.ts

@@ -17,7 +17,7 @@ export async function clientFetch<T = any>(apiUrl: string | URL, options: Reques
     // fetch 不会reject 非2xx http状态码的响应,而是resolve,所以不会走catch,如果要走catch,需要自己主动抛出异常
     const response = await fetch(apiUrl, options);
     const result = await response.json();
-    console.log('response -- ', response);
+
     if(response.status === 401) { // Unauthorized 需要登录
         emitAuthExpired();
     }