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"); } } }