import React, { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.jsx' // Inicializa o objeto global window.commandCenter para gerenciamento de configurações de usuário // Verifica se já não foi definido para evitar sobrescrever em ambientes de desenvolvimento com Fast Refresh if (!window.commandCenter) { window.commandCenter = { _localStorageKey: 'commandCenterSettings', // Chave para o localStorage _settings: {}, // Armazenamento interno para as configurações (valor, defaultValue e callback) _listeners: [], // NEW: Array para armazenar funções de callback que reagem a mudanças /** * Carrega as configurações persistidas do localStorage. * @private * @returns {object} Um objeto com as configurações carregadas, ou um objeto vazio se não houver. */ _loadPersistedSettings() { try { const storedSettings = localStorage.getItem(this._localStorageKey); return storedSettings ? JSON.parse(storedSettings) : {}; } catch (e) { console.error("Erro ao carregar configurações do localStorage:", e); return {}; } }, /** * Salva as configurações atuais (apenas os valores) no localStorage. * @private */ _savePersistedSettings() { const settingsToPersist = {}; for (const key in this._settings) { settingsToPersist[key] = this._settings[key].value; } localStorage.setItem(this._localStorageKey, JSON.stringify(settingsToPersist)); }, /** * Notifica todos os listeners registrados sobre uma mudança nas configurações. * @private */ _notifyListeners() { // Passa uma cópia das configurações para evitar modificações diretas this._listeners.forEach(listener => listener(this.getAllSettings())); }, /** * Permite que um componente ou contexto se inscreva para receber notificações de mudanças nas configurações. * @param {function} listener - A função de callback a ser chamada quando as configurações mudarem. * @returns {function} Uma função para cancelar a inscrição (unsubscribe). */ subscribe(listener) { this._listeners.push(listener); // Retorna uma função para remover o listener return () => { this._listeners = this._listeners.filter(l => l !== listener); }; }, /** * Registra uma nova configuração com um valor inicial. * @param {string} key - O nome da configuração. * @param {*} defaultValue - O valor inicial da configuração. * @param {function} [onChangeCallback] - Callback opcional para ser executado quando a configuração mudar. */ registerSetting(key, defaultValue, onChangeCallback = null) { if (Object.prototype.hasOwnProperty.call(this._settings, key)) { console.warn(`A configuração '${key}' já está registrada. Sobrescrevendo.`); } // Tenta carregar o valor do localStorage, se existir, caso contrário usa o defaultValue const persistedSettings = this._loadPersistedSettings(); const initialValue = Object.prototype.hasOwnProperty.call(persistedSettings, key) ? persistedSettings[key] : defaultValue; this._settings[key] = { value: initialValue, // Usa o valor persistido ou o padrão defaultValue: defaultValue, // NEW: Armazena o valor padrão original onChange: onChangeCallback, }; console.log(`Configuração '${key}' registrada com valor:`, initialValue); }, /** * Obtém o valor atual de uma configuração. * @param {string} key - O nome da configuração. * @returns {*} O valor da configuração, ou undefined se não for encontrada. */ getSetting(key) { if (Object.prototype.hasOwnProperty.call(this._settings, key)) { return this._settings[key].value; } console.warn(`Configuração '${key}' não encontrada.`); return undefined; }, /** * Define um novo valor para uma configuração existente. * @param {string} key - O nome da configuração. * @param {*} newValue - O novo valor para a configuração. */ setSetting(key, newValue) { if (Object.prototype.hasOwnProperty.call(this._settings, key)) { const oldValue = this._settings[key].value; this._settings[key].value = newValue; console.log(`Configuração '${key}' alterada de '${oldValue}' para '${newValue}'.`); if (typeof this._settings[key].onChange === 'function') { this._settings[key].onChange(newValue, oldValue); } this._savePersistedSettings(); // Salva as configurações no localStorage após a alteração this._notifyListeners(); // NEW: Notifica todos os listeners após uma configuração ser alterada } else { console.warn(`Tentativa de definir a configuração não registrada '${key}'. Por favor, registre-a primeiro.`); } }, /** * Obtém todas as configurações registradas. * @returns {object} Um objeto contendo todas as configurações registradas e seus valores atuais. */ getAllSettings() { const all = {}; for (const key in this._settings) { if (Object.prototype.hasOwnProperty.call(this._settings, key)) { all[key] = this._settings[key].value; } } return all; }, /** * Reseta todas as configurações para seus valores padrão e limpa o localStorage. */ resetSettings() { localStorage.removeItem(this._localStorageKey); // Remove a chave do localStorage console.log("Configurações do localStorage limpas."); for (const key in this._settings) { if (Object.prototype.hasOwnProperty.call(this._settings, key)) { // Define cada configuração para seu valor padrão original. this.setSetting(key, this._settings[key].defaultValue); } } } }; // Exemplo: Registre algumas configurações de usuário iniciais window.commandCenter.registerSetting('theme', 'dark', (newValue) => { console.log('Tema alterado para:', newValue); document.body.className = newValue === 'dark' ? 'dark-theme' : 'light-theme'; }); window.commandCenter.registerSetting('notificationsEnabled', true); window.commandCenter.registerSetting('language', 'pt-BR'); // Registering settings used in App.jsx's local state for consistency window.commandCenter.registerSetting('litros', 45); window.commandCenter.registerSetting('valor', 250.00); window.commandCenter.registerSetting('media', 10.2); window.commandCenter.registerSetting('km', 12450); // Registra km window.commandCenter.registerSetting('meta', 8); // Registra meta de jornada window.commandCenter.registerSetting('hud', true); // Registra sobreposição HUD window.commandCenter.registerSetting('screenReading', false); // NEW: Leitura de Tela window.commandCenter.registerSetting('secretCamera', false); // NEW: Câmera Secreta window.commandCenter.registerSetting('costPerKm', 0.50); // NEW: Custo por KM Rodado window.commandCenter.registerSetting('pickupDistance', 5); // NEW: Distância do Embarque window.commandCenter.registerSetting('autoAcceptTrips', false); // NEW: Salva as configurações iniciais (incluindo defaults ou valores carregados) no localStorage window.commandCenter._savePersistedSettings(); } // 171 createRoot(document.getElementById('root')).render( , )