Vulcan/client/app.js

199 lines
5.4 KiB
JavaScript
Raw Normal View History

2012-12-11 10:47:11 +09:00
Session.set('initialLoad', true);
l=function(s){
console.log(s);
}
// HELPERS
2012-10-24 11:04:42 +09:00
getSetting = function(setting){
var settings=Settings.find().fetch()[0];
if(settings){
return settings[setting];
}
return '';
}
2012-11-19 12:03:06 +09:00
clearSeenErrors = function(){
Errors.update({seen:true}, {$set: {show:false}}, {multi:true});
}
// SUBSCRIPTIONS
// ** Errors **
// Local (client-only) collection
2012-10-09 12:02:37 +09:00
2012-10-08 10:44:13 +09:00
Errors = new Meteor.Collection(null);
// ** Settings **
Settings = new Meteor.Collection('settings');
Meteor.subscribe('settings', function(){
// runs once on site load
2012-12-11 10:47:11 +09:00
analyticsInit();
2012-11-21 14:31:58 +09:00
Session.set('settingsLoaded',true);
});
// ** Categories **
Categories = new Meteor.Collection('categories');
Meteor.subscribe('categories');
2012-11-17 13:24:19 +09:00
// ** Users **
Meteor.subscribe('currentUser');
Meteor.subscribe('allUsers');
// ** Notifications **
// Only load if user is logged in
2013-04-05 11:58:37 +09:00
Notifications = new Meteor.Collection('notifications');
if(Meteor.userId() != null){
Meteor.subscribe('notifications');
}
// ** Posts **
// We have a few subscriptions here, for the various ways we load posts
//
// The advantage is that
// a) we can change pages a lot quicker
// XXX: and we can animate between them (todo)
// b) we know when an individual page is ready
2012-08-22 21:27:22 -04:00
Posts = new Meteor.Collection('posts');
2012-10-09 12:02:37 +09:00
2012-10-24 11:04:42 +09:00
STATUS_PENDING=1;
STATUS_APPROVED=2;
STATUS_REJECTED=3;
var findPosts = function(status){
console.log('calling findPosts')
var find = {};
// build find query starting with the status
switch(status){
case STATUS_APPROVED:
find = {
$or: [
{status: {$exists : false}},
{status: STATUS_APPROVED}
]
};
break;
case STATUS_PENDING:
find = {status: STATUS_PENDING}
break;
case STATUS_REJECTED:
find = {status: STATUS_REJECTED}
break;
}
// if a category slug is defined, modify selector
2013-02-18 13:59:48 +09:00
if(slug = Session.get('categorySlug')){
2013-03-15 16:14:51 +09:00
console.log('category slug: ', slug);
find={
$and : [
find,
{'categories.slug': slug}
]
};
}
2013-03-15 16:19:37 +09:00
// console.log(find)
return find;
}
var sortPosts = function(sortProperty){
var sort = {sort: {sticky: -1}};
sort.sort[sortProperty] = -1;
return sort;
2013-02-18 13:50:24 +09:00
}
var postListSubscription = function(find, options, per_page) {
console.log('calling postListSubscription')
2013-03-23 16:58:28 +11:00
var handle = Meteor.subscribeWithPagination('paginatedPosts', find, options, per_page);
handle.fetch = function() {
return limitDocuments(Posts.find(find, options), handle.loaded());
}
return handle;
2012-10-09 12:02:37 +09:00
}
topPostsHandle = postListSubscription(findPosts(STATUS_APPROVED), sortPosts('score'), 10);
newPostsHandle = postListSubscription(findPosts(STATUS_APPROVED), sortPosts('submitted'), 10);
bestPostsHandle = postListSubscription(findPosts(STATUS_APPROVED), sortPosts('baseScore'), 10);
pendingPostsHandle = postListSubscription(findPosts(STATUS_PENDING), sortPosts('createdAt'), 10);
// digest subscriptions
DIGEST_PRELOADING = 3;
var digestHandles = {}
var dateHash = function(mDate) {
return mDate.format('DD-MM-YYYY');
}
var currentMDateForDigest = function() {
return moment(Session.get('currentDate')).startOf('day');
}
2013-04-05 12:12:30 +09:00
currentDigestHandle = function() {
return digestHandles[dateHash(currentMDateForDigest())];
}
// we use autorun here, because we DON'T want meteor to automatically
// unsubscribe for us
Meteor.autorun(function() {
var daySubscription = function(mDate) {
console.log('calling daySubscription')
var find = _.extend({
submitted: {
$gte: mDate.startOf('day').valueOf(),
$lt: mDate.endOf('day').valueOf()
}
}, findPosts(STATUS_APPROVED));
// note: the digest is ranked by baseScore and not score because we want the posts with the most votes of the day
// independantly of age
var options = {sort: {baseScore: -1}};
// we aren't ever going to paginate this sub, but we'll use pSub
// so we have a reactive loading() function
// (grr... https://github.com/meteor/meteor/pull/273)
return postListSubscription(find, options, 50);
};
// take it to the start of the day.
var mDate = currentMDateForDigest();
var firstDate = moment(mDate).subtract('days', DIGEST_PRELOADING);
var lastDate = moment(mDate).add('days', DIGEST_PRELOADING);
// first unsubscribe all the subscriptions that fall outside of our current range
_.each(digestHandles, function(handle, hash) {
var mDate = moment(hash, 'DD-MM-YYYY');
if (mDate < firstDate || mDate > lastDate) {
// console.log('unsubscribing digest for ' + mDate.toString())
handle.stop();
delete digestHandles[dateHash(mDate)];
}
});
// set up a sub for each day for the DIGEST_PRELOADING days before and after
// but we want to be smart about it --
for (mDate = firstDate; mDate < lastDate; mDate.add('days',1 )) {
if (! digestHandles[dateHash(mDate)]) {
// console.log('subscribing digest for ' + mDate.toString());
digestHandles[dateHash(mDate)] = daySubscription(mDate);
}
}
});
2012-08-30 21:35:48 -04:00
2012-10-01 12:23:35 +09:00
// ** Comments **
// Collection depends on selectedPostId and selectedCommentId session variable
2012-10-08 16:49:01 +09:00
Session.set('selectedPostId', null);
Comments = new Meteor.Collection('comments');
Meteor.autosubscribe(function() {
var query = { $or : [ { post : Session.get('selectedPostId') } , { _id : Session.get('selectedCommentId') } ] };
Meteor.subscribe('comments', query, function() {
Session.set('commentReady', true);
});
2012-12-17 08:16:09 +01:00
});