mirror of
https://github.com/wassname/HackFlowy.git
synced 2026-07-02 16:50:06 +08:00
343 lines
8.2 KiB
JavaScript
343 lines
8.2 KiB
JavaScript
var CURRENT_TIMESTAMP;
|
|
var socket = null;
|
|
|
|
var AppRouter = Backbone.Router.extend({
|
|
|
|
socketEvents: _.extend({}, Backbone.Events),
|
|
|
|
routes: {
|
|
'': 'initialize',
|
|
':id': "viewRoot"
|
|
},
|
|
|
|
initialize: function(){
|
|
this.socketInitialize();
|
|
},
|
|
|
|
socketInitialize: function(){
|
|
if(socket){ return; }//prevents double-initialization.
|
|
socket = io.connect();
|
|
this.setUpSocket();
|
|
|
|
$.ajax({
|
|
url: "/ajaxlogin",
|
|
type: "POST",
|
|
|
|
complete: function(){
|
|
},
|
|
success: function(data){
|
|
// console.log("AjaxLoginDATA");
|
|
if(typeof data == "string"){
|
|
$("textarea").attr("disabled", true);
|
|
} //User is not logged in.
|
|
if(typeof data == "object"){//we've got the userObject.
|
|
$("#googleButton").parent().html("<a href='logout'>Logout</a> ");
|
|
socket.emit("logIn", data); //logs the user into the socket.
|
|
|
|
|
|
data.google.id = null; //why?
|
|
data.google.token = null;
|
|
data.google.email = null;
|
|
CurrentUser = data;
|
|
}
|
|
},
|
|
error: function(data){
|
|
console.log("ERROR- AjaxLoginDATA");
|
|
}
|
|
});//ajax
|
|
},
|
|
|
|
viewRoot: function(id, snapCollection){
|
|
|
|
var rootModel;
|
|
var metaCollection;
|
|
var snapView = 0;
|
|
|
|
if(snapCollection){
|
|
rootModel = snapCollection.findWhere({cur_id: id});
|
|
metaCollection = snapCollection
|
|
snapView = 1;
|
|
}
|
|
else{
|
|
rootModel = nodesCollection.findWhere({_id: id});
|
|
metaCollection = nodesCollection;
|
|
}
|
|
var rootView = new listView({
|
|
depth: -1,
|
|
model: rootModel,
|
|
metaCollection: metaCollection,
|
|
snapView: snapView
|
|
})
|
|
$(".main1").html(rootView.render().$el);
|
|
this.changeView(rootView);
|
|
},
|
|
|
|
changeView: function(view) {
|
|
if ( this.currentView != null ) {
|
|
this.currentView.undelegateEvents();
|
|
}
|
|
|
|
this.currentView = view;
|
|
$("textarea").textareaAutoExpand();
|
|
},
|
|
|
|
viewSearchSubset: function(matchedNodes){
|
|
console.log("matchedNodes", matchedNodes);
|
|
var SUBSET = matchedNodes
|
|
|
|
augmentedSet = []
|
|
_.each(SUBSET, function(matchedNode){
|
|
augmentedSet.push([matchedNode.get("_id")]);
|
|
augmentedSet.push(matchedNode.getAncestry());
|
|
});
|
|
var finalSet = _.union(_.flatten(augmentedSet));
|
|
var rootView = new listView({
|
|
depth: -1,
|
|
model: nodesCollection.findWhere({_id: $('.root').attr('data-id')}),
|
|
metaCollection: nodesCollection,
|
|
snapView: 0 ,
|
|
searchSet: finalSet
|
|
})
|
|
$(".main1").html(rootView.render().$el);
|
|
this.changeView(rootView);
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setUpSocket: function(){
|
|
var that = this;
|
|
|
|
socket.emitWrapper = function(eventName, data){
|
|
// console.log(this);
|
|
if(this.socket.connected){
|
|
if(eventName=="newNode" || eventName=="movedNode" || eventName=="removeNode"){
|
|
var oldTime = CURRENT_TIMESTAMP;
|
|
CURRENT_TIMESTAMP = Date.now();
|
|
this.emit(eventName, data, [CURRENT_TIMESTAMP, oldTime]);
|
|
return;
|
|
}
|
|
this.emit(eventName, data);
|
|
}
|
|
else{ //(alert + lock)
|
|
alert("Internet connection down. Edits not synced. Refresh when back online.");
|
|
}
|
|
}
|
|
|
|
socket.on('nodeData', function(data, SERVER_TIMESTAMP){
|
|
//alert("data");
|
|
CURRENT_TIMESTAMP = SERVER_TIMESTAMP;
|
|
console.log(data[0]);
|
|
nodesCollection = new NodesCollection(data);
|
|
var id = nodesCollection.findWhere({text: "0root"}).get("_id");
|
|
// if(otherID){
|
|
// id = otherID
|
|
// }
|
|
that.viewRoot(id);
|
|
});
|
|
|
|
|
|
socket.on("commitReceived", function(){
|
|
alert("commitReceived");
|
|
});
|
|
|
|
socket.on("revHistory", function(data){
|
|
alert("revHistory!!");
|
|
console.log("revHistory!!");
|
|
snapHash = data[0];
|
|
timeHash = data[1];
|
|
console.log("snapHash");
|
|
console.log(snapHash);
|
|
console.log("timeHash");
|
|
console.log(timeHash);
|
|
|
|
var list = "";
|
|
_.each(Object.keys(timeHash).sort(), function(timestamp){
|
|
list += "<li><a class='timestamp'>"+timestamp+"</a></li>";
|
|
})
|
|
|
|
$("#revTimestamps").html(list);
|
|
});
|
|
|
|
UserHash = {};
|
|
socket.on("UserList", function(data){
|
|
_.each(data, function(user){
|
|
UserHash[user._id] = user.google.name;
|
|
});
|
|
});
|
|
|
|
socket.on('edit', function(data){
|
|
var id = data[0];
|
|
var newText = data[1];
|
|
|
|
var curModel = nodesCollection.findWhere({_id: id})
|
|
curModel.set("text", newText);
|
|
_.each(curModel.get("views"), function(view){
|
|
view.updateText(newText);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
socket.on("updateReceived", function(data){
|
|
//data[0] is _id. data[1] is instance.
|
|
var instance = data[1];
|
|
var old_id = data[0];
|
|
var parId = data[2][0];
|
|
var newIndex = data[2][1];
|
|
|
|
var parentModel = nodesCollection.findWhere({_id: parId});
|
|
var new_id = instance._id
|
|
var oldModel = nodesCollection.findWhere({ _id: old_id });
|
|
oldModel.set("_id", new_id );
|
|
_.each(oldModel.get("views"), function(view){
|
|
view.updateId(new_id);
|
|
});
|
|
parentModel.get("children")[newIndex] = instance._id;
|
|
})
|
|
|
|
socket.on("newNode", function(data, newTime){
|
|
//need the instance + the index.
|
|
var modelJson = data[1]; //(includes the negative ID to find later);
|
|
var parId = data[0][0];
|
|
var newIndex = data[0][1];
|
|
CURRENT_TIMESTAMP = newTime;
|
|
|
|
var newNode = new NodeModel(modelJson);
|
|
nodesCollection.add(newNode);
|
|
var parentModel = nodesCollection.findWhere({_id: parId});
|
|
var parentViews = parentModel.get("views");
|
|
_.each(parentViews, function(parentView){
|
|
parentView.addNode(newNode, newIndex).lock();
|
|
//look at socket.emit("newNode" to see why -1);
|
|
});
|
|
parentModel.get("children").insert(newIndex, modelJson._id);
|
|
});
|
|
|
|
socket.on("editing", function(data){
|
|
var id = data[0];
|
|
var authorName = data[1];
|
|
console.log("EDITING RECEIVED + ID");
|
|
console.log(id, authorName);
|
|
if(id < 0){return;} //(ID is updated later) //(newNode is called);
|
|
var tempViews = nodesCollection.findWhere({_id: id}).get("views");
|
|
_.each(tempViews, function(tempView){
|
|
tempView.lock(authorName);
|
|
});
|
|
});
|
|
|
|
socket.on("blurred", function(data){
|
|
var id = data[0];
|
|
var tempModel = nodesCollection.findWhere({_id: id});
|
|
// alert("blurred");
|
|
console.log("blurred");
|
|
console.log(data);
|
|
if(data[1] != null){
|
|
var text = data[1];
|
|
var author = data[2];
|
|
|
|
|
|
tempModel.set("text", text);
|
|
tempModel.set("author", author);
|
|
}
|
|
|
|
var tempViews = tempModel.get("views");
|
|
_.each(tempViews, function(tempView){
|
|
tempView.unlock();
|
|
tempView.updateText(text);
|
|
});
|
|
});
|
|
|
|
socket.on("removeNode", function(data, newTime){
|
|
var tempVo = {}; //PROTECTING STATE!!
|
|
CURRENT_TIMESTAMP = newTime;
|
|
|
|
// tempVo.author = data[3]; //(actually, unnecessary...)
|
|
tempVo.thisId = data[0];
|
|
tempVo.thisIndex = data[1];
|
|
tempVo.parentId = data[2];
|
|
tempVo.thisModel = nodesCollection.findWhere({_id: tempVo.thisId});
|
|
tempVo.parentModel = nodesCollection.findWhere({_id: tempVo.parentId});
|
|
|
|
|
|
removeNode(tempVo, true); //true means came from broadcast.
|
|
});
|
|
|
|
socket.on("movedNode", function(data, newTime){
|
|
CURRENT_TIMESTAMP = newTime;
|
|
var ids = data[0];
|
|
var indices = data[1];
|
|
var author = data[2];
|
|
|
|
var thisModel = nodesCollection.findWhere({_id: ids[0]});
|
|
var oldParModel = nodesCollection.findWhere({_id: ids[1]});
|
|
var newParModel = nodesCollection.findWhere({_id: ids[2]});
|
|
|
|
|
|
thisModel.set("author", author);
|
|
moveNode(thisModel, indices[0], oldParModel, newParModel, indices[1]);
|
|
});
|
|
|
|
|
|
socket.on("revControl", function(data){
|
|
//(store all of this...).
|
|
var timeHash = data[0];
|
|
var snapHash = data[1];
|
|
var timeStamps = timeHash.keys;
|
|
|
|
//To be continued...
|
|
});
|
|
|
|
socket.on("OFF_SYNC", function(){
|
|
alert("syncing error.Edits no longer synced. Please refresh browser");
|
|
socket = null;
|
|
});
|
|
|
|
// socket.on("VALIDATE", function(data){
|
|
// var parId = data[0];
|
|
// var parArr = data[1];
|
|
// var thisParArr = nodesCollection.findWhere({_id: parId}).get("children");
|
|
// if(!_.isEqual(thisParArr, parArr)){
|
|
// alert("syncing error.Edits no longer synced. Please refresh browser");
|
|
// socket = null;
|
|
// }
|
|
// });
|
|
|
|
|
|
socket.emit("nodeRequest");
|
|
}
|
|
|
|
});//endAppRouter.
|
|
|
|
|
|
|
|
|
|
// socket.on('nodeData', function(data){
|
|
// console.log("nodeDATA RECEIVED\n");
|
|
// console.log(data);
|
|
// nodesCollection = new nodesCollection(data); //nodes
|
|
// //alert(data);
|
|
// var model = new NodeModel(data[1]);
|
|
// console.log("NodeModel(data[1])\n");
|
|
// console.log(model);
|
|
// console.log("nodesCollection.models");
|
|
// console.log(nodesCollection.models);
|
|
// var rootNode = nodesCollection.findWhere({_id: "52b7422c36dd4c5215ce78bf"});
|
|
// console.log("rootNode");
|
|
// console.log(rootNode);
|
|
// //console.log(rootNode);
|
|
// that.viewRoot("52b7422c36dd4c5215ce78bf")
|
|
// });
|