using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; namespace LANCommander.UI.Providers; public class ScriptProvider(IJSRuntime js) { private const string ScriptAsset = "./_content/LANCommander.UI/bundle.js"; private IJSObjectReference? _module; public async Task InitializeAsync() => _module ??= await js.InvokeAsync("import", ScriptAsset); public async Task ImportModuleAsync(TComponent component, params object[] args) where TComponent : class, IComponent { var mergedArgs = new object[args.Length + 1]; mergedArgs[0] = DotNetObjectReference.Create(component); Array.Copy(args, 0, mergedArgs, 1, args.Length); return await ImportModuleAsync(args); } public async Task ImportModuleAsync(TComponent component, string moduleName, params object[] args) where TComponent : class, IComponent { var mergedArgs = new object[args.Length + 1]; mergedArgs[0] = DotNetObjectReference.Create(component); Array.Copy(args, 0, mergedArgs, 1, args.Length); return await ImportModuleAsync(moduleName, mergedArgs); } public async Task ImportModuleAsync(params object[] args) { var type = typeof(T); return await ImportModuleAsync(type.Name, args); } public async Task ImportModuleAsync(string moduleName, params object[] args) { await InitializeAsync(); return await _module!.InvokeAsync($"{moduleName}.Create", args); } public async Task InvokeVoidAsync(string method, params object[] args) { await InitializeAsync(); await _module!.InvokeVoidAsync(method, args); } public async Task InvokeAsync(string method, params object[] args) { await InitializeAsync(); return await _module!.InvokeAsync(method, args); } }