diff --git a/.env b/.env
index d26da95..c2b8ddb 100644
--- a/.env
+++ b/.env
@@ -53,5 +53,23 @@ NEXT_PUBLIC_DEFAULT_LOCALE=et
NEXT_PUBLIC_TEAM_NAVIGATION_STYLE=custom
NEXT_PUBLIC_USER_NAVIGATION_STYLE=custom
-# MEDUSA
-NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=
\ No newline at end of file
+#### MEDUSA
+#NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_0ec86252438b38ce18d5601f7877e4395d7e0a6afa8687dfea8d37af33015633
+#MEDUSA_BACKEND_URL=http://5.181.51.38:9000
+NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_e23a820689a07d55aa0a0ad187268559f5d6288ecb0768ff4520516285bdef84
+MEDUSA_BACKEND_URL=http://localhost:9000
+# NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_068d930c33fea53608a410d84a51935f6ce2ccec5bef8e0ecf75eaee602ac486
+# MEDUSA_BACKEND_URL=https://backoffice-test.medreport.ee:443
+
+#### MONTONIO
+NEXT_PUBLIC_MONTONIO_ACCESS_KEY=7da5d7fa-3383-4997-9435-46aa818f4ead
+MONTONIO_SECRET_KEY=rNZkzwxOiH93mzkdV53AvhSsbGidrgO2Kl5lE/IT7cvo
+MONTONIO_API_URL=https://sandbox-stargate.montonio.com
+
+#### SUPABASE
+# NEXT_PUBLIC_SUPABASE_URL=https://oqsdacktkhmbylmzstjq.supabase.co
+# NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9xc2RhY2t0a2htYnlsbXpzdGpxIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDY1MjgxMjMsImV4cCI6MjA2MjEwNDEyM30.LdHCTWxijFmhXdnT9KVuLRAVbtSwY7OO-oLtpd8GmO0
+# SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9xc2RhY2t0a2htYnlsbXpzdGpxIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0NjUyODEyMywiZXhwIjoyMDYyMTA0MTIzfQ.KVcnkZ21Pd0XkJho23dZqFHawVTLQqfvF7l2RxsELLk
+NEXT_PUBLIC_SUPABASE_URL=http://5.181.51.38:54321
+NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0
+SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU
diff --git a/.env.development b/.env.development
index c22cdb6..cef0d99 100644
--- a/.env.development
+++ b/.env.development
@@ -2,7 +2,7 @@
# These values are only used when running the app in development mode.
# SUPABASE
-NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
+NEXT_PUBLIC_SUPABASE_URL=http://5.181.51.38:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU
diff --git a/app/api/montonio/verify-token/route.ts b/app/api/montonio/verify-token/route.ts
index 6898ac6..b5b1da7 100644
--- a/app/api/montonio/verify-token/route.ts
+++ b/app/api/montonio/verify-token/route.ts
@@ -38,6 +38,9 @@ export const POST = enhanceRouteHandler(
const body = await request.json();
const namespace = 'montonio.verify-token';
+ const activeCartId = request.cookies.get('_medusa_cart_id')?.value;
+ console.info('cart id', activeCartId);
+
try {
const { token } = BodySchema.parse(body);
@@ -58,6 +61,12 @@ export const POST = enhanceRouteHandler(
algorithms: ['HS256'],
}) as MontonioOrderToken;
+ const [, cartId] = decoded.merchantReferenceDisplay.split(':');
+ console.info('active cart id parsed', {cartId, activeCartId, decoded:decoded.merchantReferenceDisplay});
+ if (cartId !== activeCartId) {
+ throw new Error('Invalid cart id');
+ }
+
logger.info(
{
name: namespace,
diff --git a/app/home/(user)/_components/cart/cart-items.tsx b/app/home/(user)/_components/cart/cart-items.tsx
index 7ca24a9..5e7243b 100644
--- a/app/home/(user)/_components/cart/cart-items.tsx
+++ b/app/home/(user)/_components/cart/cart-items.tsx
@@ -21,7 +21,7 @@ export default function CartItems({ cart, items, productColumnLabelKey }: {
return (
-
+
diff --git a/app/home/(user)/_components/cart/montonio-checkout-callback.tsx b/app/home/(user)/_components/cart/montonio-checkout-callback.tsx
index 9f2c1eb..2ff184b 100644
--- a/app/home/(user)/_components/cart/montonio-checkout-callback.tsx
+++ b/app/home/(user)/_components/cart/montonio-checkout-callback.tsx
@@ -8,7 +8,7 @@ import { Button } from '@kit/ui/button';
import { Trans } from '@kit/ui/trans';
import { placeOrder } from "@lib/data/cart"
import Link from 'next/link';
-import Loading from '@/app/home/loading';
+import GlobalLoader from '../../loading';
enum Status {
LOADING = 'LOADING',
@@ -18,12 +18,17 @@ enum Status {
export function MontonioCheckoutCallback() {
const router = useRouter();
const [status, setStatus] = useState(Status.LOADING);
+ const [isFinalized, setIsFinalized] = useState(false);
const searchParams = useSearchParams();
useEffect(() => {
+ if (isFinalized) {
+ return;
+ }
+
const token = searchParams.get('order-token');
if (!token) {
- router.push('/home/cart');
+ //router.push('/home/cart');
return;
}
@@ -38,6 +43,7 @@ export function MontonioCheckoutCallback() {
},
body: JSON.stringify({ token }),
});
+ setIsFinalized(true);
if (!response.ok) {
const body = await response.json();
@@ -54,7 +60,7 @@ export function MontonioCheckoutCallback() {
router.push('/home/cart');
}
} else {
- setStatus(Status.ERROR);
+ throw new Error('Payment failed or pending');
}
} catch (e) {
console.error("Error verifying token", e);
@@ -63,7 +69,7 @@ export function MontonioCheckoutCallback() {
}
void verifyToken();
- }, [searchParams]);
+ }, [searchParams, isFinalized]);
if (status === Status.ERROR) {
return (
@@ -91,5 +97,5 @@ export function MontonioCheckoutCallback() {
);
}
- return ();
+ return ;
}
diff --git a/app/home/(user)/_components/order/cart-totals.tsx b/app/home/(user)/_components/order/cart-totals.tsx
index 69dadde..dc25aad 100644
--- a/app/home/(user)/_components/order/cart-totals.tsx
+++ b/app/home/(user)/_components/order/cart-totals.tsx
@@ -67,7 +67,7 @@ export default function CartTotals({ order }: {
-
+
} />
+
diff --git a/app/home/(user)/_components/order/order-item.tsx b/app/home/(user)/_components/order/order-item.tsx
index 658f91b..f938360 100644
--- a/app/home/(user)/_components/order/order-item.tsx
+++ b/app/home/(user)/_components/order/order-item.tsx
@@ -11,13 +11,13 @@ export default function OrderItem({ item, currencyCode }: {
}) {
return (
- {/*
+ {/*
*/}
-
+
-
-
+
+
{item.quantity}x{" "}
diff --git a/app/home/(user)/_components/order/order-items.tsx b/app/home/(user)/_components/order/order-items.tsx
index b08db72..25dbe31 100644
--- a/app/home/(user)/_components/order/order-items.tsx
+++ b/app/home/(user)/_components/order/order-items.tsx
@@ -2,7 +2,6 @@ import repeat from "@lib/util/repeat"
import { StoreOrder } from "@medusajs/types"
import { Table, TableBody } from "@kit/ui/table"
-import Divider from "@modules/common/components/divider"
import SkeletonLineItem from "@modules/skeletons/components/skeleton-line-item"
import OrderItem from "./order-item"
import { Heading } from "@kit/ui/heading"
@@ -19,8 +18,7 @@ export default function OrderItems({ order }: {
-
-
+
{items?.length
? items
diff --git a/instrumentation.ts b/instrumentation.ts
index 7fb6d8f..631b255 100644
--- a/instrumentation.ts
+++ b/instrumentation.ts
@@ -21,10 +21,10 @@ export async function register() {
* @param err
*/
export const onRequestError: Instrumentation.onRequestError = async (err) => {
- const { getServerMonitoringService } = await import('@kit/monitoring/server');
+ // const { getServerMonitoringService } = await import('@kit/monitoring/server');
- const service = await getServerMonitoringService();
+ // const service = await getServerMonitoringService();
- await service.ready();
- await service.captureException(err as Error);
+ // await service.ready();
+ // await service.captureException(err as Error);
};
diff --git a/lib/services/medusaCart.service.ts b/lib/services/medusaCart.service.ts
index 2813846..c3a59a6 100644
--- a/lib/services/medusaCart.service.ts
+++ b/lib/services/medusaCart.service.ts
@@ -73,7 +73,7 @@ export async function handleNavigateToPayment({ language }: { language: string }
currency: cart.currency_code.toUpperCase(),
description: `Order from Medreport`,
locale: language,
- merchantReference: `${account.id}:${Date.now()}`,
+ merchantReference: `${account.id}:${cart.id}:${Date.now()}`,
});
const { error } = await supabase
diff --git a/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts b/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts
index 20fa308..792d103 100644
--- a/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts
+++ b/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts
@@ -84,7 +84,7 @@ export class MontonioWebhookHandlerService
}, `Received Montonio webhook event`);
if (event.paymentStatus === 'PAID') {
- const accountId = event.merchantReferenceDisplay.split(':')[0];
+ const [accountId] = event.merchantReferenceDisplay.split(':');
if (!accountId) {
throw new Error('Invalid merchant reference');
}
diff --git a/public/locales/et/cart.json b/public/locales/et/cart.json
index 8db2419..f5bcc75 100644
--- a/public/locales/et/cart.json
+++ b/public/locales/et/cart.json
@@ -45,7 +45,7 @@
},
"orderConfirmed": {
"title": "Tellimus on edukalt esitatud",
- "summary": "Summa",
+ "summary": "Teenused",
"subtotal": "Vahesumma",
"taxes": "Maksud",
"giftCard": "Kinkekaart",