Source: segments-experiment-web/src/main/resources/META-INF/resources/js/state/reducer.es.js

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

export function reducer(state, action) {
	switch (action.type) {
		case 'ADD_EXPERIMENT':
			return {
				...state,
				experiment: action.payload
			};

		case 'ADD_VARIANT':
			return {
				...state,
				variants: [...state.variants, action.payload]
			};

		case 'CREATE_EXPERIMENT_FINISH':
			return {
				...state,
				createExperimentModal: {
					active: false
				}
			};

		case 'CREATE_EXPERIMENT_START':
			return _createExperimentStart(state, action.payload);

		case 'EDIT_EXPERIMENT_FINISH':
			return {
				...state,
				editExperimentModal: {
					active: false
				}
			};

		case 'EDIT_EXPERIMENT_START':
			return _editExperienceStart(state, action.payload);

		case 'UPDATE_EXPERIMENT':
			return {
				...state,
				experiment: {...state.experiment, ...action.payload}
			};

		case 'UPDATE_VARIANT':
			return {
				...state,
				variants: state.variants.map(variant => {
					if (
						action.payload.variantId ===
						variant.segmentsExperimentRelId
					) {
						return {
							...variant,
							...action.payload.changes
						};
					}
					return variant;
				})
			};

		case 'UPDATE_VARIANTS':
			return {
				...state,
				variants: action.payload
			};

		case 'ARCHIVE_EXPERIMENT':
			return {
				...state,
				experiment: null,
				experimentHistory: [
					{...state.experiment, status: action.payload.status},
					...state.experimentHistory
				],
				variants: [],
				winnerVariant: null
			};

		default:
			return state;
	}
}

function _createExperimentStart(state, experimentModalState = {}) {
	const {selectedExperienceId} = state;
	const {
		description,
		error,
		name,
		segmentsExperienceId
	} = experimentModalState;

	return {
		...state,
		createExperimentModal: {
			active: true,
			description,
			error,
			name,
			segmentsExperienceId: segmentsExperienceId
				? segmentsExperienceId
				: selectedExperienceId
		}
	};
}

function _editExperienceStart(state, experiementModalState = {}) {
	const {experiment} = state;

	const {
		description,
		editable,
		error,
		goal,
		name,
		segmentsEntryName,
		segmentsExperienceId,
		segmentsExperimentId,
		status
	} = experiementModalState;

	return {
		...state,
		editExperimentModal: {
			active: true,
			description: description ? description : experiment.description,
			editable: editable ? editable : experiment.editable,
			error: error ? error : experiment.error,
			goal: goal ? goal : experiment.goal,
			name: name ? name : experiment.name,
			segmentsEntryName: segmentsEntryName
				? segmentsEntryName
				: experiment.segmentsEntryName,
			segmentsExperienceId: segmentsExperienceId
				? segmentsExperienceId
				: experiment.segmentsExperienceId,
			segmentsExperimentId: segmentsExperimentId
				? segmentsExperimentId
				: experiment.segmentsExperimentId,
			status: status ? status : experiment.status
		}
	};
}