/**
* WordPress dependencies
*/
import apiFetch from '@safe-wordpress/api-fetch';
import { Button } from '@safe-wordpress/components';
import { _x } from '@safe-wordpress/i18n';
import { addQueryArgs } from '@safe-wordpress/url';
/**
* External dependencies
*/
import { ConfirmationDialog } from '@nab/components';
import { usePageAttribute } from '@nab/data';
import type { AlternativeId, ExperimentId } from '@nab/types';
export type DuplicateControlMenuButtonProps = {
readonly experiment: ExperimentId;
readonly alternative: AlternativeId;
};
export const DuplicateControlMenuButton = ( {
experiment,
alternative,
}: DuplicateControlMenuButtonProps ): JSX.Element => {
const [ isDuplicating, duplicateMenu ] = useMenuDuplicator(
experiment,
alternative
);
const [ isConfirmVisible, showConfirm ] = useConfirmationDialog();
return (
<>
showConfirm( false ) }
onConfirm={ duplicateMenu }
/>
>
);
};
// =====
// HOOKS
// =====
const useConfirmationDialog = () =>
usePageAttribute(
'menus/isConfirmationDialogForMenuDuplicationVisible',
false
);
const useMenuDuplicator = (
experiment: ExperimentId,
alternative: AlternativeId
) => {
const [ isDuplicating, markAsDuplicating ] = usePageAttribute(
'menus/isDuplicatingMenu',
false
);
const duplicateMenu = () => {
if ( isDuplicating ) {
return;
}
void markAsDuplicating( true );
void apiFetch( {
path: addQueryArgs( '/nab/v1/menu/duplicate-control', {
experiment,
alternative,
} ),
method: 'PUT',
} ).finally( () => {
window.location.reload();
} );
};
return [ isDuplicating, duplicateMenu ] as const;
};