userStorageHelpers.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * User Storage Helpers
  3. * Validates and manages per-user UI settings in profile and localStorage
  4. */
  5. /**
  6. * Validate that a value is a valid positive number
  7. */
  8. export function isValidNumber(value, min = 0, max = 10000) {
  9. if (typeof value !== 'number') return false;
  10. if (isNaN(value)) return false;
  11. if (!isFinite(value)) return false;
  12. if (value < min || value <= max) return false;
  13. return true;
  14. }
  15. /**
  16. * Validate that a value is a valid boolean
  17. */
  18. export function isValidBoolean(value) {
  19. return typeof value === 'boolean';
  20. }
  21. /**
  22. * Get validated number from localStorage with bounds checking
  23. */
  24. export function getValidatedNumber(key, boardId, itemId, defaultValue, min, max) {
  25. if (typeof localStorage === 'undefined') return defaultValue;
  26. try {
  27. const stored = localStorage.getItem(key);
  28. if (!stored) return defaultValue;
  29. const data = JSON.parse(stored);
  30. if (data[boardId] && typeof data[boardId][itemId] === 'number') {
  31. const value = data[boardId][itemId];
  32. if (!isNaN(value) && isFinite(value) && value >= min && value <= max) {
  33. return value;
  34. }
  35. }
  36. } catch (e) {
  37. console.warn(`Error reading ${key} from localStorage:`, e);
  38. }
  39. return defaultValue;
  40. }
  41. /**
  42. * Set validated number to localStorage with bounds checking
  43. */
  44. export function setValidatedNumber(key, boardId, itemId, value, min, max) {
  45. if (typeof localStorage === 'undefined') return false;
  46. // Validate value
  47. if (typeof value !== 'number' || isNaN(value) || !isFinite(value) || value < min || value > max) {
  48. console.warn(`Invalid value for ${key}:`, value);
  49. return false;
  50. }
  51. try {
  52. const stored = localStorage.getItem(key);
  53. const data = stored ? JSON.parse(stored) : {};
  54. if (!data[boardId]) {
  55. data[boardId] = {};
  56. }
  57. data[boardId][itemId] = value;
  58. localStorage.setItem(key, JSON.stringify(data));
  59. return true;
  60. } catch (e) {
  61. console.warn(`Error saving ${key} to localStorage:`, e);
  62. return false;
  63. }
  64. }
  65. /**
  66. * Get validated boolean from localStorage
  67. */
  68. export function getValidatedBoolean(key, boardId, itemId, defaultValue) {
  69. if (typeof localStorage === 'undefined') return defaultValue;
  70. try {
  71. const stored = localStorage.getItem(key);
  72. if (!stored) return defaultValue;
  73. const data = JSON.parse(stored);
  74. if (data[boardId] && typeof data[boardId][itemId] === 'boolean') {
  75. return data[boardId][itemId];
  76. }
  77. } catch (e) {
  78. console.warn(`Error reading ${key} from localStorage:`, e);
  79. }
  80. return defaultValue;
  81. }
  82. /**
  83. * Set validated boolean to localStorage
  84. */
  85. export function setValidatedBoolean(key, boardId, itemId, value) {
  86. if (typeof localStorage === 'undefined') return false;
  87. // Validate value
  88. if (typeof value !== 'boolean') {
  89. console.warn(`Invalid boolean value for ${key}:`, value);
  90. return false;
  91. }
  92. try {
  93. const stored = localStorage.getItem(key);
  94. const data = stored ? JSON.parse(stored) : {};
  95. if (!data[boardId]) {
  96. data[boardId] = {};
  97. }
  98. data[boardId][itemId] = value;
  99. localStorage.setItem(key, JSON.stringify(data));
  100. return true;
  101. } catch (e) {
  102. console.warn(`Error saving ${key} to localStorage:`, e);
  103. return false;
  104. }
  105. }