Skip to content

Commit 49b40e3

Browse files
committed
refactor mobile fire-and-forget calls
Mark intentional async work in the mobile screen with the void operator so lint can distinguish real promise bugs from deliberate fire-and-forget behavior.
1 parent df3276f commit 49b40e3

1 file changed

Lines changed: 48 additions & 48 deletions

File tree

packages/mobile-voice/src/app/index.tsx

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ export default function DictationScreen() {
713713

714714
useEffect(() => {
715715
let mounted = true
716-
;(async () => {
716+
void (async () => {
717717
try {
718718
const data = await FileSystem.readAsStringAsync(SERVER_STATE_FILE)
719719
if (!mounted || !data) return
@@ -740,7 +740,7 @@ export default function DictationScreen() {
740740
useEffect(() => {
741741
let mounted = true
742742

743-
;(async () => {
743+
void (async () => {
744744
let complete = false
745745

746746
try {
@@ -768,7 +768,7 @@ export default function DictationScreen() {
768768
}
769769

770770
if (complete) {
771-
FileSystem.writeAsStringAsync(ONBOARDING_STATE_FILE, JSON.stringify({ completed: true })).catch(() => {})
771+
void FileSystem.writeAsStringAsync(ONBOARDING_STATE_FILE, JSON.stringify({ completed: true })).catch(() => {})
772772
}
773773
}
774774

@@ -786,7 +786,7 @@ export default function DictationScreen() {
786786
useEffect(() => {
787787
if (!restoredRef.current) return
788788
const payload = toSaved(servers, activeServerId, activeSessionId)
789-
FileSystem.writeAsStringAsync(SERVER_STATE_FILE, JSON.stringify(payload)).catch(() => {})
789+
void FileSystem.writeAsStringAsync(SERVER_STATE_FILE, JSON.stringify(payload)).catch(() => {})
790790
}, [activeServerId, activeSessionId, servers])
791791

792792
useEffect(() => {
@@ -858,7 +858,7 @@ export default function DictationScreen() {
858858

859859
// Set up audio session and check microphone permissions on mount.
860860
useEffect(() => {
861-
;(async () => {
861+
void (async () => {
862862
try {
863863
AudioManager.setAudioSessionOptions({
864864
iosCategory: "playAndRecord",
@@ -986,7 +986,7 @@ export default function DictationScreen() {
986986
useEffect(() => {
987987
let mounted = true
988988

989-
;(async () => {
989+
void (async () => {
990990
await FileSystem.makeDirectoryAsync(WHISPER_MODELS_DIR, { intermediates: true }).catch(() => {})
991991

992992
let nextDefaultModel: WhisperModelID = DEFAULT_WHISPER_MODEL
@@ -1033,7 +1033,7 @@ export default function DictationScreen() {
10331033
useEffect(() => {
10341034
if (!whisperRestoredRef.current) return
10351035
const payload: WhisperSavedState = { defaultModel: defaultWhisperModel, mode: transcriptionMode }
1036-
FileSystem.writeAsStringAsync(WHISPER_SETTINGS_FILE, JSON.stringify(payload)).catch(() => {})
1036+
void FileSystem.writeAsStringAsync(WHISPER_SETTINGS_FILE, JSON.stringify(payload)).catch(() => {})
10371037
}, [defaultWhisperModel, transcriptionMode])
10381038

10391039
useEffect(() => {
@@ -1061,10 +1061,10 @@ export default function DictationScreen() {
10611061
whisperContextModelRef.current = null
10621062

10631063
if (context) {
1064-
context.release().catch(() => {})
1064+
void context.release().catch(() => {})
10651065
}
10661066

1067-
releaseAllWhisper().catch(() => {})
1067+
void releaseAllWhisper().catch(() => {})
10681068
}
10691069
}, [])
10701070

@@ -1101,7 +1101,7 @@ export default function DictationScreen() {
11011101
useEffect(() => {
11021102
let active = true
11031103

1104-
;(async () => {
1104+
void (async () => {
11051105
try {
11061106
if (Platform.OS !== "ios") return
11071107
const existing = await Notifications.getPermissionsAsync()
@@ -1334,7 +1334,7 @@ export default function DictationScreen() {
13341334
}
13351335

13361336
finalizeRecordingState()
1337-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
1337+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
13381338
}
13391339
}, [
13401340
defaultWhisperModel,
@@ -1350,7 +1350,7 @@ export default function DictationScreen() {
13501350
const stopRecording = useCallback(() => {
13511351
if (!isRecordingRef.current && !isStartingRef.current) return
13521352

1353-
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {})
1353+
void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {})
13541354

13551355
const baseAtStop = normalizeTranscriptSessions(baseTextRef.current)
13561356
const englishOnlyModel = isEnglishOnlyWhisperModel(defaultWhisperModel)
@@ -1451,7 +1451,7 @@ export default function DictationScreen() {
14511451
const sendOutProgress = useSharedValue(0)
14521452

14531453
const handleClearTranscript = useCallback(() => {
1454-
Haptics.selectionAsync().catch(() => {})
1454+
void Haptics.selectionAsync().catch(() => {})
14551455

14561456
clearIconRotation.value = withSequence(
14571457
withTiming(-30, { duration: 90 }),
@@ -1472,7 +1472,7 @@ export default function DictationScreen() {
14721472
}, [clearIconRotation, clearWaveform, sendOutProgress, stopRecording])
14731473

14741474
const handleHideAgentState = useCallback(() => {
1475-
Haptics.selectionAsync().catch(() => {})
1475+
void Haptics.selectionAsync().catch(() => {})
14761476
setAgentStateDismissed(true)
14771477
}, [])
14781478

@@ -1488,7 +1488,7 @@ export default function DictationScreen() {
14881488
}, [clearWaveform, stopRecording])
14891489

14901490
const handleOpenWhisperSettings = useCallback(() => {
1491-
Haptics.selectionAsync().catch(() => {})
1491+
void Haptics.selectionAsync().catch(() => {})
14921492
setDropdownMode("none")
14931493
setWhisperSettingsOpen(true)
14941494
}, [])
@@ -1497,7 +1497,7 @@ export default function DictationScreen() {
14971497
async (modelID: WhisperModelID) => {
14981498
const ok = await downloadWhisperModel(modelID)
14991499
if (ok) {
1500-
Haptics.selectionAsync().catch(() => {})
1500+
void Haptics.selectionAsync().catch(() => {})
15011501
}
15021502
},
15031503
[downloadWhisperModel],
@@ -1513,7 +1513,7 @@ export default function DictationScreen() {
15131513
await ensureWhisperModelReady(modelID)
15141514
setDefaultWhisperModel(modelID)
15151515
setWhisperError("")
1516-
Haptics.selectionAsync().catch(() => {})
1516+
void Haptics.selectionAsync().catch(() => {})
15171517
} catch (error) {
15181518
const message = error instanceof Error ? error.message : "Unable to switch Whisper model"
15191519
setWhisperError(message)
@@ -1557,7 +1557,7 @@ export default function DictationScreen() {
15571557
}
15581558
}
15591559

1560-
Haptics.selectionAsync().catch(() => {})
1560+
void Haptics.selectionAsync().catch(() => {})
15611561
},
15621562
[
15631563
activeWhisperModel,
@@ -1740,21 +1740,21 @@ export default function DictationScreen() {
17401740
setMonitorStatus(formatMonitorEventLabel(eventType))
17411741

17421742
if (eventType === "permission") {
1743-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning).catch(() => {})
1743+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning).catch(() => {})
17441744
return
17451745
}
17461746

17471747
if (eventType === "complete") {
1748-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
1749-
completePlayer.seekTo(0)
1750-
completePlayer.play()
1748+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
1749+
void completePlayer.seekTo(0)
1750+
void completePlayer.play()
17511751
stopForegroundMonitor()
17521752
setMonitorJob(null)
17531753
void loadLatestAssistantResponse(job.opencodeBaseURL, job.sessionID)
17541754
return
17551755
}
17561756

1757-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
1757+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
17581758
stopForegroundMonitor()
17591759
setMonitorJob(null)
17601760
},
@@ -1770,7 +1770,7 @@ export default function DictationScreen() {
17701770

17711771
const base = job.opencodeBaseURL.replace(/\/+$/, "")
17721772

1773-
;(async () => {
1773+
void (async () => {
17741774
try {
17751775
const response = await expoFetch(`${base}/event`, {
17761776
signal: abortController.signal,
@@ -1906,12 +1906,12 @@ export default function DictationScreen() {
19061906
setMonitorStatus("Monitoring (foreground only)")
19071907
}
19081908

1909-
sendPlayer.seekTo(0)
1910-
sendPlayer.play()
1909+
void sendPlayer.seekTo(0)
1910+
void sendPlayer.play()
19111911

1912-
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy).catch(() => {})
1912+
void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy).catch(() => {})
19131913
setTimeout(() => {
1914-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
1914+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
19151915
}, 70)
19161916

19171917
sendOutProgress.value = withTiming(
@@ -1928,7 +1928,7 @@ export default function DictationScreen() {
19281928
)
19291929
} catch {
19301930
setMonitorStatus("Failed to send prompt")
1931-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
1931+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
19321932
setIsSending(false)
19331933
sendOutProgress.value = 0
19341934
}
@@ -1951,9 +1951,9 @@ export default function DictationScreen() {
19511951
if (isRecordingRef.current) return
19521952

19531953
setDropdownMode("none")
1954-
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {})
1954+
void Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {})
19551955
isHoldingRef.current = true
1956-
startRecording()
1956+
void startRecording()
19571957
}, [startRecording])
19581958

19591959
const handlePressOut = useCallback(() => {
@@ -2332,7 +2332,7 @@ export default function DictationScreen() {
23322332
const refreshAllServerHealth = useCallback(() => {
23332333
const ids = serversRef.current.map((s) => s.id)
23342334
ids.forEach((id) => {
2335-
refreshServerStatusAndSessions(id, false)
2335+
void refreshServerStatusAndSessions(id, false)
23362336
})
23372337
}, [refreshServerStatusAndSessions])
23382338

@@ -2439,8 +2439,8 @@ export default function DictationScreen() {
24392439
}
24402440

24412441
if (payload.eventType === "complete" && source === "received") {
2442-
completePlayer.seekTo(0)
2443-
completePlayer.play()
2442+
void completePlayer.seekTo(0)
2443+
void completePlayer.play()
24442444
}
24452445

24462446
if (
@@ -2521,7 +2521,7 @@ export default function DictationScreen() {
25212521
}, [appState, syncSessionState])
25222522

25232523
const toggleServerMenu = useCallback(() => {
2524-
Haptics.selectionAsync().catch(() => {})
2524+
void Haptics.selectionAsync().catch(() => {})
25252525
setDropdownMode((prev) => {
25262526
const next = prev === "server" ? "none" : "server"
25272527
if (next === "server") {
@@ -2536,8 +2536,8 @@ export default function DictationScreen() {
25362536

25372537
const toggleSessionMenu = useCallback(() => {
25382538
if (!activeServer || activeServer.status !== "online") return
2539-
Haptics.selectionAsync().catch(() => {})
2540-
refreshServerStatusAndSessions(activeServer.id)
2539+
void Haptics.selectionAsync().catch(() => {})
2540+
void refreshServerStatusAndSessions(activeServer.id)
25412541
setDropdownRenderMode("session")
25422542
setDropdownMode((prev) => (prev === "session" ? "none" : "session"))
25432543
}, [activeServer, refreshServerStatusAndSessions])
@@ -2551,7 +2551,7 @@ export default function DictationScreen() {
25512551
setActiveServerId(id)
25522552
setActiveSessionId(null)
25532553
setDropdownMode("none")
2554-
refreshServerStatusAndSessions(id)
2554+
void refreshServerStatusAndSessions(id)
25552555
},
25562556
[refreshServerStatusAndSessions],
25572557
)
@@ -2627,7 +2627,7 @@ export default function DictationScreen() {
26272627
setActiveServerId(existing.id)
26282628
setActiveSessionId(null)
26292629
setDropdownMode("none")
2630-
refreshServerStatusAndSessions(existing.id)
2630+
void refreshServerStatusAndSessions(existing.id)
26312631
return true
26322632
}
26332633

@@ -2648,7 +2648,7 @@ export default function DictationScreen() {
26482648
setActiveServerId(id)
26492649
setActiveSessionId(null)
26502650
setDropdownMode("none")
2651-
refreshServerStatusAndSessions(id)
2651+
void refreshServerStatusAndSessions(id)
26522652
return true
26532653
},
26542654
[refreshServerStatusAndSessions],
@@ -2701,7 +2701,7 @@ export default function DictationScreen() {
27012701
const completeOnboarding = useCallback(
27022702
(openScanner: boolean) => {
27032703
setOnboardingComplete(true)
2704-
FileSystem.writeAsStringAsync(ONBOARDING_STATE_FILE, JSON.stringify({ completed: true })).catch(() => {})
2704+
void FileSystem.writeAsStringAsync(ONBOARDING_STATE_FILE, JSON.stringify({ completed: true })).catch(() => {})
27052705

27062706
if (openScanner) {
27072707
void handleStartScan()
@@ -2720,7 +2720,7 @@ export default function DictationScreen() {
27202720
setLocalNetworkPermissionState("idle")
27212721
setOnboardingReady(true)
27222722
setOnboardingComplete(false)
2723-
FileSystem.deleteAsync(ONBOARDING_STATE_FILE, { idempotent: true }).catch(() => {})
2723+
void FileSystem.deleteAsync(ONBOARDING_STATE_FILE, { idempotent: true }).catch(() => {})
27242724
}, [permissionGranted])
27252725

27262726
const connectPairPayload = useCallback(
@@ -2735,7 +2735,7 @@ export default function DictationScreen() {
27352735
const pair = parsePair(rawData)
27362736
if (!pair) {
27372737
if (fromScan) {
2738-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
2738+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error).catch(() => {})
27392739
setTimeout(() => {
27402740
scanLockRef.current = false
27412741
}, 750)
@@ -2761,7 +2761,7 @@ export default function DictationScreen() {
27612761
}
27622762

27632763
setScanOpen(false)
2764-
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
2764+
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success).catch(() => {})
27652765
})
27662766
.catch(() => {
27672767
if (fromScan) {
@@ -2820,9 +2820,9 @@ export default function DictationScreen() {
28202820

28212821
useEffect(() => {
28222822
if (!activeServerId) return
2823-
refreshServerStatusAndSessions(activeServerId)
2823+
void refreshServerStatusAndSessions(activeServerId)
28242824
const timer = setInterval(() => {
2825-
refreshServerStatusAndSessions(activeServerId)
2825+
void refreshServerStatusAndSessions(activeServerId)
28262826
}, 15000)
28272827
return () => clearInterval(timer)
28282828
}, [activeServerId, refreshServerStatusAndSessions])
@@ -2859,7 +2859,7 @@ export default function DictationScreen() {
28592859
bundleId,
28602860
})
28612861

2862-
Promise.allSettled(
2862+
void Promise.allSettled(
28632863
list.map(async (server) => {
28642864
const secret = server.relaySecret.trim()
28652865
const relay = server.relayURL
@@ -2904,7 +2904,7 @@ export default function DictationScreen() {
29042904
count: list.length,
29052905
})
29062906

2907-
Promise.allSettled(
2907+
void Promise.allSettled(
29082908
list.map(async (server) => {
29092909
const secret = server.relaySecret.trim()
29102910
const relay = server.relayURL

0 commit comments

Comments
 (0)