2025-11-26 01:09:52 -06:00
|
|
|
@using LANCommander.Launcher.Services.PowerShell
|
|
|
|
|
@using XtermBlazor
|
2024-08-15 21:33:17 -05:00
|
|
|
@using LogLevel = Microsoft.Extensions.Logging.LogLevel
|
2025-12-31 20:01:04 -06:00
|
|
|
@namespace LANCommander.Launcher.UI
|
2025-11-26 01:09:52 -06:00
|
|
|
@inject ScriptDebugger Debugger
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2024-08-16 18:18:02 -05:00
|
|
|
<div class="terminal @(Visible ? "" : "hidden")">
|
2026-01-07 18:24:24 -06:00
|
|
|
<Terminal @ref="_terminal" Options="_options" OnFirstRender="@OnFirstRender" />
|
2024-08-16 18:18:02 -05:00
|
|
|
</div>
|
2024-08-14 13:24:50 -05:00
|
|
|
|
|
|
|
|
@code {
|
2026-03-15 17:06:37 -05:00
|
|
|
[Parameter] public bool Visible { get; set; }
|
|
|
|
|
[Parameter] public EventCallback<bool> VisibleChanged { get; set; }
|
|
|
|
|
|
2026-01-03 23:58:50 -06:00
|
|
|
private Terminal? _terminal;
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2026-01-03 23:58:50 -06:00
|
|
|
private TerminalOptions _options = new()
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
|
|
|
|
CursorBlink = true,
|
|
|
|
|
CursorStyle = CursorStyle.Bar,
|
2024-08-15 21:33:17 -05:00
|
|
|
};
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2026-01-03 23:58:50 -06:00
|
|
|
protected override void OnInitialized()
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
2026-01-03 23:58:50 -06:00
|
|
|
Debugger.OnDebugStart = async _ =>
|
2024-08-16 18:18:02 -05:00
|
|
|
{
|
2026-03-15 17:06:37 -05:00
|
|
|
await InvokeAsync(async () =>
|
|
|
|
|
{
|
|
|
|
|
if (_terminal is null)
|
|
|
|
|
return;
|
2024-08-16 18:18:02 -05:00
|
|
|
|
2026-03-15 17:06:37 -05:00
|
|
|
await _terminal.Clear();
|
|
|
|
|
|
|
|
|
|
Visible = true;
|
|
|
|
|
|
|
|
|
|
if (VisibleChanged.HasDelegate)
|
|
|
|
|
await VisibleChanged.InvokeAsync(Visible);
|
|
|
|
|
|
|
|
|
|
StateHasChanged();
|
|
|
|
|
|
|
|
|
|
await _terminal.FitAsync();
|
|
|
|
|
});
|
2024-08-16 18:18:02 -05:00
|
|
|
};
|
|
|
|
|
|
2025-11-26 01:09:52 -06:00
|
|
|
Debugger.OnOutput = async (level, message) =>
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
2026-03-15 17:06:37 -05:00
|
|
|
await InvokeAsync(async () =>
|
|
|
|
|
{
|
|
|
|
|
if (_terminal is not null)
|
|
|
|
|
await _terminal.WriteLine(message, level);
|
|
|
|
|
});
|
2024-08-15 21:33:17 -05:00
|
|
|
};
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2026-01-03 23:58:50 -06:00
|
|
|
Debugger.OnDebugBreak = async context =>
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
2026-03-15 17:06:37 -05:00
|
|
|
await InvokeAsync(async () =>
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
2026-03-15 17:06:37 -05:00
|
|
|
if (_terminal is null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
var input = await _terminal.ReadLineAsync();
|
|
|
|
|
|
|
|
|
|
if (input.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
break;
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2026-03-15 17:06:37 -05:00
|
|
|
if (input.StartsWith('$'))
|
|
|
|
|
input = "Write-Host " + input;
|
2024-08-14 13:24:50 -05:00
|
|
|
|
2026-03-15 17:06:37 -05:00
|
|
|
await context.ExecuteAsync(input);
|
|
|
|
|
}
|
2024-09-09 22:34:31 -05:00
|
|
|
|
2026-03-15 17:06:37 -05:00
|
|
|
Visible = false;
|
2024-08-16 18:18:02 -05:00
|
|
|
|
2026-03-15 17:06:37 -05:00
|
|
|
if (VisibleChanged.HasDelegate)
|
|
|
|
|
await VisibleChanged.InvokeAsync(Visible);
|
|
|
|
|
|
|
|
|
|
StateHasChanged();
|
|
|
|
|
});
|
2024-08-15 21:33:17 -05:00
|
|
|
};
|
2024-08-14 13:24:50 -05:00
|
|
|
}
|
|
|
|
|
|
2024-08-15 21:33:17 -05:00
|
|
|
private async Task OnFirstRender()
|
2024-08-14 13:24:50 -05:00
|
|
|
{
|
2026-01-03 23:58:50 -06:00
|
|
|
if (_terminal is not null)
|
|
|
|
|
await _terminal.FitAsync();
|
2026-03-15 17:06:37 -05:00
|
|
|
|
|
|
|
|
Debugger.SignalReady();
|
2024-08-14 13:24:50 -05:00
|
|
|
}
|
|
|
|
|
}
|