import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { AccountAccessSuccessResponse } from '../types/account.types'; import { PaymentState, ModalState, Installment, CardType, OrderData, RewardItem } from '../types/payment.types'; import { CreditCardFormData } from '../utils/validation-schemas'; export interface MasterpassRestTokenData { MerchantId: string; AccountKey: string; IsMsisdnValidated: string; AuthenticationMethod: string; Secure3dType: string; IsOtpValidated: string; IsCustom: string; CurrencyCode: string; Hash: string; UserId: string; exp: number; iss: string; aud: string; } export interface AccountStatus { isAccountNotFound: boolean; isAccountNotLinked: boolean; shouldShowDirectForm: boolean; } export interface MasterpassRestState { token: string | null; terminalGroupId: string | null; bankIca: string | null; tokenData: MasterpassRestTokenData | null; accountData: AccountAccessSuccessResponse | null; accountStatus: AccountStatus; paymentState: PaymentState; modalState: ModalState; isTokenLoading: boolean; isScriptLoaded: boolean; locale: string; currency: string; lastCheckedBin: string; newCardFormData: Partial; error: any; } const initialState: MasterpassRestState = { token: null, terminalGroupId: null, bankIca: null, tokenData: null, accountData: null, accountStatus: { isAccountNotFound: false, isAccountNotLinked: false, shouldShowDirectForm: false }, paymentState: { selectedCard: null, selectedInstallment: null, installments: [], cardType: null, orderData: null, orderCompleted: false, cvc: '', useThreeD: true, availableRewards: [], selectedRewards: [], isLoadingRewards: false }, modalState: { showLinkModal: false, showOTPModal: false, show3DSecureModal: false, showInformationModal: false, showRewardModal: false, informationModalData: null, otpType: 'OTP', otpContext: 'account', verificationData: null, cardToDelete: null, removingCardId: null }, isTokenLoading: false, isScriptLoaded: false, locale: '', currency: '', lastCheckedBin: '', newCardFormData: {}, error: null }; const masterpassRestSlice = createSlice({ name: 'masterpassRest', initialState, reducers: { setMasterpassRestToken: (state, action: PayloadAction) => { state.token = action.payload; }, setMasterpassTerminalGroupId: (state, action: PayloadAction) => { state.terminalGroupId = action.payload; }, setMasterpassBankIca: ( state, action: PayloadAction ) => { state.bankIca = action.payload; }, setMasterpassRestTokenData: ( state, action: PayloadAction ) => { state.tokenData = action.payload; }, setTokenLoading: (state, action: PayloadAction) => { state.isTokenLoading = action.payload; }, setScriptLoaded: (state, action: PayloadAction) => { state.isScriptLoaded = action.payload; }, setLocale: (state, action: PayloadAction) => { state.locale = action.payload; }, setCurrency: (state, action: PayloadAction) => { state.currency = action.payload; }, setMasterpassRestAccountData: ( state, action: PayloadAction ) => { state.accountData = action.payload; }, setAccountStatus: ( state, action: PayloadAction> ) => { state.accountStatus = { ...state.accountStatus, ...action.payload }; }, clearMasterpassRestAccountData: (state) => { state.accountData = null; }, updatePaymentState: ( state, action: PayloadAction> ) => { state.paymentState = { ...state.paymentState, ...action.payload }; }, setSelectedCard: (state, action: PayloadAction) => { state.paymentState.selectedCard = action.payload; }, setSelectedInstallment: ( state, action: PayloadAction ) => { state.paymentState.selectedInstallment = action.payload; }, setInstallments: (state, action: PayloadAction) => { state.paymentState.installments = action.payload; }, setCardType: (state, action: PayloadAction) => { state.paymentState.cardType = action.payload; }, setOrderData: (state, action: PayloadAction) => { state.paymentState.orderData = action.payload; }, setCvc: (state, action: PayloadAction) => { state.paymentState.cvc = action.payload; }, setOrderCompleted: (state, action: PayloadAction) => { state.paymentState.orderCompleted = action.payload; }, setAvailableRewards: (state, action: PayloadAction) => { state.paymentState.availableRewards = action.payload; }, setSelectedRewards: (state, action: PayloadAction) => { state.paymentState.selectedRewards = action.payload; }, setLoadingRewards: (state, action: PayloadAction) => { state.paymentState.isLoadingRewards = action.payload; }, setShowRewardModal: (state, action: PayloadAction) => { state.modalState.showRewardModal = action.payload; }, clearRewards: (state) => { state.paymentState.availableRewards = []; state.paymentState.selectedRewards = []; state.paymentState.isLoadingRewards = false; state.modalState.showRewardModal = false; }, updateModalState: (state, action: PayloadAction>) => { state.modalState = { ...state.modalState, ...action.payload }; }, setShowLinkModal: (state, action: PayloadAction) => { state.modalState.showLinkModal = action.payload; }, setShowOTPModal: (state, action: PayloadAction) => { state.modalState.showOTPModal = action.payload; }, setCardToDelete: (state, action: PayloadAction) => { state.modalState.cardToDelete = action.payload; }, setRemovingCardId: (state, action: PayloadAction) => { state.modalState.removingCardId = action.payload; }, setNewCardFormData: ( state, action: PayloadAction> ) => { state.newCardFormData = { ...state.newCardFormData, ...action.payload }; }, updateNewCardFormField: ( state, action: PayloadAction<{ field: keyof CreditCardFormData; value: string | boolean; }> ) => { const { field, value } = action.payload; (state.newCardFormData as any)[field] = value; }, clearNewCardFormData: (state) => { state.newCardFormData = {}; }, setLastCheckedBin: (state, action: PayloadAction) => { state.lastCheckedBin = action.payload; }, setError: (state, action: PayloadAction) => { state.error = action.payload; }, clearAllErrors: (state) => { state.error = null; }, resetState: (state) => { const preservedLocale = state.locale; const preservedCurrency = state.currency; state.token = null; state.terminalGroupId = null; state.bankIca = null; state.tokenData = null; state.accountData = null; state.accountStatus = { isAccountNotFound: false, isAccountNotLinked: false, shouldShowDirectForm: false }; state.paymentState = { selectedCard: null, selectedInstallment: null, installments: [], cardType: null, orderData: null, orderCompleted: false, cvc: '', useThreeD: true, availableRewards: [], selectedRewards: [], isLoadingRewards: false }; state.modalState = { showLinkModal: false, showOTPModal: false, show3DSecureModal: false, showInformationModal: false, showRewardModal: false, informationModalData: null, otpType: 'OTP', otpContext: 'account', verificationData: null, cardToDelete: null, removingCardId: null }; state.lastCheckedBin = ''; state.newCardFormData = {}; state.error = null; state.locale = preservedLocale; state.currency = preservedCurrency; } } }); export const { setMasterpassRestToken, setMasterpassTerminalGroupId, setMasterpassBankIca, setMasterpassRestTokenData, setTokenLoading, setScriptLoaded, setLocale, setCurrency, setMasterpassRestAccountData, setAccountStatus, clearMasterpassRestAccountData, updatePaymentState, setSelectedCard, setSelectedInstallment, setInstallments, setCardType, setOrderData, setCvc, setOrderCompleted, setAvailableRewards, setSelectedRewards, setLoadingRewards, setShowRewardModal, clearRewards, updateModalState, setShowLinkModal, setShowOTPModal, setCardToDelete, setRemovingCardId, setNewCardFormData, updateNewCardFormField, clearNewCardFormData, setLastCheckedBin, setError, clearAllErrors, resetState } = masterpassRestSlice.actions; export default masterpassRestSlice.reducer;