Skip to content

Commit

Permalink
Use file scope namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
ScarletKuro committed Aug 25, 2024
1 parent da6fbf2 commit 3ca9984
Show file tree
Hide file tree
Showing 6 changed files with 214 additions and 211 deletions.
171 changes: 85 additions & 86 deletions src/Blazor.GoogleTagManager/GoogleTagManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,119 +6,118 @@
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.Extensions.Options;

namespace Blazor.GoogleTagManager
namespace Blazor.GoogleTagManager;

/// <summary>
/// Implementation for <see cref="IGoogleTagManager"/>.
/// </summary>
public class GoogleTagManager : IGoogleTagManager
{
/// <summary>
/// Implementation for <see cref="IGoogleTagManager"/>.
/// </summary>
public class GoogleTagManager : IGoogleTagManager
private readonly GoogleTagManagerOptions _gtmOptions;
private readonly NavigationManager _navigationManager;
private readonly IGoogleTagManagerInterop _googleTagManagerInterop;

/// <inheritdoc/>
public bool IsInitialized { get; private set; }

/// <inheritdoc/>
public bool IsTackingEnabled { get; private set; } = true;

public GoogleTagManager(
IOptions<GoogleTagManagerOptions> gtmOptions,
NavigationManager navigationManager,
IGoogleTagManagerInterop googleTagManagerInterop)
{
private readonly GoogleTagManagerOptions _gtmOptions;
private readonly NavigationManager _navigationManager;
private readonly IGoogleTagManagerInterop _googleTagManagerInterop;
_gtmOptions = gtmOptions.Value;
_navigationManager = navigationManager;
_googleTagManagerInterop = googleTagManagerInterop;
}

/// <inheritdoc/>
public bool IsInitialized { get; private set; }
/// <inheritdoc/>
public void EnableTracking()
{
IsTackingEnabled = true;
}

/// <inheritdoc/>
public bool IsTackingEnabled { get; private set; } = true;
/// <inheritdoc/>
public void DisableTracking()
{
IsTackingEnabled = false;
}

public GoogleTagManager(
IOptions<GoogleTagManagerOptions> gtmOptions,
NavigationManager navigationManager,
IGoogleTagManagerInterop googleTagManagerInterop)
/// <inheritdoc/>
public async Task InitializeAsync()
{
if (IsInitialized)
{
_gtmOptions = gtmOptions.Value;
_navigationManager = navigationManager;
_googleTagManagerInterop = googleTagManagerInterop;
return;
}

/// <inheritdoc/>
public void EnableTracking()
if (string.IsNullOrEmpty(_gtmOptions.GtmId))
{
IsTackingEnabled = true;
throw new ArgumentException("GTM Id cannot be empty.", nameof(_gtmOptions.GtmId));
}

/// <inheritdoc/>
public void DisableTracking()
{
IsTackingEnabled = false;
}

/// <inheritdoc/>
public async Task InitializeAsync()
{
if (IsInitialized)
{
return;
}
await _googleTagManagerInterop.InitializeAsync(_gtmOptions.GtmId, _gtmOptions.Attributes, _gtmOptions.DebugToConsole);

if (string.IsNullOrEmpty(_gtmOptions.GtmId))
{
throw new ArgumentException("GTM Id cannot be empty.", nameof(_gtmOptions.GtmId));
}
IsInitialized = true;
}

/// <inheritdoc/>
public async Task PushAsync(object data)
{
if (!IsTackingEnabled)
{
return;
}

await _googleTagManagerInterop.InitializeAsync(_gtmOptions.GtmId, _gtmOptions.Attributes, _gtmOptions.DebugToConsole);
await InitializeAsync();
await _googleTagManagerInterop.PushAsync(data, _gtmOptions.DebugToConsole);
}

IsInitialized = true;
/// <inheritdoc/>
public async Task PushEventAsync(string eventName, object? eventData = null)
{
if (!IsTackingEnabled)
{
return;
}

/// <inheritdoc/>
public async Task PushAsync(object data)
{
if (!IsTackingEnabled)
{
return;
}
await InitializeAsync();
await _googleTagManagerInterop.PushEventAsync(eventName, eventData, _gtmOptions.DebugToConsole);
}

await InitializeAsync();
await _googleTagManagerInterop.PushAsync(data, _gtmOptions.DebugToConsole);
}
/// <inheritdoc/>
public Task PushPageViewAsync(object? additionalData = null) => PushPageViewCoreAsync(_navigationManager.Uri, additionalData);

/// <inheritdoc/>
public async Task PushEventAsync(string eventName, object? eventData = null)
/// <inheritdoc/>
async Task IGoogleTagManager.PushPageViewAsync(LocationChangedEventArgs? args)
{
if (!IsTackingEnabled)
{
if (!IsTackingEnabled)
{
return;
}

await InitializeAsync();
await _googleTagManagerInterop.PushEventAsync(eventName, eventData, _gtmOptions.DebugToConsole);
return;
}

/// <inheritdoc/>
public Task PushPageViewAsync(object? additionalData = null) => PushPageViewCoreAsync(_navigationManager.Uri, additionalData);

/// <inheritdoc/>
async Task IGoogleTagManager.PushPageViewAsync(LocationChangedEventArgs? args)
if (args is null)
{
if (!IsTackingEnabled)
{
return;
}

if (args is null)
{
// App firstRender
await PushPageViewAsync();
}
else
{
await PushPageViewCoreAsync(args.Location, new Dictionary<string, string> { { "isNavigationIntercepted", args.IsNavigationIntercepted.ToString() } });
}
// App firstRender
await PushPageViewAsync();
}

private async Task PushPageViewCoreAsync(string url, object? additionalData = null)
else
{
if (!IsTackingEnabled)
{
return;
}
await PushPageViewCoreAsync(args.Location, new Dictionary<string, string> { { "isNavigationIntercepted", args.IsNavigationIntercepted.ToString() } });
}
}

await InitializeAsync();
await _googleTagManagerInterop.PushPageViewAsync(_gtmOptions.PageViewEventName, _gtmOptions.PageViewUrlVariableName, url, additionalData, _gtmOptions.DebugToConsole);
private async Task PushPageViewCoreAsync(string url, object? additionalData = null)
{
if (!IsTackingEnabled)
{
return;
}

await InitializeAsync();
await _googleTagManagerInterop.PushPageViewAsync(_gtmOptions.PageViewEventName, _gtmOptions.PageViewUrlVariableName, url, additionalData, _gtmOptions.DebugToConsole);
}
}
65 changes: 32 additions & 33 deletions src/Blazor.GoogleTagManager/GoogleTagManagerOptions.cs
Original file line number Diff line number Diff line change
@@ -1,44 +1,43 @@
using System.Collections.Generic;

namespace Blazor.GoogleTagManager
namespace Blazor.GoogleTagManager;

/// <summary>
/// Options for <see cref="GoogleTagManager"/>.
/// </summary>
public class GoogleTagManagerOptions
{
/// <summary>
/// Options for <see cref="GoogleTagManager"/>.
/// GTM-ID.
/// </summary>
public class GoogleTagManagerOptions
{
/// <summary>
/// GTM-ID.
/// </summary>
public string GtmId { get; set; } = string.Empty;
public string GtmId { get; set; } = string.Empty;

/// <summary>
/// Google Tag Manager script attributes.
/// </summary>
public Dictionary<string, string> Attributes { get; set; } = new();
/// <summary>
/// Google Tag Manager script attributes.
/// </summary>
public Dictionary<string, string> Attributes { get; set; } = new();

/// <summary>
/// Name of the event pushed when page-view is tracked.
/// </summary>
public string PageViewEventName { get; set; } = "virtualPageView";
/// <summary>
/// Name of the event pushed when page-view is tracked.
/// </summary>
public string PageViewEventName { get; set; } = "virtualPageView";

/// <summary>
/// Name of the variabel to be used for URL when page-view is tracked.
/// </summary>
public string PageViewUrlVariableName { get; set; } = "pageUrl";
/// <summary>
/// Name of the variabel to be used for URL when page-view is tracked.
/// </summary>
public string PageViewUrlVariableName { get; set; } = "pageUrl";

/// <summary>
/// Allows to print logs in the browser console. Do not use in production.
/// </summary>
public bool DebugToConsole { get; set; }
/// <summary>
/// Allows to print logs in the browser console. Do not use in production.
/// </summary>
public bool DebugToConsole { get; set; }

/// <summary>
/// Specifies whether to import the JavaScript <c>'_content/Blazor.GoogleTagManager/GoogleTagManager.js'</c> file automatically.
/// <para>
/// If you disable this option, you must manually import your own JavaScript via the <c>script</c> tag.
/// </para>
/// Default is <c>true</c>.
/// </summary>
public bool ImportJsAutomatically { get; set; } = true;
}
/// <summary>
/// Specifies whether to import the JavaScript <c>'_content/Blazor.GoogleTagManager/GoogleTagManager.js'</c> file automatically.
/// <para>
/// If you disable this option, you must manually import your own JavaScript via the <c>script</c> tag.
/// </para>
/// Default is <c>true</c>.
/// </summary>
public bool ImportJsAutomatically { get; set; } = true;
}
76 changes: 39 additions & 37 deletions src/Blazor.GoogleTagManager/GoogleTagManagerPageViewTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,57 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;

namespace Blazor.GoogleTagManager
namespace Blazor.GoogleTagManager;

public class GoogleTagManagerPageViewTracker : ComponentBase, IDisposable
{
public class GoogleTagManagerPageViewTracker : ComponentBase, IDisposable
{
[Inject]
protected NavigationManager NavigationManager { get; set; } = null!;
[Inject]
protected NavigationManager NavigationManager { get; set; } = null!;

[Inject]
protected IGoogleTagManager GoogleTagManager { get; set; } = null!;
[Inject]
protected IGoogleTagManager GoogleTagManager { get; set; } = null!;

private LocationChangedEventArgs? _locationChangedEventArgsToReportOnAfterRenderAsync;
private LocationChangedEventArgs? _locationChangedEventArgsToReportOnAfterRenderAsync;

protected override void OnInitialized()
{
base.OnInitialized();
/// <inheritdoc/>
protected override void OnInitialized()
{
base.OnInitialized();

NavigationManager.LocationChanged += OnLocationChanged;
}
NavigationManager.LocationChanged += OnLocationChanged;
}

protected override async Task OnAfterRenderAsync(bool firstRender)
/// <inheritdoc/>
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender || _locationChangedEventArgsToReportOnAfterRenderAsync is not null)
{
if (firstRender || _locationChangedEventArgsToReportOnAfterRenderAsync is not null)
{
var argsToReport = _locationChangedEventArgsToReportOnAfterRenderAsync;
_locationChangedEventArgsToReportOnAfterRenderAsync = null;
await GoogleTagManager.PushPageViewAsync(argsToReport);
}

await base.OnAfterRenderAsync(firstRender);
var argsToReport = _locationChangedEventArgsToReportOnAfterRenderAsync;
_locationChangedEventArgsToReportOnAfterRenderAsync = null;
await GoogleTagManager.PushPageViewAsync(argsToReport);
}

private void OnLocationChanged(object? sender, LocationChangedEventArgs args)
{
_locationChangedEventArgsToReportOnAfterRenderAsync = args;
StateHasChanged();
}
await base.OnAfterRenderAsync(firstRender);
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void OnLocationChanged(object? sender, LocationChangedEventArgs args)
{
_locationChangedEventArgsToReportOnAfterRenderAsync = args;
StateHasChanged();
}

protected virtual void Dispose(bool disposing)
/// <inheritdoc/>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (disposing)
{
NavigationManager.LocationChanged -= OnLocationChanged;
}
NavigationManager.LocationChanged -= OnLocationChanged;
}
}
}
Loading

0 comments on commit 3ca9984

Please sign in to comment.