Skip to content

Commit 7ac4688

Browse files
feat(firebase): update Firebase Analytics integration (#1075)
Replace deprecated namespaced API (firebaseAnalytics().logEvent()) with the v22 modular API (getAnalytics/logEvent). The namespaced API is deprecated and breaks when strict mode is enabled. - Create shared firebaseAnalytics.ts module for centralized instance - Update track, screen, reset, and identify methods - Bump peer deps to @react-native-firebase/analytics >=22.2.0 - Update all test mocks for modular API imports BREAKING CHANGE: requires @react-native-firebase/analytics >=22.2.0 and @react-native-firebase/app >=22.2.0
1 parent 7a35888 commit 7ac4688

11 files changed

Lines changed: 858 additions & 53 deletions

File tree

packages/plugins/plugin-firebase/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@
4444
},
4545
"homepage": "https://github.com/segmentio/analytics-react-native/tree/master/packages/plugins/plugin-firebase#readme",
4646
"peerDependencies": {
47-
"@react-native-firebase/analytics": ">=18.4.0",
48-
"@react-native-firebase/app": ">=18.4.0",
47+
"@react-native-firebase/analytics": ">=22.2.0",
48+
"@react-native-firebase/app": ">=22.2.0",
4949
"@segment/analytics-react-native": "^2.18.0"
5050
},
5151
"devDependencies": {
52-
"@react-native-firebase/analytics": "^18.4.0",
53-
"@react-native-firebase/app": "^18.4.0",
52+
"@react-native-firebase/analytics": "^22.2.0",
53+
"@react-native-firebase/app": "^22.2.0",
5454
"@segment/analytics-react-native": "^2.18.0",
5555
"@segment/analytics-rn-shared": "workspace:^",
5656
"@segment/sovran-react-native": "^1.1.0",

packages/plugins/plugin-firebase/src/FirebasePlugin.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import {
1010
import screen from './methods/screen';
1111
import track from './methods/track';
1212
import reset from './methods/reset';
13-
import firebaseAnalytics from '@react-native-firebase/analytics';
13+
import { firebaseAnalytics } from './firebaseAnalytics';
1414
export class FirebasePlugin extends DestinationPlugin {
1515
type = PluginType.destination;
1616
key = 'Firebase';
1717

1818
async identify(event: IdentifyEventType) {
1919
if (event.userId !== undefined) {
20-
await firebaseAnalytics().setUserId(event.userId);
20+
await firebaseAnalytics.setUserId(event.userId);
2121
}
2222
if (event.traits) {
2323
const eventTraits = event.traits;
@@ -45,7 +45,7 @@ export class FirebasePlugin extends DestinationPlugin {
4545
{}
4646
);
4747

48-
await firebaseAnalytics().setUserProperties(safeTraits);
48+
await firebaseAnalytics.setUserProperties(safeTraits);
4949
}
5050
return event;
5151
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { getAnalytics } from '@react-native-firebase/analytics';
2+
import { getApp } from '@react-native-firebase/app';
3+
4+
export const firebaseAnalytics = getAnalytics(getApp());

packages/plugins/plugin-firebase/src/methods/___tests__/identify.test.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import type { IdentifyEventType } from '@segment/analytics-react-native';
2-
import { FirebasePlugin } from '../../FirebasePlugin';
3-
41
const mockSetUserId = jest.fn();
52
const mockSetUserProperties = jest.fn();
63

7-
jest.mock('@react-native-firebase/analytics', () => () => ({
8-
setUserId: mockSetUserId,
9-
setUserProperties: mockSetUserProperties,
4+
jest.mock('@react-native-firebase/analytics', () => ({
5+
getAnalytics: jest.fn().mockImplementation(() => ({
6+
setUserId: mockSetUserId,
7+
setUserProperties: mockSetUserProperties,
8+
})),
9+
isString: (a: unknown) => typeof a === 'string',
10+
}));
11+
jest.mock('@react-native-firebase/app', () => ({
12+
getApp: jest.fn(),
1013
}));
1114

15+
import type { IdentifyEventType } from '@segment/analytics-react-native';
16+
import { FirebasePlugin } from '../../FirebasePlugin';
17+
1218
describe('#identify', () => {
1319
beforeEach(() => {
1420
jest.clearAllMocks();

packages/plugins/plugin-firebase/src/methods/___tests__/reset.test.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
import reset from '../reset';
2-
31
const mockReset = jest.fn();
42

5-
jest.mock('@react-native-firebase/analytics', () => () => ({
6-
resetAnalyticsData: mockReset,
3+
jest.mock('@react-native-firebase/analytics', () => ({
4+
getAnalytics: jest.fn().mockImplementation(() => ({
5+
resetAnalyticsData: mockReset,
6+
})),
7+
}));
8+
9+
jest.mock('@react-native-firebase/app', () => ({
10+
getApp: jest.fn(),
711
}));
812

13+
import reset from '../reset';
14+
915
describe('#reset', () => {
1016
beforeEach(() => {
1117
jest.clearAllMocks();

packages/plugins/plugin-firebase/src/methods/___tests__/screen.test.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
import type { ScreenEventType } from '@segment/analytics-react-native';
2-
import screen from '../screen';
3-
41
const mockScreen = jest.fn();
52

6-
jest.mock('@react-native-firebase/analytics', () => () => ({
7-
logScreenView: mockScreen,
3+
jest.mock('@react-native-firebase/analytics', () => ({
4+
getAnalytics: jest.fn().mockImplementation(() => ({
5+
logScreenView: mockScreen,
6+
})),
7+
}));
8+
9+
jest.mock('@react-native-firebase/app', () => ({
10+
getApp: jest.fn(),
811
}));
912

13+
import type { ScreenEventType } from '@segment/analytics-react-native';
14+
import screen from '../screen';
15+
1016
describe('#screen', () => {
1117
beforeEach(() => {
1218
jest.clearAllMocks();

packages/plugins/plugin-firebase/src/methods/___tests__/track.test.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { EventType, TrackEventType } from '@segment/analytics-react-native';
2-
import track from '../track';
3-
4-
jest.mock('uuid');
5-
61
const mockLogEvent = jest.fn();
72

8-
jest.mock('@react-native-firebase/analytics', () => () => ({
9-
logEvent: mockLogEvent,
3+
jest.mock('@react-native-firebase/analytics', () => ({
4+
getAnalytics: jest.fn().mockImplementation(() => ({
5+
logEvent: mockLogEvent,
6+
})),
7+
isString: (a: unknown) => typeof a === 'string',
108
}));
9+
jest.mock('@react-native-firebase/app', () => ({
10+
getApp: jest.fn(),
11+
}));
12+
jest.mock('uuid');
13+
14+
import { EventType, TrackEventType } from '@segment/analytics-react-native';
15+
import track from '../track';
1116

1217
describe('#track', () => {
1318
beforeEach(() => {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import firebaseAnalytics from '@react-native-firebase/analytics';
1+
import { firebaseAnalytics } from '../firebaseAnalytics';
22

33
export default async () => {
4-
await firebaseAnalytics().resetAnalyticsData();
4+
await firebaseAnalytics.resetAnalyticsData();
55
};
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import firebaseAnalytics from '@react-native-firebase/analytics';
21
import type { ScreenEventType } from '@segment/analytics-react-native';
2+
import { firebaseAnalytics } from '../firebaseAnalytics';
33

44
export default async (event: ScreenEventType) => {
55
const screenProps = {
@@ -8,5 +8,5 @@ export default async (event: ScreenEventType) => {
88
...event.properties,
99
};
1010

11-
await firebaseAnalytics().logScreenView(screenProps);
11+
await firebaseAnalytics.logScreenView(screenProps);
1212
};

packages/plugins/plugin-firebase/src/methods/track.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import firebaseAnalytics from '@react-native-firebase/analytics';
21
import {
2+
type TrackEventType,
33
generateMapTransform,
4-
TrackEventType,
54
} from '@segment/analytics-react-native';
5+
import { firebaseAnalytics } from '../firebaseAnalytics';
66
import { mapEventProps, transformMap } from './parameterMapping';
77

88
const mappedPropNames = generateMapTransform(mapEventProps, transformMap);
@@ -22,5 +22,5 @@ export default async (event: TrackEventType) => {
2222
if (safeEventName.length > 40) {
2323
safeEventName = safeEventName.substring(0, 40);
2424
}
25-
await firebaseAnalytics().logEvent(safeEventName, safeProps);
25+
await firebaseAnalytics.logEvent(safeEventName, safeProps);
2626
};

0 commit comments

Comments
 (0)