📄 src/App/ViewModels/Panels/DateTimePanelViewModel.cs
using System;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace MMirror.App.ViewModels.Panels;

public partial class DateTimePanelViewModel : ViewModelBase
{
    private readonly TimeProvider timeProvider;
    private readonly DispatcherTimer dispatcherTimer;

    [ObservableProperty]
    public partial DateTimeOffset CurrentTime { get; private set; }

    public DateTimePanelViewModel(TimeProvider timeProvider)
    {
        this.timeProvider = timeProvider;
        CurrentTime = timeProvider.GetLocalNow();

        dispatcherTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
        dispatcherTimer.Tick += OnTick;
    }

    public void SubscribeToUpdates()
    {
        dispatcherTimer.Start();
    }

    private void OnTick(object? sender, EventArgs e)
    {
        CurrentTime = timeProvider.GetLocalNow();
    }

    public void UnsubscribeFromUpdates()
    {
        dispatcherTimer.Stop();
    }
}

internal static class DateTimePanelViewModelServiceCollectionExtensions
{
    extension(IServiceCollection services)
    {
        public IServiceCollection AddDateTimePanelViewModel()
        {
            services.TryAddSingleton(TimeProvider.System);
            services.AddTransient<DateTimePanelViewModel>();
            return services;
        }
    }
}