114 lines
4.2 KiB
TypeScript
114 lines
4.2 KiB
TypeScript
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(
|
||
<React.StrictMode>
|
||
<App />
|
||
</React.StrictMode>
|
||
);
|