@fullstory/react-native
Version:
The official FullStory React Native plugin
132 lines (129 loc) • 4.1 kB
JavaScript
// When adding new imports, please verify that they are not causing the metro resolver to fail in earlier versions of react-native.
import { NativeModules, Platform } from 'react-native';
import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
import { isTurboModuleEnabled, LogLevel } from './fullstoryInterface';
const FullStory = isTurboModuleEnabled ? require('./NativeFullStory').default : NativeModules.FullStory;
if (!FullStory) {
console.warn('FullStory: Native module not found. Falling back to stub implementations.');
}
const {
anonymize = () => null,
identify = () => null,
setUserVars = () => null,
onReady: nativeOnReady = () => Promise.resolve({
replayStartUrl: '',
replayNowUrl: '',
sessionId: ''
}),
getCurrentSession = () => Promise.resolve(''),
getCurrentSessionURL = () => Promise.resolve(''),
consent = () => null,
event = () => null,
shutdown = () => null,
restart = () => null,
log = () => null,
resetIdleTimer = () => null,
onSessionStarted = () => ({
remove: () => null
})
} = FullStory ?? {};
function onReady(listener) {
if (!listener) {
return nativeOnReady();
}
if (!isTurboModuleEnabled) {
console.warn('FullStory: onReady with a listener is only supported on the New Architecture.');
return {
remove: () => null
};
}
// Fire immediately if a session is already active
getCurrentSessionURL().then(url => {
if (url) {
getCurrentSession().then(sessionId => {
listener({
replayStartUrl: url,
replayNowUrl: url,
sessionId
});
});
}
});
return onSessionStarted(listener);
}
const FullStoryPrivate = isTurboModuleEnabled ? require('./NativeFullStoryPrivate').default : NativeModules.FullStoryPrivate;
const identifyWithProperties = (uid, userVars = {}) => identify(uid, userVars);
export { FSPage } from './FSPage';
/*
Batching all property commands into a single native call to reduce the window for race conditions
with React Native's rendering scheduler.
*/
const Commands = codegenNativeCommands({
supportedCommands: ['setBatchProperties']
});
/**
* Applies FullStory properties to an already-committed native instance by
* dispatching a single batched native command. Invoked by the FullStory babel
* plugin's Fabric commit-phase hook with the host component's public instance
* and its committed props. iOS New Architecture only; on the old architecture
* the regular view-manager prop pipeline applies these props instead.
*/
export function applyFSPropertiesToInstance(instance, props) {
if (!instance || !props) {
return;
}
if (!(isTurboModuleEnabled && Platform.OS === 'ios' && !Platform.isTV)) {
return;
}
const batchedProps = {};
const {
fsClass,
fsAttribute,
fsTagName,
dataElement,
dataComponent,
dataSourceFile
} = props;
if (fsClass && typeof fsClass === 'string') {
batchedProps.fsClass = fsClass;
}
if (fsAttribute && typeof fsAttribute === 'object') {
batchedProps.fsAttribute = fsAttribute;
}
if (fsTagName && typeof fsTagName === 'string') {
batchedProps.fsTagName = fsTagName;
}
if (dataElement && typeof dataElement === 'string') {
batchedProps.dataElement = dataElement;
}
if (dataComponent && typeof dataComponent === 'string') {
batchedProps.dataComponent = dataComponent;
}
if (dataSourceFile && typeof dataSourceFile === 'string') {
batchedProps.dataSourceFile = dataSourceFile;
}
// Send all properties as a single batched command.
if (Object.keys(batchedProps).length > 0) {
Commands.setBatchProperties(instance, batchedProps);
}
}
const FullstoryAPI = {
anonymize,
identify: identifyWithProperties,
setUserVars,
onReady,
getCurrentSession,
getCurrentSessionURL,
consent,
event,
shutdown,
restart,
log,
resetIdleTimer,
LogLevel
};
export const PrivateInterface = Platform.OS === 'android' ? {
onFSPressForward: FullStoryPrivate.onFSPressForward
} : {};
export default FullstoryAPI;
//# sourceMappingURL=index.js.map