import React, { Fragment, useEffect } from 'react';
import Duration from '../../experiments/components/duration';
import withTestData from '../../experiments/data/with-test-data';
import { arrayEquals, compactMetric, getLetter, getLift, removeElement, replaceElement } from '../../utils';
import { getP2BB, trackEvent } from '../../utils/admin';
import { DateTimePicker } from './DateTimePicker';
import { Button } from '@/components/ui/button';
import { Caption } from '@/components/ui/typography';
const { Icon } = wp.components;
const { __ } = wp.i18n;
const TraySettings = ( props: any ) => {
const {
abTest,
isSaving,
originalValues,
post,
prevValues,
defaultValue,
values,
test,
setState,
updateTest,
updateValues,
} = props;
const {
paused,
started,
start_time: startTime,
end_time: endTime,
traffic_percentage: trafficPercentage,
results,
} = test;
const {
variants = [],
} = results;
const { component: Component } = abTest;
const baseRate = ( variants && variants[ 0 ] ) ? variants[ 0 ].rate * 100 : 0;
useEffect( () => {
if ( originalValues.length && ! prevValues.length ) {
setState( { prevValues: originalValues } );
}
}, [ originalValues, prevValues, setState ] );
const setPaused = ( state: boolean ) => {
setState( { prevValues: values } );
updateTest( { paused: state }, values, true );
};
const startTest = ( vals: any[] ) => {
setState( { prevValues: vals } );
updateTest( {
started: true,
paused: false,
}, vals, true );
};
const resetValues = () => {
updateValues( prevValues );
};
const isActive = started && startTime <= Date.now() && endTime >= Date.now();
const allValues = values.length > 0 ? values : [ defaultValue ];
const traffic = trafficPercentage ?? 35;
const startDate = new Date( startTime || Date.now() );
const endDate = new Date( endTime || Date.now() + ( 30 * 24 * 60 * 60 * 1000 ) );
const isRunning = ! paused && started;
return (
<>
{ /* Variant table */ }
| { __( 'Variant', 'altis' ) } |
{ abTest.singleTitle } |
{ __( 'Views', 'altis' ) } |
{ isRunning && (
<>
{ __( 'Conversion Rate', 'altis' ) } |
{ __( 'Improvement', 'altis' ) } |
{ __( 'Probability to be Best', 'altis' ) } |
>
) }
{ isRunning && (
{ __( 'Preview', 'altis' ) } |
) }
{ paused && (
|
) }
{ allValues.map( ( value: any, index: number ) => {
const variant = ( variants && variants[ index ] ) || { size: 0 };
return (
0 ? 'border-t' : '' }` }
style={ index > 0 ? { borderTopColor: '#ddd' } : {} }
>
|
{ `${ __( 'Variant', 'altis' ) } ${ getLetter( index ) }` }
{ index === 0 ? ` ${ __( '(original)', 'altis' ) }` : '' }
|
updateValues( replaceElement( allValues, v, index ) ) }
onRemove={ () => updateValues( removeElement( allValues, index ) ) }
/>
|
{ variant.size > 0 ? variant.size.toLocaleString() : '—' }
|
{ isRunning && variant.size > 0 && (
<>
{ variant.rate != null ? compactMetric( variant.rate * 100, '%' ) : '—' }
|
{ index === 0
? '—'
: compactMetric( getLift( variant.rate * 100, baseRate ), '%' ) }
|
{ variant.p != null ? compactMetric( getP2BB( variant.p ), '%' ) : '—' }
|
>
) }
{ isRunning && variant.size === 0 && (
{ __( 'Collecting data...', 'altis' ) }
|
) }
{ isRunning && (
|
) }
{ paused && index > 0 && (
|
) }
{ paused && index === 0 && (
|
) }
);
} ) }
{ /* Add variant row */ }
{ paused && allValues.length < 26 && (
|
{ `${ __( 'Variant', 'altis' ) } ${ getLetter( allValues.length ) }` }
|
updateValues( replaceElement( allValues, value, allValues.length ) ) }
/>
|
) }
{ /* Action bar */ }
{ /* Status + primary action */ }
{ paused && started && (
{ __( 'Test paused', 'altis' ) }
) }
{ isActive && ! paused && (
{ __( 'Test running', 'altis' ) }
) }
{ ! paused && started && startTime >= Date.now() && (
{ __( 'Starts in', 'altis' ) }{ ' ' }
) }
{ started && (
) }
{ ! started && (
) }
{ ! started && values.length < 2 && (
{ __( 'Add a second variant to get started.', 'altis' ) }
) }
{ /* Warnings */ }
{ started && paused && ! arrayEquals( values, prevValues ) && (
{ __( 'Changing variants will reset results.', 'altis' ) }
) }
{ /* Traffic */ }
{ __( 'Traffic', 'altis' ) }
) => updateTest( { traffic_percentage: Number( e.target.value ) } ) }
/>
) => updateTest( { traffic_percentage: Number( e.target.value ) } ) }
/>
{ /* Dates */ }
{
updateTest( { start_time: ts < endDate.getTime() ? ts : endTime - ( 24 * 60 * 60 * 1000 ) } );
} }
/>
→
{
updateTest( { end_time: ts > startDate.getTime() ? ts : startTime + ( 24 * 60 * 60 * 1000 ) } );
} }
/>
{ /* End test */ }
{ started && (
) }
>
);
};
export const ExperimentTraySettings = withTestData( TraySettings );