deprived-main-website/OpenBirchWebsite/Pages/Home.razor

118 lines
3.4 KiB
Plaintext

@page "/"
@inject OpenBirchConsole console
@inject IJSRuntime jsRuntime
@inject NavigationManager nav
<PageTitle>Home</PageTitle>
<div class="double_centered_boxes">
<MudText Align="Align.Center" Typo="Typo.h2">Welcome to<br /><b>OpenBirch!!!</b></MudText>
<div></div>
<div style="height: 200px; display: grid; place-items: end center;">
<MudPaper Style="background-color: #191724; height: 200px;" Elevation="4" Class="input-field pt-0 console-container">
<div style="height: 100%;" class="reverse-stack-direction overflow-hidden">
@for (int i = 0; i < console.history.Count; i++)
{
int temp = i;
<MudText Align="Align.Start"> @((console.history[temp].source == ConsoleSource.User) ? ">" : "#") @console.history[temp].text</MudText>
}
</div>
<MudTextField Class="" Style="color: #e0def4;" @bind-Value="inputField" OnKeyDown="OnKeyDown" Variant="Variant.Outlined" @onclick='OnInputClicked'></MudTextField>
</MudPaper>
</div>
</div>
@code {
public string inputField = " ";
public bool hasInteracted = false; // Has the user interacted with the input field?
private Task AutoTypingTask;
readonly string[] exampleInputs = {
"2+2",
"69*420+50",
"sin(2+4)",
"sqrt(9)",
"nroot(27, 3)",
"f(x):=2*x",
"f(5)",
"pi",
"e",
"myvar := 5",
"15 + myvar",
"myfunctionvar := f",
"myfunctionvar(10)",
"d/dx x",
"d/dx x^2",
"d/dx 69*x^2",
"d/dx sin(x)*x^2"
};
private void print(string e)
{
Console.WriteLine(e);
}
protected override async Task OnInitializedAsync()
{
AutoTypingTask = StartAutoTyping();
}
private async void OnInputClicked()
{
hasInteracted = true;
await AutoTypingTask;
nav.NavigateTo("openbirch");
}
async void OnKeyDown(KeyboardEventArgs args)
{
if (args.Key == "Enter")
{
await Task.Delay(100);
sendCommand(inputField);
StateHasChanged();
}
}
private async void sendCommand(string command)
{
inputField = "";
await console.pushCommand(command);
await InvokeAsync(StateHasChanged);
}
const int typingDelay = 200;
private async Task StartAutoTyping()
{
await Task.Delay(1000);
foreach (string example in exampleInputs)
{
foreach (char letter in example)
{
inputField += letter;
await InvokeAsync(StateHasChanged); // Trigger UI update
await Task.Delay(200); // Non-blocking delay
// Makes it check if user inputted while waiting
const int waitTime = 10;
int waitedTime = 0;
while (waitedTime < typingDelay)
{
await Task.Delay(waitTime);
waitedTime += waitTime;
if (!hasInteracted) goto earlyExit;
}
inputField = ""; // Clear input and let user input
await InvokeAsync(StateHasChanged);
return;
earlyExit:;
}
sendCommand(inputField);
await Task.Delay(500);
}
}
}