PaymentModal: Fix payment (#4146)
This commit is contained in:
parent
89e3640962
commit
35ae18dddc
@ -90,6 +90,7 @@ export function buildApiPaymentForm(form: GramJs.payments.PaymentForm): ApiPayme
|
|||||||
savedInfo,
|
savedInfo,
|
||||||
invoice,
|
invoice,
|
||||||
savedCredentials,
|
savedCredentials,
|
||||||
|
url,
|
||||||
} = form;
|
} = form;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -118,6 +119,7 @@ export function buildApiPaymentForm(form: GramJs.payments.PaymentForm): ApiPayme
|
|||||||
const nativeData = nativeParams ? JSON.parse(nativeParams.data) : {};
|
const nativeData = nativeParams ? JSON.parse(nativeParams.data) : {};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
url,
|
||||||
canSaveCredentials,
|
canSaveCredentials,
|
||||||
isPasswordMissing,
|
isPasswordMissing,
|
||||||
formId: String(formId),
|
formId: String(formId),
|
||||||
|
|||||||
@ -20,6 +20,7 @@ export interface ApiPaymentSavedInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface ApiPaymentForm {
|
export interface ApiPaymentForm {
|
||||||
|
url: string;
|
||||||
canSaveCredentials?: boolean;
|
canSaveCredentials?: boolean;
|
||||||
isPasswordMissing?: boolean;
|
isPasswordMissing?: boolean;
|
||||||
formId: string;
|
formId: string;
|
||||||
|
|||||||
@ -47,6 +47,7 @@ export type OwnProps = {
|
|||||||
dispatch?: FormEditDispatch;
|
dispatch?: FormEditDispatch;
|
||||||
onAcceptTos?: (isAccepted: boolean) => void;
|
onAcceptTos?: (isAccepted: boolean) => void;
|
||||||
savedCredentials?: ApiPaymentCredentials[];
|
savedCredentials?: ApiPaymentCredentials[];
|
||||||
|
isPaymentFormUrl?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const Checkout: FC<OwnProps> = ({
|
const Checkout: FC<OwnProps> = ({
|
||||||
@ -64,6 +65,7 @@ const Checkout: FC<OwnProps> = ({
|
|||||||
needAddress,
|
needAddress,
|
||||||
hasShippingOptions,
|
hasShippingOptions,
|
||||||
savedCredentials,
|
savedCredentials,
|
||||||
|
isPaymentFormUrl,
|
||||||
}) => {
|
}) => {
|
||||||
const { setPaymentStep } = getActions();
|
const { setPaymentStep } = getActions();
|
||||||
|
|
||||||
@ -185,7 +187,7 @@ const Checkout: FC<OwnProps> = ({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.invoiceInfo}>
|
<div className={styles.invoiceInfo}>
|
||||||
{renderCheckoutItem({
|
{!isPaymentFormUrl && renderCheckoutItem({
|
||||||
title: paymentMethod || savedCredentials?.[0].title,
|
title: paymentMethod || savedCredentials?.[0].title,
|
||||||
label: lang('PaymentCheckoutMethod'),
|
label: lang('PaymentCheckoutMethod'),
|
||||||
icon: 'card',
|
icon: 'card',
|
||||||
|
|||||||
@ -12,16 +12,32 @@ export type OwnProps = {
|
|||||||
url: string;
|
url: string;
|
||||||
noRedirect?: boolean;
|
noRedirect?: boolean;
|
||||||
onClose: NoneToVoidFunction;
|
onClose: NoneToVoidFunction;
|
||||||
|
onPaymentFormSubmit?: (eventData: PaymentFormSubmitEvent['eventData']) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IframeCallbackEvent {
|
export interface PaymentFormSubmitEvent {
|
||||||
eventType: string;
|
eventType: 'payment_form_submit';
|
||||||
eventData: {
|
eventData: {
|
||||||
path_full: string;
|
credentials: {
|
||||||
|
token: string;
|
||||||
|
type: string;
|
||||||
|
};
|
||||||
|
title: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const ConfirmPayment: FC<OwnProps> = ({ url, noRedirect, onClose }) => {
|
interface WebAppOpenTgLinkEvent {
|
||||||
|
eventType: 'web_app_open_tg_link';
|
||||||
|
eventData: {
|
||||||
|
path_full?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
type IframeCallbackEvent = PaymentFormSubmitEvent | WebAppOpenTgLinkEvent;
|
||||||
|
|
||||||
|
const ConfirmPayment: FC<OwnProps> = ({
|
||||||
|
url, noRedirect, onClose, onPaymentFormSubmit,
|
||||||
|
}) => {
|
||||||
const { openTelegramLink } = getActions();
|
const { openTelegramLink } = getActions();
|
||||||
|
|
||||||
const lang = useLang();
|
const lang = useLang();
|
||||||
@ -30,21 +46,27 @@ const ConfirmPayment: FC<OwnProps> = ({ url, noRedirect, onClose }) => {
|
|||||||
try {
|
try {
|
||||||
const data = JSON.parse(event.data) as IframeCallbackEvent;
|
const data = JSON.parse(event.data) as IframeCallbackEvent;
|
||||||
const { eventType, eventData } = data;
|
const { eventType, eventData } = data;
|
||||||
|
switch (eventType) {
|
||||||
if (eventType !== 'web_app_open_tg_link') {
|
case 'web_app_open_tg_link':
|
||||||
return;
|
if (!noRedirect) {
|
||||||
|
const linkUrl = TME_LINK_PREFIX + eventData.path_full!;
|
||||||
|
openTelegramLink({ url: linkUrl });
|
||||||
|
}
|
||||||
|
onClose();
|
||||||
|
break;
|
||||||
|
case 'payment_form_submit':
|
||||||
|
if (onPaymentFormSubmit) {
|
||||||
|
onPaymentFormSubmit(eventData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
onClose();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!noRedirect) {
|
|
||||||
const linkUrl = TME_LINK_PREFIX + eventData.path_full;
|
|
||||||
openTelegramLink({ url: linkUrl });
|
|
||||||
}
|
|
||||||
|
|
||||||
onClose();
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Ignore other messages
|
// Ignore other messages
|
||||||
}
|
}
|
||||||
}, [onClose, noRedirect, openTelegramLink]);
|
}, [onClose, noRedirect, openTelegramLink, onPaymentFormSubmit]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.addEventListener('message', handleMessage);
|
window.addEventListener('message', handleMessage);
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import type { ApiChat, ApiCountry, ApiPaymentCredentials } from '../../api/types
|
|||||||
import type { TabState } from '../../global/types';
|
import type { TabState } from '../../global/types';
|
||||||
import type { FormState } from '../../hooks/reducers/usePaymentReducer';
|
import type { FormState } from '../../hooks/reducers/usePaymentReducer';
|
||||||
import type { Price, ShippingOption } from '../../types';
|
import type { Price, ShippingOption } from '../../types';
|
||||||
|
import type { PaymentFormSubmitEvent } from './ConfirmPayment';
|
||||||
import { PaymentStep } from '../../types';
|
import { PaymentStep } from '../../types';
|
||||||
|
|
||||||
import { selectChat, selectTabState } from '../../global/selectors';
|
import { selectChat, selectTabState } from '../../global/selectors';
|
||||||
@ -37,6 +38,7 @@ import './PaymentModal.scss';
|
|||||||
|
|
||||||
const DEFAULT_PROVIDER = 'stripe';
|
const DEFAULT_PROVIDER = 'stripe';
|
||||||
const DONATE_PROVIDER = 'smartglocal';
|
const DONATE_PROVIDER = 'smartglocal';
|
||||||
|
const DONATE_PROVIDER_URL = 'https://payment.smart-glocal.com';
|
||||||
const SUPPORTED_PROVIDERS = new Set([DEFAULT_PROVIDER, DONATE_PROVIDER]);
|
const SUPPORTED_PROVIDERS = new Set([DEFAULT_PROVIDER, DONATE_PROVIDER]);
|
||||||
|
|
||||||
export type OwnProps = {
|
export type OwnProps = {
|
||||||
@ -67,6 +69,7 @@ type StateProps = {
|
|||||||
savedCredentials?: ApiPaymentCredentials[];
|
savedCredentials?: ApiPaymentCredentials[];
|
||||||
passwordValidUntil?: number;
|
passwordValidUntil?: number;
|
||||||
isExtendedMedia?: boolean;
|
isExtendedMedia?: boolean;
|
||||||
|
isPaymentFormUrl?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
type GlobalStateProps = Pick<TabState['payment'], (
|
type GlobalStateProps = Pick<TabState['payment'], (
|
||||||
@ -109,6 +112,7 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
savedCredentials,
|
savedCredentials,
|
||||||
passwordValidUntil,
|
passwordValidUntil,
|
||||||
isExtendedMedia,
|
isExtendedMedia,
|
||||||
|
isPaymentFormUrl,
|
||||||
}) => {
|
}) => {
|
||||||
const {
|
const {
|
||||||
loadPasswordInfo,
|
loadPasswordInfo,
|
||||||
@ -118,6 +122,7 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
sendCredentialsInfo,
|
sendCredentialsInfo,
|
||||||
clearPaymentError,
|
clearPaymentError,
|
||||||
validatePaymentPassword,
|
validatePaymentPassword,
|
||||||
|
setSmartGlocalCardInfo,
|
||||||
} = getActions();
|
} = getActions();
|
||||||
|
|
||||||
const lang = useLang();
|
const lang = useLang();
|
||||||
@ -267,6 +272,21 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sendForm = useCallback(() => {
|
||||||
|
sendPaymentForm({
|
||||||
|
shippingOptionId: paymentState.shipping,
|
||||||
|
saveCredentials: paymentState.saveCredentials,
|
||||||
|
savedCredentialId: paymentState.savedCredentialId,
|
||||||
|
tipAmount: paymentState.tipAmount,
|
||||||
|
});
|
||||||
|
}, [sendPaymentForm, paymentState]);
|
||||||
|
|
||||||
|
const handlePaymentFormSubmit = useCallback((eventData: PaymentFormSubmitEvent['eventData']) => {
|
||||||
|
const { credentials } = eventData;
|
||||||
|
setSmartGlocalCardInfo(credentials);
|
||||||
|
sendForm();
|
||||||
|
}, [sendForm]);
|
||||||
|
|
||||||
function renderModalContent(currentStep: PaymentStep) {
|
function renderModalContent(currentStep: PaymentStep) {
|
||||||
switch (currentStep) {
|
switch (currentStep) {
|
||||||
case PaymentStep.Checkout:
|
case PaymentStep.Checkout:
|
||||||
@ -281,6 +301,7 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
totalPrice={totalPrice}
|
totalPrice={totalPrice}
|
||||||
invoice={invoice}
|
invoice={invoice}
|
||||||
checkoutInfo={checkoutInfo}
|
checkoutInfo={checkoutInfo}
|
||||||
|
isPaymentFormUrl
|
||||||
currency={currency!}
|
currency={currency!}
|
||||||
hasShippingOptions={hasShippingOptions}
|
hasShippingOptions={hasShippingOptions}
|
||||||
tipAmount={paymentState.tipAmount}
|
tipAmount={paymentState.tipAmount}
|
||||||
@ -346,6 +367,7 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
<ConfirmPayment
|
<ConfirmPayment
|
||||||
url={confirmPaymentUrl!}
|
url={confirmPaymentUrl!}
|
||||||
noRedirect={isExtendedMedia}
|
noRedirect={isExtendedMedia}
|
||||||
|
onPaymentFormSubmit={handlePaymentFormSubmit}
|
||||||
onClose={closeModal}
|
onClose={closeModal}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@ -367,15 +389,6 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
});
|
});
|
||||||
}, [sendCredentialsInfo, paymentState]);
|
}, [sendCredentialsInfo, paymentState]);
|
||||||
|
|
||||||
const sendForm = useCallback(() => {
|
|
||||||
sendPaymentForm({
|
|
||||||
shippingOptionId: paymentState.shipping,
|
|
||||||
saveCredentials: paymentState.saveCredentials,
|
|
||||||
savedCredentialId: paymentState.savedCredentialId,
|
|
||||||
tipAmount: paymentState.tipAmount,
|
|
||||||
});
|
|
||||||
}, [sendPaymentForm, paymentState]);
|
|
||||||
|
|
||||||
const handleButtonClick = useCallback(() => {
|
const handleButtonClick = useCallback(() => {
|
||||||
switch (step) {
|
switch (step) {
|
||||||
case PaymentStep.ShippingInfo:
|
case PaymentStep.ShippingInfo:
|
||||||
@ -407,6 +420,12 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PaymentStep.Checkout: {
|
case PaymentStep.Checkout: {
|
||||||
|
if (isPaymentFormUrl) {
|
||||||
|
setIsLoading(true);
|
||||||
|
setStep(PaymentStep.ConfirmPayment);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (savedInfo && !requestId && !paymentState.shipping) {
|
if (savedInfo && !requestId && !paymentState.shipping) {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
validateRequest();
|
validateRequest();
|
||||||
@ -455,7 +474,7 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
}, [
|
}, [
|
||||||
isEmailRequested, isNameRequested, isPhoneRequested, isShippingAddressRequested, nativeProvider, passwordValidUntil,
|
isEmailRequested, isNameRequested, isPhoneRequested, isShippingAddressRequested, nativeProvider, passwordValidUntil,
|
||||||
paymentDispatch, paymentState, requestId, savedInfo, sendCredentials, sendForm, setStep, smartGlocalToken, step,
|
paymentDispatch, paymentState, requestId, savedInfo, sendCredentials, sendForm, setStep, smartGlocalToken, step,
|
||||||
stripeId, twoFaPassword, validatePaymentPassword, validateRequest,
|
stripeId, twoFaPassword, validatePaymentPassword, validateRequest, isPaymentFormUrl,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -574,7 +593,11 @@ const PaymentModal: FC<OwnProps & StateProps & GlobalStateProps> = ({
|
|||||||
<h3>{modalHeader}</h3>
|
<h3>{modalHeader}</h3>
|
||||||
</div>
|
</div>
|
||||||
{step !== undefined ? (
|
{step !== undefined ? (
|
||||||
<Transition name="slide" activeKey={step}>
|
<Transition
|
||||||
|
name="slide"
|
||||||
|
activeKey={step}
|
||||||
|
cleanupKey={PaymentStep.ConfirmPayment}
|
||||||
|
>
|
||||||
<div className="content custom-scroll">
|
<div className="content custom-scroll">
|
||||||
{renderModalContent(step)}
|
{renderModalContent(step)}
|
||||||
</div>
|
</div>
|
||||||
@ -622,10 +645,16 @@ export default memo(withGlobal<OwnProps>(
|
|||||||
savedCredentials,
|
savedCredentials,
|
||||||
temporaryPassword,
|
temporaryPassword,
|
||||||
isExtendedMedia,
|
isExtendedMedia,
|
||||||
|
url,
|
||||||
} = selectTabState(global).payment;
|
} = selectTabState(global).payment;
|
||||||
|
|
||||||
|
let providerName = nativeProvider;
|
||||||
|
if (!providerName && url) {
|
||||||
|
providerName = url.startsWith(DONATE_PROVIDER_URL) ? DONATE_PROVIDER : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
const chat = inputInvoice && 'chatId' in inputInvoice ? selectChat(global, inputInvoice.chatId) : undefined;
|
const chat = inputInvoice && 'chatId' in inputInvoice ? selectChat(global, inputInvoice.chatId) : undefined;
|
||||||
const isProviderError = Boolean(invoice && (!nativeProvider || !SUPPORTED_PROVIDERS.has(nativeProvider)));
|
const isProviderError = Boolean(invoice && (!providerName || !SUPPORTED_PROVIDERS.has(providerName)));
|
||||||
const { needCardholderName, needCountry, needZip } = (nativeParams || {});
|
const { needCardholderName, needCountry, needZip } = (nativeParams || {});
|
||||||
const {
|
const {
|
||||||
isNameRequested,
|
isNameRequested,
|
||||||
@ -644,7 +673,7 @@ export default memo(withGlobal<OwnProps>(
|
|||||||
shippingOptions,
|
shippingOptions,
|
||||||
savedInfo,
|
savedInfo,
|
||||||
canSaveCredentials,
|
canSaveCredentials,
|
||||||
nativeProvider,
|
nativeProvider: providerName,
|
||||||
passwordMissing,
|
passwordMissing,
|
||||||
isNameRequested,
|
isNameRequested,
|
||||||
isShippingAddressRequested,
|
isShippingAddressRequested,
|
||||||
@ -660,7 +689,8 @@ export default memo(withGlobal<OwnProps>(
|
|||||||
needCountry,
|
needCountry,
|
||||||
needZip,
|
needZip,
|
||||||
error,
|
error,
|
||||||
confirmPaymentUrl,
|
confirmPaymentUrl: confirmPaymentUrl ?? url,
|
||||||
|
isPaymentFormUrl: Boolean(!nativeProvider && url),
|
||||||
countryList: global.countryList.general,
|
countryList: global.countryList.general,
|
||||||
requestId,
|
requestId,
|
||||||
hasShippingOptions: Boolean(shippingOptions?.length),
|
hasShippingOptions: Boolean(shippingOptions?.length),
|
||||||
|
|||||||
@ -34,6 +34,7 @@ export type TransitionProps = {
|
|||||||
shouldRestoreHeight?: boolean;
|
shouldRestoreHeight?: boolean;
|
||||||
shouldCleanup?: boolean;
|
shouldCleanup?: boolean;
|
||||||
cleanupExceptionKey?: number;
|
cleanupExceptionKey?: number;
|
||||||
|
cleanupKey?: number;
|
||||||
// Used by async components which are usually remounted during first animation
|
// Used by async components which are usually remounted during first animation
|
||||||
shouldWrap?: boolean;
|
shouldWrap?: boolean;
|
||||||
wrapExceptionKey?: number;
|
wrapExceptionKey?: number;
|
||||||
@ -73,6 +74,7 @@ function Transition({
|
|||||||
shouldRestoreHeight,
|
shouldRestoreHeight,
|
||||||
shouldCleanup,
|
shouldCleanup,
|
||||||
cleanupExceptionKey,
|
cleanupExceptionKey,
|
||||||
|
cleanupKey,
|
||||||
shouldWrap,
|
shouldWrap,
|
||||||
wrapExceptionKey,
|
wrapExceptionKey,
|
||||||
id,
|
id,
|
||||||
@ -120,13 +122,16 @@ function Transition({
|
|||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
if (!shouldCleanup) {
|
if (!shouldCleanup) {
|
||||||
|
if (cleanupKey !== undefined) {
|
||||||
|
delete rendersRef.current[cleanupKey];
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (cleanupExceptionKey !== undefined) {
|
||||||
const preservedRender = cleanupExceptionKey !== undefined ? rendersRef.current[cleanupExceptionKey] : undefined;
|
rendersRef.current = { [cleanupExceptionKey]: rendersRef.current[cleanupExceptionKey] };
|
||||||
|
} else {
|
||||||
rendersRef.current = preservedRender ? { [cleanupExceptionKey!]: preservedRender } : {};
|
rendersRef.current = {};
|
||||||
|
}
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,6 +317,7 @@ function Transition({
|
|||||||
shouldDisableAnimation,
|
shouldDisableAnimation,
|
||||||
forceUpdate,
|
forceUpdate,
|
||||||
withSwipeControl,
|
withSwipeControl,
|
||||||
|
cleanupKey,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -185,10 +185,8 @@ addActionHandler('sendPaymentForm', async (global, actions, payload): Promise<vo
|
|||||||
const formId = selectPaymentFormId(global, tabId);
|
const formId = selectPaymentFormId(global, tabId);
|
||||||
const requestInfoId = selectPaymentRequestId(global, tabId);
|
const requestInfoId = selectPaymentRequestId(global, tabId);
|
||||||
const { nativeProvider, temporaryPassword } = selectTabState(global, tabId).payment;
|
const { nativeProvider, temporaryPassword } = selectTabState(global, tabId).payment;
|
||||||
const publishableKey = nativeProvider === 'stripe'
|
|
||||||
? selectProviderPublishableKey(global, tabId) : selectProviderPublicToken(global, tabId);
|
|
||||||
|
|
||||||
if (!inputInvoice || !publishableKey || !formId || !nativeProvider) {
|
if (!inputInvoice || !formId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,6 +339,14 @@ async function sendSmartGlocalCredentials<T extends GlobalState>(
|
|||||||
setGlobal(global);
|
setGlobal(global);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addActionHandler('setSmartGlocalCardInfo', (global, actions, payload): ActionReturnType => {
|
||||||
|
const { tabId = getCurrentTabId(), type, token } = payload;
|
||||||
|
return setSmartGlocalCardInfo(global, {
|
||||||
|
type,
|
||||||
|
token,
|
||||||
|
}, tabId);
|
||||||
|
});
|
||||||
|
|
||||||
addActionHandler('setPaymentStep', (global, actions, payload): ActionReturnType => {
|
addActionHandler('setPaymentStep', (global, actions, payload): ActionReturnType => {
|
||||||
const { step, tabId = getCurrentTabId() } = payload;
|
const { step, tabId = getCurrentTabId() } = payload;
|
||||||
return setPaymentStep(global, step ?? PaymentStep.Checkout, tabId);
|
return setPaymentStep(global, step ?? PaymentStep.Checkout, tabId);
|
||||||
|
|||||||
@ -472,6 +472,7 @@ export type TabState = {
|
|||||||
value: string;
|
value: string;
|
||||||
validUntil: number;
|
validUntil: number;
|
||||||
};
|
};
|
||||||
|
url?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
chatCreation?: {
|
chatCreation?: {
|
||||||
@ -1504,6 +1505,10 @@ export interface ActionPayloads {
|
|||||||
sendCredentialsInfo: {
|
sendCredentialsInfo: {
|
||||||
credentials: ApiCredentials;
|
credentials: ApiCredentials;
|
||||||
} & WithTabId;
|
} & WithTabId;
|
||||||
|
setSmartGlocalCardInfo: {
|
||||||
|
type: string;
|
||||||
|
token: string;
|
||||||
|
} & WithTabId;
|
||||||
clearPaymentError: WithTabId | undefined;
|
clearPaymentError: WithTabId | undefined;
|
||||||
clearReceipt: WithTabId | undefined;
|
clearReceipt: WithTabId | undefined;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user