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 */ } { isRunning && ( <> ) } { isRunning && ( ) } { paused && ( { allValues.map( ( value: any, index: number ) => { const variant = ( variants && variants[ index ] ) || { size: 0 }; return ( 0 ? 'border-t' : '' }` } style={ index > 0 ? { borderTopColor: '#ddd' } : {} } > { isRunning && variant.size > 0 && ( <> ) } { isRunning && variant.size === 0 && ( ) } { isRunning && ( ) } { paused && index > 0 && ( ) } { paused && index === 0 && ( ); } ) } { /* Add variant row */ } { paused && allValues.length < 26 && ( ) }
{ __( 'Variant', 'altis' ) } { abTest.singleTitle } { __( 'Views', 'altis' ) }{ __( 'Conversion Rate', 'altis' ) } { __( 'Improvement', 'altis' ) } { __( 'Probability to be Best', 'altis' ) }{ __( 'Preview', 'altis' ) } ) }
{ `${ __( 'Variant', 'altis' ) } ${ getLetter( index ) }` } { index === 0 ? ` ${ __( '(original)', 'altis' ) }` : '' } updateValues( replaceElement( allValues, v, index ) ) } onRemove={ () => updateValues( removeElement( allValues, index ) ) } /> { variant.size > 0 ? variant.size.toLocaleString() : '—' } { variant.rate != null ? compactMetric( variant.rate * 100, '%' ) : '—' } { index === 0 ? '—' : compactMetric( getLift( variant.rate * 100, baseRate ), '%' ) } { variant.p != null ? compactMetric( getP2BB( variant.p ), '%' ) : '—' }
{ __( 'Collecting data...', 'altis' ) }
) }
{ `${ __( '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 );