import {
Environment as EnvironmentType,
isUnauthenticatedError,
} from "@slicemachine/manager/client";
import { useState } from "react";
import { getState, telemetry } from "@/apiClient";
import { useSetEnvironment } from "@/features/environments/actions/useSetEnvironment";
import { useActiveEnvironment } from "@/features/environments/useActiveEnvironment";
import { useEnvironments } from "@/features/environments/useEnvironments";
import { useAutoSync } from "@/features/sync/AutoSyncProvider";
import { getUnSyncedChanges } from "@/features/sync/getUnSyncChanges";
import { useAuthStatus } from "@/hooks/useAuthStatus";
import { useNetwork } from "@/hooks/useNetwork";
import { normalizeFrontendCustomTypes } from "@/legacy/lib/models/common/normalizers/customType";
import { normalizeFrontendSlices } from "@/legacy/lib/models/common/normalizers/slices";
import useSliceMachineActions from "@/modules/useSliceMachineActions";
import { SideNavEnvironmentSelector } from "./SideNavEnvironmentSelector/SideNavEnvironmentSelector";
export function Environment() {
const { environments, error: useEnvironmentsError } = useEnvironments();
const { activeEnvironment, error: activeEnvironmentError } =
useActiveEnvironment();
const { refreshState, openLoginModal } = useSliceMachineActions();
const { syncChanges } = useAutoSync();
const isOnline = useNetwork();
const authStatus = useAuthStatus();
const [isSwitchingEnv, setIsSwitchingEnv] = useState(false);
const { autoSyncStatus } = useAutoSync();
const setEnvironment = useSetEnvironment();
async function onSelect(environment: EnvironmentType) {
if (activeEnvironment?.name === environment.name) {
return;
}
setIsSwitchingEnv(true);
void telemetry.track({
event: "environment:switch",
domain: environment.domain,
});
await setEnvironment(environment);
const serverState = await getState();
refreshState(serverState);
const slices = normalizeFrontendSlices(
serverState.libraries,
serverState.remoteSlices,
);
const customTypes = Object.values(
normalizeFrontendCustomTypes(
serverState.customTypes,
serverState.remoteCustomTypes,
),
);
const { changedCustomTypes, changedSlices } = getUnSyncedChanges({
authStatus,
customTypes,
isOnline,
libraries: serverState.libraries,
slices,
});
if (
environment.kind === "dev" &&
(changedCustomTypes.length > 0 || changedSlices.length > 0)
) {
syncChanges({
environment,
changedCustomTypes,
changedSlices,
});
}
setIsSwitchingEnv(false);
}
if (!isOnline) {
return ;
}
if (
useEnvironmentsError === undefined &&
activeEnvironmentError === undefined
) {
return (
);
}
if (isUnauthenticatedError(useEnvironmentsError)) {
return (
openLoginModal()}
/>
);
}
}