ca-grow-ops-manager/frontend/src/hooks/useServiceWorker.ts
fullsizemalt 32fd739ccf
Some checks failed
Deploy to Production / deploy (push) Failing after 0s
Test / backend-test (push) Failing after 0s
Test / frontend-test (push) Failing after 0s
feat: Complete Phases 8-13 implementation
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)
2025-12-11 00:26:25 -08:00

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