You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/Services/Scroll/ScrollManager.cs

101 lines
4.1 KiB

2 years ago
using Connected.Extensions;
using Microsoft.JSInterop;
namespace Connected
{
/// <summary>
/// Inject with the AddMudBlazorScrollServices extension
/// </summary>
public interface IScrollManager
{
ValueTask ScrollToAsync(string id, int left, int top, ScrollBehavior scrollBehavior);
ValueTask ScrollIntoViewAsync(string selector, ScrollBehavior behavior);
//ValueTask ScrollToFragmentAsync(string id, ScrollBehavior behavior);
ValueTask ScrollToTopAsync(string id, ScrollBehavior scrollBehavior = ScrollBehavior.Auto);
ValueTask ScrollToYearAsync(string elementId);
ValueTask ScrollToListItemAsync(string elementId);
ValueTask LockScrollAsync(string selector = "body", string cssClass = "scroll-locked");
ValueTask UnlockScrollAsync(string selector = "body", string cssClass = "scroll-locked");
ValueTask ScrollToBottomAsync(string elementId, ScrollBehavior scrollBehavior = ScrollBehavior.Auto);
}
public class ScrollManager : IScrollManager
{
[Obsolete]
public string Selector { get; set; }
private readonly IJSRuntime _jSRuntime;
public ScrollManager(IJSRuntime jSRuntime)
{
_jSRuntime = jSRuntime;
}
/// <summary>
/// Scrolls to the coordinates of the element
/// </summary>
/// <param name="id">id of element</param>
/// <param name="left">x coordinate</param>
/// <param name="top">y coordinate</param>
/// <param name="behavior">smooth or auto</param>
/// <returns></returns>
public ValueTask ScrollToAsync(string id, int left, int top, ScrollBehavior behavior) =>
_jSRuntime.InvokeVoidAsync("scrollManager.scrollTo", id, left, top, behavior.ToDescriptionString());
/// <summary>
/// Scrolls the first instance of the selector into view
/// </summary>
/// <param name="selector"></param>
/// <param name="behavior"></param>
/// <returns></returns>
public ValueTask ScrollIntoViewAsync(string selector, ScrollBehavior behavior) =>
_jSRuntime.InvokeVoidAsync("scrollManager.scrollIntoView", selector, behavior.ToDescriptionString());
/// <summary>
/// Scrolls to the top of the element
/// </summary>
/// <param name="id">id of element</param>
/// <param name="scrollBehavior">smooth or auto</param>
/// <returns></returns>
public ValueTask ScrollToTopAsync(string id, ScrollBehavior scrollBehavior = ScrollBehavior.Auto) =>
ScrollToAsync(id, 0, 0, scrollBehavior);
public async Task ScrollToTop(ScrollBehavior scrollBehavior = ScrollBehavior.Auto)
{
#pragma warning disable CS0612 // Type or member is obsolete
await ScrollToAsync(Selector, 0, 0, scrollBehavior);
#pragma warning restore CS0612 // Type or member is obsolete
}
/// <summary>
/// Scroll to the bottom of the element (or if not found to the bottom of the page)
/// </summary>
/// <param name="id">id of element of null to scroll to page bottom</param>
/// <param name="behavior">smooth or auto</param>
/// <returns></returns>
public ValueTask ScrollToBottomAsync(string id, ScrollBehavior behavior) =>
_jSRuntime.InvokeVoidAsync("scrollManager.scrollToBottom", id, behavior.ToDescriptionString());
public ValueTask ScrollToYearAsync(string elementId) =>
_jSRuntime.InvokeVoidAsync("scrollManager.scrollToYear", elementId);
public ValueTask ScrollToListItemAsync(string elementId) =>
_jSRuntime.InvokeVoidAsync("scrollManager.scrollToListItem", elementId);
public ValueTask LockScrollAsync(string selector = "body", string cssClass = "scroll-locked") =>
_jSRuntime.InvokeVoidAsync("scrollManager.lockScroll", selector, cssClass);
public ValueTask UnlockScrollAsync(string selector = "body", string cssClass = "scroll-locked") =>
_jSRuntime.InvokeVoidAsyncIgnoreErrors("scrollManager.unlockScroll", selector, cssClass);
}
/// <summary>
/// Smooth: scrolls in a smooth fashion;
/// Auto: is immediate
/// </summary>
public enum ScrollBehavior
{
Smooth,
Auto
}
}