Phase 8: Visitor Management - Visitor/VisitorLog/AccessZone models - Check-in/out with badge generation - Zone occupancy tracking - Kiosk and management pages Phase 9: Messaging & Communication - Announcements with priority levels - Acknowledgement tracking - Shift notes for team handoffs - AnnouncementBanner component Phase 10: Compliance & Audit Trail - Immutable AuditLog model - Document versioning and approval workflow - Acknowledgement tracking for SOPs - CSV export for audit logs Phase 11: Accessibility & i18n - WCAG 2.1 AA compliance utilities - react-i18next with EN/ES translations - User preferences context (theme, font size, etc) - High contrast and reduced motion support Phase 12: Hardware Integration - QR code generation for batches/plants/visitors - Printable label system - Visitor badge printing Phase 13: Advanced Features - Environmental monitoring (sensors, readings, alerts) - Financial tracking (transactions, P&L reports) - AI/ML insights (yield predictions, anomaly detection)
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
|
|
export function useServiceWorker() {
|
|
const [isReady, setIsReady] = useState(false);
|
|
const [hasUpdate, setHasUpdate] = useState(false);
|
|
const [registration, setRegistration] = useState<ServiceWorkerRegistration | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (!('serviceWorker' in navigator)) {
|
|
console.log('[SW] Service Worker not supported');
|
|
return;
|
|
}
|
|
|
|
const registerSW = async () => {
|
|
try {
|
|
const reg = await navigator.serviceWorker.register('/sw.js');
|
|
setRegistration(reg);
|
|
setIsReady(true);
|
|
console.log('[SW] Service Worker registered');
|
|
|
|
// Check for updates
|
|
reg.addEventListener('updatefound', () => {
|
|
const newWorker = reg.installing;
|
|
if (!newWorker) return;
|
|
|
|
newWorker.addEventListener('statechange', () => {
|
|
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
|
|
// New version available
|
|
setHasUpdate(true);
|
|
console.log('[SW] New version available');
|
|
}
|
|
});
|
|
});
|
|
} catch (error) {
|
|
console.error('[SW] Registration failed:', error);
|
|
}
|
|
};
|
|
|
|
registerSW();
|
|
|
|
// Check for updates periodically
|
|
const interval = setInterval(() => {
|
|
registration?.update();
|
|
}, 60 * 60 * 1000); // Every hour
|
|
|
|
return () => clearInterval(interval);
|
|
}, []);
|
|
|
|
const update = () => {
|
|
if (registration?.waiting) {
|
|
registration.waiting.postMessage({ type: 'SKIP_WAITING' });
|
|
window.location.reload();
|
|
}
|
|
};
|
|
|
|
return { isReady, hasUpdate, update };
|
|
}
|
|
|
|
// Register SW on app load
|
|
export function registerServiceWorker() {
|
|
if ('serviceWorker' in navigator && import.meta.env.PROD) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker.register('/sw.js')
|
|
.then((reg) => console.log('[SW] Registered:', reg.scope))
|
|
.catch((err) => console.error('[SW] Registration failed:', err));
|
|
});
|
|
}
|
|
}
|