using System.Text.Json;
using Microsoft.JSInterop;
namespace WebApp;
///
/// Service for managing browser localStorage with type-safe methods.
///
public sealed class LocalStorageService
{
private readonly IJSRuntime _jsRuntime;
private readonly ILogger _logger;
public LocalStorageService(IJSRuntime jsRuntime, ILogger logger)
{
_jsRuntime = jsRuntime;
_logger = logger;
}
///
/// Gets a boolean value from localStorage.
///
/// The storage key.
/// Default value if key doesn't exist or parsing fails.
/// The stored boolean value or default value.
public async Task GetBoolAsync(string key, bool defaultValue = false)
{
try
{
var value = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
return value != null && bool.TryParse(value, out var result) ? result : defaultValue;
}
catch
{
return defaultValue;
}
}
///
/// Sets a boolean value in localStorage.
///
/// The storage key.
/// The boolean value to store.
public async Task SetBoolAsync(string key, bool value)
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, value.ToString());
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to save boolean to localStorage [{Key}]", key);
}
}
///
/// Gets an integer value from localStorage.
///
/// The storage key.
/// Default value if key doesn't exist or parsing fails.
/// The stored integer value or default value.
public async Task GetIntAsync(string key, int defaultValue = 0)
{
try
{
var value = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
return value != null && int.TryParse(value, out var result) ? result : defaultValue;
}
catch
{
return defaultValue;
}
}
///
/// Sets an integer value in localStorage.
///
/// The storage key.
/// The integer value to store.
public async Task SetIntAsync(string key, int value)
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, value.ToString());
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to save integer to localStorage [{Key}]", key);
}
}
///
/// Gets an array of integers from localStorage (stored as JSON).
///
/// The storage key.
/// Array of integers or empty array if not found.
public async Task GetIntArrayAsync(string key)
{
try
{
var json = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
if (!string.IsNullOrEmpty(json))
{
var array = JsonSerializer.Deserialize(json);
return array ?? [];
}
return [];
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to load integer array from localStorage [{Key}]", key);
return [];
}
}
///
/// Sets an array of integers in localStorage (stored as JSON).
///
/// The storage key.
/// The integer array to store.
public async Task SetIntArrayAsync(string key, int[] values)
{
try
{
var json = JsonSerializer.Serialize(values);
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, json);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to save integer array to localStorage [{Key}]", key);
}
}
///
/// Removes an item from localStorage.
///
/// The storage key to remove.
public async Task RemoveAsync(string key)
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.removeItem", key);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to remove from localStorage [{Key}]", key);
}
}
///
/// Gets a JSON-serialized object from localStorage.
///
/// The type to deserialize to.
/// The storage key.
/// The deserialized object or default value if not found.
public async Task GetJsonAsync(string key)
{
try
{
var json = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
if (!string.IsNullOrEmpty(json))
{
return JsonSerializer.Deserialize(json);
}
return default;
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to load JSON from localStorage [{Key}]", key);
return default;
}
}
///
/// Sets a JSON-serialized object in localStorage.
///
/// The type to serialize.
/// The storage key.
/// The object to store.
public async Task SetJsonAsync(string key, T value)
{
try
{
var json = JsonSerializer.Serialize(value);
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, json);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to save JSON to localStorage [{Key}]", key);
}
}
///
/// Clears all items from localStorage.
///
public async Task ClearAsync()
{
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.clear");
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to clear localStorage");
}
}
}