/**
* WordPress dependencies
*/
import {
Dashicon,
ToggleGroupControl,
ToggleGroupControlOption,
} from '@safe-wordpress/components';
import { useSelect } from '@safe-wordpress/data';
import { createInterpolateElement, useState } from '@safe-wordpress/element';
import { _x, sprintf } from '@safe-wordpress/i18n';
/**
* External dependencies
*/
import { store as NAB_DATA } from '@nab/data';
import { numberFormat } from '@nab/i18n';
import { EMPTY_OBJECT } from '@nab/utils';
/**
* Internal dependencies
*/
import './style.scss';
import { ArpcChart } from './arpc-chart';
import { ArpcImprovementChart } from './arpc-improvement-chart';
import { ArpcTimelineChart } from './arpc-timeline-chart';
import { ConversionRatesChart } from './conversion-rates-chart';
import { ConversionRatesTimelineChart } from './conversion-rates-timeline-chart';
import { ViewsAndConversionsTimelineChart } from './views-and-conversions-timeline-chart';
import { ConversionImprovementChart } from './conversion-improvement-chart';
import { RevenueChart } from './revenue-chart';
import { RevenueImprovementChart } from './revenue-improvement-chart';
import { RevenueTimelineChart } from './revenue-timeline-chart';
import { getMoneyLabel, getNumberLabel } from '../utils';
import { useAreUniqueResultsVisible } from '../hooks';
type ChartType =
| 'conversion-rate'
| 'views-and-conversions'
| 'revenue'
| 'arpc';
export const EvolutionSection = (): JSX.Element => {
const [ activeTimeline, setActiveTimeline ] =
useState< ChartType >( 'conversion-rate' );
return (
);
};
// ============
// HELPER VIEWS
// ============
const Title = () => (
{ createInterpolateElement(
sprintf(
/* translators: %s: Dashicon. */
_x( '%s Evolution', 'text', 'nelio-ab-testing' ),
''
),
{
icon: (
),
}
) }
);
const Summary = (): JSX.Element => {
const {
areResultsUnique,
conversionRate,
conversions,
ecommerce,
uniquePageViews,
totalPageViews,
revenue,
} = useAttributes();
return (
-
{ areResultsUnique
? _x( 'Total Page Views:', 'text', 'nelio-ab-testing' )
: _x( 'Page Views:', 'text', 'nelio-ab-testing' ) }
{ getNumberLabel( totalPageViews ) }
{ areResultsUnique && (
-
{ _x(
'Unique Page Views:',
'text',
'nelio-ab-testing'
) }
{ getNumberLabel( uniquePageViews ) }
) }
{ !! ecommerce && (
-
{ _x( 'Revenue:', 'text', 'nelio-ab-testing' ) }
{ getMoneyLabel( revenue, ecommerce ) }
) }
-
{ areResultsUnique
? _x(
'Unique Conversions:',
'text',
'nelio-ab-testing'
)
: _x( 'Conversions:', 'text', 'nelio-ab-testing' ) }
{ getNumberLabel( conversions ) }
{ getConversionRateLabel( conversionRate ) }
);
};
const ChartSelector = ( {
value,
onChange,
}: {
value: ChartType;
onChange: ( v: ChartType ) => void;
} ) => {
const { ecommerce } = useAttributes();
return (
onChange( newValue as ChartType ) }
>
{ !! ecommerce && (
<>
>
) }
);
};
type ChartFunction = ( props: { type: ChartType } ) => JSX.Element | null;
const TimelineChart: ChartFunction = ( { type } ) => {
const { activeGoal, alternatives, areResultsUnique, ecommerce } =
useAttributes();
switch ( type ) {
case 'conversion-rate':
return (
);
case 'views-and-conversions':
return (
);
case 'revenue':
if ( ! ecommerce ) {
return null;
}
return (
);
case 'arpc':
if ( ! ecommerce ) {
return null;
}
return (
);
}
};
const ExtraCharts: ChartFunction = ( { type } ) => (
);
const ComparisonChart: ChartFunction = ( { type } ) => {
const {
activeGoal,
alternatives,
areResultsUnique,
ecommerce,
minConfidence,
winners,
} = useAttributes();
switch ( type ) {
case 'conversion-rate':
case 'views-and-conversions':
return (
);
case 'revenue':
if ( ! ecommerce ) {
return null;
}
return (
);
case 'arpc':
if ( ! ecommerce ) {
return null;
}
return (
);
}
};
const ImprovementChart: ChartFunction = ( { type } ) => {
const { activeGoal, alternatives, areResultsUnique, ecommerce } =
useAttributes();
switch ( type ) {
case 'conversion-rate':
case 'views-and-conversions':
return (
);
case 'revenue':
if ( ! ecommerce ) {
return null;
}
return (
);
case 'arpc':
if ( ! ecommerce ) {
return null;
}
return (
);
}
};
// =====
// HOOKS
// =====
const useAttributes = () => {
const [ areResultsUnique ] = useAreUniqueResultsVisible();
return useSelect(
( select ) => {
const {
getAlternativeResultsInExperiment,
getConversions,
getExperimentAttribute,
getPageAttribute,
getPageViews,
getTotalPageViews,
getUniquePageViews,
getPluginSetting,
getTotalRevenue,
getWinnersInExperiment,
getECommercePlugin,
} = select( NAB_DATA );
const activeExperiment =
getPageAttribute( 'editor/activeExperiment' ) ?? 0;
const goals =
getExperimentAttribute( activeExperiment, 'goals' ) ?? [];
const activeGoalId =
getPageAttribute( 'editor/activeGoal' ) ?? goals[ 0 ]?.id ?? '';
const pageViews = getPageViews( activeExperiment );
const conversions = getConversions(
activeExperiment,
activeGoalId
);
const revenue = getTotalRevenue( activeExperiment, activeGoalId );
return {
totalPageViews: getTotalPageViews( activeExperiment ),
uniquePageViews: getUniquePageViews( activeExperiment ),
conversions,
conversionRate: ( conversions / pageViews ) * 100 || 0,
activeGoal: activeGoalId,
areResultsUnique,
revenue,
ecommerce: getECommercePlugin( activeExperiment, activeGoalId ),
alternatives:
getAlternativeResultsInExperiment( activeExperiment ),
winners:
getWinnersInExperiment( activeExperiment ) ?? EMPTY_OBJECT,
minConfidence: getPluginSetting( 'minConfidence' ),
};
},
[ areResultsUnique ]
);
};
// =======
// HELPERS
// =======
function getConversionRateLabel( conversionRate?: number ): JSX.Element {
if ( ! conversionRate ) {
return <>>;
}
return <>({ numberFormat( conversionRate ) }%)>;
}