voluptasmollitia
Version:
Monorepo for the Firebase JavaScript SDK
688 lines (654 loc) • 20.3 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable camelcase */
/**
* @license
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { _getProvider, FirebaseApp, getApp } from '@firebase/app-exp';
import {
Analytics,
AnalyticsCallOptions,
CustomParams,
EventNameString,
EventParams
} from './public-types';
import { Provider } from '@firebase/component';
import {
isIndexedDBAvailable,
validateIndexedDBOpenable,
areCookiesEnabled,
isBrowserExtension,
getModularInstance
} from '@firebase/util';
import { ANALYTICS_TYPE } from './constants';
import {
AnalyticsService,
initializationPromisesMap,
wrappedGtagFunction
} from './factory';
import { logger } from './logger';
import {
logEvent as internalLogEvent,
setCurrentScreen as internalSetCurrentScreen,
setUserId as internalSetUserId,
setUserProperties as internalSetUserProperties,
setAnalyticsCollectionEnabled as internalSetAnalyticsCollectionEnabled
} from './functions';
export { settings } from './factory';
declare module '@firebase/component' {
interface NameServiceMapping {
[ANALYTICS_TYPE]: AnalyticsService;
}
}
/**
* Returns a Firebase Analytics instance for the given app.
*
* @public
*
* @param app - The FirebaseApp to use.
*/
export function getAnalytics(app: FirebaseApp = getApp()): Analytics {
app = getModularInstance(app);
// Dependencies
const analyticsProvider: Provider<'analytics-exp'> = _getProvider(
app,
ANALYTICS_TYPE
);
const analyticsInstance = analyticsProvider.getImmediate();
return analyticsInstance;
}
/**
* This is a public static method provided to users that wraps four different checks:
*
* 1. Check if it's not a browser extension environment.
* 2. Check if cookies are enabled in current browser.
* 3. Check if IndexedDB is supported by the browser environment.
* 4. Check if the current browser context is valid for using IndexedDB.open().
*
* @public
*
*/
export async function isSupported(): Promise<boolean> {
if (isBrowserExtension()) {
return false;
}
if (!areCookiesEnabled()) {
return false;
}
if (!isIndexedDBAvailable()) {
return false;
}
try {
const isDBOpenable: boolean = await validateIndexedDBOpenable();
return isDBOpenable;
} catch (error) {
return false;
}
}
/**
* Use gtag 'config' command to set 'screen_name'.
*
* @public
*
* @param analyticsInstance - Firebase Analytics instance.
* @param screenName - Screen name to set.
*/
export function setCurrentScreen(
analyticsInstance: Analytics,
screenName: string,
options?: AnalyticsCallOptions
): void {
analyticsInstance = getModularInstance(analyticsInstance);
internalSetCurrentScreen(
wrappedGtagFunction,
initializationPromisesMap[analyticsInstance.app.options.appId!],
screenName,
options
).catch(e => logger.error(e));
}
/**
* Use gtag 'config' command to set 'user_id'.
*
* @public
*
* @param analyticsInstance - Firebase Analytics instance.
* @param id - User ID to set.
*/
export function setUserId(
analyticsInstance: Analytics,
id: string,
options?: AnalyticsCallOptions
): void {
analyticsInstance = getModularInstance(analyticsInstance);
internalSetUserId(
wrappedGtagFunction,
initializationPromisesMap[analyticsInstance.app.options.appId!],
id,
options
).catch(e => logger.error(e));
}
/**
* Use gtag 'config' command to set all params specified.
*
* @public
*/
export function setUserProperties(
analyticsInstance: Analytics,
properties: CustomParams,
options?: AnalyticsCallOptions
): void {
analyticsInstance = getModularInstance(analyticsInstance);
internalSetUserProperties(
wrappedGtagFunction,
initializationPromisesMap[analyticsInstance.app.options.appId!],
properties,
options
).catch(e => logger.error(e));
}
/**
* Sets whether analytics collection is enabled for this app on this device.
* window['ga-disable-analyticsId'] = true;
*
* @public
*
* @param analyticsInstance - Firebase Analytics instance.
* @param enabled - If true, enables collection, if false, disables it.
*/
export function setAnalyticsCollectionEnabled(
analyticsInstance: Analytics,
enabled: boolean
): void {
analyticsInstance = getModularInstance(analyticsInstance);
internalSetAnalyticsCollectionEnabled(
initializationPromisesMap[analyticsInstance.app.options.appId!],
enabled
).catch(e => logger.error(e));
}
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'add_payment_info',
eventParams?: {
coupon?: EventParams['coupon'];
currency?: EventParams['currency'];
items?: EventParams['items'];
payment_type?: EventParams['payment_type'];
value?: EventParams['value'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'add_shipping_info',
eventParams?: {
coupon?: EventParams['coupon'];
currency?: EventParams['currency'];
items?: EventParams['items'];
shipping_tier?: EventParams['shipping_tier'];
value?: EventParams['value'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'add_to_cart' | 'add_to_wishlist' | 'remove_from_cart',
eventParams?: {
currency?: EventParams['currency'];
value?: EventParams['value'];
items?: EventParams['items'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'begin_checkout',
eventParams?: {
currency?: EventParams['currency'];
coupon?: EventParams['coupon'];
value?: EventParams['value'];
items?: EventParams['items'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'checkout_progress',
eventParams?: {
currency?: EventParams['currency'];
coupon?: EventParams['coupon'];
value?: EventParams['value'];
items?: EventParams['items'];
checkout_step?: EventParams['checkout_step'];
checkout_option?: EventParams['checkout_option'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'exception',
eventParams?: {
description?: EventParams['description'];
fatal?: EventParams['fatal'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'generate_lead',
eventParams?: {
value?: EventParams['value'];
currency?: EventParams['currency'];
transaction_id?: EventParams['transaction_id'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'login',
eventParams?: {
method?: EventParams['method'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'page_view',
eventParams?: {
page_title?: string;
page_location?: string;
page_path?: string;
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'purchase' | 'refund',
eventParams?: {
value?: EventParams['value'];
currency?: EventParams['currency'];
transaction_id: EventParams['transaction_id'];
tax?: EventParams['tax'];
shipping?: EventParams['shipping'];
items?: EventParams['items'];
coupon?: EventParams['coupon'];
affiliation?: EventParams['affiliation'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'screen_view',
eventParams?: {
app_name: string;
screen_name: EventParams['screen_name'];
app_id?: string;
app_version?: string;
app_installer_id?: string;
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'search' | 'view_search_results',
eventParams?: {
search_term?: EventParams['search_term'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'select_content',
eventParams?: {
items?: EventParams['items'];
promotions?: EventParams['promotions'];
content_type?: EventParams['content_type'];
content_id?: EventParams['content_id'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'select_item',
eventParams?: {
items?: EventParams['items'];
item_list_name?: EventParams['item_list_name'];
item_list_id?: EventParams['item_list_id'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'select_promotion' | 'view_promotion',
eventParams?: {
items?: EventParams['items'];
promotion_id?: EventParams['promotion_id'];
promotion_name?: EventParams['promotion_name'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'set_checkout_option',
eventParams?: {
checkout_step?: EventParams['checkout_step'];
checkout_option?: EventParams['checkout_option'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'share',
eventParams?: {
method?: EventParams['method'];
content_type?: EventParams['content_type'];
content_id?: EventParams['content_id'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'sign_up',
eventParams?: {
method?: EventParams['method'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'timing_complete',
eventParams?: {
name: string;
value: number;
event_category?: string;
event_label?: string;
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'view_cart' | 'view_item',
eventParams?: {
currency?: EventParams['currency'];
items?: EventParams['items'];
value?: EventParams['value'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: 'view_item_list',
eventParams?: {
items?: EventParams['items'];
item_list_name?: EventParams['item_list_name'];
item_list_id?: EventParams['item_list_id'];
[key: string]: any;
},
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* @public
* List of recommended event parameters can be found in
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*/
export function logEvent<T extends string>(
analyticsInstance: Analytics,
eventName: CustomEventName<T>,
eventParams?: { [key: string]: any },
options?: AnalyticsCallOptions
): void;
/**
* Sends analytics event with given `eventParams`. This method
* automatically associates this logged event with this Firebase web
* app instance on this device.
* List of official event parameters can be found in the gtag.js
* reference documentation:
* {@link https://developers.google.com/gtagjs/reference/event
* | the gtag.js reference documentation}.
*
* @public
*/
export function logEvent(
analyticsInstance: Analytics,
eventName: string,
eventParams?: EventParams,
options?: AnalyticsCallOptions
): void {
analyticsInstance = getModularInstance(analyticsInstance);
internalLogEvent(
wrappedGtagFunction,
initializationPromisesMap[analyticsInstance.app.options.appId!],
eventName,
eventParams,
options
).catch(e => logger.error(e));
}
/**
* Any custom event name string not in the standard list of recommended
* event names.
* @public
*/
export type CustomEventName<T> = T extends EventNameString ? never : T;