Skip to content

Commit

Permalink
feat(in-app-messaging): Firebase V9 modular APIs (#7306)
Browse files Browse the repository at this point in the history

---------

Co-authored-by: Mike Hardy <github@mikehardy.net>
  • Loading branch information
exaby73 and mikehardy committed Sep 5, 2023
1 parent 57f7327 commit 0149480
Show file tree
Hide file tree
Showing 6 changed files with 314 additions and 55 deletions.
213 changes: 158 additions & 55 deletions packages/in-app-messaging/e2e/fiam.e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,76 +16,179 @@
*/

describe('inAppMessaging()', function () {
describe('namespace', function () {
it('accessible from firebase.app()', function () {
const app = firebase.app();
should.exist(app.inAppMessaging);
app.inAppMessaging().app.should.equal(app);
describe('v8 compatibility', function () {
describe('namespace', function () {
it('accessible from firebase.app()', function () {
const app = firebase.app();
should.exist(app.inAppMessaging);
app.inAppMessaging().app.should.equal(app);
});
});
});

describe('setAutomaticDataCollectionEnabled()', function () {
// These depend on `tests/firebase.json` having `in_app_messaging_auto_collection_enabled` set to false the first time
// The setting is persisted across restarts, reset to false after for local runs where prefs are sticky
afterEach(async function () {
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(false);
});
describe('setAutomaticDataCollectionEnabled()', function () {
// These depend on `tests/firebase.json` having `in_app_messaging_auto_collection_enabled` set to false the first time
// The setting is persisted across restarts, reset to false after for local runs where prefs are sticky
afterEach(async function () {
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(false);
});

it('true', async function () {
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, false);
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(true);
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, true);
});

it('true', async function () {
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, false);
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(true);
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, true);
it('false', async function () {
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(false);
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, false);
});

it('errors if not boolean', async function () {
try {
firebase.inAppMessaging().setAutomaticDataCollectionEnabled();
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
});
});

it('false', async function () {
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(false);
should.equal(firebase.inAppMessaging().isAutomaticDataCollectionEnabled, false);
xdescribe('setMessagesDisplaySuppressed()', function () {
it('false', async function () {
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await firebase.inAppMessaging().setMessagesDisplaySuppressed(false);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await Utils.sleep(2000);
});

it('true', async function () {
await device.launchApp();
await firebase.inAppMessaging().setMessagesDisplaySuppressed(true);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, true);
await Utils.sleep(1500);
await firebase.inAppMessaging().setMessagesDisplaySuppressed(false);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await Utils.sleep(1500);
});

it('errors if not boolean', async function () {
try {
firebase.inAppMessaging().setMessagesDisplaySuppressed();
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
});
});

it('errors if not boolean', async function () {
try {
firebase.inAppMessaging().setAutomaticDataCollectionEnabled();
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
xdescribe('triggerEvent()', function () {
it('no exceptions thrown', async function () {
await device.launchApp();
await firebase.inAppMessaging().triggerEvent('eventName');
});
});
});

xdescribe('setMessagesDisplaySuppressed()', function () {
it('false', async function () {
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await firebase.inAppMessaging().setMessagesDisplaySuppressed(false);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await Utils.sleep(2000);
});
describe('modular', function () {
describe('setAutomaticDataCollectionEnabled()', function () {
// These depend on `tests/firebase.json` having `in_app_messaging_auto_collection_enabled` set to false the first time
// The setting is persisted across restarts, reset to false after for local runs where prefs are sticky
afterEach(async function () {
await firebase.inAppMessaging().setAutomaticDataCollectionEnabled(false);
});
// afterEach(async function () {
// const { getInAppMessaging, setAutomaticDataCollectionEnabled } = inAppMessagingModular;
// const inAppMessaging = getInAppMessaging();
// await setAutomaticDataCollectionEnabled(inAppMessaging, false);
// });

it('true', async function () {
const {
getInAppMessaging,
setAutomaticDataCollectionEnabled,
isAutomaticDataCollectionEnabled,
} = inAppMessagingModular;
const inAppMessaging = getInAppMessaging();

should.equal(isAutomaticDataCollectionEnabled(inAppMessaging), false);
await setAutomaticDataCollectionEnabled(inAppMessaging, true);
should.equal(isAutomaticDataCollectionEnabled(inAppMessaging), true);
});

it('false', async function () {
const {
getInAppMessaging,
setAutomaticDataCollectionEnabled,
isAutomaticDataCollectionEnabled,
} = inAppMessagingModular;
const inAppMessaging = getInAppMessaging();

it('true', async function () {
await device.launchApp();
await firebase.inAppMessaging().setMessagesDisplaySuppressed(true);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, true);
await Utils.sleep(1500);
await firebase.inAppMessaging().setMessagesDisplaySuppressed(false);
should.equal(firebase.inAppMessaging().isMessagesDisplaySuppressed, false);
await Utils.sleep(1500);
await setAutomaticDataCollectionEnabled(inAppMessaging, false);
should.equal(isAutomaticDataCollectionEnabled(inAppMessaging), false);
});

it('errors if not boolean', async function () {
const { getInAppMessaging, setAutomaticDataCollectionEnabled } = inAppMessagingModular;

try {
await setAutomaticDataCollectionEnabled(getInAppMessaging());
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
});
});

it('errors if not boolean', async function () {
try {
firebase.inAppMessaging().setMessagesDisplaySuppressed();
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
xdescribe('setMessagesDisplaySuppressed()', function () {
it('false', async function () {
const { getInAppMessaging, setMessagesDisplaySuppressed, isMessagesDisplaySuppressed } =
inAppMessagingModular;
const inAppMessaging = getInAppMessaging();

should.equal(isMessagesDisplaySuppressed(inAppMessaging), false);
await setMessagesDisplaySuppressed(inAppMessaging, false);
should.equal(isMessagesDisplaySuppressed(inAppMessaging), false);
await Utils.sleep(2000);
});

it('true', async function () {
const { getInAppMessaging, setMessagesDisplaySuppressed, isMessagesDisplaySuppressed } =
inAppMessagingModular;
const inAppMessaging = getInAppMessaging();

await device.launchApp();
await setMessagesDisplaySuppressed(inAppMessaging, true);
should.equal(isMessagesDisplaySuppressed(inAppMessaging), true);
await Utils.sleep(1500);
await setMessagesDisplaySuppressed(inAppMessaging, false);
should.equal(isMessagesDisplaySuppressed(inAppMessaging), false);
await Utils.sleep(1500);
});

it('errors if not boolean', async function () {
const { setMessagesDisplaySuppressed } = inAppMessagingModular;

try {
setMessagesDisplaySuppressed();
return Promise.reject(new Error('Did not throw'));
} catch (e) {
e.message.should.containEql('must be a boolean');
return Promise.resolve();
}
});
});
});

xdescribe('triggerEvent()', function () {
it('no exceptions thrown', async function () {
await device.launchApp();
await firebase.inAppMessaging().triggerEvent('eventName');
xdescribe('triggerEvent()', function () {
it('no exceptions thrown', async function () {
const { getInAppMessaging, triggerEvent } = inAppMessagingModular;
const inAppMessaging = getInAppMessaging();

await device.launchApp();
await triggerEvent(inAppMessaging, 'eventName');
});
});
});
});
2 changes: 2 additions & 0 deletions packages/in-app-messaging/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ class FirebaseFiamModule extends FirebaseModule {
}
}

export * from './modular';

// import { SDK_VERSION } from '@react-native-firebase/in-app-messaging';
export const SDK_VERSION = version;

Expand Down
89 changes: 89 additions & 0 deletions packages/in-app-messaging/lib/modular/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { FirebaseInAppMessagingTypes } from '..';

type FirebaseInAppMessaging = FirebaseInAppMessagingTypes.Module;

export declare function getInAppMessaging(): FirebaseInAppMessaging;

/**
* Determines whether messages are suppressed or not.
*
* #### Example
*
* ```js
* const inAppMessaging = getInAppMessaging();
* const isSuppressed = isMessagesDisplaySuppressed(inAppMessaging);
* ```
*/
export declare function isMessagesDisplaySuppressed(
inAppMessaging: FirebaseInAppMessaging,
): boolean;

/**
* Enable or disable suppression of Firebase In App Messaging messages.
*
* When enabled, no in app messages will be rendered until either you disable suppression, or the app restarts.
* This state is not persisted between app restarts.
*
* #### Example
*
* ```js
* // Suppress messages
* const inAppMessaging = getInAppMessaging();
* await setMessagesDisplaySuppressed(inAppMessaging, true);
* ```
*/
export declare function setMessagesDisplaySuppressed(
inAppMessaging: FirebaseInAppMessaging,
enabled: boolean,
): Promise<null>;

/**
* Determines whether automatic data collection is enabled or not.
*
* #### Example
*
* ```js
* const inAppMessaging = getInAppMessaging();
* const isDataCollectionEnabled = isAutomaticDataCollectionEnabled(inAppMessaging);
* ```
*/
export declare function isAutomaticDataCollectionEnabled(
inAppMessaging: FirebaseInAppMessaging,
): boolean;

/**
* Enable or disable automatic data collection for Firebase In-App Messaging.
*
* When enabled, generates a registration token on app startup if there is no valid one and generates a new token
* when it is deleted (which prevents `deleteInstanceId()` from stopping the periodic sending of data).
*
* This setting is persisted across app restarts and overrides the setting specified in your manifest/plist file.
*
* #### Example
*
* ```js
* // Disable data collection
* const inAppMessaging = getInAppMessaging();
* setAutomaticDataCollectionEnabled(inAppMessaging, false);
* ```
*/
export declare function setAutomaticDataCollectionEnabled(
inAppMessaging: FirebaseInAppMessaging,
enabled: boolean,
): Promise<null>;

/**
* Trigger in-app messages programmatically
*
* #### Example
*
* ```js
* // Suppress messages
* const inAppMessaging = getInAppMessaging();
* await triggerEvent(inAppMessaging, "exampleTrigger");
* ```
*/
export declare function triggerEvent(
inAppMessaging: FirebaseInAppMessaging,
eventId: string,
): Promise<null>;
57 changes: 57 additions & 0 deletions packages/in-app-messaging/lib/modular/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { firebase } from '..';

/**
* @typedef {import("..").FirebaseApp} FirebaseApp
* @typedef {import("..").FirebaseInAppMessagingTypes.Module} FirebaseInAppMessaging
*/

/**
* @returns {FirebaseInAppMessaging}
*/
export function getInAppMessaging() {
return firebase.inAppMessaging();
}

/**
* @param {FirebaseInAppMessaging} inAppMessaging
* @returns {boolean}
*/
export function isMessagesDisplaySuppressed(inAppMessaging) {
return inAppMessaging.isMessagesDisplaySuppressed;
}

/**
*
* @param {FirebaseInAppMessaging} inAppMessaging
* @param {boolean} enabled
* @returns {Promise<null>}
*/
export function setMessagesDisplaySuppressed(inAppMessaging, enabled) {
return inAppMessaging.setMessagesDisplaySuppressed(enabled);
}

/**
* @param {FirebaseInAppMessaging} inAppMessaging
* @returns {boolean}
*/
export function isAutomaticDataCollectionEnabled(inAppMessaging) {
return inAppMessaging.isAutomaticDataCollectionEnabled;
}

/**
* @param {FirebaseInAppMessaging} inAppMessaging
* @param {boolean} enabled
* @returns {Promise<null>}
*/
export function setAutomaticDataCollectionEnabled(inAppMessaging, enabled) {
return inAppMessaging.setAutomaticDataCollectionEnabled(enabled);
}

/**
* @param {FirebaseInAppMessaging} inAppMessaging
* @param {string} eventId
* @returns {Promise<null>}
*/
export function triggerEvent(inAppMessaging, eventId) {
return inAppMessaging.triggerEvent(eventId);
}
Loading

1 comment on commit 0149480

@vercel
Copy link

@vercel vercel bot commented on 0149480 Sep 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.