()
| 47 | let lastActivityTimestamp = Date.now() |
| 48 | |
| 49 | async function poll() { |
| 50 | if (cancelled) return |
| 51 | |
| 52 | const currentInteractionTime = getLastInteractionTime() |
| 53 | if (lastSeenInteractionTime !== currentInteractionTime) { |
| 54 | lastSeenInteractionTime = currentInteractionTime |
| 55 | lastActivityTimestamp = Date.now() |
| 56 | } else if (Date.now() - lastActivityTimestamp >= IDLE_STOP_MS) { |
| 57 | return |
| 58 | } |
| 59 | |
| 60 | const start = Date.now() |
| 61 | const result = await fetchPrStatus() |
| 62 | if (cancelled) return |
| 63 | lastFetchRef.current = start |
| 64 | |
| 65 | setPrStatus(prev => { |
| 66 | const newNumber = result?.number ?? null |
| 67 | const newReviewState = result?.reviewState ?? null |
| 68 | if (prev.number === newNumber && prev.reviewState === newReviewState) { |
| 69 | return prev |
| 70 | } |
| 71 | return { |
| 72 | number: newNumber, |
| 73 | url: result?.url ?? null, |
| 74 | reviewState: newReviewState, |
| 75 | lastUpdated: Date.now(), |
| 76 | } |
| 77 | }) |
| 78 | |
| 79 | if (Date.now() - start > SLOW_GH_THRESHOLD_MS) { |
| 80 | disabledRef.current = true |
| 81 | return |
| 82 | } |
| 83 | |
| 84 | if (!cancelled) { |
| 85 | timeoutRef.current = setTimeout(poll, POLL_INTERVAL_MS) |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | const elapsed = Date.now() - lastFetchRef.current |
| 90 | if (elapsed >= POLL_INTERVAL_MS) { |
no test coverage detected