File: PreserveStateService.cs
Web Access
Project: src\src\Components\test\testassets\BasicTestApp\BasicTestApp.csproj (BasicTestApp)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
 
namespace BasicTestApp;
 
public class PreserveStateService : IDisposable
{
    private readonly PersistentComponentState _componentApplicationState;
    private PersistingComponentStateSubscription _persistingSubscription;
 
    private ServiceState _state = new();
 
    public PreserveStateService(PersistentComponentState componentApplicationState)
    {
        _componentApplicationState = componentApplicationState;
        _persistingSubscription = _componentApplicationState.RegisterOnPersisting(PersistState, RenderMode.InteractiveAuto);
        TryRestoreState();
    }
 
    public Guid Guid => _state.TheState;
 
    private void TryRestoreState()
    {
        if (_componentApplicationState.TryTakeFromJson<ServiceState>("Service", out var state))
        {
            _state = state;
        }
        else
        {
            _state = new ServiceState { TheState = Guid.NewGuid() };
        }
    }
 
    public void NewState() => _state = new ServiceState { TheState = Guid.NewGuid() };
 
    private Task PersistState()
    {
        _componentApplicationState.PersistAsJson("Service", _state);
        return Task.CompletedTask;
    }
 
    public void Dispose() => _persistingSubscription.Dispose();
 
    private class ServiceState
    {
        public Guid TheState { get; set; }
    }
}