From d70e6df0323820d5772767625c76087c026e5376 Mon Sep 17 00:00:00 2001
From: Miqdad <ahmadmiqdad27@gmail.com>
Date: Tue, 7 Oct 2025 10:31:54 +0700
Subject: <Miqdad> fix cannot buy from google ads

---
 .../components/Product/ProductDesktopVariant.jsx   | 130 +++++++++++++++------
 1 file changed, 93 insertions(+), 37 deletions(-)

(limited to 'src/lib/product/components/Product/ProductDesktopVariant.jsx')

diff --git a/src/lib/product/components/Product/ProductDesktopVariant.jsx b/src/lib/product/components/Product/ProductDesktopVariant.jsx
index de88e5bb..0eef016a 100644
--- a/src/lib/product/components/Product/ProductDesktopVariant.jsx
+++ b/src/lib/product/components/Product/ProductDesktopVariant.jsx
@@ -103,15 +103,7 @@ const ProductDesktopVariant = ({
     variantQuantityRefs.current[variantId] = element;
   };
 
-  const validQuantity = (quantity) => {
-    let isValid = true;
-    if (!quantity || quantity < 1 || isNaN(parseInt(quantity))) {
-      toast.error('Jumlah barang minimal 1');
-      isValid = false;
-    }
-    return isValid;
-  };
-
+  
   const handleAddToCart = (variant) => {
     if (!auth) {
       router.push(`/login?next=/shop/product/${slug}?srsltid=${srsltid}`);
@@ -131,30 +123,37 @@ const ProductDesktopVariant = ({
     });
     setAddCartAlert(true);
   };
+  
+  const toInt = (v) => {
+    const n = parseInt(String(v ?? '').trim(), 10);
+    return Number.isFinite(n) ? n : 0;
+  };
 
+  const validQuantity = (q) => {
+    if (!Number.isInteger(q) || q < 1) {
+      toast.error('Jumlah barang minimal 1');
+      return false;
+    }
+    return true;
+  };
+  
   const handleBuy = async (variant) => {
-    const quantity = variantQuantityRefs?.current[product.id]?.value;
+    const quantity = Math.max(1, toInt(quantityInput)); // clamp min 1
+    
     let isLoggedIn = typeof auth === 'object';
-
     if (!isLoggedIn) {
       const currentUrl = encodeURIComponent(router.asPath);
       await router.push(`/login?next=${currentUrl}`);
 
-      // Tunggu login berhasil, misalnya dengan memantau perubahan status auth.
-      const authCheckInterval = setInterval(() => {
-        const newAuth = getAuth();
-        if (typeof newAuth === 'object') {
-          isLoggedIn = true;
-          auth = newAuth; // Update nilai auth setelah login
-          clearInterval(authCheckInterval);
-        }
-      }, 500); // Periksa status login setiap 500ms
-
+      // tunggu sampai auth ada
       await new Promise((resolve) => {
-        const checkLogin = setInterval(() => {
-          if (isLoggedIn) {
-            clearInterval(checkLogin);
-            resolve(null);
+        const t = setInterval(() => {
+          const newAuth = getAuth();
+          if (typeof newAuth === 'object') {
+            isLoggedIn = true;
+            auth = newAuth;
+            clearInterval(t);
+            resolve();
           }
         }, 500);
       });
@@ -162,16 +161,57 @@ const ProductDesktopVariant = ({
 
     if (!validQuantity(quantity)) return;
 
-    updateItemCart({
+    await updateItemCart({
       productId: variant,
       quantity,
       programLineId: null,
       selected: true,
       source: 'buy',
     });
-    router.push(`/shop/checkout?source=buy`);
+
+    router.push('/shop/checkout?source=buy');
   };
 
+  // const handleBuy = async (variant) => {
+  //   const quantity = variantQuantityRefs?.current[product.id]?.value;
+  //   let isLoggedIn = typeof auth === 'object';
+
+  //   if (!isLoggedIn) {
+  //     const currentUrl = encodeURIComponent(router.asPath);
+  //     await router.push(`/login?next=${currentUrl}`);
+
+  //     // Tunggu login berhasil, misalnya dengan memantau perubahan status auth.
+  //     const authCheckInterval = setInterval(() => {
+  //       const newAuth = getAuth();
+  //       if (typeof newAuth === 'object') {
+  //         isLoggedIn = true;
+  //         auth = newAuth; // Update nilai auth setelah login
+  //         clearInterval(authCheckInterval);
+  //       }
+  //     }, 500); // Periksa status login setiap 500ms
+
+  //     await new Promise((resolve) => {
+  //       const checkLogin = setInterval(() => {
+  //         if (isLoggedIn) {
+  //           clearInterval(checkLogin);
+  //           resolve(null);
+  //         }
+  //       }, 500);
+  //     });
+  //   }
+
+  //   if (!validQuantity(quantity)) return;
+
+  //   updateItemCart({
+  //     productId: variant,
+  //     quantity,
+  //     programLineId: null,
+  //     selected: true,
+  //     source: 'buy',
+  //   });
+  //   router.push(`/shop/checkout?source=buy`);
+  // };
+
   const handleButton = async (variant) => {
     const quantity = quantityInput;
     let isLoggedIn = typeof auth === 'object';
@@ -448,32 +488,48 @@ const ProductDesktopVariant = ({
                 <button
                   type='button'
                   className='absolute left-0 px-2 py-1 h-full text-gray-500'
-                  onClick={() =>
-                    setQuantityInput(
-                      String(Math.max(1, Number(quantityInput) - 1))
-                    )
-                  }
+                  onClick={() => {
+                    const n = parseInt(String(quantityInput), 10);
+                    const next = Number.isFinite(n) ? Math.max(1, n - 1) : 1;
+                    setQuantityInput(next);
+                  }}
                 >
                   -
                 </button>
+
                 <input
                   type='number'
                   id='quantity'
                   min={1}
+                  step={1}
+                  inputMode='numeric'
+                  pattern='[0-9]*'
                   value={quantityInput}
-                  onChange={(e) => setQuantityInput(e.target.value)}
-                  className=' w-24 h-10 text-center border border-gray-300 rounded focus:outline-none'
+                  onChange={(e) => {
+                    const raw = e.target.value.trim();
+                    const n = parseInt(raw, 10);
+                    setQuantityInput(Number.isFinite(n) && n > 0 ? n : 1);
+                  }}
+                  onKeyDown={(e) => {
+                    if (['e', 'E', '+', '-', '.'].includes(e.key))
+                      e.preventDefault();
+                  }}
+                  className='w-24 h-10 text-center border border-gray-300 rounded focus:outline-none'
                 />
+
                 <button
                   type='button'
                   className='absolute right-0 px-2 py-1 h-full text-gray-500'
-                  onClick={() =>
-                    setQuantityInput(String(Number(quantityInput) + 1))
-                  }
+                  onClick={() => {
+                    const n = parseInt(String(quantityInput), 10);
+                    const next = (Number.isFinite(n) ? n : 0) + 1;
+                    setQuantityInput(next);
+                  }}
                 >
                   +
                 </button>
               </div>
+
               <div>
                 <Skeleton
                   isLoaded={!isLoadingSLA}
-- 
cgit v1.2.3

