diff --git a/app.js b/app.js index 3910243..7eb4742 100644 --- a/app.js +++ b/app.js @@ -2,11 +2,13 @@ var express = require('express'); var helmet = require('helmet'); var path = require('path'); +var url = require('url'); var favicon = require('serve-favicon'); var logger = require('morgan'); var session = require('express-session'); var cookieParser = require('cookie-parser'); var flash = require('connect-flash'); +var compress = require('compression'); var bodyParser = require('body-parser'); var pmongo = require('promised-mongo'); @@ -14,13 +16,20 @@ var search = require('./routes/search'); var share = require('./routes/share'); var itunesProxy = require('./routes/itunes-proxy'); +var browserify = require('connect-browserify'); +var React = require('react'); +var nodejsx = require('node-jsx').install(); +var Home = React.createFactory(require('./client').Home); + var app = express(); +var development = process.env.NODE_ENV !== 'production'; + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); - +app.use(compress()); app.use(favicon(__dirname + '/public/images/favicon.png')); app.use(helmet()); app.use(logger('dev')); @@ -41,6 +50,13 @@ app.use(function(req, res, next) { next(); }); +if (development) { + app.get('/javascript/bundle.js', + browserify('./client', { + debug: true, + watch: true + })); +} app.get('*', function(req,res,next) { // force SSL @@ -59,9 +75,18 @@ app.get('*', function(req,res,next) { } }); -app.get('/', function(req, res) { - req.db.matches.find().sort({'$natural':-1}).limit(6).toArray().then(function(docs){ - res.render('index', { page: "home", recent: docs, error: req.flash('search-error') }); +app.get('/', function(req, res, next) { + + var path = url.parse(req.url).pathname; + + req.db.matches.find().sort({created_at:-1}).limit(6).toArray().then(function(docs){ + var recent = []; + docs.forEach(function(doc) { + recent.push(doc.services[doc._id.split("$$")[0]]); + }) + + var home = Home({recent: recent}); + res.send('\n' + React.renderToString(home).replace("", "")); }); }); diff --git a/client/index.js b/client/index.js new file mode 100644 index 0000000..d40318b --- /dev/null +++ b/client/index.js @@ -0,0 +1,155 @@ +/** + * @jsx React.DOM + */ +'use strict'; + +var React = require('react'); +var Router = require('react-router'); +var request = require('superagent'); +var ga = require('react-google-analytics'); +var GAInitiailizer = ga.Initializer; + +var Head = React.createClass({ + + render: function() { + return ( + + + + Match Audio + + + + + + + + + + + + + + ); + } +}); + +var Foot = React.createClass({ + + render: function() { + return ( + + ); + } +}); + + +var Recent = React.createClass({ + + render: function() { + return (
+
+

Recently Shared

+
+ {this.props.items.map(function(item, i){ + return (); + })} +
+
+
); + } + +}); + +var RecentItem = React.createClass({ + + render: function() { + return ( +
+ +
+ ); + } + +}); + +var SearchForm = React.createClass({ + + handleSubmit: function(e) { + e.preventDefault(); + var url = this.refs.url.getDOMNode().value.trim(); + if (!url) { + return; + } + request.post('/search').send({url:url}).end(function(res) { + window.location = "/" + res.body.service + "/" + res.body.type + "/" + res.body.id + }); + }, + + render: function() { + return ( +
+
+ + + + +
+
+ ); + } +}); + +var Home = React.createClass({ + + render: function() { + return ( + + + +
+
+

match.audio

+
+
+
+
+ +
+
+
+
+

Make sharing from music services better. + We match album and track links from Rdio, Spotify, Deezer, Beats Music, Google Music and iTunes and give you back a link with all of them. +

+
+
+ +
+
+ + +