| 33 | * called unconditionally to satisfy the rules of hooks). |
| 34 | */ |
| 35 | export function usePrStatus(isLoading: boolean, enabled = true): PrStatusState { |
| 36 | const [prStatus, setPrStatus] = useState<PrStatusState>(INITIAL_STATE) |
| 37 | const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null) |
| 38 | const disabledRef = useRef(false) |
| 39 | const lastFetchRef = useRef(0) |
| 40 | |
| 41 | useEffect(() => { |
| 42 | if (!enabled) return |
| 43 | if (disabledRef.current) return |
| 44 | |
| 45 | let cancelled = false |
| 46 | let lastSeenInteractionTime = -1 |
| 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) { |
| 91 | void poll() |
| 92 | } else { |