state.js•1.96 kB
// state.js - Centralized state management for MARM chatbot
// ===== Centralized State Management for MARM Chatbot =====
const STATE_KEY = 'marm-current-state';
// --- Application State (Private) ---
const state = { 
  isMarmActive: false, 
  currentSessionId: null 
};
// --- State Getter ---
export function getState() {
  return { ...state };
}
// --- State Persistence ---
function persistState() {
  try {
    localStorage.setItem(STATE_KEY, JSON.stringify(state));
  } catch (e) {
    console.warn('Failed to persist state:', e);
  }
}
// --- State Restoration ---
export function restoreState() {
  try {
    const saved = localStorage.getItem(STATE_KEY);
    if (saved) {
      const parsedState = JSON.parse(saved);
      try {
        validateState(parsedState);
        Object.assign(state, parsedState);
      } catch (validationError) {
        console.warn('Saved state failed validation, resetting to defaults:', validationError);
        resetToDefaults();
      }
    }
  } catch (e) {
    console.warn('Failed to restore state, using defaults:', e);
    resetToDefaults();
  }
}
// --- State Reset ---
function resetToDefaults() {
  state.isMarmActive = false;
  state.currentSessionId = null;
  persistState(); 
}
restoreState();
// --- State Validation ---
export function validateState(newState) {
  if (typeof newState.isMarmActive !== 'boolean') {
    throw new Error('isMarmActive must be boolean');
  }
  if (newState.currentSessionId && typeof newState.currentSessionId !== 'string') {
    throw new Error('currentSessionId must be string or null');
  }
  return true;
}
// ===== State Management Functions =====
export function updateState(updates) {
  const newState = { ...state, ...updates };
  validateState(newState);
  
  Object.assign(state, newState);
  
  persistState();
  return { ...state };
}
export function resetState() {
  return updateState({
    isMarmActive: false,
    currentSessionId: null
  });
}