import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import "./styles/index.css"; import "./styles/theme.css"; import "./styles/style.css"; import "./styles/style-calendar.css"; import { dbManager } from "./utils/indexedDB"; import { networkListener, checkNetworkStatus } from "./utils/offlineManager"; import { syncService } from "./services/syncService"; import { store } from "./store/index"; import { setOfflineMode, setPendingSyncCount } from "./store/slices/notesSlice"; import { addNotification } from "./store/slices/uiSlice"; // Регистрация PWA (vite-plugin-pwa автоматически внедряет регистрацию через injectRegister: "auto") // Инициализация offline функционала async function initOfflineMode() { try { console.log('[Init] Initializing offline mode...'); // Инициализация IndexedDB await dbManager.init(); console.log('[Init] IndexedDB initialized'); // Проверка состояния сети // Сначала проверяем navigator.onLine для быстрой проверки let isOnline: boolean = navigator.onLine; // Если navigator.onLine = false, точно оффлайн (не нужно делать fetch) if (!navigator.onLine) { isOnline = false; } else { // Если navigator.onLine = true, делаем дополнительную проверку через fetch try { isOnline = await checkNetworkStatus(); } catch (error) { // Если проверка сети упала с ошибкой, скорее всего мы оффлайн console.warn('[Init] Network status check failed, assuming offline:', error); isOnline = false; } } // Финальная проверка: если navigator.onLine = false, точно оффлайн // Это важно, так как navigator.onLine может обновиться во время проверки if (!navigator.onLine) { isOnline = false; } store.dispatch(setOfflineMode(!isOnline)); console.log(`[Init] Network status: ${isOnline ? 'online' : 'offline'}`); // Установка listeners для событий сети networkListener.onOnline(async () => { console.log('[Network] Online event detected'); const isOnline = await checkNetworkStatus(); store.dispatch(setOfflineMode(!isOnline)); if (isOnline) { store.dispatch( addNotification({ message: 'Подключение восстановлено, начинаем синхронизацию...', type: 'info', }) ); // Запуск синхронизации await syncService.startSync(); } }); networkListener.onOffline(() => { console.log('[Network] Offline event detected'); store.dispatch(setOfflineMode(true)); store.dispatch( addNotification({ message: 'Работаем в offline режиме', type: 'warning', }) ); }); // Обновление счетчика ожидающих синхронизацию const pendingCount = await dbManager.getPendingSyncCount(); store.dispatch(setPendingSyncCount(pendingCount)); if (pendingCount > 0) { console.log(`[Init] Found ${pendingCount} pending sync items`); } // Автоматическая синхронизация при старте если есть что синхронизировать if (isOnline && pendingCount > 0) { console.log('[Init] Starting initial sync...'); // Небольшая задержка для инициализации UI setTimeout(() => { syncService.startSync(); }, 2000); } console.log('[Init] Offline mode initialized successfully'); } catch (error) { console.error('[Init] Error initializing offline mode:', error); } } // Запуск инициализации initOfflineMode(); ReactDOM.createRoot(document.getElementById("root")!).render( );