import { RegistryProvider } from "@effect/atom-react"; import * as React from "react"; import { FrontendErrorReporterProvider, type FrontendErrorReporter } from "./error-reporting"; import { ExecutorServerConnectionProvider, setActiveOrgSlugOverride, useExecutorServerConnection, type ExecutorServerConnectionInput, } from "./server-connection"; function ExecutorRegistryProvider(props: React.PropsWithChildren<{ scopeKey?: string | null }>) { const connection = useExecutorServerConnection(); // The org scope MUST be part of the registry key on org-scoped hosts: query // atoms key their cache entries on the request shape alone (the org selector // header is injected in transformClient, invisible to the atom family key), // so without it a cached result fetched under one org would serve under // another for its TTL. Keying the registry tears the whole cache down // whenever the scope changes — including bare-URL → slugged canonicalization, // which discards any header-less (server-rejected) fetches from first paint. // // The scope also becomes the header authority (setActiveOrgSlugOverride) — // synchronously, during render, BEFORE the keyed registry below mounts and // its atoms fire their first fetches. window.history lags the router during // client-side navigations, so deriving the header from window.location alone // would scope those first fetches to the OLD URL. Browser only: the header // injection never runs during SSR, and the worker's module state is shared // across concurrent requests. if (props.scopeKey !== undefined && globalThis.window) { setActiveOrgSlugOverride(props.scopeKey); } const key = props.scopeKey ? `${connection.key}#${props.scopeKey}` : connection.key; return {props.children}; } export const ExecutorProvider = ( props: React.PropsWithChildren<{ connection?: ExecutorServerConnectionInput; /** * The org scope the atom registry is keyed to — pass the console URL's org * slug on org-scoped hosts (cloud) so cached query results can never * survive an org change. Hosts without org scoping leave it unset. */ scopeKey?: string | null; onHandledError?: FrontendErrorReporter; }>, ) => ( {props.children} );