File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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" ;
Original file line number Diff line number Diff 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 ( )
Original file line number Diff line number Diff line change 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 />
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+ }
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments