using Blazored.LocalStorage;
using decePubClient.Models;
namespace decePubClient.Services
{
///
/// Asks a persona, once, before its first reaction or poll vote, to accept that these are public and visible as that
/// persona (an owner decision). PublicNoticeHost shows the question; Confirm returns true at once for a persona that
/// already accepted it, and false when the reader declines.
///
public class PublicNoticeService(ILocalStorageService localStorage)
{
TaskCompletionSource pending;
public event Action Changed;
public bool IsAsking => pending is not null;
public async Task Confirm(string personaId, CancellationToken cancellationToken = default)
{
if (string.IsNullOrEmpty(personaId))
return false;
var seen = await localStorage.GetItemAsync(nameof(PublicActionNotices), cancellationToken) ?? new();
if (seen.PersonaIds.Contains(personaId))
return true;
pending = new TaskCompletionSource();
Changed?.Invoke();
var accepted = await pending.Task;
pending = null;
Changed?.Invoke();
if (!accepted)
return false;
seen.PersonaIds.Add(personaId);
await localStorage.SetItemAsync(nameof(PublicActionNotices), seen, cancellationToken);
return true;
}
public void Answer(bool accepted) => pending?.TrySetResult(accepted);
}
}