Skip to content

Instantly share code, notes, and snippets.

@thenickcox
Created May 12, 2016 19:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thenickcox/c6d7311f8da576a15ed6108d699721c2 to your computer and use it in GitHub Desktop.
Save thenickcox/c6d7311f8da576a15ed6108d699721c2 to your computer and use it in GitHub Desktop.
import McFly from 'mcfly';
const Flux = new McFly();
import WeekStore from './week_store.js';
let _blocks = {};
let _persisted = {};
let _trainingModule = {};
let _editableBlockIds = [];
let _editingAddedBlock = false;
const setBlocks = (data, persisted = false) => {
data.map((week) => {
week.blocks.map((block) => {
_blocks[block.id] = block;
if (persisted) {
_persisted[block.id] = $.extend(true, {}, block);
}
});
});
BlockStore.emitChange();
};
const updatePersisted = () => {
Object.keys(_blocks).map((blockId) => {
_persisted[blockId] = $.extend(true, {}, _blocks[blockId]);
});
};
const setBlock = (data, quiet) => {
_blocks[data.id] = data;
if (!quiet) {
BlockStore.emitChange();
}
};
const setTrainingModule = (module) => {
_trainingModule = module;
BlockStore.emitChange()
};
const addBlock = (weekId) => {
weekBlocks = _.reject(BlockStore.getBlocksInWeek(weekId), (block) => block.deleted);
const block = {
id: Date.now(),
is_new: true,
kind: 0,
title: "",
content: "",
gradeable_id: null,
week_id: week_id,
order: week_blocks.length,
duration: null
};
setBlock(block);
setEditableBlockId(block.id);
}
removeBlock = (blockId) => {
delete(_blocks[blockId]);
_editingAddedBlock = false;
BlockStore.emitChange();
}
const insertBlock = (block, toWeek, targetIndex) => {
const fromWeekId = block.week_id;
block.week_id = toWeek.id;
if (targetIndex) {
if (toWeek.id == fromWeekId) {
block.order = block.order > targetIndex ? targetIndex - .5 : targetIndex + .5;
} else {
const fromWeek = WeekStore.getWeek(fromWeekId);
block.order = fromWeek.order > toWeek.order ? targetIndex + 999 : targetIndex - .5;
}
} else {
block.order = -1
}
setBlock(block, true);
const fromWeekBlocks = BlockStore.getBlocksInWeek(fromWeekId);
fromWeekBlocks.forEach((block, i) => {
b.order = i;
setBlock(block, true);
});
if (fromWeekId != toWeek.id) {
const toWeekBlocks = BlockStore.getBlocksInWeek(toWeek.id);
toWeekBlocks.forEach((block, i) => {
b.order = i;
setBlock(b, true);
});
BlockStore.emitChange()
};
const isAddedBlock = (blockId) => {
// new block ids are set to Date.now()
blockId > 1000000000
};
const setEditableBlockId = (blockId) => {
_editableBlockIds.push(blockId);
_editingAddedBlock = isAddedBlock(blockId);
BlockStore.emitChange();
};
const BlockStore = Flux.createStore({
getBlock(blockId) {
return _blocks[blockId];
},
getBlocks() {
const blockList = [];
Object.keys(_blocks).map((blockId) => {
blockList.push(_blocks[block_id]);
});
return blockList;
},
getBlocksInWeek(week_id) {
const blocks = _.filter(_blocks, (block) => { block.week_id === week_id });
return blocks.sort((a,b) => { a.order - b.order });
},
restore() {
_blocks = $.extend(true, {}, _persisted);
_editingAddedBlock = false;
BlockStore.emitChange();
},
getTrainingModule() {
return _trainingModule;
},
getEditableBlockIds() {
return _editableBlockIds;
},
clearEditableBlockIds() {
_editableBlockIds = [];
BlockStore.emitChange();
},
cancelBlockEditable(blockId) {
_editableBlockIds.splice(_editableBlockIds.indexOf(blockId), 1);
_editingAddedBlock = false;
BlockStore.emitChange()
},
editingAddedBlock() {
return _editingAddedBlock;
}
}, function(payload) {
const data = payload.data;
switch(payload.actionType) {
case 'RECEIVE_TIMELINE':
case 'SAVED_TIMELINE':
case 'WIZARD_SUBMITTED':
_blocks = {};
setBlocks(data.course.weeks, true);
break;
case 'ADD_BLOCK':
addBlock(data.week_id);
break;
case 'UPDATE_BLOCK':
setBlock(data.block, data.quiet);
break;
case 'DELETE_BLOCK':
removeBlock(data.block_id);
break;
case 'INSERT_BLOCK':
insertBlock(data.block, data.toWeek, data.afterBlock);
break;
case 'SET_BLOCK_EDITABLE':
setEditableBlockId(data.block_id);
break;
}
return true;
});
export default BlockStore;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment