Skip to content

Commit f739059

Browse files
russellwheatleymikehardy
authored andcommitted
chore(messaging): deprecation warnings for v8 API ahead of future major release
1 parent 65f18fb commit f739059

File tree

4 files changed

+357
-33
lines changed

4 files changed

+357
-33
lines changed

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
@@ -337,6 +337,47 @@ const mapOfDeprecationReplacements = {
337337
nanoseconds: NO_REPLACEMENT,
338338
},
339339
},
340+
messaging: {
341+
default: {
342+
isAutoInitEnabled: 'isAutoInitEnabled()',
343+
isDeviceRegisteredForRemoteMessages: 'isDeviceRegisteredForRemoteMessages()',
344+
isNotificationDelegationEnabled: 'isNotificationDelegationEnabled()',
345+
isDeliveryMetricsExportToBigQueryEnabled: 'isDeliveryMetricsExportToBigQueryEnabled()',
346+
setAutoInitEnabled: 'setAutoInitEnabled()',
347+
getInitialNotification: 'getInitialNotification()',
348+
getDidOpenSettingsForNotification: 'getDidOpenSettingsForNotification()',
349+
getIsHeadless: 'getIsHeadless()',
350+
onNotificationOpenedApp: 'onNotificationOpenedApp()',
351+
onTokenRefresh: 'onTokenRefresh()',
352+
requestPermission: 'requestPermission()',
353+
registerDeviceForRemoteMessages: 'registerDeviceForRemoteMessages()',
354+
unregisterDeviceForRemoteMessages: 'unregisterDeviceForRemoteMessages()',
355+
getAPNSToken: 'getAPNSToken()',
356+
setAPNSToken: 'setAPNSToken()',
357+
hasPermission: 'hasPermission()',
358+
onDeletedMessages: 'onDeletedMessages()',
359+
onMessageSent: 'onMessageSent()',
360+
onSendError: 'onSendError()',
361+
setBackgroundMessageHandler: 'setBackgroundMessageHandler()',
362+
setOpenSettingsForNotificationsHandler: 'setOpenSettingsForNotificationsHandler()',
363+
sendMessage: 'sendMessage()',
364+
subscribeToTopic: 'subscribeToTopic()',
365+
unsubscribeFromTopic: 'unsubscribeFromTopic()',
366+
setNotificationDelegationEnabled: 'setNotificationDelegationEnabled()',
367+
// Actual firebase-js-sdk methods
368+
getToken: 'getToken()',
369+
deleteToken: 'deleteToken()',
370+
onMessage: 'onMessage()',
371+
isSupported: 'isSupported()',
372+
setDeliveryMetricsExportToBigQuery:
373+
'experimentalSetDeliveryMetricsExportedToBigQueryEnabled()',
374+
},
375+
statics: {
376+
AuthorizationStatus: 'AuthorizationStatus',
377+
NotificationAndroidPriority: 'NotificationAndroidPriority',
378+
NotificationAndroidVisibility: 'NotificationAndroidVisibility',
379+
},
380+
},
340381
remoteConfig: {
341382
default: {
342383
activate: 'activate()',
@@ -553,12 +594,44 @@ export function createDeprecationProxy(instance) {
553594
deprecationConsoleWarning('auth', prop, 'statics', false);
554595
}
555596

597+
if (
598+
prop === 'AuthorizationStatus' ||
599+
prop === 'NotificationAndroidPriority' ||
600+
prop === 'NotificationAndroidVisibility'
601+
) {
602+
deprecationConsoleWarning('messaging', prop, 'statics', false);
603+
}
604+
556605
if (prop !== 'setLogLevel') {
557606
// we want to capture setLogLevel function call which we do below
558607
return Reflect.get(target, prop, receiver);
559608
}
560609
}
561610

611+
// Check if it's a getter/setter first
612+
const descriptor =
613+
Object.getOwnPropertyDescriptor(target, prop) ||
614+
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), prop);
615+
616+
if (descriptor && (descriptor.get || descriptor.set)) {
617+
const instanceName = getInstanceName(target);
618+
const nameSpace = getNamespace(target);
619+
620+
if (descriptor.get) {
621+
// Handle getter - call it and show deprecation warning
622+
deprecationConsoleWarning(nameSpace, prop, instanceName, _isModularCall);
623+
return descriptor.get.call(target);
624+
}
625+
626+
if (descriptor.set) {
627+
// Handle setter - return a function that calls the setter with deprecation warning
628+
return function (value) {
629+
deprecationConsoleWarning(nameSpace, prop, instanceName, _isModularCall);
630+
descriptor.set.call(target, value);
631+
};
632+
}
633+
}
634+
562635
if (typeof originalMethod === 'function') {
563636
return function (...args) {
564637
const isModularMethod = args.includes(MODULAR_DEPRECATION_ARG);
@@ -577,6 +650,19 @@ export function createDeprecationProxy(instance) {
577650

578651
export const MODULAR_DEPRECATION_ARG = 'react-native-firebase-modular-method-call';
579652

653+
// Flag to track if we're currently in a modular call
654+
let _isModularCall = false;
655+
656+
export function withModularFlag(fn) {
657+
const previousFlag = _isModularCall;
658+
_isModularCall = true;
659+
try {
660+
return fn();
661+
} finally {
662+
_isModularCall = previousFlag;
663+
}
664+
}
665+
580666
export function filterModularArgument(list) {
581667
return list.filter(arg => arg !== MODULAR_DEPRECATION_ARG);
582668
}

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)