import React, { useContext, useState } from "react";
import { useQuery } from "react-query";
import { InjectedRouter } from "react-router";
import { AxiosError } from "axios";
import PATHS from "router/paths";
import mdmAppleAPI, {
IGetVppInfoResponse,
IVppApp,
} from "services/entities/mdm_apple";
import { DEFAULT_USE_QUERY_OPTIONS } from "utilities/constants";
import Card from "components/Card";
import CustomLink from "components/CustomLink";
import Spinner from "components/Spinner";
import Button from "components/buttons/Button";
import DataError from "components/DataError";
import Radio from "components/forms/fields/Radio";
import { NotificationContext } from "context/notification";
import { getErrorReason } from "interfaces/errors";
import { buildQueryStringFromParams } from "utilities/url";
import SoftwareIcon from "../icons/SoftwareIcon";
import { getErrorMessage } from "./helpers";
const baseClass = "app-store-vpp";
const EnableVppCard = () => {
return (
Volume Purchasing Program (VPP) isn’t enabled.
To add App Store apps, first enable VPP.
);
};
interface IVppAppListItemProps {
app: IVppApp;
selected: boolean;
onSelect: (software: IVppApp) => void;
}
const VppAppListItem = ({ app, selected, onSelect }: IVppAppListItemProps) => {
return (
{app.name}
}
id={`vppApp-${app.app_store_id}`}
checked={selected}
value={app.app_store_id.toString()}
name="vppApp"
onChange={() => onSelect(app)}
/>
);
};
interface IVppAppListProps {
apps: IVppApp[];
selectedApp: IVppApp | null;
onSelect: (app: IVppApp) => void;
}
const VppAppList = ({ apps, selectedApp, onSelect }: IVppAppListProps) => {
const renderContent = () => {
if (apps.length === 0) {
return (
You don't have any App Store apps
You must purchase apps in ABM. App Store apps that are already added
to this team are not listed.
);
}
return (
);
};
return (
{renderContent()}
);
};
interface IAppStoreVppProps {
teamId: number;
router: InjectedRouter;
onExit: () => void;
}
const AppStoreVpp = ({ teamId, router, onExit }: IAppStoreVppProps) => {
const { renderFlash } = useContext(NotificationContext);
const [isSubmitDisabled, setIsSubmitDisabled] = useState(true);
const [selectedApp, setSelectedApp] = useState(null);
const {
data: vppInfo,
isLoading: isLoadingVppInfo,
error: errorVppInfo,
} = useQuery(
["vppInfo"],
() => mdmAppleAPI.getVppInfo(),
{
...DEFAULT_USE_QUERY_OPTIONS,
staleTime: 30000,
retry: (tries, error) => error.status !== 404 && tries <= 3,
}
);
const {
data: vppApps,
isLoading: isLoadingVppApps,
error: errorVppApps,
} = useQuery(["vppSoftware", teamId], () => mdmAppleAPI.getVppApps(teamId), {
...DEFAULT_USE_QUERY_OPTIONS,
enabled: !!vppInfo,
staleTime: 30000,
select: (res) => res.app_store_apps,
});
const onSelectApp = (app: IVppApp) => {
setIsSubmitDisabled(false);
setSelectedApp(app);
};
const onAddSoftware = async () => {
if (!selectedApp) {
return;
}
try {
await mdmAppleAPI.addVppApp(teamId, selectedApp.app_store_id);
renderFlash(
"success",
<>
{selectedApp.name} successfully added. Go to Host details page
to install software.
>
);
const queryParams = buildQueryStringFromParams({
team_id: teamId,
available_for_install: true,
});
router.push(`${PATHS.SOFTWARE}?${queryParams}`);
} catch (e) {
renderFlash("error", getErrorMessage(e));
}
onExit();
};
const renderContent = () => {
if (isLoadingVppInfo || isLoadingVppApps) {
return ;
}
if (
errorVppInfo &&
getErrorReason(errorVppInfo).includes("MDMConfigAsset was not found")
) {
return ;
}
if (errorVppInfo || errorVppApps) {
return ;
}
return vppApps ? (
) : null;
};
return (
Apple App Store apps purchased via Apple Business Manager.
{renderContent()}
);
};
export default AppStoreVpp;