Skip to content

Instantly share code, notes, and snippets.

@jessedhillon
Created September 20, 2014 20:41
Show Gist options
  • Save jessedhillon/43fa9c83508a937faa53 to your computer and use it in GitHub Desktop.
Save jessedhillon/43fa9c83508a937faa53 to your computer and use it in GitHub Desktop.
GAmail.js
GAmail = function(options, data) {
this.options = options;
this.data = data;
this.currentUser = randomElement(data.friends);
this.labels = [{
id: 'inbox',
displayName: 'Inbox',
}, {
id: 'important',
displayName: 'High Priority',
}, {
id: 'sent',
displayName: 'Sent',
}, {
id: 'trash',
displayName: 'Trash',
}];
};
GAmail.prototype = {
getLabels: function(onSuccess) {
var mailbox = this;
function callback() {
onSuccess(mailbox.labels);
}
setTimeout(callback,
randomInterval(
this.options.minWait,
this.options.maxWait) * 1000);
},
getMessagesForLabel: function(label, onSuccess) {
var messages = [];
for(var i = 0; i < this.data.messages.length; i++) {
var thread = this.data.messages[i];
if(thread.hasLabel(label)) {
messages.push(thread);
}
}
function callback() {
onSuccess(messages);
}
setTimeout(callback,
randomInterval(
this.options.minWait,
this.options.maxWait) * 1000);
},
getFriends: function(onSuccess) {
var friends = this.data.friends;
function callback() {
onSuccess(friends);
}
setTimeout(callback,
randomInterval(
this.options.minWait,
this.options.maxWait) * 1000);
},
};
var users = [{
id: 1,
thumbnail: "http://lorempixel.com/250/250/people/1",
name: "Lilly Simpson",
brief: "Regional Marketing Officer",
}, {
id: 2,
thumbnail: "http://lorempixel.com/250/250/people/2",
name: "Lorenzo Noble",
brief: "Student",
}, {
id: 3,
thumbnail: "http://lorempixel.com/250/250/people/3",
name: "Javon Sears",
brief: "Direct Communications Assistant",
}, {
id: 4,
thumbnail: "http://lorempixel.com/250/250/people/4",
name: "Carleigh Fisher",
brief: "Investor Marketing Developer",
}, {
id: 5,
thumbnail: "http://lorempixel.com/250/250/people/5",
name: "Julissa Leon",
brief: "National Accounts Assistant",
}, {
id: 6,
thumbnail: "http://lorempixel.com/250/250/people/6",
name: "Kaiya Glenn",
brief: "Forward Directives Assistant",
}, {
id: 7,
thumbnail: "http://lorempixel.com/250/250/people/7",
name: "Zion Baldwin",
brief: "Human Program Assistant",
}, {
id: 8,
thumbnail: "http://lorempixel.com/250/250/people/8",
name: "Morgan Curtis",
brief: "Direct Accounts Engineer",
}, {
id: 9,
thumbnail: "http://lorempixel.com/250/250/people/9",
name: "Cindy Cervantes",
brief: "International Usability Associate",
}, {
id: 10,
thumbnail: "http://lorempixel.com/250/250/people/10",
name: "Layne King",
brief: "Central Accountability Administrator",
}];
GAmail = new GAmail({
minWait: 0.8,
maxWait: 1.3
}, {
friends: users,
messages: generateMessageStore(
users,
['inbox', 'sent', 'important'])
.concat(
generateMessageStore(users, ['trash']))
.sort(descendingByDate),
});
// functions for generating random data
// ////////////////////////////////////
function randomInterval(min, max) {
// random number between [min, max]
var intervalWidth = Math.abs(max - min);
return Math.round(min + (Math.random() * intervalWidth));
}
function randomElement(array, count) {
var singleElement = false;
if(count === undefined) {
count = 1;
singleElement = true;
}
if(count > array.length) {
throw "WTF man!? We have to stop this thing at some point, you know?";
}
var indices = [];
var elements = [];
while(indices.length < count) {
// dumb: technically not guaranteed to ever finish
var i = Math.round(Math.random() * (array.length - 1));
if(indices.indexOf(i) == -1) {
indices.push(i);
}
}
for(var i = 0; i < indices.length; i++) {
var index = indices[i];
elements.push(array[index]);
}
if(singleElement) {
return elements[0];
}
return elements;
}
function generateKey() {
// makes random alphanumeric string of length N
return Math.random().toString(36).substring(2);
}
function randomPhrase() {
var loremIpsum = [
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"Sed a consequat elit.",
"Nulla lorem nisi, iaculis vitae diam consectetur, vestibulum sodales ipsum.",
"In convallis, velit sit amet mollis molestie, eros massa porttitor diam, eget efficitur massa erat eu sem.",
"Etiam a sem eu risus aliquet gravida tempor nec magna.",
"Suspendisse mattis interdum magna a vulputate.",
"Phasellus lobortis ornare odio quis eleifend.",
"Duis volutpat elit molestie ligula euismod sollicitudin.",
"Fusce sed ligula vel tortor faucibus faucibus non vitae libero.",
"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",
"Vivamus bibendum, mauris ut placerat egestas, libero nunc mollis lacus, at egestas turpis massa quis urna.",
"Sed nisl nibh, venenatis quis augue sed, ornare cursus odio.",
"Sed iaculis massa orci, non molestie lacus pulvinar in.",
"Cras eget ante nibh.",
"Nullam cursus, justo a sollicitudin varius, est ex iaculis est, in blandit diam mauris a augue.",
"Donec mattis maximus mauris, vel dapibus ante interdum ut.",
"Fusce et laoreet mi.",
"Aenean ornare dapibus aliquet.",
"Maecenas dictum neque sed euismod porttitor.",
"In euismod quam quis vehicula blandit.",
"Donec finibus nulla vel aliquam tincidunt.",
"Fusce felis purus, cursus non semper sit amet, convallis id magna.",
"Cras vestibulum a mi at placerat.",
"Phasellus ultrices metus at convallis tincidunt.",
"Praesent vitae sollicitudin leo, non pellentesque dui.",
"Aenean et tempus lorem.",
"Nam ultricies facilisis elit, non tempor sem.",
"Vivamus vel consequat massa.",
"Quisque lacinia porta leo, ut molestie magna gravida sit amet.",
"Aliquam erat volutpat.",
"Sed laoreet, erat non bibendum vestibulum, orci nunc commodo turpis, at tempus mi leo et massa.",
"Integer nisl dolor, molestie vitae turpis sit amet, sagittis suscipit nisi.",
"Nunc ullamcorper est ac felis porttitor, a interdum orci finibus.",
"Suspendisse potenti.",
"Proin hendrerit nisl diam, nec imperdiet mauris dignissim nec.",
"Nullam orci neque, auctor ac odio in, aliquet malesuada ligula.",
"Sed sodales aliquet nisl sit amet elementum.",
"Nam aliquam ullamcorper tellus, id cursus magna semper sit amet.",
"Ut vel magna et orci congue congue.",
"Aenean at tincidunt massa, et congue libero.",
"Vestibulum nec varius lorem.",
"Nam lacinia sit amet elit dictum iaculis.",
"Sed vulputate odio non elit tempus, eu ultricies nulla accumsan.",
"Nullam et dui dapibus, pellentesque est vitae, blandit augue.",
"Ut eu mattis sem, nec varius nulla.",
"Donec gravida ipsum eu justo eleifend blandit.",
"Integer velit sem, pellentesque sit amet efficitur eu, rutrum vel sapien.",
"Sed semper, erat eget dapibus fermentum, orci eros accumsan diam, in lacinia erat urna non urna.",
"Suspendisse et ex tortor.",
"Vivamus blandit fringilla elit, sed venenatis tortor mattis vel.",
"Donec condimentum euismod turpis.",
"In sed ex a purus pellentesque tincidunt.",
];
return randomElement(loremIpsum);
}
function generateBodyText() {
var paragraphs = randomInterval(1, 6);
var blocks = [];
for(var i = 0; i < paragraphs; i++) {
var lines = randomInterval(3, 8);
var s = [];
for(var j = 0; j < lines; j++) {
s.push(randomPhrase());
}
blocks.push(s.join(' '));
}
return blocks;
}
function generateDate(start, end) {
var delta = end.getTime() - start.getTime();
return new Date(start.getTime() + Math.random() * delta);
}
function generateMessage(sender, recipients, labels) {
function hasLabel(label) {
return this.labels.indexOf(label) > -1;
}
return {
key: generateKey(),
date: generateDate(new Date(2014, 8, 1), new Date()),
from: sender,
to: recipients,
subject: randomPhrase(),
body: generateBodyText(),
hasLabel: hasLabel,
labels: randomElement(
labels,
randomInterval(1, labels.length)),
};
}
function generateThread(users, labels) {
var messages = [];
var messageCount = randomInterval(1, 8);
var participantCount = randomInterval(2, 5);
var participants = randomElement(
users,
participantCount);
for(var i = 0; i < messageCount; i++) {
sender = randomElement(participants);
recipients = [];
for(var p = 0; p < participants.length; p++) {
if(participants[p].id != sender.id) {
recipients.push(participants[p]);
}
}
messages.push(generateMessage(sender, recipients, labels));
}
function hasLabel(label) {
for(var i = 0; i < this.thread.length; i++) {
var m = this.thread[i];
if(m.hasLabel(label)) {
return true;
}
}
return false;
}
messages.sort(descendingByDate);
return {
sender: messages[0].from,
subject: messages[0].subject,
date: messages[0].date,
thread: messages,
hasLabel: hasLabel
};
}
function generateMessageStore(users, labels) {
var threads = [];
var threadCount = randomInterval(40, 100);
for(var i = 0; i < threadCount; i++) {
threads.push(
generateThread(users, labels));
}
threads.sort(descendingByDate);
return threads;
}
function descendingByDate(a, b) {
return a.date < b.date;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment