Skip to content

Commit b0b108f

Browse files
authored
Added UserId (#52)
* Added UserId * Removed MId * Implemented globalConfigData & globalEventData * Removed MId * Enabled display in demo * Name cleanup * Applied new feature with user id in both samples
1 parent 3df2b0c commit b0b108f

6 files changed

Lines changed: 97 additions & 17 deletions

File tree

demo/DemoApp/DemoApp.Client/Shared/MainLayout.razor

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,20 @@
1313
@Body
1414
</div>
1515
</div>
16+
17+
@code {
18+
[Inject]
19+
private Blazor.Analytics.IAnalytics Analytics { get; set; }
20+
21+
protected override void OnInitialized()
22+
{
23+
var userId = $"userid{DateTime.Now.Ticks}";
24+
var globalConfigData = new Dictionary<string, object>();
25+
globalConfigData["user_id"] = userId;
26+
var globalEventData = new Dictionary<string, object>();
27+
globalEventData["user_id"] = userId;
28+
29+
this.Analytics.ConfigureGlobalConfigData(globalConfigData);
30+
this.Analytics.ConfigureGlobalEventData(globalEventData);
31+
}
32+
}

demo/DemoApp/DemoApp.Server/Shared/MainLayout.razor

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
@inherits LayoutComponentBase
1+
@using System.Threading
2+
@inherits LayoutComponentBase
23

34
<div class="sidebar">
45
<NavMenu />
@@ -13,3 +14,21 @@
1314
@Body
1415
</div>
1516
</div>
17+
18+
@code {
19+
20+
[Inject]
21+
private Blazor.Analytics.IAnalytics Analytics { get; set; }
22+
23+
protected override void OnInitialized()
24+
{
25+
var userId = $"userid{DateTime.Now.Ticks}";
26+
var globalConfigData = new Dictionary<string, object>();
27+
globalConfigData["user_id"] = userId;
28+
var globalEventData = new Dictionary<string, object>();
29+
globalEventData["user_id"] = userId;
30+
31+
this.Analytics.ConfigureGlobalConfigData(globalConfigData);
32+
this.Analytics.ConfigureGlobalEventData(globalEventData);
33+
}
34+
}

demo/DemoApp/DemoApp.Server/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using Microsoft.AspNetCore.Builder;
23
using Microsoft.AspNetCore.Hosting;
34
using Microsoft.Extensions.Configuration;

src/Blazor.Analytics/Abstractions/IAnalytics.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
23

34
namespace Blazor.Analytics
45
{
56
public interface IAnalytics
67
{
7-
Task Initialize(string trackingId);
8+
Task ConfigureGlobalConfigData(Dictionary<string, object> globalConfigData);
9+
Task ConfigureGlobalEventData(Dictionary<string, object> globalEventData);
810

911
Task TrackNavigation(string uri);
1012

src/Blazor.Analytics/GoogleAnalytics/GoogleAnalyticsStrategy.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Threading.Tasks;
34
using Blazor.Analytics.Abstractions;
45
using Blazor.Analytics.Constants;
@@ -12,8 +13,10 @@ public sealed class GoogleAnalyticsStrategy : IAnalytics
1213
private bool _isGloballyEnabledTracking = true;
1314

1415
private string _trackingId = null;
15-
public bool _isInitialized = false;
16-
public bool _debug = false;
16+
private Dictionary<string, object> _globalConfigData = new Dictionary<string, object>();
17+
private Dictionary<string, object> _globalEventData = new Dictionary<string, object>();
18+
private bool _isInitialized = false;
19+
private bool _debug = false;
1720

1821
public GoogleAnalyticsStrategy(
1922
IJSRuntime jsRuntime
@@ -28,20 +31,34 @@ public void Configure(string trackingId, bool debug)
2831
_debug = debug;
2932
}
3033

31-
public async Task Initialize(string trackingId)
34+
private async Task Initialize()
3235
{
33-
if (trackingId == null)
36+
if (_trackingId == null)
3437
{
3538
throw new InvalidOperationException("Invalid TrackingId");
3639
}
3740

3841
await _jsRuntime.InvokeAsync<string>(
39-
GoogleAnalyticsInterop.Configure, trackingId, _debug);
40-
41-
_trackingId = trackingId;
42+
GoogleAnalyticsInterop.Configure, _trackingId, _globalConfigData, _debug);
43+
4244
_isInitialized = true;
4345
}
4446

47+
public async Task ConfigureGlobalConfigData(Dictionary<string, object> globalConfigData)
48+
{
49+
if (!_isInitialized)
50+
{
51+
this._globalConfigData = globalConfigData;
52+
53+
await Initialize();
54+
}
55+
}
56+
57+
public async Task ConfigureGlobalEventData(Dictionary<string, object> globalEventData)
58+
{
59+
this._globalEventData = globalEventData;
60+
}
61+
4562
public async Task TrackNavigation(string uri)
4663
{
4764
if (!_isGloballyEnabledTracking)
@@ -51,7 +68,7 @@ public async Task TrackNavigation(string uri)
5168

5269
if (!_isInitialized)
5370
{
54-
await Initialize(_trackingId);
71+
await Initialize();
5572
}
5673

5774
await _jsRuntime.InvokeAsync<string>(
@@ -86,12 +103,12 @@ public async Task TrackEvent(string eventName, object eventData)
86103

87104
if (!_isInitialized)
88105
{
89-
await Initialize(_trackingId);
106+
await Initialize();
90107
}
91108

92109
await _jsRuntime.InvokeAsync<string>(
93110
GoogleAnalyticsInterop.TrackEvent,
94-
eventName, eventData);
111+
eventName, eventData, _globalEventData);
95112
}
96113

97114
public void Enable() => _isGloballyEnabledTracking = true;

src/Blazor.Analytics/GoogleAnalytics/Resources/GoogleAnalyticsInterop.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@ interface Window
55
gtag: (...args: any[]) => void;
66
}
77

8+
interface ObjectConstructor {
9+
assign(...objects: Object[]): Object;
10+
}
11+
12+
interface ConfigObject {
13+
[key: string]: any
14+
}
15+
16+
interface EventDataObject {
17+
[key: string]: any
18+
}
19+
20+
821
// declare globals
922
declare const dataLayer: any[];
1023
declare const gtag: (...args: any[]) => void;
@@ -18,16 +31,21 @@ gtag("js", new Date());
1831

1932
namespace GoogleAnalyticsInterop
2033
{
21-
export function configure(trackingId: string, debug: boolean = false): void
34+
export function configure(trackingId: string, globalConfigObject: ConfigObject, debug: boolean = false): void
2235
{
2336
this.debug = debug;
37+
this.globalConfigObject = globalConfigObject;
2438
const script = document.createElement("script");
2539
script.async = true;
2640
script.src = "https://www.googletagmanager.com/gtag/js?id=" + trackingId;
2741

2842
document.head.appendChild(script);
2943

30-
gtag("config", trackingId, { 'send_page_view': false });
44+
let configObject: ConfigObject = {};
45+
configObject.send_page_view = false;
46+
Object.assign(configObject, globalConfigObject)
47+
48+
gtag("config", trackingId, configObject);
3149

3250
if(this.debug){
3351
console.log(`[GTAG][${trackingId}] Configured!`);
@@ -36,15 +54,21 @@ namespace GoogleAnalyticsInterop
3654

3755
export function navigate(trackingId: string, href: string): void
3856
{
39-
gtag("config", trackingId, { page_location: href });
57+
let configObject: ConfigObject = {};
58+
59+
configObject.page_location = href;
60+
Object.assign(configObject, this.globalConfigObject)
61+
gtag("config", trackingId, configObject);
4062

4163
if(this.debug){
4264
console.log(`[GTAG][${trackingId}] Navigated: '${href}'`);
4365
}
4466
}
4567

46-
export function trackEvent(eventName: string, eventData: object)
68+
export function trackEvent(eventName: string, eventData: EventDataObject, globalEventData: EventDataObject)
4769
{
70+
Object.assign(eventData, globalEventData)
71+
4872
gtag("event", eventName, eventData);
4973
if (this.debug) {
5074
console.log(`[GTAG][Event triggered]: ${eventName}`);

0 commit comments

Comments
 (0)