Skip to content

Commit

Permalink
♻ refactor(Breakpoint): differentiate the window size, breakpoint and…
Browse files Browse the repository at this point in the history
… mobile change events
  • Loading branch information
capdiem committed Jul 25, 2024
1 parent 29dcc6e commit ed4aade
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 68 deletions.
11 changes: 3 additions & 8 deletions docs/Masa.Blazor.Docs/Examples/features/breakpoints/Dialog.razor
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,17 @@
{
base.OnInitialized();

MasaBlazor.Breakpoint.OnUpdate += BreakpointOnOnUpdate;
MasaBlazor.MobileChanged += MasaBlazorOnMobileChanged;
}

private void BreakpointOnOnUpdate(object? sender, BreakpointChangedEventArgs e)
private void MasaBlazorOnMobileChanged(object? sender, MobileChangedEventArgs e)
{
if (!e.MobileChanged)
{
return;
}

InvokeAsync(StateHasChanged);
}

public void Dispose()
{
MasaBlazor.Breakpoint.OnUpdate -= BreakpointOnOnUpdate;
MasaBlazor.MobileChanged -= MasaBlazorOnMobileChanged;
}

}
13 changes: 1 addition & 12 deletions docs/Masa.Docs.Shared/Pages/Home.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,17 @@ public partial class Home : ComponentBase
[SupplyParameterFromQuery(Name = "v")]
[Parameter] public string? Version { get; set; }

private bool _prevXs;

protected override void OnInitialized()
{
base.OnInitialized();

MasaBlazor.BreakpointChanged += MasaBlazorOnBreakpointChanged;
}

protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
_prevXs = MasaBlazor.Breakpoint.Xs;
}
}

private void MasaBlazorOnBreakpointChanged(object? sender, BreakpointChangedEventArgs e)
{
if (_prevXs != MasaBlazor.Breakpoint.Xs)
if (e.Breakpoint == Breakpoints.Xs)
{
_prevXs = MasaBlazor.Breakpoint.Xs;
InvokeAsync(StateHasChanged);
}
}
Expand Down
17 changes: 8 additions & 9 deletions src/Masa.Blazor/Components/AppBar/MAppBarTitle.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,17 @@ protected override void OnInitialized()
{
base.OnInitialized();

MasaBlazor.BreakpointChanged += MasaBlazorOnBreakpointChanged;
MasaBlazor.WindowSizeChanged += MasaBlazorOnBreakpointChanged;
}

private async void MasaBlazorOnBreakpointChanged(object? sender, BreakpointChangedEventArgs e)
private async void MasaBlazorOnBreakpointChanged(object? sender, WindowSizeChangedEventArgs e)
{
if (Math.Abs(_windowsWidth - MasaBlazor.Breakpoint.Width) > 0.01)
{
_windowsWidth = MasaBlazor.Breakpoint.Width;
if (!(Math.Abs(_windowsWidth - MasaBlazor.Breakpoint.Width) > 0.01)) return;

await UpdateDimensions();
await InvokeAsync(StateHasChanged);
}
_windowsWidth = MasaBlazor.Breakpoint.Width;

await UpdateDimensions();
await InvokeAsync(StateHasChanged);
}

protected override async Task OnAfterRenderAsync(bool firstRender)
Expand Down Expand Up @@ -89,7 +88,7 @@ private async Task UpdateDimensions()

protected override ValueTask DisposeAsyncCore()
{
MasaBlazor.BreakpointChanged -= MasaBlazorOnBreakpointChanged;
MasaBlazor.WindowSizeChanged -= MasaBlazorOnBreakpointChanged;
return base.DisposeAsyncCore();
}
}
10 changes: 4 additions & 6 deletions src/Masa.Blazor/Components/SlideGroup/MSlideGroup.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,13 @@ protected override void OnInitialized()
{
base.OnInitialized();

MasaBlazor.Breakpoint.OnUpdate += BreakpointOnOnUpdate;
MasaBlazor.MobileChanged += MasaBlazorOnMobileChanged;
IsMobile = MasaBlazor.Breakpoint.Mobile;
}

private async void BreakpointOnOnUpdate(object? sender, BreakpointChangedEventArgs e)
private async void MasaBlazorOnMobileChanged(object? sender, MobileChangedEventArgs e)
{
if (!e.MobileChanged) return;

IsMobile = MasaBlazor.Breakpoint.Mobile;
IsMobile = e.Mobile;
await InvokeStateHasChangedAsync();
}

Expand Down Expand Up @@ -385,7 +383,7 @@ protected async Task OnResize()

protected override async ValueTask DisposeAsyncCore()
{
MasaBlazor.Breakpoint.OnUpdate -= BreakpointOnOnUpdate;
MasaBlazor.MobileChanged -= MasaBlazorOnMobileChanged;
await ResizeJSModule.UnobserveAsync(Ref);
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/Masa.Blazor/Mixins/Menuable/MMenuable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,10 @@ protected override void OnInitialized()
{
base.OnInitialized();

MasaBlazor.BreakpointChanged += MasaBlazorOnBreakpointChanged;
MasaBlazor.WindowSizeChanged += MasaBlazorOnWindowSizeChanged;
}

private async void MasaBlazorOnBreakpointChanged(object? sender, BreakpointChangedEventArgs e)
private async void MasaBlazorOnWindowSizeChanged(object? sender, WindowSizeChangedEventArgs e)
{
if (!IsActive)
{
Expand Down Expand Up @@ -427,7 +427,7 @@ protected virtual Task DeactivateAsync()

protected override async ValueTask DisposeAsyncCore()
{
MasaBlazor.BreakpointChanged -= MasaBlazorOnBreakpointChanged;
MasaBlazor.WindowSizeChanged -= MasaBlazorOnWindowSizeChanged;

if (ContentElement.Context is not null)
{
Expand Down
33 changes: 14 additions & 19 deletions src/Masa.Blazor/Services/Breakpoint/Breakpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ public class BreakpointOptions

public class Breakpoint
{
private bool _prevMobile;

public Breakpoint()
{
}
Expand Down Expand Up @@ -81,7 +79,7 @@ public double GetMobileBreakpointValue()
Breakpoints.Xs => Thresholds.Xs,
Breakpoints.Sm => Thresholds.Sm,
Breakpoints.Md => Thresholds.Md,
_ => Thresholds.Lg,
_ => Thresholds.Lg,
};
}

Expand All @@ -90,9 +88,9 @@ public double GetMobileBreakpointValue()
public double ScrollBarWidth { get; internal set; }

[Obsolete("Use MasaBlazor.BreakpointChanged instead")]
public event EventHandler<BreakpointChangedEventArgs> OnUpdate;
public event EventHandler<BreakpointChangedEventArgs>? OnUpdate;

internal Action<BreakpointChangedEventArgs> OnChanged;
internal Action<WindowSizeChangedEventArgs>? OnWindowResize;

public void Deconstruct(
out double width,
Expand All @@ -110,19 +108,14 @@ public async Task InitAsync(IJSRuntime jsRuntime)
{
JSRuntime = jsRuntime;

await UpdateAsync();
await ResizeAsync();

_ = JSRuntime.AddHtmlElementEventListener("window", "resize", ResizeAsync,
new EventListenerOptions { Passive = true },
new EventListenerExtras(debounce: 200));
}

private async Task ResizeAsync()
{
await UpdateAsync();
}

public async Task UpdateAsync()
{
var height = await GetClientSizeAsync("Height");
var width = await GetClientSizeAsync("Width");
Expand Down Expand Up @@ -153,6 +146,9 @@ public async Task UpdateAsync()
LgAndUp = !(xs || sm || md) && (lg || xl);
XlOnly = xl;

var prevBreakpoint = Name;
var prevMobile = Mobile;

if (xs)
{
Name = Breakpoints.Xs;
Expand Down Expand Up @@ -186,19 +182,18 @@ public async Task UpdateAsync()
Mobile = current <= max;
}

var eventArgs = new BreakpointChangedEventArgs();
var breakpointChanged = prevBreakpoint != Name;
var mobileChanged = prevMobile != Mobile;
var eventArgs = new WindowSizeChangedEventArgs(Name, breakpointChanged, Mobile, mobileChanged);

Initialized = true;

if (_prevMobile != Mobile)
if (breakpointChanged)
{
_prevMobile = Mobile;
eventArgs.MobileChanged = true;
OnUpdate?.Invoke(this, eventArgs);
}

OnUpdate?.Invoke(this, eventArgs);

OnChanged?.Invoke(eventArgs);
OnWindowResize?.Invoke(eventArgs);
}

private async Task<double> GetClientSizeAsync(string sizeName)
Expand All @@ -218,4 +213,4 @@ private async Task<double> GetClientSizeAsync(string sizeName)
var jsonElement = await JSRuntime.InvokeAsync<JsonElement>(JsInteropConstants.GetProp, selector, name);
return jsonElement.ValueKind == JsonValueKind.Number ? jsonElement.GetDouble() : null;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
namespace Masa.Blazor;

public class BreakpointChangedEventArgs : MobileChangedEventArgs
public class BreakpointChangedEventArgs(Breakpoints breakpoint, bool breakpointChanged, bool mobile, bool mobileChanged)
: MobileChangedEventArgs(mobile, mobileChanged)
{
/// <summary>
/// Indicates whether the value of Mobile property has changed. First time is always false.
/// </summary>
public bool MobileChanged { get; set; }
}
public Breakpoints Breakpoint { get; } = breakpoint;

internal bool BreakpointChanged { get; } = breakpointChanged;
}
10 changes: 8 additions & 2 deletions src/Masa.Blazor/Services/Breakpoint/MobileChangedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
namespace Masa.Blazor;

public class MobileChangedEventArgs : EventArgs
public class MobileChangedEventArgs(bool mobile, bool mobileChanged) : EventArgs
{
}
public bool Mobile { get; } = mobile;

/// <summary>
/// Indicates whether the value of Mobile property has changed. First time is always false.
/// </summary>
internal bool MobileChanged { get; } = mobileChanged;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Masa.Blazor;

public class WindowSizeChangedEventArgs(Breakpoints breakpoint, bool breakpointChanged, bool mobile, bool mobileChanged)
: BreakpointChangedEventArgs(breakpoint, breakpointChanged, mobile, mobileChanged)
{
}
15 changes: 12 additions & 3 deletions src/Masa.Blazor/Services/MasaBlazor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,20 @@ public MasaBlazor(
{
RTL = rtl;
Breakpoint = breakpoint;
Breakpoint.OnChanged = e =>
Breakpoint.OnWindowResize = e =>
{
BreakpointChanged?.Invoke(this, e);
WindowSizeChanged?.Invoke(this, e);

if (e.BreakpointChanged)
{
BreakpointChanged?.Invoke(this, e);
}

if (e.MobileChanged)
{
MobileChanged?.Invoke(this, e);
}
};

Application = application;
Theme = theme;
Icons = icons;
Expand Down Expand Up @@ -67,6 +71,11 @@ public bool RTL

public event Action<Theme>? OnThemeChange;

/// <summary>
/// An event that fires when the window size has changed.
/// </summary>
public event EventHandler<WindowSizeChangedEventArgs>? WindowSizeChanged;

/// <summary>
/// An event that fires when the breakpoint has changed.
/// </summary>
Expand Down

0 comments on commit ed4aade

Please sign in to comment.