* Copyright (C) 2025 Red Hat, Inc.
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
import { useContext, useEffect, useState } from "react";
import { resolveEnvironment } from "../../apis/payload_dnf.js";
import { PayloadContext } from "../../contexts/Common.jsx";
* DNF software selection completeness for the Review screen.
*
* Mirrors ``is_software_selection_complete`` in Anaconda.
*
* @param {{ automatedInstall?: boolean, isHidden?: boolean }} [opts]
* @returns {true | false | undefined} — **undefined** while ``ResolveEnvironment`` has not
* finished; **false** when selection is invalid or resolution failed; **true** when complete.
*/
export const usePageComplete = ({ automatedInstall, isHidden } = {}) => {
const { packagesKickstarted, selection } = useContext(PayloadContext);
const environment = selection?.environment ?? "";
const [environmentResolved, setEnvironmentResolved] = useState(null);
const kickstarted = automatedInstall && packagesKickstarted;
useEffect(() => {
if (isHidden || !environment) {
setEnvironmentResolved(null);
return;
}
(async () => {
try {
const resolved = await resolveEnvironment(environment);
setEnvironmentResolved(Boolean(resolved));
} catch {
setEnvironmentResolved(false);
}
})();
return () => {
setEnvironmentResolved(null);
};
}, [environment, isHidden]);
if (isHidden) {
return true;
}
if (kickstarted && !environment) {
return true;
}
if (!environment) {
return false;
}
if (environmentResolved === null) {
return undefined;
}
return environmentResolved;
};