waveterm/frontend/app/modals/modalsrenderer.tsx
2025-10-20 22:10:57 -07:00

57 lines
2.1 KiB
TypeScript

// Copyright 2025, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import { NewInstallOnboardingModal } from "@/app/onboarding/onboarding";
import { CurrentOnboardingVersion } from "@/app/onboarding/onboarding-common";
import { UpgradeOnboardingModal } from "@/app/onboarding/onboarding-upgrade";
import { atoms, globalPrimaryTabStartup, globalStore } from "@/store/global";
import { modalsModel } from "@/store/modalmodel";
import * as jotai from "jotai";
import { useEffect } from "react";
import * as semver from "semver";
import { getModalComponent } from "./modalregistry";
const ModalsRenderer = () => {
const clientData = jotai.useAtomValue(atoms.client);
const [newInstallOnboardingOpen, setNewInstallOnboardingOpen] = jotai.useAtom(modalsModel.newInstallOnboardingOpen);
const [upgradeOnboardingOpen, setUpgradeOnboardingOpen] = jotai.useAtom(modalsModel.upgradeOnboardingOpen);
const [modals] = jotai.useAtom(modalsModel.modalsAtom);
const rtn: React.ReactElement[] = [];
for (const modal of modals) {
const ModalComponent = getModalComponent(modal.displayName);
if (ModalComponent) {
rtn.push(<ModalComponent key={modal.displayName} {...modal.props} />);
}
}
if (newInstallOnboardingOpen) {
rtn.push(<NewInstallOnboardingModal key={NewInstallOnboardingModal.displayName} />);
}
if (upgradeOnboardingOpen) {
rtn.push(<UpgradeOnboardingModal key={UpgradeOnboardingModal.displayName} />);
}
useEffect(() => {
if (!clientData.tosagreed) {
setNewInstallOnboardingOpen(true);
}
}, [clientData]);
useEffect(() => {
if (!globalPrimaryTabStartup) {
return;
}
if (!clientData.tosagreed) {
return;
}
const lastVersion = clientData.meta?.["onboarding:lastversion"] ?? "v0.0.0";
if (semver.lt(lastVersion, CurrentOnboardingVersion)) {
setUpgradeOnboardingOpen(true);
}
}, []);
useEffect(() => {
globalStore.set(atoms.modalOpen, rtn.length > 0);
}, [rtn]);
return <>{rtn}</>;
};
export { ModalsRenderer };