/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { useCallback, useEffect, useRef, useState } from "react"; import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, EuiButtonProps, EuiButtonEmptyProps } from "@elastic/eui"; import classNames from "classnames"; import BottomBar from "../BottomBar"; import "./index.scss"; export type CustomFormRowProps = { unsavedCount: number; formErrorsCount?: number; onClickCancel?: () => void; onClickSubmit: () => Promise; submitButtonDataTestSubj?: string; renderProps?: (props: { renderCancel: () => React.ReactChild; renderConfirm: () => React.ReactChild; renderUnsavedText: () => React.ReactChild; loading?: boolean; }) => React.ReactChild; confirmButtonProps?: EuiButtonProps; cancelButtonprops?: EuiButtonEmptyProps; }; export default function UnsavedChangesBottomBar(props: CustomFormRowProps) { const { unsavedCount, onClickCancel, onClickSubmit, submitButtonDataTestSubj, formErrorsCount } = props; const [loading, setLoading] = useState(false); const destroyRef = useRef(false); const onClick = async () => { setLoading(true); try { await onClickSubmit(); } catch (e) { } finally { if (destroyRef.current) { return; } setLoading(false); } }; useEffect(() => { return () => { destroyRef.current = true; }; }, []); const renderCancel = useCallback( () => ( ), [onClickCancel] ); const renderConfirm = useCallback( () => ( ), [onClick, submitButtonDataTestSubj, loading] ); const renderUnsavedText = useCallback( () => ( <> {formErrorsCount ? (
{formErrorsCount} form errors. ) : null} {unsavedCount && !formErrorsCount ? (
{unsavedCount} unsaved changes. ) : null} ), [unsavedCount, formErrorsCount] ); const renderProps = props.renderProps || (() => ( <> {renderUnsavedText()} {renderCancel()} {renderConfirm()} )); return ( {renderProps({ renderCancel, renderConfirm, renderUnsavedText, loading, })} ); }