UI/MenuSystem/MainMenuPanel.razor
@using Sandbox;
@using Sandbox.UI;

@namespace Opium.UI
@inherits PanelComponent

<root>
    <MainMenu @ref="Menu" />
</root>

@code
{
    public static MainMenuPanel Current { get; set; }
    public MainMenu Menu { get; set; }

    [Property] List<PageCameraSetup> CameraSetup { get; set; } = new();
    [Property] public GameObject Camera { get; set; }

    Vector3 lerpedPos = Vector3.Zero;
    Rotation lerpedRot = Rotation.Identity;

    bool firstUpdate = false;

    [Property] public Action<string> OnUrlChangedAction { get; set; }

    // THIS EXISTS BECAUSE WE DON'T HAVE DYNAMIC ACTIONGRAPH PROPERTIES YET!!
    [Property] public SlidingDoorComponent ElevatorLeft { get; set; }
    [Property] public SlidingDoorComponent ElevatorRight { get; set; }
    [Property] public string PlaySceneUrl { get; set; } = "/play/demo";

    string currentUrl = "";
    public void OnUrlChanged( string url )
    {
        OnUrlChangedAction?.Invoke( url );
    }

    protected override void OnUpdate()
    {
        if (Menu is null) return;

        Current = this;

        var url = Menu.CurrentUrl;
        if (url != currentUrl )
        {
            currentUrl = url;
            OnUrlChanged(url);
        }

        var setup = CameraSetup.FirstOrDefault(x => x.Url == Menu.CurrentUrl);

        if (setup.CameraObject is null)
        {
            setup = CameraSetup.FirstOrDefault(x => x.Url == "/");
        }

        if ( !firstUpdate )
        {
            lerpedPos = Camera.Transform.Position;
            lerpedRot = Camera.Transform.Rotation;
            firstUpdate = true;
        }

        var targetPos = setup.CameraObject.Transform.Position;
        var targetRot = setup.CameraObject.Transform.Rotation;

        lerpedPos = lerpedPos.LerpTo( targetPos, Time.Delta * setup.PositionLerpSpeed );
        lerpedRot = Rotation.Lerp( lerpedRot, targetRot, Time.Delta * setup.RotationLerpSpeed );

        Camera.Transform.Position = lerpedPos;
        Camera.Transform.Rotation = lerpedRot;
    }
}