📄 src/App/Views/Panels/VasttrafikPanel.axaml.cs
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Converters;
using MMirror.App.ViewModels.Panels;

namespace MMirror.App.Views.Panels;

public partial class VasttrafikPanel : UserControl
{
    public VasttrafikPanel()
    {
        InitializeComponent();
    }

    protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
    {
        base.OnAttachedToVisualTree(e);

        if (DataContext is VasttrafikPanelViewModel vm)
        {
            vm.SubscribeToUpdates();
        }
    }

    protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
    {
        if (DataContext is VasttrafikPanelViewModel vm)
        {
            vm.UnsubscribeFromUpdates();
        }

        base.OnDetachedFromVisualTree(e);
    }
}

public sealed class MinutesLeftBinding(BindingBase target)
{
    public required BindingBase CurrentTime { get; set; }

    public object ProvideValue() =>
        new MultiBinding()
        {
            Bindings = [target, CurrentTime],
            Converter = new FuncMultiValueConverter<DateTimeOffset, string>(times =>
            {
                var minutesLeft = (int)double.Floor((times[0] - times[1]).TotalMinutes);
                return minutesLeft is 0 ? "Nu" : minutesLeft.ToString();
            }),
        };
}