📄 src/App/ViewModels/MainViewModel.cs
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using MMirror.App.ViewModels.Panels;
using MMirror.Integrations.FaceCamera;

namespace MMirror.App.ViewModels;

public partial class MainViewModel : ViewModelBase
{
    private readonly FaceDetectionService faceDetectionService;

    [ObservableProperty]
    public partial bool FaceNear { get; set; }

    public ViewModelBase Olskrokstorget { get; }
    public ViewModelBase Svingeln { get; }
    public ViewModelBase Weather { get; }
    public ViewModelBase UpperRight { get; }

    public MainViewModel(
        FaceDetectionService faceDetectionService,
        VasttrafikPanelViewModel olskrokstorget,
        VasttrafikPanelViewModel svingeln,
        WeatherPanelViewModel smhi,
        DateTimePanelViewModel dateTimePanelViewModel
    )
    {
        this.faceDetectionService = faceDetectionService;

        olskrokstorget.StopName = "Olskrokstorget";
        olskrokstorget.StopId = "9021014005160000";
        Olskrokstorget = olskrokstorget;

        svingeln.StopName = "Svingeln";
        svingeln.StopId = "9021014006480000";
        svingeln.Platforms = ["C", "D", "E", "F", "G"];
        Svingeln = svingeln;

        smhi.LocationName = "Gรถteborg";
        smhi.Latitude = 57.714263;
        smhi.Longitude = 12.000887;
        Weather = smhi;

        UpperRight = dateTimePanelViewModel;
    }

    public void Watch()
    {
        faceDetectionService.FaceDetected += OnFaceDetected;
    }

    private void OnFaceDetected(bool isFaceDetected) => FaceNear = isFaceDetected;

    public void UnWatch()
    {
        faceDetectionService.FaceDetected -= OnFaceDetected;
    }
}

internal static class MainViewModelServiceCollectionExtensions
{
    extension(IServiceCollection services)
    {
        public IServiceCollection AddMainViewModel()
        {
            services.TryAddSingleton(TimeProvider.System);
            services.AddTransient<MainViewModel>();
            return services;
        }
    }
}