@using BlazorMonaco.Editor @using Microsoft.JSInterop @namespace LANCommander.UI.Components @inject IJSRuntime JSRuntime @code { [Parameter] public EventCallback OnSave { get; set; } [Parameter] public Language Language { get; set; } [Parameter] public int Height { get; set; } = 450; [Parameter] public string? Value { get; set; } [Parameter] public EventCallback ValueChanged { get; set; } static bool _completionsRegistered; bool _isEditorInitialized = false; string? _previousValue; StandaloneCodeEditor _editor; StandaloneEditorConstructionOptions _editorConstructionOptions(StandaloneCodeEditor editor) => new() { AutomaticLayout = true, Language = Language.Id, Theme = "vs-dark", Value = Value, }; protected override async Task OnParametersSetAsync() { if (_isEditorInitialized && ValueChanged.HasDelegate && Value != _previousValue) { _previousValue = Value; await _editor.SetValue(Value); } await base.OnParametersSetAsync(); } async Task OnInit() { _isEditorInitialized = true; await _editor.AddCommand((int)BlazorMonaco.KeyMod.CtrlCmd | (int)BlazorMonaco.KeyCode.KeyS, async (editor) => { if (OnSave.HasDelegate) await OnSave.InvokeAsync(); }, null); if (!_completionsRegistered) { _completionsRegistered = true; var module = await JSRuntime.InvokeAsync( "import", "./_content/LANCommander.UI/bundle.js"); await module.InvokeVoidAsync("registerPowerShellCompletions"); } } public async Task InsertText(string text) { var position = await _editor.GetPosition(); var range = new BlazorMonaco.Range(position.LineNumber, 1, position.LineNumber, 1); var selections = await _editor.GetSelections(); await _editor.ExecuteEdits("CodeInput", new List { new IdentifiedSingleEditOperation { Range = range, Text = text, ForceMoveMarkers = true } }, selections); } async Task OnChangedContent(ModelContentChangedEvent e) { if (ValueChanged.HasDelegate) { _previousValue = await _editor.GetValue(); await ValueChanged.InvokeAsync(_previousValue); } } }