Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 13aa652

Browse files
Merge pull request #989 from pboulch/master
Log complex event Analytics
2 parents 0369ec8 + 883846c commit 13aa652

File tree

7 files changed

+285
-5
lines changed

7 files changed

+285
-5
lines changed

demo/app/main-view-model.ts

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
crashlytics as firebaseCrashlytics,
99
performance as firebasePerformance,
1010
storage as firebaseStorage,
11-
User
11+
User,
12+
LogComplexEventTypeParameter
1213
} from "nativescript-plugin-firebase";
1314
import * as fs from "tns-core-modules/file-system";
1415
import { MessagingViewModel } from './messaging-view-model';
@@ -503,6 +504,47 @@ export class HelloWorldModel extends Observable {
503504
});
504505
}
505506
);
507+
508+
/**
509+
* Same thing as logEvent but can add an array or specific types not just string (LogComplexEventTypeParameter.BOOLEAN, LogComplexEventTypeParameter.STRING,
510+
* LogComplexEventTypeParameter.DOUBLE, LogComplexEventTypeParameter.FLOAT, LogComplexEventTypeParameter.INT, LogComplexEventTypeParameter.ARRAY)
511+
*/
512+
firebase.analytics.logComplexEvent({
513+
key: "view_item_list",
514+
parameters: [{
515+
key: "item1",
516+
type: "array",
517+
value: [
518+
{
519+
parameters: [
520+
{ key: "item_id", value: "id of item", type: LogComplexEventTypeParameter.STRING},
521+
{key: "item_name", value: "name of item", type: LogComplexEventTypeParameter.STRING},
522+
{key: "item_category", value: "category", type: LogComplexEventTypeParameter.STRING},
523+
{key: "item_variant", value: "variant", type: LogComplexEventTypeParameter.STRING},
524+
{key: "item_brand", value: "name of item brand", type: LogComplexEventTypeParameter.STRING},
525+
{key: "price", value: 1 , type: LogComplexEventTypeParameter.DOUBLE},
526+
{key: "item_list", value: "name of list" , type: LogComplexEventTypeParameter.STRING },
527+
{key: "index", value: 1 , type: LogComplexEventTypeParameter.INT}
528+
529+
]
530+
},
531+
{
532+
parameters: [
533+
{ key: "item_id", value: "id of item", type: LogComplexEventTypeParameter.STRING},
534+
{key: "item_name", value: "name of item", type: LogComplexEventTypeParameter.STRING},
535+
{key: "item_category", value: "category", type: LogComplexEventTypeParameter.STRING},
536+
{key: "item_variant", value: "variant", type: LogComplexEventTypeParameter.STRING},
537+
{key: "item_brand", value: "name of item brand", type: LogComplexEventTypeParameter.STRING},
538+
{key: "price", value: 1 , type: LogComplexEventTypeParameter.DOUBLE},
539+
{key: "item_list", value: "name of list" , type: LogComplexEventTypeParameter.STRING },
540+
{key: "index", value: 2 , type: LogComplexEventTypeParameter.INT}
541+
542+
]
543+
}
544+
]
545+
}]
546+
});
547+
506548
}
507549

508550
public doSetAnalyticsUserProperty(): void {
@@ -1763,4 +1805,4 @@ export class HelloWorldModel extends Observable {
17631805
okButtonText: "Okay"
17641806
});
17651807
}
1766-
}
1808+
}

demo/app_resources/iOS/GoogleService-Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@
3737
<key>DATABASE_URL</key>
3838
<string>https://n-plugin-test.firebaseio.com</string>
3939
</dict>
40-
</plist>
40+
</plist>

src/analytics/analytics.android.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as appModule from "tns-core-modules/application";
2-
import { LogEventOptions, SetScreenNameOptions, SetUserPropertyOptions } from "./analytics";
2+
import { LogEventOptions, SetScreenNameOptions, SetUserPropertyOptions, LogComplexEventOptions, LogComplexEventParameter } from "./analytics";
3+
import { LogComplexEventTypeParameter } from "../firebase";
34

45
declare const com: any;
56

@@ -33,6 +34,76 @@ export function logEvent(options: LogEventOptions): Promise<void> {
3334
});
3435
}
3536

37+
function getArrayList(array: Array<LogComplexEventOptions>): java.util.ArrayList<android.os.Bundle> {
38+
let returnArray = new java.util.ArrayList<android.os.Bundle>();
39+
for (const p in array) {
40+
const param = array[p];
41+
if (param.parameters !== undefined) {
42+
let bundle: android.os.Bundle = buildBundle(param.parameters);
43+
returnArray.add(bundle);
44+
} else {
45+
console.log("BE CARREFUL, no parameters into your complex event");
46+
}
47+
}
48+
return returnArray;
49+
}
50+
51+
function buildBundle(params: Array<LogComplexEventParameter>): android.os.Bundle {
52+
const bundle = new android.os.Bundle();
53+
for (const p in params) {
54+
const param = params[p];
55+
if (param.value !== undefined) {
56+
if (param.type === "string") {
57+
bundle.putString(param.key, param.value);
58+
} else if (param.type === "double") {
59+
bundle.putDouble(param.key, param.value);
60+
}
61+
else if (param.type === "float") {
62+
bundle.putFloat(param.key, param.value);
63+
}
64+
else if (param.type === "int") {
65+
bundle.putInt(param.key, param.value);
66+
}
67+
else if (param.type === "long") {
68+
bundle.putLong(param.key, param.value);
69+
}
70+
else if (param.type === "boolean") {
71+
bundle.putBoolean(param.key, param.value);
72+
}
73+
else if (param.type === "array") {
74+
bundle.putParcelableArrayList(param.key, getArrayList(param.value));
75+
}
76+
// bundle.putString(param.key, param.value);
77+
}
78+
}
79+
return bundle;
80+
}
81+
82+
export function logComplexEvent(options: LogComplexEventOptions): Promise<void> {
83+
return new Promise<void>((resolve, reject) => {
84+
try {
85+
if (options.key === undefined) {
86+
reject("Argument 'key' is missing");
87+
return;
88+
}
89+
90+
let bundle = new android.os.Bundle();
91+
if (options.parameters !== undefined) {
92+
bundle = buildBundle(options.parameters);
93+
}
94+
95+
com.google.firebase.analytics.FirebaseAnalytics.getInstance(
96+
appModule.android.currentContext || com.tns.NativeScriptApplication.getInstance()
97+
).logEvent(options.key, bundle);
98+
99+
resolve();
100+
} catch (ex) {
101+
console.log("Error in firebase.analytics.logEvent: " + ex);
102+
reject(ex);
103+
}
104+
});
105+
}
106+
36107
export function setUserId(arg): Promise<void> {
37108
return new Promise<void>((resolve, reject) => {
38109
try {

src/analytics/analytics.d.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
export interface LogComplexEventParameter {
2+
key: string;
3+
value: any;
4+
type: string;
5+
}
6+
17
export interface LogEventParameter {
28
key: string;
39
value: string;
@@ -23,6 +29,26 @@ export interface LogEventOptions {
2329
parameters?: Array<LogEventParameter>;
2430
}
2531

32+
export interface LogComplexEventOptions {
33+
/**
34+
* The name of the event. You can use any name, but it's recommended to use one of
35+
* the predefined constants. These values are the same for both iOS and Android, so
36+
* for the complete list see https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html
37+
*/
38+
key: string;
39+
/**
40+
* Each (predefined) event has its own set of optional parameters, see
41+
* https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Param
42+
* Example:
43+
*
44+
* parameters: [{
45+
* key: "item_name",
46+
* value: "abc"
47+
* }, ..]
48+
*/
49+
parameters?: Array<LogComplexEventParameter>;
50+
}
51+
2652
export interface SetUserIdOptions {
2753
userId: string;
2854
}
@@ -38,6 +64,8 @@ export interface SetScreenNameOptions {
3864

3965
export declare function logEvent(options: LogEventOptions): Promise<void>;
4066

67+
export declare function logComplexEvent(options: LogComplexEventOptions): Promise<void>;
68+
4169
export declare function setUserId(options: SetUserIdOptions): Promise<void>;
4270

4371
export declare function setUserProperty(options: SetUserPropertyOptions): Promise<void>;

src/analytics/analytics.ios.ts

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { LogEventOptions, SetScreenNameOptions, SetUserPropertyOptions } from "./analytics";
1+
import { LogEventOptions, SetScreenNameOptions, SetUserPropertyOptions, LogComplexEventOptions, LogComplexEventParameter } from "./analytics";
22

33
export function logEvent(options: LogEventOptions): Promise<void> {
44
return new Promise<void>((resolve, reject) => {
@@ -27,6 +27,127 @@ export function logEvent(options: LogEventOptions): Promise<void> {
2727
}
2828
});
2929
}
30+
/*
31+
function getArrayList(array: Array<LogComplexEventOptions>): Array<NSMutableDictionary<string, any>> {
32+
let returnArray: Array<NSMutableDictionary<string, any>> = new Array();
33+
for (const p in array) {
34+
const param = array[p];
35+
if (param.parameters !== undefined) {
36+
let bundle: NSMutableDictionary<string, any> = buildBundle(param.parameters);
37+
returnArray.push(bundle);
38+
} else {
39+
console.log("BE CARREFUL, no parameters into your complex event");
40+
}
41+
}
42+
return returnArray;
43+
}
44+
45+
function buildBundle(params: Array<LogComplexEventParameter>): NSMutableDictionary<string, any> {
46+
const bundle: NSMutableDictionary<string, any> = NSMutableDictionary.new();
47+
for (const p in params) {
48+
const param = params[p];
49+
if (param.value !== undefined) {
50+
let nsString = NSMutableString.new();
51+
nsString.setString(param.key);
52+
if (param.type === "string" || param.type === "double" || param.type === "float" || param.type === "int" || param.type === "long" || param.type === "boolean") {
53+
bundle.setObjectForKey(param.value, param.key);
54+
}
55+
else if (param.type === "array") {
56+
let arrayList = getArrayList(param.value);
57+
bundle.setObjectForKey(arrayList, param.key);
58+
}
59+
// bundle.putString(param.key, param.value);
60+
}
61+
}
62+
return bundle;
63+
}*/
64+
65+
/*export function logComplexEvent(options: LogComplexEventOptions): Promise<void> {
66+
return new Promise<void>((resolve, reject) => {
67+
try {
68+
const dic: any = NSMutableDictionary.new();
69+
if (options.parameters !== undefined) {
70+
for (let p in options.parameters) {
71+
const param = options.parameters[p];
72+
if (param.value !== undefined) {
73+
let dic1: NSMutableDictionary<string, any> = buildBundle(options.parameters);
74+
dic.setObjectForKey(dic1, param.key);
75+
}
76+
}
77+
}
78+
FIRAnalytics.logEventWithNameParameters(options.key, dic);
79+
resolve();
80+
}
81+
catch (ex) {
82+
console.log("Error in firebase.analytics.logEvent: " + ex);
83+
reject(ex);
84+
}
85+
});
86+
}*/
87+
88+
/*
89+
export function logComplexEvent(options: LogComplexEventOptions): Promise<void> {
90+
return new Promise<void>((resolve, reject) => {
91+
try {
92+
const dic: any = NSMutableDictionary.new();
93+
if (options.parameters !== undefined) {
94+
for (let p in options.parameters) {
95+
const param = options.parameters[p];
96+
if (param.value !== undefined) {
97+
const dic1: any = NSMutableDictionary.new();
98+
dic1.setObjectForKey("value56", "testval");
99+
dic.setObjectForKey(new Array(dic1), param.key);
100+
}
101+
}
102+
}
103+
FIRAnalytics.logEventWithNameParameters(options.key, dic);
104+
resolve();
105+
}
106+
catch (ex) {
107+
console.log("Error in firebase.analytics.logEvent: " + ex);
108+
reject(ex);
109+
}
110+
});
111+
}*/
112+
113+
114+
export function logComplexEvent(options: LogComplexEventOptions): Promise<void> {
115+
return new Promise<void>((resolve, reject) => {
116+
try {
117+
const dic: any = NSMutableDictionary.new();
118+
if (options.parameters !== undefined) {
119+
for (let p in options.parameters) {
120+
const param = options.parameters[p];
121+
if (param.type === "array" && param.value !== undefined ) {
122+
const listArray = new Array();
123+
for (let val in param.value) {
124+
const value = param.value[val];
125+
if (value.parameters !== undefined) {
126+
const dicTemp: any = NSMutableDictionary.new();
127+
for (let i in value.parameters) {
128+
const item = value.parameters[i];
129+
if (item.type !== "array" && item.value !== undefined && item.key !== undefined ) {
130+
dicTemp.setObjectForKey(item.value, item.key);
131+
}
132+
}
133+
listArray.push(dicTemp);
134+
}
135+
}
136+
dic.setObjectForKey(listArray, param.key);
137+
} else if (param.type === "string" || param.type === "double" || param.type === "float" || param.type === "int" || param.type === "long" || param.type === "boolean") {
138+
dic.setObjectForKey(param.value, param.key);
139+
}
140+
}
141+
}
142+
FIRAnalytics.logEventWithNameParameters(options.key, dic);
143+
resolve();
144+
} catch (ex) {
145+
console.log("Error in firebase.analytics.logEvent: " + ex);
146+
reject(ex);
147+
}
148+
});
149+
}
150+
30151

31152
export function setUserId(arg): Promise<void> {
32153
return new Promise<void>((resolve, reject) => {

src/firebase-common.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ export const firebase: any = {
6565
GOOGLE: "google",
6666
EMAIL_LINK: "emailLink"
6767
},
68+
LogComplexEventTypeParameter: {
69+
STRING: "string",
70+
INT: "int",
71+
FLOAT: "float",
72+
DOUBLE: "double",
73+
LONG: "long",
74+
ARRAY: "array",
75+
BOOLEAN: "boolean"
76+
},
6877
QueryOrderByType: {
6978
KEY: "key",
7079
VALUE: "value",

src/firebase.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ export enum LoginType {
3939
EMAIL_LINK
4040
}
4141

42+
export enum LogComplexEventTypeParameter {
43+
STRING,
44+
INT,
45+
FLOAT,
46+
DOUBLE,
47+
LONG,
48+
ARRAY,
49+
BOOLEAN
50+
}
4251
/**
4352
* The allowed values for QueryOptions.orderBy.type.
4453
*/

0 commit comments

Comments
 (0)