-
Notifications
You must be signed in to change notification settings - Fork 0
/
PageVisibilityService.cs
128 lines (114 loc) · 5.21 KB
/
PageVisibilityService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace CurrieTechnologies.Razor.PageVisibility
{
public class PageVisibilityService
{
private readonly IJSRuntime jSRuntime;
static readonly IDictionary<Guid, EventCallback<VisibilityInfo>> visibilityChangeCallbacks =
new Dictionary<Guid, EventCallback<VisibilityInfo>>();
public PageVisibilityService(IJSRuntime jSRuntime)
{
this.jSRuntime = jSRuntime;
}
/// <summary>
/// Returns true if the page is in a state considered to be hidden to the user, and false otherwise.
/// </summary>
/// <returns></returns>
public async Task<bool> IsHiddenAsync()
{
var result = await jSRuntime.InvokeAsync<bool?>("CurrieTechnologies.Razor.PageVisibility.IsHidden");
if (result == null)
{
throw new JSException("Visibility not supported");
}
return result.Value;
}
/// <summary>
/// A DOMString indicating the document's current visibility state.
/// <see cref="VisibilityState"/>
/// </summary>
/// <returns></returns>
public async Task<string> GetVisibilityStateAsync()
{
var result = await jSRuntime.InvokeAsync<string>("CurrieTechnologies.Razor.PageVisibility.GetVisibilityState");
if (result == null)
{
throw new JSException("Visibility not supported");
}
return result;
}
/// <summary>
/// An EventListener providing the code to be called when the visibilitychange event is fired.
/// </summary>
/// <param name="visibilityCallback">The action to perform when the visibility changes.</param>
/// <param name="callingComponent">Pass in 'this' from the calling component.</param>
/// <returns>A GUID that can be used to clear the event callback.</returns>
public async Task<Guid> OnVisibilityChangeAsync(Func<VisibilityInfo, Task> visibilityCallback, object callingComponent)
{
EventCallback<VisibilityInfo> eventCallback = EventCallback.Factory.Create(callingComponent, visibilityCallback);
return await AttachCallbackToDomAsync(eventCallback);
}
/// <summary>
/// An EventListener providing the code to be called when the visibilitychange event is fired.
/// </summary>
/// <param name="visibilityCallback">The action to perform when the visibility changes.</param>
/// <param name="callingComponent">Pass in 'this' from the calling component.</param>
/// <returns>A GUID that can be used to clear the event callback.</returns>
public async Task<Guid> OnVisibilityChangeAsync(Action<VisibilityInfo> visibilityCallback, object callingComponent)
{
EventCallback<VisibilityInfo> eventCallback = EventCallback.Factory.Create(callingComponent, visibilityCallback);
return await AttachCallbackToDomAsync(eventCallback);
}
private async Task<Guid> AttachCallbackToDomAsync(EventCallback<VisibilityInfo> eventCallback)
{
var actionId = Guid.NewGuid();
visibilityChangeCallbacks.Add(actionId, eventCallback);
await jSRuntime.InvokeAsync<string>("CurrieTechnologies.Razor.PageVisibility.OnVisibilityChange", actionId);
return actionId;
}
[JSInvokable]
public static async Task ReceiveVisibiliyChange(string id, bool hidden, string visibilityState)
{
var actionId = Guid.Parse(id);
if (!visibilityChangeCallbacks.ContainsKey(actionId))
{
return;
}
var action = visibilityChangeCallbacks.First(x => x.Key == actionId).Value;
var visibilityInfo = new VisibilityInfo
{
Hidden = hidden,
VisibilityState = visibilityState
};
await action.InvokeAsync(visibilityInfo);
}
/// <summary>
/// Removes a callback set with OnVisibilityChangeAsync.
/// </summary>
/// <param name="callbackId">The GUID of the callback obtained when setting the listener.</param>
/// <returns></returns>
public async Task RemoveVisibilityChangeCallbackAsync(Guid callbackId)
{
if (visibilityChangeCallbacks.ContainsKey(callbackId))
{
visibilityChangeCallbacks.Remove(callbackId);
}
await jSRuntime.InvokeAsync<string>("CurrieTechnologies.Razor.PageVisibility.RemoveVisibilityChangeCallback", callbackId);
}
/// <summary>
/// Removes a callback set with OnVisibilityChangeAsync.
/// </summary>
/// <param name="callbackId">The GUID of the callback obtained when setting the listener.</param>
/// <returns></returns>
public Task RemoveVisibilityChangeCallbackAsync(string callbackId)
{
var callbackIdGuid = Guid.Parse(callbackId);
return RemoveVisibilityChangeCallbackAsync(callbackIdGuid);
}
}
}