Files
checkcle/application/src/components/schedule-incident/maintenance/MaintenanceStatusChecker.tsx
T

93 lines
3.4 KiB
TypeScript

import { useEffect, useRef } from 'react';
import { maintenanceService } from '@/services/maintenance';
import { useToast } from '@/hooks/use-toast';
import { useLanguage } from '@/contexts/LanguageContext';
import { MaintenanceItem } from '@/services/types/maintenance.types';
import { maintenanceNotificationService } from '@/services/maintenance/maintenanceNotificationService';
interface MaintenanceStatusCheckerProps {
maintenanceData: MaintenanceItem[];
onStatusUpdated: () => void;
}
export const MaintenanceStatusChecker = ({
maintenanceData,
onStatusUpdated
}: MaintenanceStatusCheckerProps) => {
const { t } = useLanguage();
const { toast } = useToast();
const checkedItemsRef = useRef<Set<string>>(new Set());
const notificationSentRef = useRef<Set<string>>(new Set());
useEffect(() => {
if (!maintenanceData || maintenanceData.length === 0) return;
// Check for maintenance items that need status update
const now = new Date();
const checkAndUpdateStatus = async () => {
for (const item of maintenanceData) {
if (item.status.toLowerCase() !== 'scheduled') continue;
// Skip if we've already checked this item in this session
if (checkedItemsRef.current.has(item.id)) continue;
try {
const startTime = new Date(item.start_time);
const endTime = new Date(item.end_time);
// If current time is past start time but before end time, update to in_progress
if (startTime <= now && now <= endTime) {
console.log(`Auto-updating maintenance ${item.title} to in_progress status`);
// Update status to in_progress
await maintenanceService.updateMaintenanceStatus(item.id, 'in_progress');
// Only send notification if not sent before
if (!notificationSentRef.current.has(item.id)) {
console.log(`Sending start notification for maintenance ${item.title}`);
// Send notification for maintenance start
await maintenanceNotificationService.sendMaintenanceNotification({
maintenance: item,
notificationType: 'start'
});
// Mark as notified
notificationSentRef.current.add(item.id);
}
toast({
title: t('maintenanceInProgress'),
description: `${item.title} ${t('isNowInProgress')}`,
});
onStatusUpdated();
}
// Mark as checked regardless of outcome
checkedItemsRef.current.add(item.id);
} catch (error) {
console.error(`Error auto-updating maintenance status for ${item.id}:`, error);
// Add a small delay before trying again to prevent rapid retry cycles
setTimeout(() => {
checkedItemsRef.current.delete(item.id); // Allow retry on next check
}, 300000); // 5 minutes before retry
}
}
};
// Run the check immediately
checkAndUpdateStatus();
// Set up interval to check every minute
const intervalId = setInterval(checkAndUpdateStatus, 60000);
return () => clearInterval(intervalId);
}, [maintenanceData, onStatusUpdated, t, toast]);
// This is a utility component with no UI render
return null;
};