noteJS-react/src/main.tsx

114 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>
);