actions/StateUserAction.js

/**
 * Функции для изменения текущего состояния user
 * @module StateConfigAction
 * @author Ihor Bielchenko
 */

import Base from '../Base.js';

/**
 * Обновление текущего состояния
 * @param {Object} user
 * @param {Function} callback
 * @return {Function}
 */
export function update(user, callback = () => {}) {
	return (dispatch) => {
		dispatch({
			type: 'UPDATE_USER',
			payload: user
		});
		callback();
	}
}

/**
 * Обновление группы
 * @param {Object} user
 * @param {Object} id Идентификатор группы
 * @param {Object} params 
 * @param {Function} callback
 * @return {Function}
 */
export function updateGroup(user, id, params = {}, callback = () => {}) {
	return (dispatch) => {
		var i,
			group;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === id) {
				user.groups[i] = Object.assign(user.groups[i], params);
				group = user.groups[i];
				break;
			}
		}

		Base.serverSEND(JSON.stringify({
			action: 'teacher/group/edit',
			properties: {
				group_id: group.id,
				name: params.name
			}
		}), (r) => {
			if(r.success === 1) {
				dispatch({
					type: 'UPDATE_USER_GROUP',
					payload: user
				});
				callback(r);
			}
		});
	}
}

/**
 * Удаление группы
 * @param {Object} user
 * @param {Number} id Идентификатор группы
 * @param {Function} callback
 * @return {Function}
 */
export function removeGroup(user, id, callback = () => {}) {
	return (dispatch) => {
		var i,
			id = 0;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === id) {
				if(user.groups[i].id === user.current_group) {
					user.current_group = 0;
				}
				id = user.groups[i].id;
				user.groups.splice(i, 1);
				break;
			}
		}

		Base.serverSEND(JSON.stringify({
			action: 'teacher/group/remove',
			properties: {
				group_id: id
			}
		}), (r) => {
			if(r.success === true) {
				dispatch({
					type: 'REMOVE_USER_GROUP',
					payload: user
				});
				callback(r);
			}
		});
	}
}

/**
 * Добаить группу
 * @param {Object} user
 * @param {Object} params Параметры группы
 * @param {Function} callback
 * @return {Function}
 */
export function addGroup(user, params = {}, callback = () => {}) {
	return (dispatch) => {
		user.groups.push({
			id: Date.now(),
			name: params.name,
			students: [],
			lessons: []
		});

		Base.serverSEND(JSON.stringify({
			action: 'teacher/group/add',
			properties: {
				name: params.name
			}
		}), (r) => {
			dispatch({
				type: 'CREATE_USER_GROUP',
				payload: user
			});
			callback();
		});
	}
}

/**
 * Обновление настроек соц сетей пользователя
 * @param {Object} user
 * @param {Object} params
 * @param {Function} callback
 * @return {Function}
 */
export function updateSocials(user, params = {}, callback = () => {}) {
	return (dispatch) => {
		user = Object.assign(user, params);
		dispatch({
			type: 'UPDATE_USER_SOCIALS',
			payload: user
		});
		callback();
	}
}

/**
 * Добавление урока
 * @param {Object} user
 * @param {Object} params
 * @param {Function} callback
 * @return {Function}
 */
export function addLessonFirst(user, params = {}, callback = () => {}) {
	return (dispatch) => {
		var group,
			i;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
			}
		}

		group.lessons.push({
			id: 0,
			name: '',
			theme: '',
			class_name: params.class_name,
			group_id: params.group_id,
			days: params.days,
			learn_word_repeat: 1,
			write_word_repeat: 1,
			find_word_repeat: 1,
			snake_repeat: 1,
			scrabble_repeat: 1,
			done_time: '13 октября 2017г.',
			data: params.data
		});

		dispatch({
			type: 'ADD_GROUP_LESSONS',
			payload: user
		});
		callback();
	}
}

/**
 * Создание урока и отправка в базу
 * @param {Object} user
 * @param {Object} params
 * @param {Function} callback
 * @return {Function}
 */
export function create(user, assignParams = {}, queryParams = {}, callback = () => {}) {
	return (dispatch) => {
		var group,
			i;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
				break;
			}
		}

		let lessons = group.lessons;
		let item = lessons[lessons.length - 1];

		Base.serverSEND(JSON.stringify({
			action: 'teacher/lessons/add',
			properties: Object.assign(queryParams, {
				group_id: group.id,
				days: group.days
			})
		}), (r) => {
			if(r.success === 1) {
				item.id = Date.now();
				item = Object.assign(item, assignParams);

				dispatch({
					type: 'CREATE_GROUP_LESSONS',
					payload: user
				});
				callback(r);
			}
		});
	}
}

/**
 * Изменение параметра remove у пользователя
 * @param {Object} user
 * @param {Number} index Индекс пользователя
 * @param {Function} callback
 * @return {Function}
 */
export function prepareDeleteUser(user, index, callback = () => {}) {
	return (dispatch) => {
		var group,
			i;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
			}
		}

		group.students[index].remove = 1;

		dispatch({
			type: 'DELETE_USER_FROM_GROUP',
			payload: user
		});
		callback();
	}
};

/**
 * Удаление пользователя из текущей группы
 * @param {Number} index Индекс пользователя
 * @param {Function} callback
 * @return {Function}
 */
export function deleteUser(user, callback = () => {}) {
	return (dispatch) => {
		var group,
			i,
			ids = [],
			clear = [];

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
				break;
			}
		}

		for(i = 0; i < group.students.length; i++) {
			if(group.students[i].remove === 1) {
				ids.push(group.students[i].id);
				delete group.students[i];
			}
		}

		for(i in group.students) {
			clear.push(group.students[i]);
		}

		group.students = clear;

		Base.serverSEND(JSON.stringify({
			action: "teacher/students/delete",
			properties: {
				group_id: group.id,
				users: ids
			}
		}), (r) => {
			if(r.success === 1) {
				dispatch({
					type: 'DELETE_USER_FROM_GROUP',
					payload: user
				});
				callback(r);
			}
		});
	}
};

/**
 * Удаление урока
 * @param {Number} index Индекс урока
 * @param {Function} callback
 * @return {Function}
 */
export function removeTask(user, index, callback = () => {}) {
	return (dispatch) => {
		var group,
			i;

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
				break;
			}
		}
		group.lessons[index].remove = 1;

		dispatch({
			type: 'DELETE_USER_LESSON',
			payload: user
		});
		callback();
	}
};

/**
 * Удаление уроков из базы
 * @param {Number} index Индекс урока
 * @param {Function} callback
 * @return {Function}
 */
export function configmRemoveTasks(user, callback = () => {}) {
	return (dispatch) => {
		var group,
			i,
			ids = [],
			clear = [];

		for(i = 0; i < user.groups.length; i++) {
			if(user.groups[i].id === user.current_group) {
				group = user.groups[i];
				break;
			}
		}

		for(i = 0; i < group.lessons.length; i++) {
			if(group.lessons[i].remove === 1) {
				ids.push(group.lessons[i].id);
				delete group.lessons[i];
			}
		}

		for(i in group.lessons) {
			clear.push(group.lessons[i]);
		}
		group.lessons = clear;

		Base.serverSEND(JSON.stringify({
			action: 'teacher/lessons/remove',
			properties: {
				group_id: group.id,
				lessons: ids
			}
		}), () => {
			dispatch({
				type: 'DELETE_USER_LESSON',
				payload: user
			});
			callback();
		});
	}
};

/**
 * Обновление параметров профиля
 * @param {Object} user
 * @param {Object} assignParams Параметры, которые нужно обновить в состоянии
 * @param {Object} queryParams Параметры, которые нужно отправить на сервер
 * @param {Function} callback
 * @return {Function}
 */
export function updateProfile(user, assignParams = {}, queryParams = {}, callback = () => {}) {
	return (dispatch) => {
		user = Object.assign(user, assignParams);

		Base.serverSEND(JSON.stringify({
			action: 'teacher/profile/edit',
			properties: queryParams
		}), (r) => {
			if(r.success === 1) {
				dispatch({
					type: 'PROFILE_USER_UPDATE',
					payload: user
				});
				callback(r);
			}
		});
	}
};