private/components/Format-ResultsComponent.ps1
function Format-ResultsComponent { param ( [Spectre.Console.LiveDisplayContext] $Context, [Spectre.Console.Layout] $Layout, [int] $Mistakes, [string] $Completed, [string] $Mode, [int] $Timeout ) # Display results if ([string]::IsNullOrEmpty($Completed)) { throw "Completed string is empty" } $accuracy = 1 - ($Mistakes / $Completed.Length) $wpm = [math]::Round(($Completed.Split(" ").Count) / ($Timeout / 60), 2) $resultsData = [ordered]@{ "Date" = Get-Date "Mode" = $Mode "Words per Minute" = $wpm "Accuracy" = $accuracy "Mistakes" = $Mistakes "Completed" = $Completed.Split(" ").Count } $resultsTable = $resultsData | Format-SpectreTable -Title "[grey42]Results`n[/]" -Border Square -Color "white" $previousResults = Get-PreviousResults -Mode $Mode $resultsChartItems = @($previousResults | Sort-Object -Property Date | Select-Object -Last 4 | ForEach-Object { New-SpectreChartItem -Label $_.Date -Value $_."Words per Minute" -Color "#084406" }) $resultsChartItems += New-SpectreChartItem -Label $resultsData.Date -Value $resultsData."Words per Minute" -Color "#11910e" $resultsChart = $resultsChartItems | Format-SpectreBarChart -Width ([int]($Host.UI.RawUI.WindowSize.Width / 2)) $accuracyChartItems = @($previousResults | Sort-Object -Property Date | Select-Object -Last 4 | ForEach-Object { New-SpectreChartItem -Label $_.Date -Value ([int]($_.Accuracy * 100)) -Color "#9a3039" }) $accuracyChartItems += New-SpectreChartItem -Label $resultsData.Date -Value ([int]($resultsData.Accuracy * 100)) -Color "#e74856" $accuracyChart = $accuracyChartItems | Format-SpectreBarChart -Width ([int]($Host.UI.RawUI.WindowSize.Width / 2)) $results = @( $resultsTable, "", "[grey42]WPM History[/]", "", $resultsChart, "[grey42]`nAccuracy Percent History[/]", "", $accuracyChart ) | Format-SpectreRows | Format-SpectreAligned -HorizontalAlignment Center # Save results Set-PreviousResults -Results $resultsData $Layout.IsVisible = $true $Layout.Update($results) | Out-Null $Context.Refresh() Start-Sleep -Seconds 3 } |