/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faTimes } from "@fortawesome/free-solid-svg-icons"; import Button from "../components/Button"; import ReactModal from "react-modal"; import "./Modal.css"; import { useTranslation } from "react-i18next"; import MarkdownRender from "./MarkdownRender"; import FriendlyURLInput from "./FriendlyURLInput"; import TextField from "./TextField"; import { useForm } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import * as Yup from "yup"; import { useDashboard, useDashboardVersions, useFriendlyUrl, useSettings, useWindowSize, } from "../hooks"; import { DashboardState } from "../models"; import styles from "./PublishDashboardModal.module.scss"; import BackendService from "../services/BackendService"; import Alert from "./Alert"; import Link from "./Link"; interface PathParams { id: string; dashboardId: string; isOpen: boolean; closeModal: () => void; dashboardPublished?: Function; } interface FormValues { releaseNotes: string; friendlyURL: string; acknowledge: boolean; } function PublishDashboardModal(props: PathParams) { const { t } = useTranslation(); const { settings } = useSettings(); const validationSchema = Yup.object().shape({ releaseNotes: Yup.string().required(t("PublishDashboardModal.MissingVersionNotesError")), friendlyURL: Yup.string() .required(t("PublishDashboardModal.FriendlyURLRequired")) .matches(/\w+(-|\w+)*/gm, t("PublishDashboardModal.InvalidFriendlyURL")), acknowledge: Yup.bool().oneOf([true], t("PublishDashboardModal.AcknowledgementRequired")), }); // functions to build form returned by useForm() hook const { register, errors, handleSubmit, watch } = useForm({ resolver: yupResolver(validationSchema), }); const { dashboard } = useDashboard(props.dashboardId); const { versions } = useDashboardVersions(dashboard?.parentDashboardId); const suggestedUrl = useFriendlyUrl(dashboard, versions); const windowSize = useWindowSize(); const isMobile = windowSize.width <= 600; const acknowledge = watch("acknowledge"); const [publishError, setPublishError] = useState(); const [isDraftDashboard, setIsDraftDashboard] = useState(true); const hasPublishedVersion = (): boolean => { return !!versions.find((v) => v.state === DashboardState.Published); }; const onSubmit = async (values: FormValues) => { setPublishError(undefined); if (dashboard) { try { await BackendService.publishDashboard( dashboard.id, dashboard.updatedAt, values.releaseNotes, values.friendlyURL, ); setIsDraftDashboard(false); if (props.dashboardPublished) { props.dashboardPublished(); } } catch (err: any) { setPublishError( err?.response?.status === 409 ? t("PublishDashboardModal.FailToPublishUrlAlreadyExists") : t("PublishDashboardModal.FailToPublishError"), ); } } }; const publishingGuidanceWithVersionOverride = `${ settings.publishingGuidance.endsWith(".") ? settings.publishingGuidance : settings.publishingGuidance + "." }${hasPublishedVersion() ? " " + t("PublishDashboardModal.OverwriteWarning") : ""}`; return ( { props.closeModal(); }} className={`font-sans-md ${styles.modalLarge} ${ isMobile ? "margin-0 padding-0 border-0" : "" }`} overlayClassName={`${styles.modalOverlay} ${isMobile ? "padding-0" : ""}`} portalClassName={styles.modalPortal} shouldFocusAfterRender={true} shouldReturnFocusAfterClose={true} aria={{ labelledby: `${props.id}-header`, describedby: `${props.id}-description`, modal: "true", }} >
{isDraftDashboard && (

{isDraftDashboard && t("PublishDashboardModal.Title")}

{window.EnvironmentConfig?.authenticationRequired ? t("PublishDashboardModal.PrivateDescription") : t("PublishDashboardModal.Description")}
{publishError && ( )}
{errors.acknowledge && ( {errors.acknowledge.message} )}
)} {!isDraftDashboard && (
{t("PublishDashboardModal.PublishSuccess")} {t("PublishDashboardModal.PublishSuccess")} {t("PublishDashboardModal.PublishSuccessDescription")}
{t("PublishDashboardModal.ViewPublishedDashboard")}
)}
); } export default PublishDashboardModal;