/** * 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 DuplicateControlWidgetsButtonProps = { readonly experiment: ExperimentId; readonly alternative: AlternativeId; }; export const DuplicateControlWidgetsButton = ( { experiment, alternative, }: DuplicateControlWidgetsButtonProps ): JSX.Element => { const [ isConfirmVisible, showConfirm ] = useConfirmationDialog(); const [ isDuplicating, duplicateWidgets ] = useWidgetDuplicator( experiment, alternative ); return ( showConfirm( false ) } onConfirm={ duplicateWidgets } /> ); }; // ===== // HOOKS // ===== const useConfirmationDialog = () => usePageAttribute( 'widgets/isConfirmationDialogForWidgetDuplicationVisible', false ); const useWidgetDuplicator = ( experiment: ExperimentId, alternative: AlternativeId ) => { const [ isDuplicating, markAsDuplicating ] = usePageAttribute( 'widgets/isDuplicatingWidgets', false ); const duplicateWidget = () => { if ( isDuplicating ) { return; } void markAsDuplicating( true ); void apiFetch( { path: addQueryArgs( '/nab/v1/widget/duplicate-control', { experiment, alternative, } ), method: 'PUT', } ).finally( () => { window.location.reload(); } ); }; return [ isDuplicating, duplicateWidget ] as const; };