Refactor code structure for improved readability and maintainability

This commit is contained in:
MaddoScientisto 2026-02-21 10:40:12 +01:00
commit 4f488bae45
78 changed files with 3309 additions and 1570 deletions

View file

@ -0,0 +1,64 @@
@page "/"
@inject TwitchArchive.Core.Workers.StreamWorkerManager WorkerManager
@inject TwitchArchive.Web.Services.SessionCacheService SessionCache
<h2>Dashboard</h2>
<div class="cards">
@foreach (var s in streamers)
{
<div class="card">
<div class="card-header">
<a href="/streamer/@s">@s</a>
<span class="badge">@(WorkerManager.IsRunning(s) ? "Live" : "Offline")</span>
</div>
<div class="card-body">
<div>Last session: @(lastStarts.ContainsKey(s) ? lastStarts[s].ToLocalTime().ToString() : "-")</div>
<div class="actions">
<button @onclick="() => Start(s)">Start</button>
<button @onclick="() => Stop(s)">Stop</button>
</div>
</div>
</div>
}
</div>
@code {
private List<string> streamers = new();
private Dictionary<string, DateTime> lastStarts = new();
private void OnCacheUpdatedHandler()
{
_ = InvokeAsync(() => {
lastStarts = SessionCache.GetSnapshot();
StateHasChanged();
});
}
protected override async Task OnInitializedAsync()
{
LoadStreamers();
lastStarts = SessionCache.GetSnapshot();
SessionCache.Updated += OnCacheUpdatedHandler;
}
private void LoadStreamers()
{
var cfgDir = Path.Combine(Environment.CurrentDirectory, "config", "streamers");
if (Directory.Exists(cfgDir))
{
streamers = Directory.GetFiles(cfgDir, "*.json").Select(f => Path.GetFileNameWithoutExtension(f)).ToList();
}
}
// Index reads from the singleton SessionCacheService; updates are pushed via the Updated event.
private void Start(string u) { WorkerManager.StartWorker(u); }
private async Task Stop(string u) { await WorkerManager.StopWorkerAsync(u); }
public async ValueTask DisposeAsync()
{
SessionCache.Updated -= OnCacheUpdatedHandler;
await Task.CompletedTask;
}
}