diff --git a/DbFirst.BlazorWebApp/Components/Layout/NavMenu.razor b/DbFirst.BlazorWebApp/Components/Layout/NavMenu.razor
index 68901b3..a4c739c 100644
--- a/DbFirst.BlazorWebApp/Components/Layout/NavMenu.razor
+++ b/DbFirst.BlazorWebApp/Components/Layout/NavMenu.razor
@@ -31,6 +31,12 @@
MassData
+
+
+
+ Clock
+
+
diff --git a/DbFirst.BlazorWebApp/Components/Pages/Clock.razor b/DbFirst.BlazorWebApp/Components/Pages/Clock.razor
new file mode 100644
index 0000000..fe35b78
--- /dev/null
+++ b/DbFirst.BlazorWebApp/Components/Pages/Clock.razor
@@ -0,0 +1,100 @@
+@rendermode InteractiveServer
+@page "/clock"
+@inject TimeApiClient TimeApi
+@implements IAsyncDisposable
+
+Clock
+
+DB Server Clock
+
+
+
+ @if (_dbTime.HasValue)
+ {
+ @_dbTime.Value.ToString("HH:mm:ss")
+ @_dbTime.Value.ToString("dd.MM.yyyy")
+ }
+ else if (_error != null)
+ {
+ --:--:--
+ @_error
+ }
+ else
+ {
+ ...
+ }
+
+
+
+
+
+@code {
+ private DateTime? _dbTime;
+ private string? _error;
+ private Timer? _timer;
+
+ protected override async Task OnInitializedAsync()
+ {
+ await TickAsync();
+ _timer = new Timer(async _ =>
+ {
+ await TickAsync();
+ await InvokeAsync(StateHasChanged);
+ }, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
+ }
+
+ private async Task TickAsync()
+ {
+ try
+ {
+ _dbTime = await TimeApi.InsertAndGetLastAsync();
+ _error = null;
+ }
+ catch (Exception ex)
+ {
+ _error = ex.Message;
+ }
+ }
+
+ public async ValueTask DisposeAsync()
+ {
+ if (_timer != null)
+ await _timer.DisposeAsync();
+ }
+}
diff --git a/DbFirst.BlazorWebApp/Program.cs b/DbFirst.BlazorWebApp/Program.cs
index e06db92..ed58f10 100644
--- a/DbFirst.BlazorWebApp/Program.cs
+++ b/DbFirst.BlazorWebApp/Program.cs
@@ -31,6 +31,10 @@ if (!string.IsNullOrWhiteSpace(apiBaseUrl))
{
client.BaseAddress = new Uri(apiBaseUrl);
});
+ builder.Services.AddHttpClient(client =>
+ {
+ client.BaseAddress = new Uri(apiBaseUrl);
+ });
}
else
{
@@ -38,6 +42,7 @@ else
builder.Services.AddHttpClient();
builder.Services.AddHttpClient();
builder.Services.AddHttpClient();
+ builder.Services.AddHttpClient();
}
var app = builder.Build();
diff --git a/DbFirst.BlazorWebApp/Services/TimeApiClient.cs b/DbFirst.BlazorWebApp/Services/TimeApiClient.cs
new file mode 100644
index 0000000..b2f0b74
--- /dev/null
+++ b/DbFirst.BlazorWebApp/Services/TimeApiClient.cs
@@ -0,0 +1,27 @@
+using System.Net.Http.Json;
+
+namespace DbFirst.BlazorWebApp.Services;
+
+public class TimeApiClient
+{
+ private readonly HttpClient _httpClient;
+ private const string Endpoint = "api/time";
+
+ public TimeApiClient(HttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ }
+
+ public async Task InsertAndGetLastAsync()
+ {
+ var response = await _httpClient.PostAsync(Endpoint, null);
+ response.EnsureSuccessStatusCode();
+ var result = await response.Content.ReadFromJsonAsync();
+ return result?.Now;
+ }
+
+ private sealed class TimeResponse
+ {
+ public DateTime? Now { get; set; }
+ }
+}