/** * WordPress dependencies */ import { _x } from '@safe-wordpress/i18n'; /** * External dependencies */ import { filter, map, values } from 'lodash'; import type { AlternativeId, Goal, Maybe, Segment, SegmentId, } from '@nab/types'; /** * Internal dependencies. */ import type { State } from '../types'; export function isExperimentBeingSaved( state: State ): boolean { return !! state.editor.isExperimentBeingSaved; } export function hasExperimentBeenRecentlySaved( state: State ): boolean { return !! state.editor.hasExperimentBeenRecentlySaved; } export function getActiveGoal( state: State ): Maybe< Omit< Goal, 'conversionActions' > > { return ( state.experiment.goals[ state.editor.activeGoalId ] || values( state.experiment.goals )[ 0 ] ); } export function getActiveGoalIndex( state: State ): number { return ( map( state.experiment.goals, 'id' ).indexOf( state.editor.activeGoalId ) || 0 ); } const DEFAULT_SEGMENT: Omit< Segment, 'segmentationRules' > = { id: 'default-segment' as SegmentId, attributes: { name: _x( 'Combined Segment (Auto)', 'text', 'nelio-ab-testing' ), }, }; export function getActiveSegment( state: State ): Maybe< Omit< Segment, 'segmentationRules' > > { if ( state.editor.activeSegmentId === 'default-segment' ) { return DEFAULT_SEGMENT; } return filter( state.experiment.segmentation.segments, { id: state.editor.activeSegmentId, } )[ 0 ]; } export function getActiveSegmentIndex( state: State ): number { return ( map( state.experiment.segmentation.segments, 'id' ).indexOf( state.editor.activeSegmentId ) || 0 ); } export function getDraftStatusRationale( state: State ): Maybe< string > { if ( ! state.experiment || ! state.experiment.data ) { return; } const isDraft = [ 'draft', 'paused_draft' ].includes( state.experiment.data.status ); if ( ! isDraft ) { return; } return state.editor.draftStatusRationale; } export function getAlternativePreviewerUrl( state: State ): string { return state.editor.alternativePreviewerUrl; } export function getAiAlternativeModal( state: State ): Maybe< AlternativeId > { return state.editor.aiAlternativeModal; } export function getReusableDialog( state: State ): State[ 'editor' ][ 'reusableDialog' ] { return state.editor.reusableDialog; }