import React, { useState, useEffect } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { api } from '../lib/api' import { AlertCircle, Play, Square } from 'lucide-react' const IDLE_TIMEOUT = 5 * 60 * 1000 // 5 minutes export const IdleDetector = () => { const queryClient = useQueryClient() const [isIdle, setIsIdle] = useState(false) const [timer, setTimer] = useState(null) const { data: runningEntry } = useQuery({ queryKey: ['running-entry'], queryFn: () => api.getRunningTimeEntry(), refetchInterval: 30000, }) const stopMutation = useMutation({ mutationFn: (id: string) => api.stopTimeEntry(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['running-entry'] }) setIsIdle(false) }, }) const resetIdleTimer = () => { if (timer) clearTimeout(timer) setIsIdle(false) const newTimer = setTimeout(() => { setIsIdle(true) }, IDLE_TIMEOUT) setTimer(newTimer) } useEffect(() => { const events = ['mousemove', 'mousedown', 'keydown', 'scroll', 'touchstart'] const handleActivity = () => resetIdleTimer() events.forEach(event => window.addEventListener(event, handleActivity)) resetIdleTimer() return () => { events.forEach(event => window.removeEventListener(event, handleActivity)) if (timer) clearTimeout(timer) } }, []) // Only show modal if user is idle AND a timer is actually running if (!isIdle || !runningEntry) return null return (

Are you still there?

You've been inactive for 5 minutes. Should we stop the timer for "{runningEntry.description || 'this entry'}"?

) }