using FluentResults;
using Microsoft.JSInterop;
using NexusReader.Application.Abstractions.Services;
namespace NexusReader.Web.New.Services;
///
/// Server-side implementation of INativeStorageService for Blazor Server.
/// Uses JS Interop to access browser local storage.
///
public class NativeStorageService : INativeStorageService
{
private readonly IJSRuntime _jsRuntime;
public NativeStorageService(IJSRuntime jsRuntime)
{
_jsRuntime = jsRuntime;
}
public async Task> GetSecureString(string key)
{
try
{
var value = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
return Result.Ok(value ?? string.Empty);
}
catch (Exception ex)
{
return Result.Fail(new Error("Failed to read from local storage").CausedBy(ex));
}
}
public async Task SaveSecureString(string key, string value)
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, value);
return Result.Ok();
}
catch (Exception ex)
{
return Result.Fail(new Error("Failed to write to local storage").CausedBy(ex));
}
}
public async Task> GetBool(string key)
{
var result = await GetSecureString(key);
if (result.IsFailed) return Result.Fail(result.Errors);
return Result.Ok(bool.TryParse(result.Value, out var val) && val);
}
public async Task SaveBool(string key, bool value)
{
return await SaveSecureString(key, value.ToString().ToLower());
}
public async Task> GetInt(string key)
{
var result = await GetSecureString(key);
if (result.IsFailed) return Result.Fail(result.Errors);
return Result.Ok(int.TryParse(result.Value, out var val) ? val : 0);
}
public async Task SaveInt(string key, int value)
{
return await SaveSecureString(key, value.ToString());
}
public async Task ClearAll()
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.clear");
return Result.Ok();
}
catch (Exception ex)
{
return Result.Fail(new Error("Failed to clear local storage").CausedBy(ex));
}
}
}