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; public LocalStorageService(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } /// /// 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) { Console.WriteLine($"Failed to save boolean to localStorage [{key}]: {ex.Message}"); } } /// /// 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) { Console.WriteLine($"Failed to save integer to localStorage [{key}]: {ex.Message}"); } } /// /// 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 ?? Array.Empty(); } return Array.Empty(); } catch (Exception ex) { Console.WriteLine($"Failed to load integer array from localStorage [{key}]: {ex.Message}"); return Array.Empty(); } } /// /// 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) { Console.WriteLine($"Failed to save integer array to localStorage [{key}]: {ex.Message}"); } } /// /// 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) { Console.WriteLine($"Failed to remove from localStorage [{key}]: {ex.Message}"); } } /// /// Clears all items from localStorage. /// public async Task ClearAsync() { try { await _jsRuntime.InvokeVoidAsync("localStorage.clear"); } catch (Exception ex) { Console.WriteLine($"Failed to clear localStorage: {ex.Message}"); } } }