From 4f90aeff3cb705a672d9b8355d43b1cb69937dcc Mon Sep 17 00:00:00 2001 From: Mitchell Magro Date: Mon, 29 Dec 2025 19:40:38 +0100 Subject: [PATCH] Fixed more to redirections --- src/features/cashier/types.ts | 8 ++++++++ src/pages/PaymentStatus/PaymentStatus.tsx | 17 ++++++++++++++--- src/utils/parentMessage.ts | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/utils/parentMessage.ts diff --git a/src/features/cashier/types.ts b/src/features/cashier/types.ts index c650e12..a2f0bb0 100644 --- a/src/features/cashier/types.ts +++ b/src/features/cashier/types.ts @@ -45,3 +45,11 @@ export interface IPaymentRequest { export interface IPaymentResponse { payment_url: string; // URL where customer needs to continue with payment flow } + +export type TCashierResultStatus = 'success' | 'cancel' | 'error'; + +export interface ICashierResultMessage { + type: 'CASHIER_RESULT'; + status: TCashierResultStatus; + message?: string; +} diff --git a/src/pages/PaymentStatus/PaymentStatus.tsx b/src/pages/PaymentStatus/PaymentStatus.tsx index 4f9edf0..768a15f 100644 --- a/src/pages/PaymentStatus/PaymentStatus.tsx +++ b/src/pages/PaymentStatus/PaymentStatus.tsx @@ -1,5 +1,8 @@ +import { useEffect } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import Status from '@/components/Status/Status'; +import { postMessageToParent } from '@/utils/parentMessage'; +import type { TCashierResultStatus } from '@/features/cashier/types'; import './PaymentStatus.scss'; function PaymentStatus() { @@ -8,13 +11,21 @@ function PaymentStatus() { // Get status from URL query params const statusParam = searchParams.get('status'); - const status: 'success' | 'cancel' | 'error' = + const status: TCashierResultStatus = statusParam === 'success' || statusParam === 'cancel' || statusParam === 'error' ? statusParam : 'error'; // Default to error if invalid or missing // Get message from URL params or use default - const message = searchParams.get('message') || getDefaultMessage(status); + const message = getDefaultMessage(status); + + // Notify parent window about the payment result + useEffect(() => { + postMessageToParent({ + type: 'CASHIER_RESULT', + status, + }); + }, [status]); const handleAction = () => { navigate('/'); @@ -38,7 +49,7 @@ function PaymentStatus() { ); } -function getDefaultMessage(type: 'success' | 'cancel' | 'error'): string { +function getDefaultMessage(type: TCashierResultStatus): string { switch (type) { case 'success': return 'Payment completed successfully!'; diff --git a/src/utils/parentMessage.ts b/src/utils/parentMessage.ts new file mode 100644 index 0000000..cec4608 --- /dev/null +++ b/src/utils/parentMessage.ts @@ -0,0 +1,15 @@ +import type { ICashierResultMessage } from '@/features/cashier/types'; + +/** + * Posts a message to the parent window (useful for iframe integrations) + * @param message - The message object to send + * @param targetOrigin - The target origin for the message (defaults to '*' for flexibility) + */ +export function postMessageToParent( + message: ICashierResultMessage, + targetOrigin: string = '*' +): void { + if (window.parent && window.parent !== window) { + window.parent.postMessage(message, targetOrigin); + } +}