From 221947bfedbf1a630bbf9c7201fd84439ac4d4a6 Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 19 Aug 2026 21:54:02 +0100 Subject: [PATCH] chore(webapp): scope route effect synchronization --- .../route.tsx | 1 + .../route.tsx | 1 + .../route.tsx | 1 + .../route.tsx | 1 + .../route.tsx | 2 ++ .../route.tsx | 1 + .../route.tsx | 2 ++ .../route.tsx | 2 ++ .../route.tsx | 3 +++ .../route.tsx | 1 + .../route.tsx | 1 + .../route.tsx | 1 + .../useRunsLiveReload.ts | 2 ++ .../route.tsx | 4 ++++ .../route.tsx | 2 ++ .../route.tsx | 2 ++ .../route.tsx | 1 + .../routes/_app.orgs.$organizationSlug.settings.sso/route.tsx | 3 +++ .../_app.orgs.$organizationSlug.settings.team/route.tsx | 1 + .../_app.orgs.$organizationSlug_.projects.new/route.tsx | 1 + apps/webapp/app/routes/account._index/route.tsx | 1 + apps/webapp/app/routes/admin.feature-flags.tsx | 2 ++ apps/webapp/app/routes/admin.queue-metrics.tsx | 2 ++ apps/webapp/app/routes/confirm-basic-details.tsx | 1 + apps/webapp/app/routes/login.mfa/route.tsx | 1 + apps/webapp/app/routes/resources.branches.create.tsx | 1 + ...zationSlug.projects.$projectParam.env.$envParam.github.tsx | 3 +++ .../route.tsx | 1 + ...zationSlug.projects.$projectParam.env.$envParam.vercel.tsx | 1 + .../routes/resources.orgs.$organizationSlug.select-plan.tsx | 3 +++ apps/webapp/app/routes/vercel.onboarding.tsx | 1 + 31 files changed, 50 insertions(+) diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx index 34a2f9882f7..d726b4e0163 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.apikeys/route.tsx @@ -617,6 +617,7 @@ function NewApiKeyDialog({ } if (actionData?.ok && actionData.action === "create") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setCreatedApiKey(actionData.apiKey); } else if (actionData && !actionData.ok) { setShowError(true); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsx index 3642e336f7b..a5c986ebce9 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.branches/route.tsx @@ -667,6 +667,7 @@ function PurchaseBranchesModal({ "ok" in data && data.ok ) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setOpen(false); } }, [fetcher.state, fetcher.data]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsx index e866a4e8ae4..a89bccf27f1 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.concurrency/route.tsx @@ -648,6 +648,7 @@ function PurchaseConcurrencyModal({ const [open, setOpen] = useState(false); useEffect(() => { if (purchaseSucceeded) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setOpen(false); setSearchParams((s) => { s.delete("success"); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsx index a91e91437cd..31f14f8b70d 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardKey/route.tsx @@ -444,6 +444,7 @@ function useContainerWidth(initialWidth = 1280) { useEffect(() => { measureWidth(); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setMounted(true); const element = containerRef.current; diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsx index ec248521b5f..9b2664139e2 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.custom.$dashboardId/route.tsx @@ -677,6 +677,7 @@ function RenameDashboardDialog({ title }: { title: string }) { // Close dialog when navigation completes useEffect(() => { if (navigation.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsOpen(false); } }, [navigation.state]); @@ -750,6 +751,7 @@ function DeleteDashboardDialog({ title }: { title: string }) { // Close dialog when navigation completes useEffect(() => { if (navigation.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsOpen(false); } }, [navigation.state]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsx index 94be5f3b739..090f12807a4 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments.$deploymentParam/route.tsx @@ -199,6 +199,7 @@ export default function Page() { const abortController = new AbortController(); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setLogs([]); setStreamError(null); setIsStreaming(true); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx index 14339b1cf39..28bd697e04b 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx @@ -451,6 +451,7 @@ function EnvironmentVariablesListPage({ const [isVirtualized, setIsVirtualized] = useState(false); useLayoutEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsVirtualized(shouldVirtualize); }, [shouldVirtualize]); @@ -815,6 +816,7 @@ function EditEnvironmentVariablePanel({ // Close dialog on successful submission useEffect(() => { if (lastSubmission?.success && fetcher.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsOpen(false); } }, [lastSubmission?.success, fetcher.state]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsx index 431dfb7b74c..a1d55a90330 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsx @@ -318,6 +318,7 @@ function LogsList({ // Clear accumulated logs immediately when filters change (for instant visual feedback) useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setAccumulatedLogs([]); setNextCursor(undefined); // Preserve log selection from URL param, clear if not present @@ -327,6 +328,7 @@ function LogsList({ // Populate accumulated logs when new data arrives useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setAccumulatedLogs(list.logs); setNextCursor(list.pagination.next); }, [list.logs, list.pagination.next]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsx index cf02be888cf..e5b4f900512 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsx @@ -909,6 +909,7 @@ function OverrideDialog({ // Reset when dialog opens useEffect(() => { if (open) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setEditedContent(content); setCommitMessage(""); setModel(currentOverrideModel ?? prompt.defaultModel ?? ""); @@ -1332,6 +1333,7 @@ function GenerationsTab({ // Append fetched rows when fetcher completes useEffect(() => { if (fetcher.data && fetcher.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setGenerations((prev) => { const existingIds = new Set(prev.map((g) => g.span_id)); const newRows = fetcher.data!.generations.filter((g) => !existingIds.has(g.span_id)); @@ -1422,6 +1424,7 @@ function GenerationsTab({ const [showSpinner, setShowSpinner] = useState(false); useEffect(() => { if (!isLoadingMore) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setShowSpinner(false); return; } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx index fbf11162f1d..be588d924d2 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx @@ -1035,6 +1035,7 @@ function EnvironmentPauseResumeButton({ useEffect(() => { if (navigation.state === "loading" || navigation.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsOpen(false); } }, [navigation.state]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx index 7ab55d2cef1..1abe8f1dbe1 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx @@ -898,6 +898,7 @@ function useConcurrencyKeys(opts: { }, [body]); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. load(); return () => abortRef.current?.abort(); }, [load]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx index 32ce8d71584..9a332a08fb1 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx @@ -1264,6 +1264,7 @@ function TimelineView({ const [duration, setDuration] = useState(queueAdjustedNs(totalDuration, queuedDuration)); useEffect(() => { if (rootSpanStatus !== "executing" || !rootStartedAt) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setDuration(queueAdjustedNs(totalDuration, queuedDuration)); return; } diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.ts b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.ts index e443fb84cfb..1412103d099 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.ts +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs._index/useRunsLiveReload.ts @@ -192,6 +192,7 @@ export function useRunsLiveReload({ // Single reset path: new loader data or changed filters re-baseline both the // visible rows and new-run tracking. useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setVisibleRuns(runs); resetNewRunsTracking(); }, [runs, searchKeyWithoutPagination, resetNewRunsTracking]); @@ -202,6 +203,7 @@ export function useRunsLiveReload({ const data = runsPollFetcher.data; if (!data?.runs.length) return; + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setVisibleRuns((currentRuns) => patchVisibleRunsWithLiveUpdates(currentRuns, data.runs)); }, [runsPollFetcher.data]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsx index 3d848113c8e..9554aff131c 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.settings.integrations/route.tsx @@ -261,6 +261,7 @@ export default function IntegrationsSettingsPage() { if (onboardingData && vercelFetcher.state === "idle") { // Data is loaded, ensure modal is open (query param takes precedence) if (!isModalOpen) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. openVercelOnboarding(); } } else if (vercelFetcher.state === "idle" && !hasVercelFetcherData) { @@ -289,6 +290,7 @@ export default function IntegrationsSettingsPage() { if (hasQueryParam && !isModalOpen) { // Query param is present but modal is closed, open it // This ensures the modal stays open during the onboarding flow + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. openVercelOnboarding(); } }, [hasQueryParam, isModalOpen, openVercelOnboarding]); @@ -298,6 +300,7 @@ export default function IntegrationsSettingsPage() { if (hasQueryParam && onboardingData && vercelFetcher.state === "idle") { // Data loaded and query param is present, ensure modal is open if (!isModalOpen) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. openVercelOnboarding(); } } @@ -442,6 +445,7 @@ function BuildSettingsForm({ buildSettings }: { buildSettings: BuildSettings }) buildSettingsValues.installCommand !== (buildSettings?.installCommand || "") || buildSettingsValues.triggerConfigFilePath !== (buildSettings?.triggerConfigFilePath || "") || buildSettingsValues.useNativeBuildServer !== nativeBuildServerEnabled; + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setHasBuildSettingsChanges(hasChanges); }, [buildSettingsValues, buildSettings, nativeBuildServerEnabled]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsx index d56396dfbad..590556e087b 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.scheduled.$taskParam/route.tsx @@ -651,6 +651,7 @@ function ScheduleSheet({ // Always reopen in inspect mode. useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setMode("inspect"); }, [openScheduleId]); @@ -693,6 +694,7 @@ function ScheduleSheet({ handledUpdateRef.current = data; if (data.ok) { toast.success(data.message ?? "Schedule updated"); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setMode("inspect"); if (detailPath) loadScheduleDetail(detailPath); revalidator.revalidate(); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx index 7ead145d015..c3ba7694ba3 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.tasks.$taskParam/route.tsx @@ -1585,6 +1585,7 @@ function RunTemplatesPopover({ useEffect(() => { if (lastSubmission && "success" in lastSubmission && lastSubmission.success === true) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsDeleteDialogOpen(false); } }, [lastSubmission]); @@ -1772,6 +1773,7 @@ function CreateTemplateModal({ useEffect(() => { if (lastSubmission && "success" in lastSubmission && lastSubmission.success === true) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsModalOpen(false); setShowCreatedSuccessMessage(true); clearTimeout(successMessageTimeoutRef.current); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsx index 45d973884c7..f7fba86c64e 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.webhooks.endpoints.$endpointParam/route.tsx @@ -614,6 +614,7 @@ function SetSecretDialog({ // Close on a successful save; the loader revalidates and the state flips to "Set". useEffect(() => { if (fetcher.state === "idle" && fetcher.data?.success) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setOpen(false); } }, [fetcher.state, fetcher.data]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsx index 242a3425f14..019798b2daf 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.sso/route.tsx @@ -375,6 +375,7 @@ function useOverrideDraft(serverValue: T): { const [override, setOverride] = useState<{ value: T } | null>(null); useEffect(() => { // Server matches the pending edit → clear the override. + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setOverride((current) => (current && Object.is(current.value, serverValue) ? null : current)); }, [serverValue]); const value = override ? override.value : serverValue; @@ -419,6 +420,7 @@ export default function Page() { useEffect(() => { if (portalFetcher.data?.ok && portalFetcher.data.url) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setPortalUrl(portalFetcher.data.url); } }, [portalFetcher.data]); @@ -917,6 +919,7 @@ function DirectorySyncSection({ // server value so polled-in groups appear and matched overrides drop. const [draftGroupRoles, setDraftGroupRoles] = useState>({}); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setDraftGroupRoles((current) => { const next: Record = {}; for (const g of directorySync.groups) { diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx index 893eacec7a0..80ba22056d1 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.settings.team/route.tsx @@ -985,6 +985,7 @@ export function PurchaseSeatsModal({ "ok" in data && data.ok ) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setOpen(false); } }, [fetcher.state, fetcher.data]); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsx index 1287b416d76..ce82f4caa8a 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug_.projects.new/route.tsx @@ -360,6 +360,7 @@ export default function Page() { useEffect(() => { const nonOther = workingOnOptions.filter((o) => o !== WORKING_ON_OTHER); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setShuffledWorkingOn([...shuffleArray(nonOther), WORKING_ON_OTHER]); const nonOtherGoals = goalOptions.filter((o) => o !== GOALS_OTHER); diff --git a/apps/webapp/app/routes/account._index/route.tsx b/apps/webapp/app/routes/account._index/route.tsx index 2021eafe51d..246904d0b24 100644 --- a/apps/webapp/app/routes/account._index/route.tsx +++ b/apps/webapp/app/routes/account._index/route.tsx @@ -221,6 +221,7 @@ export default function Page() { const [contrastPreview, setContrastPreview] = useState(contrast); useEffect(() => { if (contrastFetcher.state === "idle") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setContrastPreview(contrast); document.documentElement.style.setProperty("--theme-contrast", String(contrast / 100)); } diff --git a/apps/webapp/app/routes/admin.feature-flags.tsx b/apps/webapp/app/routes/admin.feature-flags.tsx index c4d2dca6a33..22799689117 100644 --- a/apps/webapp/app/routes/admin.feature-flags.tsx +++ b/apps/webapp/app/routes/admin.feature-flags.tsx @@ -182,12 +182,14 @@ export default function AdminFeatureFlagsRoute() { editable[key] = value; } } + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setValues({ ...editable }); setInitialValues({ ...editable }); }, [globalFlags, unlocked]); useEffect(() => { if (saveFetcher.data?.success) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setSaveError(null); setConfirmOpen(false); } else if (saveFetcher.data?.error) { diff --git a/apps/webapp/app/routes/admin.queue-metrics.tsx b/apps/webapp/app/routes/admin.queue-metrics.tsx index 3624d05e065..1701c609c7c 100644 --- a/apps/webapp/app/routes/admin.queue-metrics.tsx +++ b/apps/webapp/app/routes/admin.queue-metrics.tsx @@ -65,6 +65,7 @@ export default function AdminQueueMetricsRoute() { const handledSaveDataRef = useRef(saveFetcher.data); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setEnabled(controls.enabled); setSampleRate(String(controls.sampleRate)); }, [controls.enabled, controls.sampleRate]); @@ -76,6 +77,7 @@ export default function AdminQueueMetricsRoute() { handledSaveDataRef.current = saveFetcher.data; if (saveFetcher.data.success) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setError(null); revalidate(); } else if (saveFetcher.data.error) { diff --git a/apps/webapp/app/routes/confirm-basic-details.tsx b/apps/webapp/app/routes/confirm-basic-details.tsx index 53d3f05804e..8e189817f6a 100644 --- a/apps/webapp/app/routes/confirm-basic-details.tsx +++ b/apps/webapp/app/routes/confirm-basic-details.tsx @@ -228,6 +228,7 @@ export default function Page() { useEffect(() => { const nonOtherReferral = referralSourceOptions.filter((r) => r !== "Other"); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setShuffledReferralSources([...shuffleArray(nonOtherReferral), "Other"]); const nonOtherRoles = roleOptions.filter((r) => r !== "Other"); diff --git a/apps/webapp/app/routes/login.mfa/route.tsx b/apps/webapp/app/routes/login.mfa/route.tsx index b31025d54ff..16dfb81c208 100644 --- a/apps/webapp/app/routes/login.mfa/route.tsx +++ b/apps/webapp/app/routes/login.mfa/route.tsx @@ -197,6 +197,7 @@ export default function LoginMfaPage() { // Reset hideError when a new error appears React.useEffect(() => { if (rawMfaError) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setHideError(false); } }, [rawMfaError]); diff --git a/apps/webapp/app/routes/resources.branches.create.tsx b/apps/webapp/app/routes/resources.branches.create.tsx index 9fa5aaeace8..ed033b31d08 100644 --- a/apps/webapp/app/routes/resources.branches.create.tsx +++ b/apps/webapp/app/routes/resources.branches.create.tsx @@ -99,6 +99,7 @@ export function NewBranchPanel({ s.delete("dialogClosed"); return s; }); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsOpen(false); } }, [searchParams, setSearchParams]); diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsx index fb12f772ffc..77770e5f3fa 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github.tsx @@ -442,6 +442,7 @@ export function ConnectGitHubRepoModal({ const params = new URLSearchParams(searchParams); if (params.get("openGithubRepoModal") === "1") { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsModalOpen(true); params.delete("openGithubRepoModal"); setSearchParams(params); @@ -450,6 +451,7 @@ export function ConnectGitHubRepoModal({ useEffect(() => { if (lastSubmission && "success" in lastSubmission && lastSubmission.success === true) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsModalOpen(false); } }, [lastSubmission]); @@ -810,6 +812,7 @@ export function ConnectedGitHubRepoForm({ gitSettingsValues.stagingBranch !== (connectedGitHubRepo.branchTracking?.staging?.branch || "") || gitSettingsValues.previewDeploymentsEnabled !== connectedGitHubRepo.previewDeploymentsEnabled; + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setHasGitSettingsChanges(hasChanges); }, [gitSettingsValues, connectedGitHubRepo]); diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx index 79644140afe..98fa3ca06f2 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx @@ -540,6 +540,7 @@ export function useRealtimeStream(resourcePath: string, startIndex?: number) { const [isConnected, setIsConnected] = useState(false); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setChunks([]); setError(null); diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsx index b8df543c857..c63f874b635 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel.tsx @@ -1118,6 +1118,7 @@ function VercelSettingsPanel({ useEffect(() => { if (!data?.authInvalid && !hasError && !data && !hasFetched) { load(vercelResourcePath(organizationSlug, projectSlug, environmentSlug)); + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setHasFetched(true); } }, [ diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx index 80635361216..88faa7096bf 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx @@ -327,6 +327,7 @@ export function TierFree({ const [isLackingFeaturesChecked, setIsLackingFeaturesChecked] = useState(false); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsDialogOpen(false); }, [subscription]); @@ -493,6 +494,7 @@ export function TierHobby({ const [isDialogOpen, setIsDialogOpen] = useState(false); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsDialogOpen(false); }, [subscription]); @@ -635,6 +637,7 @@ export function TierPro({ const [isDialogOpen, setIsDialogOpen] = useState(false); useEffect(() => { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsDialogOpen(false); }, [subscription]); diff --git a/apps/webapp/app/routes/vercel.onboarding.tsx b/apps/webapp/app/routes/vercel.onboarding.tsx index f30f22cb81f..80f27ff4a8d 100644 --- a/apps/webapp/app/routes/vercel.onboarding.tsx +++ b/apps/webapp/app/routes/vercel.onboarding.tsx @@ -328,6 +328,7 @@ export default function VercelOnboardingPage() { // Reset isInstalling when navigation returns to idle (e.g. on error) useEffect(() => { if (navigation.state === "idle" && isInstalling) { + // oxlint-disable-next-line react/react-compiler -- This effect intentionally synchronizes route state after an external or lifecycle change. setIsInstalling(false); } }, [navigation.state, isInstalling]);