import type { EnvironmentId } from "@t3tools/contracts"; import type { RelayClientEnvironmentRecord } from "@t3tools/contracts/relay"; import type { ConnectedEnvironmentSummary } from "../../state/remote-runtime-types"; export interface EnvironmentSectionsInput { readonly connectedEnvironments: ReadonlyArray; readonly cloudEnvironments: ReadonlyArray | null; } export interface EnvironmentSections { readonly localEnvironments: ReadonlyArray; readonly connectedCloudEnvironments: ReadonlyArray; readonly availableCloudEnvironments: ReadonlyArray; } /** * Ids of the environments that already occupy a T3 Connect slot. A backend saved directly is * not one of them, so it must not suppress the cloud environment that happens to share its id. */ export function relayManagedEnvironmentIds( environments: ReadonlyArray<{ readonly environmentId: EnvironmentId; readonly isRelayManaged: boolean; }>, ): ReadonlySet { return new Set( environments .filter((environment) => environment.isRelayManaged) .map((environment) => environment.environmentId), ); } export function splitEnvironmentSections(input: EnvironmentSectionsInput): EnvironmentSections { const savedEnvironmentIds = relayManagedEnvironmentIds(input.connectedEnvironments); return { localEnvironments: input.connectedEnvironments.filter( (environment) => !environment.isRelayManaged, ), connectedCloudEnvironments: input.connectedEnvironments.filter( (environment) => environment.isRelayManaged, ), availableCloudEnvironments: (input.cloudEnvironments ?? []).filter( (environment) => !savedEnvironmentIds.has(environment.environmentId), ), }; }