From 8f29070030b0e60f5bd65159927790df7eee5d2b Mon Sep 17 00:00:00 2001
From: haiphamhoang <33831192+haiphamhoang@users.noreply.github.com>
Date: Mon, 3 Mar 2025 12:00:04 +0700
Subject: [PATCH 1/6] Add Liquid template support for offline payment
instructions
---
.../Payment/PaymentMethods/Offline/index.tsx | 51 +++++++++++++++++--
.../routes/product-widget/Payment/index.tsx | 2 +-
2 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx b/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
index cd3c5b00..edf323f4 100644
--- a/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
+++ b/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
@@ -1,13 +1,54 @@
-import {Event} from "../../../../../../types.ts";
-import {Card} from "../../../../../common/Card";
-import {t} from "@lingui/macro";
+import { Event, Order } from "../../../../../../types.ts";
+import { Card } from "../../../../../common/Card";
+import {getClientLocale} from "../../../../../../locales";
+import { t } from "@lingui/macro";
+import { Liquid } from 'liquidjs';
+import React from 'react';
interface OfflinePaymentMethodProps {
event: Event;
+ order?: Order;
}
-export const OfflinePaymentMethod = ({event}: OfflinePaymentMethodProps) => {
+export const OfflinePaymentMethod = ({ event, order }: OfflinePaymentMethodProps) => {
const eventSettings = event?.settings;
+ // Initialize Liquid engine with default settings
+ const engine = new Liquid();
+
+ const replaceVariables = async (text: string) => {
+ if (!text || !order) return text;
+
+ const variables = {
+ order: {
+ short_id: order.short_id,
+ public_id: order.public_id,
+ first_name: order.first_name,
+ last_name: order.last_name,
+ email: order.email,
+ total_gross: order.total_gross,
+ currency: order.currency,
+ items: order.order_items
+ },
+ client_language: getClientLocale()
+ };
+
+ try {
+ return await engine.parseAndRender(text, variables);
+ } catch (error) {
+ console.error('Error processing Liquid template:', error);
+ return text;
+ }
+ };
+
+ const [processedInstructions, setProcessedInstructions] = React.useState(eventSettings?.offline_payment_instructions || "");
+
+ React.useEffect(() => {
+ const processInstructions = async () => {
+ const processed = await replaceVariables(eventSettings?.offline_payment_instructions || "");
+ setProcessedInstructions(processed);
+ };
+ processInstructions();
+ }, [eventSettings?.offline_payment_instructions, order]);
return (
@@ -15,7 +56,7 @@ export const OfflinePaymentMethod = ({event}: OfflinePaymentMethodProps) => {
diff --git a/frontend/src/components/routes/product-widget/Payment/index.tsx b/frontend/src/components/routes/product-widget/Payment/index.tsx
index 44ceb77a..3d6729f6 100644
--- a/frontend/src/components/routes/product-widget/Payment/index.tsx
+++ b/frontend/src/components/routes/product-widget/Payment/index.tsx
@@ -90,7 +90,7 @@ const Payment = () => {
{isOfflineEnabled && (
-
+
)}
From 0b17fcf0b3f6ce3d9007e8eacd5ede4d141bd84a Mon Sep 17 00:00:00 2001
From: haiphamhoang <33831192+haiphamhoang@users.noreply.github.com>
Date: Mon, 3 Mar 2025 13:19:35 +0700
Subject: [PATCH 2/6] Add Liquid template processing for event descriptions
---
.../EventHomepage/EventInformation/index.tsx | 21 +++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/frontend/src/components/layouts/EventHomepage/EventInformation/index.tsx b/frontend/src/components/layouts/EventHomepage/EventInformation/index.tsx
index ef21671e..14fa426e 100644
--- a/frontend/src/components/layouts/EventHomepage/EventInformation/index.tsx
+++ b/frontend/src/components/layouts/EventHomepage/EventInformation/index.tsx
@@ -6,9 +6,11 @@ import {Button} from "@mantine/core";
import {LoadingMask} from "../../../common/LoadingMask";
import {ShareComponent} from "../../../common/ShareIcon";
import {eventCoverImageUrl, eventHomepageUrl} from "../../../../utilites/urlHelper.ts";
-import {FC} from "react";
+import {FC, useMemo} from "react";
import {Event} from "../../../../types.ts";
import {EventDateRange} from "../../../common/EventDateRange";
+import { getClientLocale } from "../../../../locales.ts";
+import { Liquid } from "liquidjs";
export const EventInformation: FC<{
event: Event
@@ -17,6 +19,21 @@ export const EventInformation: FC<{
if (!event) {
return
;
}
+
+ const processedDescription = useMemo(() => {
+ if (!event.description) return '';
+
+ const engine = new Liquid();
+ try {
+ const clientLocale = getClientLocale();
+ return engine.parseAndRenderSync(event.description, {
+ client_language: clientLocale
+ });
+ } catch (error) {
+ console.error("Error processing liquid template:", error);
+ return event.description;
+ }
+ }, [event.description]);
return (
<>
@@ -75,7 +92,7 @@ export const EventInformation: FC<{
)}
From e52629e0b7ed65bfe3b4f7eaa2296a237e4dcc1a Mon Sep 17 00:00:00 2001
From: haiphamhoang <33831192+haiphamhoang@users.noreply.github.com>
Date: Mon, 3 Mar 2025 13:57:33 +0700
Subject: [PATCH 3/6] Refactor offline payment method variables for Liquid
template processing
- Use flat variable instead of dot variable
---
.../Payment/PaymentMethods/Offline/index.tsx | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx b/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
index edf323f4..5114871b 100644
--- a/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
+++ b/frontend/src/components/routes/product-widget/Payment/PaymentMethods/Offline/index.tsx
@@ -19,16 +19,14 @@ export const OfflinePaymentMethod = ({ event, order }: OfflinePaymentMethodProps
if (!text || !order) return text;
const variables = {
- order: {
- short_id: order.short_id,
- public_id: order.public_id,
- first_name: order.first_name,
- last_name: order.last_name,
- email: order.email,
- total_gross: order.total_gross,
- currency: order.currency,
- items: order.order_items
- },
+ order_short_id: order.short_id,
+ order_public_id: order.public_id,
+ order_first_name: order.first_name,
+ order_last_name: order.last_name,
+ order_email: order.email,
+ order_total_gross: order.total_gross,
+ order_currency: order.currency,
+ order_items: order.order_items,
client_language: getClientLocale()
};
From d3294aa6e2cfc985062ae50661e2c9920fc78d9c Mon Sep 17 00:00:00 2001
From: haiphamhoang <33831192+haiphamhoang@users.noreply.github.com>
Date: Mon, 3 Mar 2025 15:24:45 +0700
Subject: [PATCH 4/6] Refactor OfflinePaymentInstructions with
OfflinePaymentMethod component
---
.../OrderSummaryAndProducts/index.tsx | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/frontend/src/components/routes/product-widget/OrderSummaryAndProducts/index.tsx b/frontend/src/components/routes/product-widget/OrderSummaryAndProducts/index.tsx
index a8c75ff4..7e863ddd 100644
--- a/frontend/src/components/routes/product-widget/OrderSummaryAndProducts/index.tsx
+++ b/frontend/src/components/routes/product-widget/OrderSummaryAndProducts/index.tsx
@@ -15,6 +15,7 @@ import {
IconPrinter,
IconUser
} from "@tabler/icons-react";
+import { OfflinePaymentMethod } from "../Payment/PaymentMethods/Offline";
import {useGetOrderPublic} from "../../../../queries/useGetOrderPublic.ts";
import {eventCheckoutPath} from "../../../../utilites/urlHelper.ts";
@@ -223,16 +224,9 @@ const PostCheckoutMessage = ({ message }: { message: string }) => (
);
-const OfflinePaymentInstructions = ({ event }: { event: Event }) => (
+const OfflinePaymentInstructions = ({ event, order }: { event: Event, order: Order }) => (