feat: create email template for TTO reservation confirmation

feat: implement order notifications service with TTO reservation confirmation handling

feat: create migration for TTO booking email webhook trigger
This commit is contained in:
Danel Kungla
2025-09-30 16:05:43 +03:00
parent 4003284f3a
commit 72f6f2b716
56 changed files with 3692 additions and 294 deletions

View File

@@ -1,18 +1,19 @@
'use client';
import { useEffect, useRef, useState } from 'react';
import CartTotals from '@/app/home/(user)/_components/order/cart-totals';
import OrderDetails from '@/app/home/(user)/_components/order/order-details';
import OrderItems from '@/app/home/(user)/_components/order/order-items';
import { retrieveOrder } from '@lib/data/orders';
import { StoreOrder } from '@medusajs/types';
import Divider from '@modules/common/components/divider';
import { GlobalLoader } from '@kit/ui/makerkit/global-loader';
import { PageBody, PageHeader } from '@kit/ui/page';
import { Trans } from '@kit/ui/trans';
import { StoreOrder } from '@medusajs/types';
import { AnalysisOrder } from '~/lib/types/analysis-order';
import { useEffect, useRef, useState } from 'react';
import { retrieveOrder } from '@lib/data/orders';
import { GlobalLoader } from '@kit/ui/makerkit/global-loader';
function OrderConfirmedLoadingWrapper({
medusaOrder: initialMedusaOrder,
@@ -21,7 +22,8 @@ function OrderConfirmedLoadingWrapper({
medusaOrder: StoreOrder;
order: AnalysisOrder;
}) {
const [medusaOrder, setMedusaOrder] = useState<StoreOrder>(initialMedusaOrder);
const [medusaOrder, setMedusaOrder] =
useState<StoreOrder>(initialMedusaOrder);
const fetchingRef = useRef(false);
const paymentStatus = medusaOrder.payment_status;
@@ -52,7 +54,7 @@ function OrderConfirmedLoadingWrapper({
if (!isPaid) {
return (
<PageBody>
<div className="flex flex-col justify-start items-center h-full pt-[10vh]">
<div className="flex h-full flex-col items-center justify-start pt-[10vh]">
<div>
<GlobalLoader />
</div>

View File

@@ -7,6 +7,7 @@ import { pathsConfig } from '@kit/shared/config';
import { withI18n } from '~/lib/i18n/with-i18n';
import { getAnalysisOrder } from '~/lib/services/order.service';
import OrderConfirmedLoadingWrapper from './order-confirmed-loading-wrapper';
export async function generateMetadata() {
@@ -36,7 +37,9 @@ async function OrderConfirmedPage(props: {
redirect(pathsConfig.app.myOrders);
}
return <OrderConfirmedLoadingWrapper medusaOrder={medusaOrder} order={order} />;
return (
<OrderConfirmedLoadingWrapper medusaOrder={medusaOrder} order={order} />
);
}
export default withI18n(OrderConfirmedPage);

View File

@@ -29,12 +29,13 @@ export async function generateMetadata() {
}
async function OrdersPage() {
const [medusaOrders, analysisOrders, ttoOrders, { productTypes }] = await Promise.all([
listOrders(ORDERS_LIMIT),
getAnalysisOrders(),
getTtoOrders(),
listProductTypes(),
]);
const [medusaOrders, analysisOrders, ttoOrders, { productTypes }] =
await Promise.all([
listOrders(ORDERS_LIMIT),
getAnalysisOrders(),
getTtoOrders(),
listProductTypes(),
]);
if (!medusaOrders || !productTypes || !ttoOrders) {
redirect(pathsConfig.auth.signIn);