Skip to content

Commit 7f10685

Browse files
russellwheatleymikehardy
authored andcommitted
chore(messaging): deprecation warnings for v8 API ahead of future major release
1 parent 497c6d1 commit 7f10685

4 files changed

Lines changed: 357 additions & 33 deletions

File tree

jest.setup.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ jest.doMock('react-native', () => {
3232
OS: 'android',
3333
select: () => {},
3434
},
35+
AppRegistry: {
36+
registerHeadlessTask: jest.fn(),
37+
},
3538
NativeModules: {
3639
...ReactNative.NativeModules,
3740
RNFBAnalyticsModule: {

packages/app/lib/common/index.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,47 @@ export function tryJSONStringify(data) {
107107
const NO_REPLACEMENT = true;
108108

109109
const mapOfDeprecationReplacements = {
110+
messaging: {
111+
default: {
112+
isAutoInitEnabled: 'isAutoInitEnabled()',
113+
isDeviceRegisteredForRemoteMessages: 'isDeviceRegisteredForRemoteMessages()',
114+
isNotificationDelegationEnabled: 'isNotificationDelegationEnabled()',
115+
isDeliveryMetricsExportToBigQueryEnabled: 'isDeliveryMetricsExportToBigQueryEnabled()',
116+
setAutoInitEnabled: 'setAutoInitEnabled()',
117+
getInitialNotification: 'getInitialNotification()',
118+
getDidOpenSettingsForNotification: 'getDidOpenSettingsForNotification()',
119+
getIsHeadless: 'getIsHeadless()',
120+
onNotificationOpenedApp: 'onNotificationOpenedApp()',
121+
onTokenRefresh: 'onTokenRefresh()',
122+
requestPermission: 'requestPermission()',
123+
registerDeviceForRemoteMessages: 'registerDeviceForRemoteMessages()',
124+
unregisterDeviceForRemoteMessages: 'unregisterDeviceForRemoteMessages()',
125+
getAPNSToken: 'getAPNSToken()',
126+
setAPNSToken: 'setAPNSToken()',
127+
hasPermission: 'hasPermission()',
128+
onDeletedMessages: 'onDeletedMessages()',
129+
onMessageSent: 'onMessageSent()',
130+
onSendError: 'onSendError()',
131+
setBackgroundMessageHandler: 'setBackgroundMessageHandler()',
132+
setOpenSettingsForNotificationsHandler: 'setOpenSettingsForNotificationsHandler()',
133+
sendMessage: 'sendMessage()',
134+
subscribeToTopic: 'subscribeToTopic()',
135+
unsubscribeFromTopic: 'unsubscribeFromTopic()',
136+
setNotificationDelegationEnabled: 'setNotificationDelegationEnabled()',
137+
// Actual firebase-js-sdk methods
138+
getToken: 'getToken()',
139+
deleteToken: 'deleteToken()',
140+
onMessage: 'onMessage()',
141+
isSupported: 'isSupported()',
142+
setDeliveryMetricsExportToBigQuery:
143+
'experimentalSetDeliveryMetricsExportedToBigQueryEnabled()',
144+
},
145+
statics: {
146+
AuthorizationStatus: 'AuthorizationStatus',
147+
NotificationAndroidPriority: 'NotificationAndroidPriority',
148+
NotificationAndroidVisibility: 'NotificationAndroidVisibility',
149+
},
150+
},
110151
appCheck: {
111152
default: {
112153
activate: 'initializeAppCheck()',
@@ -391,12 +432,44 @@ export function createDeprecationProxy(instance) {
391432
deprecationConsoleWarning('appCheck', prop, 'statics', false);
392433
}
393434

435+
if (
436+
prop === 'AuthorizationStatus' ||
437+
prop === 'NotificationAndroidPriority' ||
438+
prop === 'NotificationAndroidVisibility'
439+
) {
440+
deprecationConsoleWarning('messaging', prop, 'statics', false);
441+
}
442+
394443
if (prop !== 'setLogLevel') {
395444
// we want to capture setLogLevel function call which we do below
396445
return Reflect.get(target, prop, receiver);
397446
}
398447
}
399448

449+
// Check if it's a getter/setter first
450+
const descriptor =
451+
Object.getOwnPropertyDescriptor(target, prop) ||
452+
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), prop);
453+
454+
if (descriptor && (descriptor.get || descriptor.set)) {
455+
const instanceName = getInstanceName(target);
456+
const nameSpace = getNamespace(target);
457+
458+
if (descriptor.get) {
459+
// Handle getter - call it and show deprecation warning
460+
deprecationConsoleWarning(nameSpace, prop, instanceName, _isModularCall);
461+
return descriptor.get.call(target);
462+
}
463+
464+
if (descriptor.set) {
465+
// Handle setter - return a function that calls the setter with deprecation warning
466+
return function (value) {
467+
deprecationConsoleWarning(nameSpace, prop, instanceName, _isModularCall);
468+
descriptor.set.call(target, value);
469+
};
470+
}
471+
}
472+
400473
if (typeof originalMethod === 'function') {
401474
return function (...args) {
402475
const isModularMethod = args.includes(MODULAR_DEPRECATION_ARG);
@@ -415,6 +488,19 @@ export function createDeprecationProxy(instance) {
415488

416489
export const MODULAR_DEPRECATION_ARG = 'react-native-firebase-modular-method-call';
417490

491+
// Flag to track if we're currently in a modular call
492+
let _isModularCall = false;
493+
494+
export function withModularFlag(fn) {
495+
const previousFlag = _isModularCall;
496+
_isModularCall = true;
497+
try {
498+
return fn();
499+
} finally {
500+
_isModularCall = previousFlag;
501+
}
502+
}
503+
418504
export function filterModularArgument(list) {
419505
return list.filter(arg => arg !== MODULAR_DEPRECATION_ARG);
420506
}

packages/messaging/__tests__/messaging.test.ts

Lines changed: 224 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { describe, expect, it } from '@jest/globals';
1+
import { beforeEach, describe, expect, it, jest } from '@jest/globals';
22

3-
import {
3+
import messaging, {
44
getMessaging,
55
deleteToken,
66
getToken,
@@ -35,7 +35,15 @@ import {
3535
NotificationAndroidVisibility,
3636
} from '../lib';
3737

38-
describe('Firestore', function () {
38+
import {
39+
createCheckV9Deprecation,
40+
CheckV9DeprecationFunction,
41+
} from '../../app/lib/common/unitTestUtils';
42+
43+
// @ts-ignore test
44+
import FirebaseModule from '../../app/lib/internal/FirebaseModule';
45+
46+
describe('Messaging', function () {
3947
describe('modular', function () {
4048
it('`getMessaging` function is properly exposed to end user', function () {
4149
expect(getMessaging).toBeDefined();
@@ -175,4 +183,217 @@ describe('Firestore', function () {
175183
expect(NotificationAndroidVisibility.VISIBILITY_SECRET).toBeDefined();
176184
});
177185
});
186+
187+
describe('test `console.warn` is called for RNFB v8 API & not called for v9 API', function () {
188+
let messagingV9Deprecation: CheckV9DeprecationFunction;
189+
let staticsV9Deprecation: CheckV9DeprecationFunction;
190+
191+
beforeEach(function () {
192+
messagingV9Deprecation = createCheckV9Deprecation(['messaging']);
193+
staticsV9Deprecation = createCheckV9Deprecation(['messaging', 'statics']);
194+
195+
// @ts-ignore test
196+
jest.spyOn(FirebaseModule.prototype, 'native', 'get').mockImplementation(() => {
197+
return new Proxy(
198+
{},
199+
{
200+
get: () =>
201+
jest.fn().mockResolvedValue({
202+
result: true,
203+
} as never),
204+
},
205+
);
206+
});
207+
});
208+
209+
describe('Messaging', function () {
210+
it('isAutoInitEnabled', function () {
211+
const messaging = getMessaging();
212+
messagingV9Deprecation(
213+
() => isAutoInitEnabled(messaging),
214+
() => messaging.isAutoInitEnabled,
215+
'isAutoInitEnabled',
216+
);
217+
});
218+
219+
it('isDeviceRegisteredForRemoteMessages', function () {
220+
const messaging = getMessaging();
221+
messagingV9Deprecation(
222+
() => isDeviceRegisteredForRemoteMessages(messaging),
223+
() => messaging.isDeviceRegisteredForRemoteMessages,
224+
'isDeviceRegisteredForRemoteMessages',
225+
);
226+
});
227+
228+
it('setAutoInitEnabled', function () {
229+
const messaging = getMessaging();
230+
messagingV9Deprecation(
231+
() => setAutoInitEnabled(messaging, true),
232+
() => messaging.setAutoInitEnabled(true),
233+
'setAutoInitEnabled',
234+
);
235+
});
236+
237+
it('getInitialNotification', function () {
238+
const messaging = getMessaging();
239+
messagingV9Deprecation(
240+
() => getInitialNotification(messaging),
241+
() => messaging.getInitialNotification(),
242+
'getInitialNotification',
243+
);
244+
});
245+
246+
it('getDidOpenSettingsForNotification', function () {
247+
const messaging = getMessaging();
248+
messagingV9Deprecation(
249+
() => getDidOpenSettingsForNotification(messaging),
250+
() => messaging.getDidOpenSettingsForNotification(),
251+
'getDidOpenSettingsForNotification',
252+
);
253+
});
254+
255+
it('getIsHeadless', function () {
256+
const messaging = getMessaging();
257+
messagingV9Deprecation(
258+
() => getIsHeadless(messaging),
259+
() => messaging.getIsHeadless(),
260+
'getIsHeadless',
261+
);
262+
});
263+
264+
it('requestPermission', function () {
265+
const messaging = getMessaging();
266+
messagingV9Deprecation(
267+
() => requestPermission(messaging),
268+
() => messaging.requestPermission(),
269+
'requestPermission',
270+
);
271+
});
272+
273+
it('registerDeviceForRemoteMessages', function () {
274+
const messaging = getMessaging();
275+
messagingV9Deprecation(
276+
() => registerDeviceForRemoteMessages(messaging),
277+
() => messaging.registerDeviceForRemoteMessages(),
278+
'registerDeviceForRemoteMessages',
279+
);
280+
});
281+
282+
it('unregisterDeviceForRemoteMessages', function () {
283+
const messaging = getMessaging();
284+
messagingV9Deprecation(
285+
() => unregisterDeviceForRemoteMessages(messaging),
286+
() => messaging.unregisterDeviceForRemoteMessages(),
287+
'unregisterDeviceForRemoteMessages',
288+
);
289+
});
290+
291+
it('getAPNSToken', function () {
292+
const messaging = getMessaging();
293+
messagingV9Deprecation(
294+
() => getAPNSToken(messaging),
295+
() => messaging.getAPNSToken(),
296+
'getAPNSToken',
297+
);
298+
});
299+
300+
it('setAPNSToken', function () {
301+
const messaging = getMessaging();
302+
messagingV9Deprecation(
303+
() => setAPNSToken(messaging, 'token'),
304+
() => messaging.setAPNSToken('token'),
305+
'setAPNSToken',
306+
);
307+
});
308+
309+
it('hasPermission', function () {
310+
const messaging = getMessaging();
311+
messagingV9Deprecation(
312+
() => hasPermission(messaging),
313+
() => messaging.hasPermission(),
314+
'hasPermission',
315+
);
316+
});
317+
318+
it('subscribeToTopic', function () {
319+
const messaging = getMessaging();
320+
messagingV9Deprecation(
321+
() => subscribeToTopic(messaging, 'topic'),
322+
() => messaging.subscribeToTopic('topic'),
323+
'subscribeToTopic',
324+
);
325+
});
326+
327+
it('unsubscribeFromTopic', function () {
328+
const messaging = getMessaging();
329+
messagingV9Deprecation(
330+
() => unsubscribeFromTopic(messaging, 'topic'),
331+
() => messaging.unsubscribeFromTopic('topic'),
332+
'unsubscribeFromTopic',
333+
);
334+
});
335+
336+
it('getToken', function () {
337+
const messaging = getMessaging();
338+
messagingV9Deprecation(
339+
() => getToken(messaging),
340+
() => messaging.getToken(),
341+
'getToken',
342+
);
343+
});
344+
345+
it('deleteToken', function () {
346+
const messaging = getMessaging();
347+
messagingV9Deprecation(
348+
() => deleteToken(messaging),
349+
() => messaging.deleteToken(),
350+
'deleteToken',
351+
);
352+
});
353+
354+
it('isSupported', function () {
355+
const messaging = getMessaging();
356+
messagingV9Deprecation(
357+
() => isSupported(messaging),
358+
() => messaging.isSupported(),
359+
'isSupported',
360+
);
361+
});
362+
363+
it('experimentalSetDeliveryMetricsExportedToBigQueryEnabled', function () {
364+
const messaging = getMessaging();
365+
messagingV9Deprecation(
366+
() => experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, true),
367+
() => messaging.setDeliveryMetricsExportToBigQuery(true),
368+
'setDeliveryMetricsExportToBigQuery',
369+
);
370+
});
371+
372+
describe('statics', function () {
373+
it('AuthorizationStatus', function () {
374+
staticsV9Deprecation(
375+
() => AuthorizationStatus,
376+
() => messaging.AuthorizationStatus,
377+
'AuthorizationStatus',
378+
);
379+
});
380+
381+
it('NotificationAndroidPriority', function () {
382+
staticsV9Deprecation(
383+
() => NotificationAndroidPriority,
384+
() => messaging.NotificationAndroidPriority,
385+
'NotificationAndroidPriority',
386+
);
387+
});
388+
389+
it('NotificationAndroidVisibility', function () {
390+
staticsV9Deprecation(
391+
() => NotificationAndroidVisibility,
392+
() => messaging.NotificationAndroidVisibility,
393+
'NotificationAndroidVisibility',
394+
);
395+
});
396+
});
397+
});
398+
});
178399
});

0 commit comments

Comments
 (0)