Vulcan/client/lib/router.js

249 lines
No EOL
7.4 KiB
JavaScript

(function() {
// specific router functions
digest = function(year, month, day, view){
var destination = (typeof view === 'undefined') ? 'posts_digest' : 'posts_digest_'+view
if (typeof day === 'undefined') {
// we can get into an infinite reactive loop with the subscription filter
// if we keep setting the date even when it's barely changed
if (new Date() - new Date(Session.get('currentDate')) > 60 * 1000) {
Session.set('currentDate', new Date());
}
// Session.set('currentDate', new Date());
} else {
Session.set('currentDate', new Date(year, month-1, day));
}
// we need to make sure that the session changes above have been executed
// before we can look at the digest handle. XXX: this might be a bad idea
Meteor.flush();
if (!currentDigestHandle() || currentDigestHandle().loading()) {
return 'loading';
} else {
return destination;
}
};
post = function(id, commentId) {
Session.set('selectedPostId', id);
if(typeof commentId !== 'undefined')
Session.set('scrollToCommentId', commentId);
// XXX: should use the Session for these
// on post page, we show the comment tree
Session.set('showChildComments',true);
return 'post_page';
};
post_edit = function(id) {
Session.set('selectedPostId', id);
return 'post_edit';
};
comment = function(id) {
Session.set('selectedCommentId', id);
return 'comment_page';
};
comment_reply = function(id) {
Session.set('selectedCommentId', id);
return 'comment_reply';
};
comment_edit = function(id) {
Session.set('selectedCommentId', id);
return 'comment_edit';
};
// XXX: do these two really not want to set it to undefined (or null)?
user_profile = function(id) {
if(typeof id !== undefined){
Session.set('selectedUserId', id);
}
return 'user_profile';
};
user_edit = function(id) {
if(typeof id !== undefined){
Session.set('selectedUserId', id);
}
return 'user_edit';
};
// XXX: not sure if the '/' trailing routes are needed any more
Meteor.Router.add({
'/': 'posts_top',
'/top':'posts_top',
'/top/':'posts_top',
'/top/:page':'posts_top',
'/new':'posts_new',
'/new/':'posts_new',
'/new/:page':'posts_new',
'/best':'posts_best',
'/best/':'posts_best',
'/pending':'posts_pending',
'/digest/:year/:month/:day': digest,
'/digest': digest,
'/digest/': digest,
'/test':'test',
'/signin':'user_signin',
'/signup':'user_signup',
'/submit':'post_submit',
'/invite':'no_invite',
'/posts/deleted':'post_deleted',
'/posts/:id/edit':post_edit,
'/posts/:id/comment/:comment_id':post,
'/posts/:id/':post,
'/posts/:id':post,
'/comments/deleted':'comment_deleted',
'/comments/:id':comment,
'/comments/:id/reply':comment_reply,
'/comments/:id/edit':comment_edit,
'/settings':'settings',
'/admin':'admin',
'/categories':'categories',
'/users':'users',
'/account':'user_edit',
'/forgot_password':'user_password',
'/users/:id': user_profile,
'/users/:id/edit':user_edit,
'/:year/:month/:day':digest,
});
Meteor.Router.filters({
requireLogin: function(page) {
if (Meteor.loggingIn()) {
return 'loading';
} else if (Meteor.user()) {
return page;
} else {
return 'user_signin';
}
},
canView: function(page) {
var error = canView(Meteor.user(), true);
if (error === true)
return page;
// a problem.. make sure we are logged in
if (Meteor.loggingIn())
return 'loading';
// otherwise the error tells us what to show.
return error;
},
canPost: function(page) {
var error = canPost(Meteor.user(), true);
if (error === true)
return page;
// a problem.. make sure we are logged in
if (Meteor.loggingIn())
return 'loading';
// otherwise the error tells us what to show.
return error;
},
canEdit: function(page) {
if (page === 'comment_edit') {
var item = Comments.findOne(Session.get('selectedCommentId'));
} else {
var item = Posts.findOne(Session.get('selectedPostId'));
}
var error = canEdit(Meteor.user(), item, true);
if (error === true)
return page;
// a problem.. make sure the item has loaded and we have logged in
if (! item || Meteor.loggingIn())
return 'loading';
// otherwise the error tells us what to show.
return error;
},
isLoggedOut: function(page){
return Meteor.user() ? "already_logged_in" : page;
},
isAdmin: function(page) {
return isAdmin(Meteor.user()) ? page : "no_rights";
},
// if the user is logged in but their profile isn't filled out enough
requireProfile: function(page) {
var user = Meteor.user();
if (user && ! Meteor.loggingIn() && ! userProfileComplete(user)){
Session.set('selectedUserId', user._id);
return 'user_email';
} else {
return page;
}
},
// if we are on a page that requires a post, as set in selectedPostId
requirePost: function(page) {
if (Posts.findOne(Session.get('selectedPostId'))) {
return page;
} else if (! Session.get('postReady')) {
return 'loading';
} else {
return 'not_found';
}
}
});
//
Meteor.Router.filter('requireProfile');
Meteor.Router.filter('requireLogin', {only: ['comment_reply','post_submit']});
Meteor.Router.filter('canView', {only: ['posts_top', 'posts_new', 'posts_digest', 'posts_best']});
Meteor.Router.filter('isLoggedOut', {only: ['user_signin', 'user_signup']});
Meteor.Router.filter('canPost', {only: ['posts_pending', 'comment_reply', 'post_submit']});
Meteor.Router.filter('canEdit', {only: ['post_edit', 'comment_edit']});
Meteor.Router.filter('requirePost', {only: ['post_page', 'post_edit']});
Meteor.Router.filter('isAdmin', {only: ['posts_pending', 'users', 'settings', 'categories', 'admin']});
Meteor.startup(function() {
Meteor.autorun(function() {
// grab the current page from the router, so this re-runs every time it changes
Meteor.Router.page();
if(Meteor.Router.page() !== "loading"){
console.log('------ Request start -------- ('+Meteor.Router.page()+')');
// openedComments is an Array that tracks which comments
// have been expanded by the user, to make sure they stay expanded
Session.set("openedComments", null);
Session.set('requestTimestamp',new Date());
// currentScroll stores the position of the user in the page
Session.set('currentScroll', null);
document.title = getSetting("title");
$('body').css('min-height','0');
// set all errors who have already been seen to not show anymore
clearSeenErrors();
// log this request with mixpanel, etc
analyticsRequest();
// if there are any pending events, log them too
if(eventBuffer=Session.get('eventBuffer')){
_.each(eventBuffer, function(e){
console.log('in buffer: ', e);
trackEvent(e.event, e.properties);
});
}else{
console.log('------ Loading… --------');
}
}
});
});
}());