import React, { useContext, useState } from "react"; import { IAppStoreApp } from "interfaces/software"; import { NotificationContext } from "context/notification"; import softwareAPI from "services/entities/software"; import Modal from "components/Modal"; import ModalFooter from "components/ModalFooter"; import Editor from "components/Editor"; import Button from "components/buttons/Button"; import CustomLink from "components/CustomLink"; import { LEARN_MORE_ABOUT_BASE_LINK } from "utilities/constants"; import InstallerDetailsWidget from "../SoftwareInstallerCard/InstallerDetailsWidget"; import { getErrorMessage } from "./helpers"; const baseClass = "edit-configuration-modal"; // Used to surface error.message in UI of unknown error type type ErrorWithMessage = { message: string; [key: string]: unknown; }; const isErrorWithMessage = (error: unknown): error is ErrorWithMessage => { return (error as ErrorWithMessage).message !== undefined; }; export interface ISoftwareConfigurationFormData { configuration: string; } interface EditConfigurationModal { softwareId: number; teamId: number; softwareInstaller: IAppStoreApp; refetchSoftwareTitle: () => void; onExit: () => void; } const EditConfigurationModal = ({ softwareInstaller, softwareId, teamId, refetchSoftwareTitle, onExit, }: EditConfigurationModal) => { const { renderFlash, renderMultiFlash } = useContext(NotificationContext); const [isUpdatingConfiguration, setIsUpdatingConfiguration] = useState(false); const [canSaveForm, setCanSaveForm] = useState(true); const [jsonFormData, setJsonFormData] = useState( JSON.stringify(softwareInstaller.configuration, null, "\t") || "{}" ); const [formError, setFormError] = useState(null); const validateForm = (curFormData: string) => { let error = null; if (curFormData) { try { JSON.parse(curFormData); } catch (e: unknown) { if (isErrorWithMessage(e)) { error = e.message.toString(); } else { throw e; } } } return error; }; // Edit package API call const onEditConfiguration = async ( evt: React.MouseEvent ) => { setIsUpdatingConfiguration(true); evt.preventDefault(); // Format for API const formDataToSubmit = jsonFormData === "" ? { configuration: {} } // Send empty object if no keys are set : { configuration: (jsonFormData && JSON.parse(jsonFormData)) || null, }; try { await softwareAPI.editAppStoreApp(softwareId, teamId, formDataToSubmit); renderFlash( "success", <> {softwareInstaller.name} configuration updated. ); refetchSoftwareTitle(); onExit(); } catch (e) { renderFlash( "error", getErrorMessage(e, softwareInstaller as IAppStoreApp) ); } setIsUpdatingConfiguration(false); }; const onInputChange = (value: string) => { setJsonFormData(value); const error = validateForm(value); setFormError(error); setCanSaveForm(!error); }; const renderHelpText = () => { return (
The Android app's configuration in JSON format.{" "}
); }; const renderForm = () => ( <> ); return ( <> {renderForm()} Save } /> ); }; export default EditConfigurationModal;