connect-transfer-react-native-sdk
Version:
Connect Transfer React Native SDK for Mastercard Open Banking Connect
170 lines (165 loc) • 5.3 kB
JavaScript
;
/**
* Maps event names to structured payloads compatible with the Audit Service events API.
* Includes utility functions to transform event data and extract metadata from Redux state.
*
* Usage:
* const mapAuditEvent = useAuditEventsMapper();
* const payload = mapAuditEvent("SomeEventName", eventData);
*/
import { useSelector } from 'react-redux';
import { ListenerType, RedirectReason, TransferActionCodes, TransferActionEvents, TransferEventDataName, UserEvents } from '../constants';
import { getTransferProductType } from './transferEventHandlers';
import { SDK_PLATFORM } from '../constants';
import { SDK_VERSION } from '../utility/version';
/**
* Maps event-specific parameters to structured audit event data.
*
* @param eventParams - Object containing eventName, eventData, queryParams, and product.
* @returns An object formatted according to the event name for the audit API.
*/
const mapEventData = eventParams => {
const {
eventName,
eventData,
queryParams,
product
} = eventParams;
const COMMON_FIELDS = {
[TransferEventDataName.TTL]: queryParams?.ttl
};
switch (eventName) {
case TransferActionEvents.INITIALIZE_TRANSFER:
case TransferActionEvents.TERMS_ACCEPTED:
case UserEvents.TASK_COMPLETED:
return COMMON_FIELDS;
case UserEvents.INITIALIZE_DEPOSIT_SWITCH:
return {
...COMMON_FIELDS,
product
};
case UserEvents.SEARCH_PAYROLL_PROVIDER:
return {
...COMMON_FIELDS,
searchTerms: eventData.searchTerm
};
case UserEvents.SELECT_PAYROLL_PROVIDER:
return {
...COMMON_FIELDS,
payrollProvider: eventData.payrollProvider
};
case UserEvents.SELECTED_COMPANY_THROUGH_FRANCHISE_PAGE:
case UserEvents.SELECTED_COMPANY_THROUGH_PAYROLL_PROVIDER:
return {
...COMMON_FIELDS,
company: eventData.company
};
case UserEvents.SUBMIT_CREDENTIALS:
return {
...COMMON_FIELDS,
inputType: eventData.inputType
};
case UserEvents.CHANGE_DEFAULT_ALLOCATION:
case UserEvents.SUBMIT_ALLOCATION:
const {
depositOption,
depositAllocation
} = eventData;
return {
...COMMON_FIELDS,
distributions: [{
type: depositOption,
...(depositAllocation !== undefined && {
allocatedValue: depositAllocation
})
}]
};
case TransferActionEvents.END:
const {
listenerType,
code,
reason,
distributionType,
distributionAmount,
taskId,
...restEventData
} = eventData;
if (listenerType === ListenerType.FINISH) {
return {
...COMMON_FIELDS,
...restEventData,
switchId: taskId,
distributions: [{
type: distributionType,
...(distributionAmount !== undefined && {
allocatedValue: distributionAmount
})
}],
code: TransferActionCodes.SUCCESS,
reason: RedirectReason.COMPLETE
};
}
if (listenerType === ListenerType.CLOSE) {
const isExitReason = reason === RedirectReason.UNKNOWN || reason === RedirectReason.EXIT;
return {
...COMMON_FIELDS,
code: isExitReason ? TransferActionCodes.USER_INITIATED_EXIT : code,
reason: isExitReason ? RedirectReason.EXIT : reason
};
}
return COMMON_FIELDS;
case TransferActionEvents.ERROR:
return {
...COMMON_FIELDS,
code: eventData.code || TransferActionCodes.API_OR_ATOMIC_ERROR,
reason: RedirectReason.ERROR
};
default:
return COMMON_FIELDS;
}
};
/**
* Extracts metadata fields from the query parameters.
*
* @param queryParams - Query parameters containing customer, partner, session, and experience data.
* @returns An object containing metadata fields for the audit payload.
*/
function getMetadata(queryParams) {
const metaData = {
origin: queryParams.origin,
platform: SDK_PLATFORM,
sdkVersion: SDK_VERSION,
[TransferEventDataName.TIMESTAMP]: queryParams[TransferEventDataName.TIMESTAMP],
[TransferEventDataName.CUSTOMER_ID]: queryParams[TransferEventDataName.CUSTOMER_ID],
[TransferEventDataName.PARTNER_ID]: queryParams[TransferEventDataName.PARTNER_ID],
[TransferEventDataName.SESSION_ID]: queryParams.signature
};
if (queryParams?.experience?.id) {
metaData[TransferEventDataName.EXPERIENCE] = queryParams.experience.id;
}
return metaData;
}
/**
* Custom React hook to map Redux state and event input to a complete audit event payload.
*
* @returns A function that accepts eventName and eventData, and returns a structured event object.
*/
export const useAuditEventsMapper = () => {
const {
queryParamsObject: queryParams = {},
data = {}
} = useSelector(state => state.user || {});
const product = getTransferProductType(data?.data?.product);
return (eventName, eventData) => ({
eventType: queryParams?.type,
eventName,
eventData: mapEventData({
eventName,
eventData,
queryParams,
product
}),
metadata: getMetadata(queryParams)
});
};
//# sourceMappingURL=auditEventsMapper.js.map