Skip to content

Commit fadbf52

Browse files
committed
Rework theme listening
1 parent 046f7da commit fadbf52

5 files changed

Lines changed: 48 additions & 24 deletions

File tree

src/TryMudBlazor.Client/Models/TryConstants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public static class Try
66
public const string ChangeDisplayUrl = "Try.changeDisplayUrl";
77
public const string ReloadIframe = "Try.reloadIframe";
88
public const string Dispose = "Try.dispose";
9+
public const string RegisterThemeListener = "Try.registerThemeListener";
10+
public const string UnregisterThemeListener = "Try.unregisterThemeListener";
911
public static class Editor
1012
{
1113
public const string Create = "Try.Editor.create";

src/TryMudBlazor.Client/Pages/Repl.razor.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,7 @@ private async Task UpdateTheme()
285285
await LayoutService.ToggleDarkMode();
286286
string theme = LayoutService.IsDarkMode ? "vs-dark" : "default";
287287
await JsRuntime.InvokeVoidAsync(Try.Editor.SetTheme, theme);
288-
// LayoutService calls StateHasChanged, we need the updated <style> tags for updateIframeTheme to work
289-
await Task.Yield();
290-
await JsRuntime.InvokeVoidAsync("updateIframeTheme");
288+
// The iframe's EmptyLayout listens for the localStorage storage event and updates itself.
291289
}
292290

293291
private void ClearCache()

src/TryMudBlazor.Client/Shared/EmptyLayout.razor

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
@using TryMudBlazor.Client.Services
1+
@using Microsoft.JSInterop
2+
@using TryMudBlazor.Client.Services
3+
@using TryMudBlazor.Client.Models
24
@inherits LayoutComponentBase
5+
@implements IAsyncDisposable
36

47
<MudThemeProvider IsDarkMode="@LayoutService.IsDarkMode" />
58
<MudPopoverProvider />
@@ -12,10 +15,36 @@
1215

1316
@code {
1417
[Inject] private LayoutService LayoutService { get; set; }
18+
[Inject] private IJSRuntime JSRuntime { get; set; }
19+
20+
private DotNetObjectReference<EmptyLayout> _dotNetRef;
1521

1622
protected override async Task OnInitializedAsync()
1723
{
1824
await LayoutService.ApplyUserPreferences(false);
1925
await base.OnInitializedAsync();
2026
}
21-
}
27+
28+
protected override async Task OnAfterRenderAsync(bool firstRender)
29+
{
30+
if (firstRender)
31+
{
32+
_dotNetRef = DotNetObjectReference.Create(this);
33+
await JSRuntime.InvokeVoidAsync(Try.RegisterThemeListener, _dotNetRef);
34+
}
35+
await base.OnAfterRenderAsync(firstRender);
36+
}
37+
38+
[JSInvokable]
39+
public async Task RefreshTheme()
40+
{
41+
await LayoutService.ApplyUserPreferences(false);
42+
StateHasChanged();
43+
}
44+
45+
public async ValueTask DisposeAsync()
46+
{
47+
await JSRuntime.InvokeVoidAsync(Try.UnregisterThemeListener);
48+
_dotNetRef?.Dispose();
49+
}
50+
}

src/TryMudBlazor.Client/wwwroot/editor/main.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,20 @@ window.Try = {
101101
dispose: function () {
102102
_dotNetInstance = null;
103103
window.removeEventListener('keydown', onKeyDown);
104+
},
105+
registerThemeListener: function (dotNetRef) {
106+
this._themeListener = function (e) {
107+
if (e.key === 'userPreferences') {
108+
dotNetRef.invokeMethodAsync('RefreshTheme');
109+
}
110+
};
111+
window.addEventListener('storage', this._themeListener);
112+
},
113+
unregisterThemeListener: function () {
114+
if (this._themeListener) {
115+
window.removeEventListener('storage', this._themeListener);
116+
delete this._themeListener;
117+
}
104118
}
105119
}
106120

src/TryMudBlazor.Client/wwwroot/index.html

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -91,25 +91,6 @@
9191
}
9292
}).catch(error => console.error(error));
9393

94-
function updateIframeTheme() {
95-
const mudblazorTheme = parent.document.querySelector('.mud-theme-provider') || parent.document.getElementsByTagName('style')[3];
96-
97-
if (mudblazorTheme) {
98-
// Find the iframe
99-
const userPageIframe = parent.document.getElementById('user-page-window');
100-
101-
if (userPageIframe && userPageIframe.contentDocument) {
102-
const iframeDoc = userPageIframe.contentDocument;
103-
const iFrameTheme = iframeDoc.querySelector('.mud-theme-provider') || iframeDoc.getElementsByTagName('style')[2];
104-
105-
if (iFrameTheme) {
106-
iFrameTheme.innerHTML = mudblazorTheme.innerHTML;
107-
}
108-
}
109-
} else {
110-
console.error('Could not find the parent theme element.');
111-
}
112-
}
11394
</script>
11495
</body>
11596

0 commit comments

Comments
 (0)