Skip to content

Commit a50eb53

Browse files
committed
useActivityQuery as our own alternative to tanstackquery. activity tracker singelton that knows when the user was last active.
1 parent 7cfabfd commit a50eb53

15 files changed

+1696
-191
lines changed

cli/src/chat.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import { getClaudeOAuthStatus } from './utils/claude-oauth'
7979
import { createPasteHandler } from './utils/strings'
8080
import { computeInputLayoutMetrics } from './utils/text-layout'
8181
import { createMarkdownPalette } from './utils/theme-system'
82+
import { reportActivity } from './utils/activity-tracker'
8283

8384
import type { CommandResult } from './commands/command-registry'
8485
import type { MultilineInputHandle } from './components/multiline-input'
@@ -249,7 +250,7 @@ export const Chat = ({
249250

250251
const isConnected = useConnectionStatus(handleReconnection)
251252
const mainAgentTimer = useElapsedTime()
252-
const { ad, reportActivity } = useGravityAd()
253+
const { ad } = useGravityAd()
253254
const timerStartTime = mainAgentTimer.startTime
254255

255256
// Set initial mode from CLI flag on mount
@@ -912,7 +913,7 @@ export const Chat = ({
912913
lastReportedActivityRef.current = now
913914
reportActivity()
914915
}
915-
}, [inputValue, reportActivity])
916+
}, [inputValue])
916917
useEffect(() => {
917918
cursorPositionRef.current = cursorPosition
918919
}, [cursorPosition])
@@ -989,13 +990,7 @@ export const Chat = ({
989990
reportActivity()
990991
const result = await onSubmitPrompt(inputValue, agentMode)
991992
handleCommandResult(result)
992-
}, [
993-
onSubmitPrompt,
994-
inputValue,
995-
agentMode,
996-
handleCommandResult,
997-
reportActivity,
998-
])
993+
}, [onSubmitPrompt, inputValue, agentMode, handleCommandResult])
999994

1000995
const totalMentionMatches = agentMatches.length + fileMatches.length
1001996
const historyNavUpEnabled =
@@ -1404,7 +1399,7 @@ export const Chat = ({
14041399
lastMouseActivityRef.current = now
14051400
reportActivity()
14061401
}
1407-
}, [reportActivity])
1402+
}, [])
14081403

14091404
return (
14101405
<box

cli/src/components/out-of-credits-banner.tsx

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { useQuery, useQueryClient } from '@tanstack/react-query'
21
import React, { useEffect, useState } from 'react'
32

3+
import { getActivityQueryData } from '../hooks/use-activity-query'
44
import { usageQueryKeys, useUsageQuery } from '../hooks/use-usage-query'
55
import { useChatStore } from '../state/chat-store'
66
import { useTheme } from '../hooks/use-theme'
@@ -16,36 +16,26 @@ export const areCreditsRestored = () => creditsRestoredGlobal
1616

1717
export const OutOfCreditsBanner = () => {
1818
const sessionCreditsUsed = useChatStore((state) => state.sessionCreditsUsed)
19-
const queryClient = useQueryClient()
2019
const [creditsRestored, setCreditsRestored] = useState(false)
2120

2221
const { data: apiData } = useUsageQuery({
2322
enabled: true,
23+
refetchInterval: CREDIT_POLL_INTERVAL,
2424
})
2525

26-
const { data: cachedUsageData } = useQuery<{
26+
// Get cached data for immediate display
27+
const cachedUsageData = getActivityQueryData<{
2728
type: 'usage-response'
2829
usage: number
2930
remainingBalance: number | null
3031
balanceBreakdown?: { free: number; paid: number; ad?: number }
3132
next_quota_reset: string | null
32-
}>({
33-
queryKey: usageQueryKeys.current(),
34-
enabled: false,
35-
})
33+
}>(usageQueryKeys.current())
3634

3735
const theme = useTheme()
3836
const activeData = apiData || cachedUsageData
3937
const remainingBalance = activeData?.remainingBalance ?? 0
4038

41-
// Poll for credit updates
42-
useEffect(() => {
43-
const interval = setInterval(() => {
44-
queryClient.invalidateQueries({ queryKey: usageQueryKeys.current() })
45-
}, CREDIT_POLL_INTERVAL)
46-
return () => clearInterval(interval)
47-
}, [queryClient])
48-
4939
// Track if we've confirmed the zero-balance state to avoid false positives from stale cache
5040
const [confirmedZeroBalance, setConfirmedZeroBalance] = useState(false)
5141

cli/src/components/usage-banner.tsx

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { useQuery, useQueryClient } from '@tanstack/react-query'
21
import React, { useEffect } from 'react'
32
import open from 'open'
43

54
import { BottomBanner } from './bottom-banner'
65
import { Button } from './button'
76
import { ProgressBar } from './progress-bar'
7+
import { getActivityQueryData } from '../hooks/use-activity-query'
88
import { useClaudeQuotaQuery } from '../hooks/use-claude-quota-query'
99
import { usageQueryKeys, useUsageQuery } from '../hooks/use-usage-query'
1010
import { useChatStore } from '../state/chat-store'
@@ -41,7 +41,6 @@ const formatRenewalDate = (dateStr: string | null): string => {
4141
}
4242

4343
export const UsageBanner = ({ showTime }: { showTime: number }) => {
44-
const queryClient = useQueryClient()
4544
const sessionCreditsUsed = useChatStore((state) => state.sessionCreditsUsed)
4645
const setInputMode = useChatStore((state) => state.setInputMode)
4746

@@ -60,27 +59,17 @@ export const UsageBanner = ({ showTime }: { showTime: number }) => {
6059
isFetching,
6160
} = useUsageQuery({
6261
enabled: true,
62+
refetchInterval: USAGE_POLL_INTERVAL,
6363
})
6464

65-
// Manual polling using setInterval - TanStack Query's refetchInterval doesn't work
66-
// reliably in terminal environments even with focusManager configuration
67-
useEffect(() => {
68-
const interval = setInterval(() => {
69-
queryClient.invalidateQueries({ queryKey: usageQueryKeys.current() })
70-
}, USAGE_POLL_INTERVAL)
71-
return () => clearInterval(interval)
72-
}, [queryClient])
73-
74-
const { data: cachedUsageData } = useQuery<{
65+
// Get cached data for immediate display
66+
const cachedUsageData = getActivityQueryData<{
7567
type: 'usage-response'
7668
usage: number
7769
remainingBalance: number | null
7870
balanceBreakdown?: { free: number; paid: number; ad?: number }
7971
next_quota_reset: string | null
80-
}>({
81-
queryKey: usageQueryKeys.current(),
82-
enabled: false,
83-
})
72+
}>(usageQueryKeys.current())
8473

8574
// Auto-hide after timeout
8675
useEffect(() => {

0 commit comments

Comments
 (0)