diff --git a/lib/modules/analytics/index.js b/lib/modules/analytics/index.js new file mode 100644 index 00000000..f1870907 --- /dev/null +++ b/lib/modules/analytics/index.js @@ -0,0 +1,117 @@ +// @flow +import { NativeModules } from 'react-native'; +import { Base } from './../base'; + +const FirebaseAnalytics = NativeModules.FirebaseAnalytics; +const AlphaNumericUnderscore = /^[a-zA-Z0-9_]+$/; + +const ReservedEventNames = [ + 'app_clear_data', + 'app_uninstall', + 'app_update', + 'error', + 'first_open', + 'in_app_purchase', + 'notification_dismiss', + 'notification_foreground', + 'notification_open', + 'notification_receive', + 'os_update', + 'session_start', + 'user_engagement', +]; + +export default class Analytics extends Base { + /** + * Logs an app event. + * @param {string} name + * @param params + * @return {Promise} + */ + logEvent(name: string, params: Object): void { + // check name is not a reserved event name + if (ReservedEventNames.includes(name)) { + throw new Error(`event name '${name}' is a reserved event name and can not be used.`); + } + + // name format validation + if (!AlphaNumericUnderscore.test(name)) { + throw new Error(`Event name '${name}' is invalid. Names should contain 1 to 32 alphanumeric characters or underscores.`); + } + + // maximum number of allowed params check + if (params && Object.keys(params).length > 25) throw new Error('Maximum number of parameters exceeded (25).'); + + // TODO validate param names and values + // Parameter names can be up to 24 characters long and must start with an alphabetic character + // and contain only alphanumeric characters and underscores. Only String, long and double param + // types are supported. String parameter values can be up to 36 characters long. The "firebase_" + // prefix is reserved and should not be used for parameter names. + + return FirebaseAnalytics.logEvent(name, params); + } + + /** + * Sets whether analytics collection is enabled for this app on this device. + * @param enabled + */ + setAnalyticsCollectionEnabled(enabled: boolean): void { + return FirebaseAnalytics.setAnalyticsCollectionEnabled(enabled); + } + + /** + * Sets the current screen name, which specifies the current visual context in your app. + * @param screenName + * @param screenClassOverride + */ + setCurrentScreen(screenName: string, screenClassOverride: string): void { + return FirebaseAnalytics.setCurrentScreen(screenName, screenClassOverride); + } + + /** + * Sets the minimum engagement time required before starting a session. The default value is 10000 (10 seconds). + * @param milliseconds + */ + setMinimumSessionDuration(milliseconds: number = 10000): void { + return FirebaseAnalytics.setMinimumSessionDuration(milliseconds); + } + + /** + * Sets the duration of inactivity that terminates the current session. The default value is 1800000 (30 minutes). + * @param milliseconds + */ + setSessionTimeoutDuration(milliseconds: number = 1800000): void { + return FirebaseAnalytics.setSessionTimeoutDuration(milliseconds); + } + + /** + * Sets the user ID property. + * @param id + */ + setUserId(id: string): void { + return FirebaseAnalytics.setUserId(id); + } + + /** + * Sets a user property to a given value. + * @param name + * @param value + */ + setUserProperty(name: string, value: string): void { + return FirebaseAnalytics.setUserProperty(name, value); + } + + /** + * Sets a user property to a given value. + * @param object + */ + setUserProperties(object: Object): void { + for (const property of Object.keys(object)) { + FirebaseAnalytics.setUserProperty(property, object[property]); + } + } + + get namespace(): string { + return 'firebase:analytics'; + } +}