|
// Namespace |
|
var usersModule = {}; |
|
|
|
// View-Model (usersModule state / data) |
|
usersModule.viewModel = |
|
{ |
|
users: m.prop([]), |
|
sampleUsers: function () |
|
{ |
|
var sample = _.sample(usersModule.UserList.users(), 3); |
|
usersModule.viewModel.users(sample); |
|
}, |
|
replaceUser: function (id) |
|
{ |
|
var users = usersModule.viewModel.users(); |
|
var idx = _.findIndex(users, 'id', id); |
|
// alert(id + " " + idx); |
|
if (idx >= 0) |
|
{ |
|
// Might loop until we get a user of different id... |
|
users[idx] = _.sample(usersModule.UserList.users()); |
|
usersModule.viewModel.users(users); |
|
} |
|
} |
|
}; |
|
|
|
// Model (domain) |
|
usersModule.UserList = |
|
{ |
|
users: m.prop([]), |
|
load: function (process) |
|
{ |
|
// Idea taken from https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 |
|
// Starting with http://jsfiddle.net/staltz/8jFJH/48/ as base |
|
var randomOffset = Math.floor(Math.random() * 5000); |
|
// Gets 100 GitHub users from a random offset |
|
m.request({ method: 'GET', url: "https://api.github.com/users?since=" + randomOffset }) |
|
.then(usersModule.UserList.users).then(process); |
|
} |
|
}; |
|
|
|
// Controller (initialized once) |
|
usersModule.controller = function () |
|
{ |
|
// Get the data |
|
usersModule.UserList.load(usersModule.viewModel.sampleUsers); |
|
|
|
return { |
|
refreshAll: function () |
|
{ |
|
usersModule.viewModel.sampleUsers(); |
|
}, |
|
refreshUser: function (user) |
|
{ |
|
usersModule.viewModel.replaceUser(user.id); |
|
} |
|
} |
|
}; |
|
|
|
// View (rendering the UI, on each data change) |
|
usersModule.view = function (controller) |
|
{ |
|
return [ |
|
m('.header', |
|
[ |
|
m('h2', "Who to follow"), |
|
m('a.refresh[href="#"]', { onclick: controller.refreshAll }, "Refresh") |
|
]), |
|
m('ul.suggestions', |
|
usersModule.viewModel.users().map(function (user) |
|
{ |
|
return [ |
|
m('li', |
|
[ |
|
// m('a.close[href="#"]', { onclick: m.withAttr('title', controller.close), title: user.id }, "x"), |
|
m('a.close[href="#"]', { onclick: controller.refreshUser.bind(this, user) }, "x"), |
|
m('img', { src: user.avatar_url + "&size=40", title: user.login + " (" + user.id + ")" }), |
|
m('a.username', { href: user.html_url }, user.login) |
|
]) |
|
]; |
|
}) |
|
) |
|
]; |
|
}; |
|
|
|
// Initialize usersModule |
|
m.module(document.getElementById("container"), usersModule); |