summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-10-07 10:31:54 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-10-07 10:31:54 +0700
commitd70e6df0323820d5772767625c76087c026e5376 (patch)
tree9f670cf9d89e19a6d5a19b50c1fe737e9d2020a0 /src
parent469d4c6bb4a0b6fc5a6e380158f81ae9e44cf612 (diff)
<Miqdad> fix cannot buy from google ads
Diffstat (limited to 'src')
-rw-r--r--src/lib/product/components/Product/ProductDesktopVariant.jsx130
1 files changed, 93 insertions, 37 deletions
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}