LANCommander/LANCommander.UI/Components/CodeInput/CodeInput.razor

90 lines
No EOL
2.6 KiB
Text

@using BlazorMonaco.Editor
@using Microsoft.JSInterop
@namespace LANCommander.UI.Components
@inject IJSRuntime JSRuntime
<StandaloneCodeEditor
@ref="_editor"
OnDidChangeModelContent="OnChangedContent"
OnDidInit="OnInit"
ConstructionOptions="_editorConstructionOptions" />
@code {
[Parameter] public EventCallback<string> 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<string?> 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<IJSObjectReference>(
"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<IdentifiedSingleEditOperation>
{
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);
}
}
}