diff --git a/DeepDrftPublic.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs b/DeepDrftPublic.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs index 44aa136..62cf5a9 100644 --- a/DeepDrftPublic.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs +++ b/DeepDrftPublic.Client/Controls/AudioPlayerBar/AudioPlayerBar.razor.cs @@ -115,13 +115,22 @@ public partial class AudioPlayerBar : ComponentBase, IAsyncDisposable } } - private async Task Expand() + private async Task Expand() => await SetMinimized(false); + + /// + /// The single assignment site for . Guards no-op transitions, + /// fires so MainLayout's spacer class stays in sync, and renders + /// so OnAfterRenderAsync re-evaluates the ResizeObserver on every transition path. + /// The Fixed branch in OnParametersSet intentionally bypasses this — it is a + /// prerender/parameter pass, not a user-driven transition, and the embed host has no spacer. + /// + private async Task SetMinimized(bool value) { - if (_isMinimized) - { - _isMinimized = false; - StateHasChanged(); - } + if (_isMinimized == value) return; + + _isMinimized = value; + if (OnMinimized.HasDelegate) await OnMinimized.InvokeAsync(value); + StateHasChanged(); } private async Task TogglePlayPause() @@ -176,12 +185,7 @@ public partial class AudioPlayerBar : ComponentBase, IAsyncDisposable PlayerService?.ClearError(); } - private async Task ToggleMinimized() - { - _isMinimized = !_isMinimized; - if (OnMinimized.HasDelegate) await OnMinimized.InvokeAsync(_isMinimized); - StateHasChanged(); - } + private async Task ToggleMinimized() => await SetMinimized(!_isMinimized); private async Task Close() { @@ -190,11 +194,7 @@ public partial class AudioPlayerBar : ComponentBase, IAsyncDisposable await PlayerService.Unload(); } - if (!_isMinimized) - { - _isMinimized = true; - StateHasChanged(); - } + await SetMinimized(true); } public async ValueTask DisposeAsync()