GitHub check
256 KB of 599 KB loaded Download the full log (599 KB)
343 KB of earlier output not loaded
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
63 โ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
64 โ }, [playbackUrl, resolvedUrl]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/components/ui/Menu.tsx:54:36]
53 โ const child = children as ReactElement<Pick<PressableProps, "onTouchStart" | "onPress">>;
54 โ โญโโถ children = cloneElement(child, {
55 โ โ onTouchStart: (event) => {
56 โ โ // Reset for a new touch, not onPressIn, which also fires when a
57 โ โ // finger moves out of the row and back during the same gesture.
58 โ โ menuPress.current.isPreparing = false;
59 โ โ menuPress.current.suppressPress = menuPress.current.isOpen;
60 โ โ pendingPress.current = null;
61 โ โ child.props.onTouchStart?.(event);
62 โ โ },
63 โ โ onPress: (event) => {
64 โ โ // Accessibility clicks have no touch identifier and must not inherit
65 โ โ // cancellation from a previous physical gesture.
66 โ โ const isTouch = typeof event.nativeEvent.identifier === "number";
67 โ โ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) {
68 โ โ return;
69 โ โ }
70 โ โ if (isTouch && menuPress.current.isPreparing) {
71 โ โ // A release can arrive between native menu preparation and display.
72 โ โ // Let UIKit's display/cancel callback decide this press's outcome.
73 โ โ event.persist();
74 โ โ pendingPress.current = () => child.props.onPress?.(event);
75 โ โ return;
76 โ โ }
77 โ โ child.props.onPress?.(event);
78 โ โ },
79 โ โโโถ });
ยท โฐโโโโ Passing a ref to a function may read its value during render
80 โ menuProps.onMenuInteractionStart = () => {
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(memo-dependencies): Found missing memoization dependencies
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6]
161 โ const tokens = collectComposerInlineTokens(props.value, {
162 โ preserveTrailingFrom: confirmedTokensRef.current,
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
163 โ });
164 โ confirmedTokensRef.current = tokens;
165 โ return JSON.stringify(
166 โ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
167 โ const record =
168 โ token.type === "context"
169 โ ? props.context?.records.find((record) => record.contextId === token.contextId)
170 โ : undefined;
171 โ const presentation = contextChipPresentation(
172 โ token.type === "context" ? token.kind : token.type,
173 โ record,
174 โ );
175 โ const icon = contextChipIcon(
176 โ presentation,
177 โ token.type === "mention" ? token.value : contextRecordFileName(record),
178 โ );
179 โ return {
180 โ type: token.type,
181 โ source: token.source,
182 โ start: token.start,
183 โ end: token.end,
184 โ accent: presentation.accent,
185 โ label:
186 โ token.type === "skill"
187 โ ? (skillLabels.get(token.value) ?? token.value)
188 โ : token.type === "context"
189 โ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " ยท unavailable"}`
190 โ : basename(token.value),
191 โ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
192 โ iconUri: contextChipIconUri(icon),
193 โ tintsIcon: icon.kind === "chip",
194 โ };
195 โ }),
196 โ );
197 โ }, [props.value, props.context, skillLabels]);
ยท โโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ This dependency list is missing values used by the callback
198 โ // Every render resolves against the snapshot history, so a render whose
โฐโโโโ
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found missing memoization dependencies
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5]
251 โ mostRecentEventCountRef.current = acknowledgedEventCount;
252 โ nativeEventSnapshotsRef.current.push({
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
253 โ eventCount: acknowledgedEventCount,
254 โ value,
255 โ selection: nextSelection,
256 โ });
257 โ return acknowledgedEventCount;
258 โ },
259 โ [],
ยท โโฌ
ยท โฐโโ This dependency list is missing values used by the callback
260 โ );
โฐโโโโ
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
161 โ const tokens = collectComposerInlineTokens(props.value, {
162 โ preserveTrailingFrom: confirmedTokensRef.current,
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
163 โ });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
161 โ const tokens = collectComposerInlineTokens(props.value, {
162 โ preserveTrailingFrom: confirmedTokensRef.current,
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
163 โ });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23]
163 โ });
164 โ confirmedTokensRef.current = tokens;
ยท โโโโโโโโโโฌโโโโโโโโโโโโโฌโโโ
ยท โ โฐโโ Cannot update ref value during render
ยท โฐโโ This value is a ref
165 โ return JSON.stringify(
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5]
205 โ mostRecentEventCount,
206 โ nativeEventSnapshotsRef.current,
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
207 โ );
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5]
211 โ mostRecentEventCount,
212 โ nativeEventSnapshotsRef.current,
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
213 โ );
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(exhaustive-effect-dependencies): Found missing effect dependencies
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6]
225 โ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
226 โ nativeEventSnapshotsRef.current,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
227 โ mostRecentEventCount,
228 โ );
229 โ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ This dependency list is missing values used by the callback
230 โ const assumedValue = props.value;
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7]
236 โ nativeEventSnapshotsRef.current = assumeComposerControlledState(
237 โ nativeEventSnapshotsRef.current,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
238 โ controlledEventCount,
239 โ assumedValue,
240 โ );
241 โ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `controlledDocumentJson`
242 โ const acceptNativeEvent = useCallback(
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ eslint(no-control-regex): Unexpected control character
โญโ[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
219 โ <Text selectable className="font-mono text-sm text-foreground">
220 โ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
ยท โโโฌโ
ยท โฐโโ 'U+001B' is a control character.
221 โ </Text>
โฐโโโโ
help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/components/ComposerContextSheet.tsx:267:25]
266 โ {record.elements?.map((element, index) => (
267 โ <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
268 โ <ContextField
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
99 โ const startEditor = startScheduledTaskEditor;
100 โ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
ยท โโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `startEditor`
101 โ const readEditor = useCallback(
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7]
120 โ setEditor,
121 โ startEditor,
ยท โโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `startEditor`
122 โ hasChanges,
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
66 โ const { id: attachmentId, fileUri } = attachment;
67 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
68 โ setUri(null);
ยท โโโโฌโโ
ยท โฐโโ Avoid calling setState() directly within an effect
69 โ setError(null);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/components/VideoPreviewModal.tsx:91:7]
90 โ };
91 โ }, [attachmentId, fileUri]);
ยท โโโโโโโฌโโโโโ โโโโฌโโโ
ยท โ โฐโโ Unnecessary dependency `fileUri`
ยท โฐโโ Unnecessary dependency `attachmentId`
92 โ const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
212 โ useEffect(() => {
213 โ if (!isFocused && hasSource) props.onRequestClose();
ยท โโโฌโโ
ยท โฐโโ Missing dependency `props`
214 โ }, [isFocused, hasSource, props.onRequestClose]);
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Overly precise dependency `props.onRequestClose`, use `props` instead
215 โ const { source } = props;
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
211 โ };
212 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
213 โ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
214 โ if (inserted) {
215 โ setSelection((current) =>
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
216 โ current.start === inserted.start && current.end === inserted.end ? current : inserted,
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
284 โ }, [hasWorkspaceSnapshot]);
285 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
286 โ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
287 โ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
288 โ const now = Date.now();
289 โ const lastRequest = workspaceRefreshKeyRef.current;
290 โ if (
291 โ lastRequest?.key === key &&
292 โ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
293 โ )
294 โ return;
295 โ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
296 โ setWorkspaceRefreshRetry(null);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
297 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
325 โ }, [
326 โ draftMessage,
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `draftMessage`
327 โ environmentId,
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
117 โ
118 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
119 โ void refreshNotifications();
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
120 โ const subscription = AppState.addEventListener("change", (state) => {
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
125 โ
126 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
127 โ if (!isLoaded) {
128 โ setLiveActivityStatus("checking");
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
129 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(no-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/Stack.tsx:1058:21]
1057 โ <Navigator
1058 โ screenLayout={(props) => <GuardedScreenLayout {...props} />}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1059 โ screenOptions={({ route }) => {
โฐโโโโ
help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true.
โ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
โญโ[apps/web/src/types.ts:22:3]
21 โ EnvironmentThreadShell,
22 โ ThreadRunSummary,
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'ThreadRunSummary' is imported here
23 โ ThreadRuntimeSummary,
โฐโโโโ
help: Consider removing this import.
โ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
โญโ[apps/web/src/terminal/ghostty/core.ts:194:19]
193 โ const count = Math.min(CHUNK_SIZE, graphemeLength - start);
194 โ const codes = new Array<number>(count);
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
195 โ for (let index = 0; index < count; index += 1) {
โฐโโโโ
help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:682:6]
681 โ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
682 โ [props.snoozePresetMinute, swipeActions.secondary],
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `props.snoozePresetMinute`
683 โ );
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:728:7]
727 โ thread.pinnedAt,
728 โ variant,
ยท โโโโฌโโโ
ยท โฐโโ Unnecessary dependency `variant`
729 โ ],
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(purity): Cannot call impure function during render
โญโ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:660:76]
659 โ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
660 โ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
661 โ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
โฐโโโโ
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1178:21]
1177 โ {providerDrivers.slice(0, -1).map((driver, index) => (
1178 โ <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
1179 โ <ProviderIcon provider={driver} size={12} />
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
276 โ
277 โ โญโโถ return createElement(RawNativeView, {
278 โ โ ...nativeProps,
279 โ โ refreshEnabled: props.onPullToRefresh !== undefined,
280 โ โ ref: nativeRef,
281 โ โโโถ });
ยท โฐโโโโ Passing a ref to a function may read its value during render
282 โ }
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(capitalized-calls): Capitalized function called without JSX
โญโ[apps/mobile/src/features/threads/ThreadQueueControl.tsx:595:27]
594 โ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
595 โ const gesture = Gesture.Pan()
ยท โโฌโ
ยท โฐโโ `Pan` may be a component
596 โ .enabled(!props.disabled)
โฐโโโโ
help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
86 โ
87 โ const cardCoverage = props.cardCoverage;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `cardCoverage` originates here
88 โ const barHeightRef = useRef(0);
89 โ const cardHeightRef = useRef(0);
90 โ const cardHeight = useSharedValue(0);
91 โ const notifyCoverage = useCallback(() => {
92 โ if (!cardCoverage) {
93 โ return;
94 โ }
95 โ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 โ if (coverage === cardCoverage.value) {
97 โ return;
98 โ }
99 โ if (cardCoverage.value === 0) {
100 โ cardCoverage.value = coverage;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `cardCoverage` cannot be modified
101 โ return;
โฐโโโโ
help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
89 โ const cardHeightRef = useRef(0);
90 โ const cardHeight = useSharedValue(0);
ยท โโโโโโฌโโโโ
ยท โฐโโ `cardHeight` originates here
91 โ const notifyCoverage = useCallback(() => {
92 โ if (!cardCoverage) {
93 โ return;
94 โ }
95 โ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 โ if (coverage === cardCoverage.value) {
97 โ return;
98 โ }
99 โ if (cardCoverage.value === 0) {
100 โ cardCoverage.value = coverage;
101 โ return;
102 โ }
103 โ cardCoverage.value = withTiming(coverage, {
104 โ duration: USER_INPUT_TOGGLE_DURATION_MS,
105 โ easing: Easing.out(Easing.cubic),
106 โ });
107 โ }, [cardCoverage]);
108 โ const handleBarLayout = useCallback(
109 โ (event: LayoutChangeEvent) => {
110 โ barHeightRef.current = event.nativeEvent.layout.height;
111 โ notifyCoverage();
112 โ },
113 โ [notifyCoverage],
114 โ );
115 โ const handleCardLayout = useCallback(
116 โ (event: LayoutChangeEvent) => {
117 โ cardHeightRef.current = event.nativeEvent.layout.height;
118 โ cardHeight.value = event.nativeEvent.layout.height;
ยท โโโโโโฌโโโโ
ยท โฐโโ `cardHeight` cannot be modified
119 โ notifyCoverage();
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): Cannot modify local variables after render completes
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
90 โ const cardHeight = useSharedValue(0);
91 โ const notifyCoverage = useCallback(() => {
ยท โโโโฌโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardCoverage` after render
92 โ if (!cardCoverage) {
93 โ return;
94 โ }
95 โ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 โ if (coverage === cardCoverage.value) {
97 โ return;
98 โ }
99 โ if (cardCoverage.value === 0) {
100 โ cardCoverage.value = coverage;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `cardCoverage`
101 โ return;
โฐโโโโ
help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): Cannot modify local variables after render completes
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
99 โ if (cardCoverage.value === 0) {
100 โ cardCoverage.value = coverage;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `cardCoverage`
101 โ return;
102 โ }
103 โ cardCoverage.value = withTiming(coverage, {
104 โ duration: USER_INPUT_TOGGLE_DURATION_MS,
105 โ easing: Easing.out(Easing.cubic),
106 โ });
107 โ }, [cardCoverage]);
108 โ const handleBarLayout = useCallback(
109 โ (event: LayoutChangeEvent) => {
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardCoverage` after render
110 โ barHeightRef.current = event.nativeEvent.layout.height;
โฐโโโโ
help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): Cannot modify local variables after render completes
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
115 โ const handleCardLayout = useCallback(
116 โ (event: LayoutChangeEvent) => {
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardHeight` after render
117 โ cardHeightRef.current = event.nativeEvent.layout.height;
118 โ cardHeight.value = event.nativeEvent.layout.height;
ยท โโโโโโฌโโโโ
ยท โฐโโ This modifies `cardHeight`
119 โ notifyCoverage();
โฐโโโโ
help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(capitalized-calls): Capitalized function called without JSX
โญโ[apps/mobile/src/lib/useHoverGesture.ts:8:15]
7 โ () =>
8 โ Gesture.Hover()
ยท โโโฌโโ
ยท โฐโโ `Hover` may be a component
9 โ .manualActivation(true)
โฐโโโโ
help: Render `Hover` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Hover` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[apps/mobile/src/state/use-composer-drafts.ts:1022:15]
1021 โ instanceId,
1022 โ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models },
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1023 โ ]),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
โญโ[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
222 โ let idlePasses = 0;
223 โ โญโโถ for (;;) {
224 โ โ yield* Effect.promise(() => Promise.resolve());
225 โ โ const pending = backgroundRuntime.pending.shift();
226 โ โ if (!pending) {
227 โ โ idlePasses++;
228 โ โ if (idlePasses >= 3) {
229 โ โ return;
230 โ โ }
231 โ โ continue;
232 โ โ }
233 โ โ idlePasses = 0;
234 โ โ const exit = yield* Effect.exit(
235 โ โ pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
236 โ โ );
237 โ โ yield* Effect.sync(() => {
238 โ โ pending.resolve(exit);
239 โ โ });
240 โ โฐโโถ }
241 โ },
โฐโโโโ
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/state/use-vcs-action-state.ts:86:5]
83 โ const [nowMs, setNowMs] = useState(() => Date.now());
84 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
85 โ if (!actionState.isRunning) return;
86 โ setNowMs(Date.now());
ยท โโโโโฌโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
87 โ const interval = setInterval(() => setNowMs(Date.now()), 1000);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/review/ReviewSheet.tsx:462:7]
461 โ showAuxiliaryPane("inspector");
462 โ }, [environmentId, showAuxiliaryPane, threadId]);
ยท โโโโโโโฌโโโโโโ โโโโโฌโโโ
ยท โ โฐโโ Unnecessary dependency `threadId`
ยท โฐโโ Unnecessary dependency `environmentId`
463 โ const {
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(static-components): Cannot create components during render
โญโ[apps/mobile/src/features/review/ReviewSheet.tsx:733:20]
500 โ // same check.
501 โ const NativeReviewDiffView = resolveNativeReviewDiffView();
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
ยท โฐโโ The component is created during render here
502 โ const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
503 โ const showcasedReviewDrawRef = useRef<string | null>(null);
504 โ const [isPullRefreshing, setIsPullRefreshing] = useState(false);
505 โ const handlePullToRefresh = async () => {
506 โ setIsPullRefreshing(true);
507 โ await refreshSelectedSection();
508 โ setIsPullRefreshing(false);
509 โ };
510 โ const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
511 โ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
512 โ const fileVisibility = useReviewFileVisibility({
513 โ threadKey: reviewCache.threadKey,
514 โ sectionId: selectedSection?.id ?? null,
515 โ files: reviewFiles,
516 โ cachedExpandedFileIds: selectedSection?.id
517 โ ? reviewCache.expandedFileIdsBySection[selectedSection.id]
518 โ : undefined,
519 โ cachedViewedFileIds: selectedSection?.id
520 โ ? reviewCache.viewedFileIdsBySection[selectedSection.id]
521 โ : undefined,
522 โ });
523 โ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
524 โ const commentSelection = useReviewCommentSelectionController({
525 โ environmentId,
526 โ threadId,
527 โ selectedSection,
528 โ nativeReviewDiffData,
529 โ });
530 โ const nativeBridge = useNativeReviewDiffBridge({
531 โ threadKey: reviewCache.threadKey,
532 โ sectionId: selectedSection?.id ?? null,
533 โ diff: selectedSection?.diff,
534 โ data: nativeReviewDiffData,
535 โ collapsedFileIds,
536 โ viewedFileIds,
537 โ selectedRowIds: commentSelection.selectedRowIds,
538 โ canHighlight: parsedDiff.kind === "files",
539 โ });
540 โ const showcaseReviewKey =
541 โ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
542 โ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
543 โ : null;
544 โ const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
545 โ nativeBridge.onDebug(event);
546 โ if (
547 โ showcaseReviewKey === null ||
548 โ showcasedReviewDrawRef.current === showcaseReviewKey ||
549 โ !isNativeReviewDiffDrawEvent(event.nativeEvent)
550 โ ) {
551 โ return;
552 โ }
553 โ showcasedReviewDrawRef.current = showcaseReviewKey;
554 โ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
555 โ };
556 โ
557 โ const handleSelectFile = async (fileId: string | null) => {
558 โ loadVisibleFile(fileId, true);
559 โ commentSelection.clearSelection();
560 โ if (fileId !== null && collapsedFileIds.includes(fileId)) {
561 โ toggleExpandedFile(fileId);
562 โ }
563 โ const nativeView = nativeReviewDiffViewRef.current;
564 โ if (!nativeView) return;
565 โ const result = await settlePromise(() =>
566 โ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
567 โ );
568 โ if (AsyncResult.isFailure(result)) {
569 โ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
570 โ }
571 โ };
572 โ const handleVisibleFileChange = (
573 โ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
574 โ ) => {
575 โ loadVisibleFile(event.nativeEvent.fileId ?? null);
576 โ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
577 โ };
578 โ const renderInspector = () => (
579 โ <ReviewFileNavigator
580 โ ref={reviewFileNavigatorRef}
581 โ files={nativeReviewDiffData.files}
582 โ headerInset={insets.top}
583 โ sectionId={selectedSection?.id ?? null}
584 โ onSelectFile={(fileId) => void handleSelectFile(fileId)}
585 โ />
586 โ );
587 โ
588 โ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
589 โ const { fileId } = event.nativeEvent;
590 โ if (fileId) {
591 โ loadVisibleFile(fileId, true);
592 โ toggleExpandedFile(fileId);
593 โ }
594 โ };
595 โ
596 โ const handleNativeToggleViewedFile = (
597 โ event: NativeSyntheticEvent<{ readonly fileId?: string }>,
598 โ ) => {
599 โ const { fileId } = event.nativeEvent;
600 โ if (fileId) {
601 โ toggleViewedFile(fileId);
602 โ }
603 โ };
604 โ
605 โ const parsedDiffNotice =
606 โ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
607 โ const hasCachedSelectedDiff = selectedSection?.diff != null;
608 โ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
609 โ const sectionMenu = buildReviewSectionMenu(reviewSections);
610 โ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
611 โ hasEnvironmentPresentation: environment.isReady,
612 โ isEnvironmentConnected: isEnvironmentReady,
613 โ hasCachedSelectedDiff,
614 โ hasAnyCachedDiff,
615 โ });
616 โ const handleRetryEnvironment = () => {
617 โ void retryEnvironment(environmentId);
618 โ };
619 โ const handleReturnToThread = () => {
620 โ if (navigation.canGoBack()) {
621 โ navigation.goBack();
622 โ return;
623 โ }
624 โ navigation.navigate("Thread", {
625 โ environmentId: String(environmentId),
626 โ threadId: String(threadId),
627 โ });
628 โ };
629 โ const androidHeaderSubtitle = [
630 โ selectedSection?.title,
631 โ headerDiffSummary.additions,
632 โ headerDiffSummary.deletions,
633 โ ]
634 โ .filter((part): part is string => Boolean(part))
635 โ .join(" ยท ");
636 โ
637 โ const showChangedFilesPane =
638 โ !showConnectionNotice &&
639 โ selectedSection !== null &&
640 โ parsedDiff.kind === "files" &&
641 โ NativeReviewDiffView !== null;
642 โ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
643 โ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
644 โ
645 โ const listHeader = (() => {
646 โ const children: ReactElement[] = [];
647 โ
648 โ if (error) {
649 โ children.push(
650 โ <View
651 โ key="review-error"
652 โ className={cn(
653 โ "bg-card px-4 py-3",
654 โ Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
655 โ )}
656 โ >
657 โ <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
658 โ <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
659 โ </View>,
660 โ );
661 โ }
662 โ
663 โ if (parsedDiffNotice) {
664 โ children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
665 โ }
666 โ
667 โ if (children.length === 0) {
668 โ return null;
669 โ }
670 โ
671 โ return <>{children}</>;
672 โ })();
673 โ const headerSubtitle = [
674 โ headerDiffSummary.additions,
675 โ headerDiffSummary.deletions,
676 โ pendingReviewCommentCount > 0
677 โ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
678 โ : null,
679 โ ]
680 โ .filter(Boolean)
681 โ .join(" ยท ");
682 โ const headerTitleText = selectedSection?.title ?? "Review changes";
683 โ
684 โ return (
685 โ <>
686 โ <ReviewHeader
687 โ environmentId={environmentId}
688 โ threadId={threadId}
689 โ title={headerTitleText}
690 โ subtitle={headerSubtitle}
691 โ androidSubtitle={androidHeaderSubtitle}
692 โ iconColor={headerIcon}
693 โ selectedThreadCwd={selectedThreadCwd}
694 โ sectionMenu={sectionMenu}
695 โ selectedSection={selectedSection}
696 โ showSectionToolbar={showSectionToolbar}
697 โ showChangedFilesToggle={showChangedFilesToggle}
698 โ onRefresh={handlePullToRefresh}
699 โ onSelectSection={selectSection}
700 โ onReturnToThread={handleReturnToThread}
701 โ />
702 โ
703 โ <ScreenContent>
704 โ <View className="flex-1 bg-sheet android:bg-sheet-solid">
705 โ {showConnectionNotice ? (
706 โ <View className="flex-1" style={{ paddingTop: topContentInset }}>
707 โ <EnvironmentConnectionNotice
708 โ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
709 โ connection={
710 โ environment.presentation?.connection ?? {
711 โ phase: "available",
712 โ error: null,
713 โ traceId: null,
714 โ }
715 โ }
716 โ resourceName="review"
717 โ onRetry={handleRetryEnvironment}
718 โ />
719 โ </View>
720 โ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
721 โ <View
722 โ className="flex-1"
723 โ style={{
724 โ backgroundColor: nativeBridge.theme.background,
725 โ }}
726 โ >
727 โ <View
728 โ className="min-w-0 flex-1"
729 โ style={listHeader ? { paddingTop: topContentInset } : undefined}
730 โ >
731 โ {listHeader}
732 โ <View className="min-w-0 flex-1" collapsable={false}>
733 โ <NativeReviewDiffView
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ This component is created during render
734 โ collapsable={false}
โฐโโโโ
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
222 โ ? snippetTokens.map((line, lineIndex) => (
223 โ <NativeText key={lineIndex}>
ยท โโโโโโโโโโโโโโโ
224 โ {lineIndex > 0 ? "\n" : ""}
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
226 โ <NativeText
227 โ key={tokenIndex}
ยท โโโโโโโโโโโโโโโโ
228 โ style={{
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
100 โ
101 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
102 โ if (!target || selectedLines.length === 0) {
103 โ setHighlightedLinesById({});
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
104 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
150 โ
151 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
152 โ if (!controlledSelectedPath) {
153 โ return;
154 โ }
155 โ setExpandedPaths((current) => {
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
156 โ const ancestors = ancestorPaths(controlledSelectedPath);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
104 โ
105 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
106 โ clearReviewCommentTarget();
107 โ setPendingNativeCommentSelection(null);
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
108 โ }, [selectedSection?.id]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
109 โ
110 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
111 โ if (activeCommentTarget === null) {
112 โ setPendingNativeCommentSelection(null);
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
113 โ }
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
107 โ setPendingNativeCommentSelection(null);
108 โ }, [selectedSection?.id]);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `selectedSection?.id`
109 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
256 โ return () => cancelAnimationFrame(frame);
257 โ }, [props.path, targetIndex]);
ยท โโโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `props.path`
258 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
292 โ <SourceText
293 โ key={`${index}:${tokenIndex}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
294 โ style={{
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
308 โ return (
309 โ <SourceText key={index}>
ยท โโโโโโโโโโโ
310 โ {body}
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
55 โ
56 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
57 โ scheduler.reset();
58 โ highlightedRowIdsRef.current = new Set();
59 โ visibleChunkIndexRef.current = 0;
60 โ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
61 โ setTokensPatchJson(createEmptyTokenPatch(resetKey));
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
62 โ return () => scheduler.cancel();
63 โ }, [enabled, resetKey, rows.length, scheduler]);
ยท โโโโฌโโโ โโโโโโฌโโโโโ
ยท โ โฐโโ Unnecessary dependency `rows.length`
ยท โฐโโ Unnecessary dependency `enabled`
64 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:138:28]
137 โ visit(parser.parse(markdown));
138 โ for (const edit of edits.reverse())
ยท โโโโโโโ
139 โ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:169:28]
168 โ visit(parser.parse(markdown));
169 โ for (const edit of edits.reverse())
ยท โโโโโโโ
170 โ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:223:38]
222 โ visit(parser.parse(markdown));
223 โ for (const lineStart of lineStarts.reverse()) {
ยท โโโโโโโ
224 โ // The header row may be a lazy line without its container markers (`>` or list indent),
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
76 โ
77 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
78 โ const { host, code } = parsePairingUrl(connectionPairingUrl);
79 โ setHostInput(host);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
80 โ setCodeInput(code);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
82 โ
83 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
84 โ if (routePairingUrl.length === 0) {
85 โ return;
86 โ }
87 โ
88 โ const { host, code } = parsePairingUrl(routePairingUrl);
89 โ setHostInput(host);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
90 โ setCodeInput(code);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
92 โ
93 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
94 โ if (pairingConnectionError) {
95 โ setIsSubmitting(false);
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
96 โ }
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
107 โ );
108 โ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ `separationProgress` originates here
109 โ
110 โ useEffect(() => {
111 โ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ `separationProgress` cannot be modified
112 โ }, [props.showScrollToEnd, separationProgress]);
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
128 โ // and repeatedly retargets the animation as it grows.
129 โ const capsuleWidth = useSharedValue<number | null>(null);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `capsuleWidth` originates here
130 โ const measuredWidthRef = useRef<number | null>(null);
131 โ const handleLabelLayout = (event: LayoutChangeEvent) => {
132 โ const width = event.nativeEvent.layout.width;
133 โ if (width === measuredWidthRef.current) {
134 โ return;
135 โ }
136 โ const first = measuredWidthRef.current === null;
137 โ measuredWidthRef.current = width;
138 โ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `capsuleWidth` cannot be modified
139 โ };
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
128 โ // and repeatedly retargets the animation as it grows.
129 โ const capsuleWidth = useSharedValue<number | null>(null);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `capsuleWidth` originates here
130 โ const measuredWidthRef = useRef<number | null>(null);
131 โ const handleLabelLayout = (event: LayoutChangeEvent) => {
132 โ const width = event.nativeEvent.layout.width;
133 โ if (width === measuredWidthRef.current) {
134 โ return;
135 โ }
136 โ const first = measuredWidthRef.current === null;
137 โ measuredWidthRef.current = width;
138 โ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
139 โ };
140 โ const hasStatus = props.status !== null;
141 โ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 โ useEffect(() => {
143 โ if (!hasStatus) {
144 โ measuredWidthRef.current = null;
145 โ capsuleWidth.value = null;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `capsuleWidth` cannot be modified
146 โ }
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): Cannot modify local variables after render completes
โญโ[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
141 โ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 โ useEffect(() => {
ยท โโโโฌโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `capsuleWidth` after render
143 โ if (!hasStatus) {
144 โ measuredWidthRef.current = null;
145 โ capsuleWidth.value = null;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `capsuleWidth`
146 โ }
โฐโโโโ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): Cannot modify local variables after render completes
โญโ[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
130 โ const measuredWidthRef = useRef<number | null>(null);
131 โ const handleLabelLayout = (event: LayoutChangeEvent) => {
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `capsuleWidth` after render
132 โ const width = event.nativeEvent.layout.width;
133 โ if (width === measuredWidthRef.current) {
134 โ return;
135 โ }
136 โ const first = measuredWidthRef.current === null;
137 โ measuredWidthRef.current = width;
138 โ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `capsuleWidth`
139 โ };
โฐโโโโ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(memo-dependencies): Found missing memoization dependencies
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
103 โ .runOnJS(true)
104 โ .onStart(() => latest.current.onStart())
ยท โโโโฌโโ
ยท โฐโโ Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
105 โ .onUpdate((event) => latest.current.onMove(event.translationY))
106 โ .onEnd((event) => latest.current.onMove(event.translationY))
107 โ .onFinalize((_, success) => latest.current.onEnd(!success)),
108 โ [props.disabled],
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ This dependency list is missing values used by the callback
109 โ );
โฐโโโโ
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5]
260 โ .join("|");
261 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
262 โ stop();
ยท โโโฌโ
ยท โฐโโ Avoid calling setState() directly within an effect
263 โ }, [orderVersion]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
95 โ const latest = useRef(props);
96 โ latest.current = props;
ยท โโโโฌโโโโโโโฌโโโ
ยท โ โฐโโ Cannot update ref value during render
ยท โฐโโ This value is a ref
97 โ const gesture = useMemo(
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
103 โ .runOnJS(true)
104 โ .onStart(() => latest.current.onStart())
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
105 โ .onUpdate((event) => latest.current.onMove(event.translationY))
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
104 โ .onStart(() => latest.current.onStart())
105 โ .onUpdate((event) => latest.current.onMove(event.translationY))
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
106 โ .onEnd((event) => latest.current.onMove(event.translationY))
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
105 โ .onUpdate((event) => latest.current.onMove(event.translationY))
106 โ .onEnd((event) => latest.current.onMove(event.translationY))
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
107 โ .onFinalize((_, success) => latest.current.onEnd(!success)),
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
106 โ .onEnd((event) => latest.current.onMove(event.translationY))
107 โ .onFinalize((_, success) => latest.current.onEnd(!success)),
ยท โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Passing a ref to a function may read its value during render
108 โ [props.disabled],
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:250:9]
249 โ const latest = useRef({ rows, planners, moveThread });
250 โ latest.current = { rows, planners, moveThread };
ยท โโโโฌโโโโโโโฌโโโ
ยท โ โฐโโ Cannot update ref value during render
ยท โฐโโ This value is a ref
251 โ
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
247 โ const [preview, setPreview] = useState<Drag | null>(null);
248 โ const translateY = useRef(new Animated.Value(0)).current;
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
249 โ const latest = useRef({ rows, planners, moveThread });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
247 โ const [preview, setPreview] = useState<Drag | null>(null);
248 โ const translateY = useRef(new Animated.Value(0)).current;
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
249 โ const latest = useRef({ rows, planners, moveThread });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
247 โ const [preview, setPreview] = useState<Drag | null>(null);
248 โ const translateY = useRef(new Animated.Value(0)).current;
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
249 โ const latest = useRef({ rows, planners, moveThread });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
247 โ const [preview, setPreview] = useState<Drag | null>(null);
248 โ const translateY = useRef(new Animated.Value(0)).current;
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
249 โ const latest = useRef({ rows, planners, moveThread });
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5]
261 โ useEffect(() => {
262 โ stop();
ยท โโโฌโ
ยท โฐโโ Missing dependency `stop`
263 โ }, [orderVersion]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `orderVersion`
264 โ useEffect(
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(purity): Cannot call impure function during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:325:16]
324 โ update(0);
325 โ let last = performance.now();
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Cannot call impure function
326 โ const tick = () => {
โฐโโโโ
help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
โ react(capitalized-calls): Capitalized function called without JSX
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
98 โ () =>
99 โ Gesture.Pan()
ยท โโฌโ
ยท โฐโโ `Pan` may be a component
100 โ .enabled(!props.disabled)
โฐโโโโ
help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
53 โ function usePulseAnimation(pulse: boolean) {
54 โ const pulseProgress = useSharedValue(0);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ `pulseProgress` originates here
55 โ
56 โ useEffect(() => {
57 โ if (pulse) {
58 โ pulseProgress.value = withRepeat(
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ `pulseProgress` cannot be modified
59 โ withTiming(1, {
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
55 โ
56 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
57 โ setDecodedSize(null);
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
58 โ }, [props.sourceKey]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
59 โ
60 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
61 โ setFailedUri(null);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
62 โ }, [props.uri]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
6 โ import { parse, SvgAst, type JsxAST } from "react-native-svg";
7 โ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'ActivityIndicator' is imported here
8 โ
โฐโโโโ
help: Consider removing this import.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
57 โ setDecodedSize(null);
58 โ }, [props.sourceKey]);
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Unnecessary dependency `props.sourceKey`
59 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
61 โ setFailedUri(null);
62 โ }, [props.uri]);
ยท โโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `props.uri`
63 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:84:5]
79 โ
80 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
81 โ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
82 โ const branchName = initialProjectRef.branch;
83 โ let active = true;
84 โ setPendingCheckouts((count) => count + 1);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
85 โ // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
โญโ[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:289:50]
288 โ return (
289 โ <ExistingThreadSettingsRouteContext.Provider value={value}>
ยท โโโโโโโโโโโโโ
290 โ {props.children}
โฐโโโโ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
โ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
โญโ[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:653:44]
652 โ return (
653 โ <ThreadSettingsSessionContext.Provider value={value}>
ยท โโโโโโโโโโโโโ
654 โ {props.children}
โฐโโโโ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
โ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
โญโ[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1456:55]
1455 โ return (
1456 โ <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
ยท โโโโโโโโโโโโโโโโโโโโ
1457 โ <ThreadSettingsPickerStack.Navigator
โฐโโโโ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:282:7]
281 โ mountedRef.current = false;
282 โ flow.setBranchQuery("");
ยท โโโฌโ
ยท โฐโโ Missing dependency `flow`
283 โ };
284 โ }, [flow.setBranchQuery]);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
285 โ
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:487:5]
485 โ }, []);
486 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
487 โ setKeyboardStateSuspect(false);
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
488 โ }, [isKeyboardVisible, liveKeyboardHeight]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:838:7]
835 โ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
836 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
837 โ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
838 โ setLastKnownKeyboardHeight(liveKeyboardHeight);
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
839 โ }
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1081:5]
1077 โ
1078 โ useLayoutEffect(() => {
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ This is the containing effect
1079 โ selectedThreadKeyRef.current = selectedThreadKey;
1080 โ // A replaced or unmounted native editor may not emit a blur event.
1081 โ setComposerFocused(false);
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
1082 โ }, [selectedThreadKey, showContent]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1085:5]
1083 โ
1084 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
1085 โ setAnchorMessageId(null);
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
1086 โ setSubmittedMessageId(null);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:488:7]
487 โ setKeyboardStateSuspect(false);
488 โ }, [isKeyboardVisible, liveKeyboardHeight]);
ยท โโโโโโโโโฌโโโโโโโโ โโโโโโโโโโฌโโโโโโโโ
ยท โ โฐโโ Unnecessary dependency `liveKeyboardHeight`
ยท โฐโโ Unnecessary dependency `isKeyboardVisible`
489 โ const handleOwnedInputFocusChange = (focused: boolean) => {
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1031:7]
1030 โ userInputInsetProgress.set(1);
1031 โ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `activeUserInputRequestId`
1032 โ const showContent = props.showContent ?? true;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1082:26]
1081 โ setComposerFocused(false);
1082 โ }, [selectedThreadKey, showContent]);
ยท โโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `showContent`
1083 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1091:15]
1090 โ freeze.set(false);
1091 โ }, [freeze, selectedThreadKey]);
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Unnecessary dependency `selectedThreadKey`
1092 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:919:5]
914 โ const composerPopoverHeight = useSharedValue(0);
915 โ const floatingControlCoverage = useSharedValue(
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ `floatingControlCoverage` originates here
916 โ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
917 โ );
918 โ useEffect(() => {
919 โ floatingControlCoverage.value = withTiming(
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ `floatingControlCoverage` cannot be modified
920 โ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:937:7]
927 โ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
928 โ const combinedContentInsetEndAdjustment = useSharedValue(
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
ยท โฐโโ `combinedContentInsetEndAdjustment` originates here
929 โ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
930 โ );
931 โ useAnimatedReaction(
932 โ () =>
933 โ contentInsetEndAdjustment.value +
934 โ floatingControlCoverage.value +
935 โ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
936 โ (value) => {
937 โ combinedContentInsetEndAdjustment.value = value;
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
ยท โฐโโ `combinedContentInsetEndAdjustment` cannot be modified
938 โ },
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:282:5]
280 โ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
281 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
282 โ setNow(new Date().toISOString());
ยท โโโโฌโโ
ยท โฐโโ Avoid calling setState() directly within an effect
283 โ const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:362:25]
361 โ // range) the boundary string is identical and the chain would die.
362 โ }, [nextSnoozeWakeAt, snoozeWakeTick]);
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `snoozeWakeTick`
363 โ const listItems = ((): readonly SidebarListItem[] => {
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(purity): Cannot call impure function during render
โญโ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:353:53]
352 โ if (Number.isNaN(wakeAtMs)) return;
353 โ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
354 โ const id = setTimeout(() => {
โฐโโโโ
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[apps/mobile/src/state/use-model-option-memory.ts:21:7]
20 โ [instanceId]: {
21 โ ...(state[instanceId] ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
22 โ [model]: options,
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:57:5]
55 โ
56 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
57 โ setMountedModes((current) => {
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
58 โ if (current.has(props.mode)) {
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5]
1314 โ queuedMessagesByThreadKey,
1315 โ retryTick,
ยท โโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `retryTick`
1316 โ restoreQueuedMessage,
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/state/thread-order.ts:29:7]
28 โ getPendingThreadOrder();
29 โ }, [nowMinute, snoozeWakeTick]);
ยท โโโโโฌโโโโ โโโโโโโโฌโโโโโโ
ยท โ โฐโโ Unnecessary dependency `snoozeWakeTick`
ยท โฐโโ Unnecessary dependency `nowMinute`
30 โ return pending;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:590:9]
589 โ };
590 โ }, [props.environmentId, attachment.id, httpBaseUrl]),
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโฌโโโโโโ โโโโโโฌโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `httpBaseUrl`
ยท โ โฐโโ Unnecessary dependency `attachment.id`
ยท โฐโโ Unnecessary dependency `props.environmentId`
591 โ );
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:1845:5]
1843 โ );
1844 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
1845 โ setExpandedVideo(null);
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
1846 โ setExpandedFile(null);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:64:10]
63 โ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
64 โ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'isMarkdownFileLinkLabel' is imported here
65 โ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:90:3]
89 โ import {
90 โ createContext,
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'createContext' is imported here
91 โ memo,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3]
103 โ import {
104 โ ActivityIndicator,
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'ActivityIndicator' is imported here
105 โ Image,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3]
110 โ Pressable,
111 โ ScrollView,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'ScrollView' is imported here
112 โ StyleSheet,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11]
112 โ StyleSheet,
113 โ Text as NativeText,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'NativeText' is imported here
114 โ type ColorValue,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:135:10]
134 โ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
135 โ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'tryOpenExternalUrl' is imported here
136 โ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:138:10]
137 โ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
138 โ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'faviconUrlForOrigin' is imported here
139 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:152:10]
151 โ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
152 โ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'MediaVideoPlayer' is imported here
153 โ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3]
155 โ attachmentVideoPreviewSource,
156 โ mediaVideoPreviewUri,
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'mediaVideoPreviewUri' is imported here
157 โ mediaVideoThumbnailKey,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3]
156 โ mediaVideoPreviewUri,
157 โ mediaVideoThumbnailKey,
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ 'mediaVideoThumbnailKey' is imported here
158 โ type MediaVideoPreviewSource,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:158:8]
157 โ mediaVideoThumbnailKey,
158 โ type MediaVideoPreviewSource,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'MediaVideoPreviewSource' is imported here
159 โ } from "../../lib/videoPreviewSource";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:166:15]
165 โ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
166 โ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ 'ReviewDiffTheme' is imported here
167 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:181:3]
180 โ import {
181 โ resolveMarkdownFontSizes,
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownFontSizes' is imported here
182 โ resolveNativeMarkdownTypography,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:186:10]
185 โ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
186 โ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ 'markdownLinkIconSource' is imported here
187 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3]
188 โ normalizeNativeMarkdownUrl,
189 โ resolveMarkdownInlineCodePresentation,
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownInlineCodePresentation' is imported here
190 โ resolveMarkdownLinkIcon,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3]
189 โ resolveMarkdownInlineCodePresentation,
190 โ resolveMarkdownLinkIcon,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownLinkIcon' is imported here
191 โ resolveMarkdownLinkPresentation,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:225:10]
224 โ import { ThreadMcpApp } from "./McpAppWebView";
225 โ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'useMarkdownCodeHighlight' is imported here
226 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:229:3]
228 โ useAssetUrl,
229 โ useAssetUrlState,
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'useAssetUrlState' is imported here
230 โ useRefreshAssetUrl,
โฐโโโโ
help: Consider removing this import.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:1847:7]
1846 โ setExpandedFile(null);
1847 โ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโฌโโโโโโ โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `props.contentPresentation.kind`
ยท โ โฐโโ Unnecessary dependency `props.threadId`
ยท โฐโโ Unnecessary dependency `props.environmentId`
1848 โ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2302:30]
2301 โ transitionEndFollow({ type: "reset" });
2302 โ }, [clearUserScrollSettle, feedThreadKey, transitionEndFollow]);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `feedThreadKey`
2303 โ useEffect(() => {
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2320:7]
2319 โ reportHeaderMaterialVisibility(false);
2320 โ }, [feedThreadKey, reportHeaderMaterialVisibility]);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `feedThreadKey`
2321 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2352:7]
2351 โ }
2352 โ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `listMountKey`
2353 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2447:7]
2446 โ }
2447 โ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
ยท โโโโโโโโฌโโโโโโโ โโโโโโโโโโฌโโโโโโโโ โโโโโโโโโฌโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `expandedWorkRows`
ยท โ โฐโโ Unnecessary dependency `expandedWorkGroups`
ยท โฐโโ Unnecessary dependency `expandedTurnIds`
2448 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:431:5]
426 โ : null;
427 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
428 โ if (activeDraftKey !== null || editingPendingTask !== null || selectedProject === null) {
429 โ return;
430 โ }
431 โ setActiveDraftKey(
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
432 โ createNewTaskDraft({
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
โญโ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1212:39]
1211 โ
1212 โ return <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>;
ยท โโโโโโโโโโโโโ
1213 โ }
โฐโโโโ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:388:5]
386 โ
387 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
388 โ setInspectorSelection((current) => {
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
389 โ if (props.renderInspector === undefined) {
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(no-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:516:24]
515 โ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
516 โ โญโโถ const GitInspector = () => (
517 โ โ <GitOverviewSheet
518 โ โ headerInset={inspectorHeaderInset}
519 โ โ presentation="inspector"
520 โ โ route={{ params: props.route.params }}
521 โ โ />
522 โ โฐโโถ );
523 โ const FilesInspector = () =>
โฐโโโโ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
โ react(no-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:523:26]
522 โ );
523 โ โญโโถ const FilesInspector = () =>
524 โ โ selectedThread !== null && selectedThreadCwd !== null ? (
525 โ โ <ThreadFileNavigatorPane
526 โ โ cwd={selectedThreadCwd}
527 โ โ environmentId={selectedThread.environmentId}
528 โ โ headerInset={inspectorHeaderInset}
529 โ โ projectName={selectedThreadProject?.title ?? "Files"}
530 โ โ selectedPath={null}
531 โ โ onSelectFile={handleSelectInspectorFile}
532 โ โ />
533 โ โฐโโถ ) : null;
534 โ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
โฐโโโโ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:552:7]
546 โ }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
547 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
548 โ if (!isReturningToProjectPicker) {
549 โ return;
550 โ }
551 โ if (requestedInitialProjectAvailable) {
552 โ setIsReturningToProjectPicker(false);
ยท โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
553 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:700:9]
643 โ
644 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
645 โ if (props.pendingTaskId || props.draftId) {
646 โ return;
647 โ }
648 โ if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
649 โ lastInitialProjectRefRef.current = props.initialProjectRef;
650 โ appliedInitialProjectKeyRef.current = null;
651 โ }
652 โ const initialEnvironmentId = props.initialProjectRef?.environmentId;
653 โ const initialProjectId = props.initialProjectRef?.projectId;
654 โ if (initialEnvironmentId && initialProjectId) {
655 โ const directProject =
656 โ projects.find(
657 โ (project) =>
658 โ project.environmentId === initialEnvironmentId && project.id === initialProjectId,
659 โ ) ?? null;
660 โ
661 โ if (directProject) {
662 โ // Apply the route's project once. Re-applying on every change would
663 โ // instantly revert environment/project switches made in the picker.
664 โ const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
665 โ if (appliedInitialProjectKeyRef.current === directProjectKey) {
666 โ return;
667 โ }
668 โ if (props.initialProjectRef?.branch) {
669 โ if (
670 โ selectedProject?.environmentId !== directProject.environmentId ||
671 โ selectedProject.id !== directProject.id
672 โ ) {
673 โ setProject(directProject);
674 โ return;
675 โ }
676 โ if (!flow.draftKey) return;
677 โ // The route completes checkout before mounting this composer. Local
678 โ // mode reuses an existing worktree; worktree mode would create another.
679 โ updateComposerDraftSettings(flow.draftKey, {
680 โ workspaceSelection: {
681 โ mode: "local",
682 โ branch: props.initialProjectRef.branch,
683 โ worktreePath: props.initialProjectRef.worktreePath ?? null,
684 โ startFromOrigin: false,
685 โ },
686 โ });
687 โ }
688 โ appliedInitialProjectKeyRef.current = directProjectKey;
689 โ if (
690 โ selectedProject?.environmentId === directProject.environmentId &&
691 โ selectedProject.id === directProject.id
692 โ ) {
693 โ return;
694 โ }
695 โ setProject(directProject);
696 โ return;
697 โ }
698 โ
699 โ if (projects.length > 0) {
700 โ setIsReturningToProjectPicker(true);
ยท โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
701 โ }
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:800:5]
741 โ
742 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
743 โ const shareId = props.incomingShareId;
744 โ const draftKey = flow.draftKey;
745 โ const destinationProject = selectedProject;
746 โ const initialEnvironmentId = props.initialProjectRef?.environmentId;
747 โ const initialProjectId = props.initialProjectRef?.projectId;
748 โ const selectedProjectMatchesRoute =
749 โ !initialEnvironmentId ||
750 โ !initialProjectId ||
751 โ (destinationProject?.environmentId === initialEnvironmentId &&
752 โ destinationProject.id === initialProjectId);
753 โ if (
754 โ !shareId ||
755 โ !draftKey ||
756 โ !destinationProject ||
757 โ !selectedProjectMatchesRoute ||
758 โ cancelledIncomingShareId === shareId
759 โ ) {
760 โ return;
761 โ }
762 โ const importKey = `${shareId}:${draftKey}`;
763 โ if (
764 โ startedShareImportKeyRef.current === importKey ||
765 โ cancellingShareImportKeyRef.current === importKey
766 โ ) {
767 โ return;
768 โ }
769 โ
770 โ if (!incomingShare) {
771 โ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
772 โ alertedUnavailableIncomingShareIdRef.current = shareId;
773 โ Dialog.alert(
774 โ "Shared content unavailable",
775 โ "The shared content is no longer in the inbox. You can continue editing this task draft.",
776 โ );
777 โ }
778 โ return;
779 โ }
780 โ
781 โ if (
782 โ incomingShare.attachments.some((attachment) => attachment.type === "file") &&
783 โ selectedEnvironmentServerConfig === null
784 โ ) {
785 โ return;
786 โ }
787 โ
788 โ if (alertedUnavailableIncomingShareIdRef.current === shareId) {
789 โ alertedUnavailableIncomingShareIdRef.current = null;
790 โ }
791 โ startedShareImportKeyRef.current = importKey;
792 โ const draftBackup =
793 โ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
794 โ shareImportDraftBackupRef.current.set(importKey, draftBackup);
795 โ const importToken = Symbol(importKey);
796 โ let didReserveShare = false;
797 โ let didConsumeShare = false;
798 โ let needsDraftRestore = false;
799 โ activeShareImportTokenRef.current = importToken;
800 โ setImportingShareKey(importKey);
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
801 โ void (async () => {
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:720:5]
719 โ props.initialProjectRef,
720 โ props.incomingShareId,
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `props.incomingShareId`
721 โ props.pendingTaskId,
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:739:5]
738 โ loadedBranchesProjectKeyRef.current = projectKey;
739 โ flow.loadBranches();
ยท โโโฌโ
ยท โฐโโ Missing dependency `flow`
740 โ }, [flow.loadBranches, selectedProject]);
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Overly precise dependency `flow.loadBranches`, use `flow` instead
741 โ
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:962:5]
961 โ flow.draftKey,
962 โ hasImportedIncomingShare,
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `hasImportedIncomingShare`
963 โ incomingShare,
964 โ isIncomingShareInboxLoading,
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `isIncomingShareInboxLoading`
965 โ isIncomingShareUnavailable,
966 โ props.incomingShareId,
967 โ props.initialProjectRef?.environmentId,
968 โ props.initialProjectRef?.projectId,
969 โ releaseShareReservation,
970 โ reserveShare,
971 โ selectedEnvironmentServerConfig,
972 โ selectedProject,
973 โ shareImportAttempt,
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Unnecessary dependency `shareImportAttempt`
974 โ ]);
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
Found 0 errors and 361 warnings in 5241 files (6.9s, 8 threads)
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea, not saving cache.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2;outcome=success;conclusion=success;duration_ms=107]
##[start-action display=Setup Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp]
Post job cleanup.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=68]
##[start-action display=Cache Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v1-Linux-X64-1.0.0, not saving cache.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache;outcome=success;conclusion=success;duration_ms=66]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/f14e02d3-3a85-4f03-9b07-a6140fd406b1' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
Removing SSH command configuration
[command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
Warning: The process '/usr/local/bin/git' failed with exit code 128
A job completed hook has been configured by the self-hosted runner administrator
โธ Run '/job_completed.sh'
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422
BLACKSMITH_CHECK_RUN_ID: 119018884336
BLACKSMITH_JOB_DISPLAY_NAME: Lint
GITHUB_ACTIONS_CACHE_MODE: write
Docker container cache not activated, skipping hash computation.
No active SSH sessions detected. Proceeding with shutdown immediately.
Cleaning up orphan processes