From a2148dc00a7344466b8aee5b104d76c71969fdb6 Mon Sep 17 00:00:00 2001
From: Jonathan Cremin
Date: Mon, 22 Dec 2014 22:38:08 +0000
Subject: [PATCH] React home and share pages working isomorphically
---
app.js | 34 +++++---
client/index.jsx | 155 -----------------------------------
client/share.jsx | 153 ----------------------------------
lib/services/xbox/index.js | 4 +-
package.json | 3 +-
public/stylesheets/style.css | 2 +-
routes/index.js | 19 +++--
routes/search.js | 14 ++--
routes/share.js | 56 +++++--------
views/album.ejs | 88 --------------------
views/app.jsx | 62 ++++++++++++++
views/error.ejs | 20 -----
views/error.jsx | 39 +++++++++
views/foot.jsx | 20 +++++
views/footer.ejs | 21 -----
views/head.jsx | 28 +++++++
views/header.ejs | 23 ------
views/home.jsx | 114 ++++++++++++++++++++++++++
views/index.ejs | 43 ----------
views/share.jsx | 154 ++++++++++++++++++++++++++++++++++
views/track.ejs | 88 --------------------
21 files changed, 482 insertions(+), 658 deletions(-)
delete mode 100644 client/index.jsx
delete mode 100644 client/share.jsx
delete mode 100644 views/album.ejs
create mode 100644 views/app.jsx
delete mode 100644 views/error.ejs
create mode 100644 views/error.jsx
create mode 100644 views/foot.jsx
delete mode 100644 views/footer.ejs
create mode 100644 views/head.jsx
delete mode 100644 views/header.ejs
create mode 100644 views/home.jsx
delete mode 100644 views/index.ejs
create mode 100644 views/share.jsx
delete mode 100644 views/track.ejs
diff --git a/app.js b/app.js
index bf5eb6d..58d69ec 100644
--- a/app.js
+++ b/app.js
@@ -17,6 +17,10 @@ var search = require('./routes/search');
var share = require('./routes/share');
var itunesProxy = require('./routes/itunes-proxy');
+var React = require('react');
+var nodejsx = require('node-jsx').install({extension: '.jsx'});
+var ErrorView = React.createFactory(require('./views/error.jsx'));
+
var browserify = require('connect-browserify');
var app = express();
@@ -50,7 +54,7 @@ app.use(function(req, res, next) {
if (development) {
app.get('/javascript/bundle.js',
- browserify('./client/index.jsx', {
+ browserify('./views/app.jsx', {
debug: true,
watch: true
}));
@@ -75,9 +79,17 @@ app.get('*', function(req,res,next) {
app.get('/', index);
app.post('/search', search);
-app.get('/:service/:type/:id.json', share.json);
-app.get('/:service/:type/:id', share.html);
+app.get('/:service/:type/:id', share);
app.get('/itunes/*', itunesProxy);
+app.get('/recent', function(req, res, next) {
+ req.db.matches.find().sort({created_at:-1}).limit(6).toArray().then(function(docs){
+ var recents = [];
+ docs.forEach(function(doc) {
+ recents.push(doc.services[doc._id.split("$$")[0]]);
+ });
+ res.json({recents:recents});
+ });
+});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
@@ -93,11 +105,9 @@ app.use(function(req, res, next) {
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
- res.render('error', {
- page: "error",
- message: err.message,
- error: err
- });
+
+ var content = React.renderToString(ErrorView({status: err.status || 500, message: err.message, error: err}));
+ res.send('\n' + content);
});
}
@@ -105,11 +115,9 @@ if (app.get('env') === 'development') {
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
- res.render('error', {
- page: "error",
- message: err.message,
- error: {status: err.status || 500}
- });
+
+ var content = React.renderToString(ErrorView({status: err.status || 500, message: err.message, error: {status: err.status || 500}}));
+ res.send('\n' + content);
});
diff --git a/client/index.jsx b/client/index.jsx
deleted file mode 100644
index d40318b..0000000
--- a/client/index.jsx
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * @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 (
-
-
-
-
-
-
-
-
-
-
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.
-
-
-
-
-
-
-
-
-
-
-
- );
- }
-});
-
-module.exports.Home = Home;
-
-if (typeof window !== 'undefined') {
- window.onload = function() {
- React.render( , document);
- ga('create', 'UA-66209-8', 'auto');
- ga('send', 'pageview');
- }
-}
\ No newline at end of file
diff --git a/client/share.jsx b/client/share.jsx
deleted file mode 100644
index e26a460..0000000
--- a/client/share.jsx
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * @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
-
-
-
-
-
);
- }
-
-});
-
-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 Share = React.createClass({
-
- render: function() {
- return (
-
-
-
-
-
-
-
-
-
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.
-
-
-
-
-
-
-
-
-
-
-
- );
- }
-});
-
-module.exports.Share = Share;
-
-if (typeof window !== 'undefined') {
- window.onload = function() {
- React.render( , document);
- ga('create', 'UA-66209-8', 'auto');
- ga('send', 'pageview');
- }
-}
\ No newline at end of file
diff --git a/lib/services/xbox/index.js b/lib/services/xbox/index.js
index cfefc8e..cad53fa 100644
--- a/lib/services/xbox/index.js
+++ b/lib/services/xbox/index.js
@@ -43,8 +43,8 @@ var formatResponse = function(res) {
streamUrl: result.Link,
purchaseUrl: null,
artwork: {
- small: result.ImageUrl.replace("http://", "https://") + "?w=250",
- large: result.ImageUrl.replace("http://", "https://") + "?w=500"
+ small: result.ImageUrl.replace("http://", "https://") + "&w=250&h=250",
+ large: result.ImageUrl.replace("http://", "https://") + "&w=500&h=250"
},
artist: {
name: result.Artists[0].Artist.Name
diff --git a/package.json b/package.json
index 79bfd27..d4f8c1e 100644
--- a/package.json
+++ b/package.json
@@ -37,11 +37,10 @@
"node-jsx": "^0.12.4",
"node-uuid": "^1.4.2",
"promised-mongo": "^0.11.1",
- "querystring": "^0.2.0",
"rdio": "^1.5.2",
"react": "^0.12.1",
"react-google-analytics": "^0.2.0",
- "react-router": "^0.11.4",
+ "react-router": "^0.11.6",
"serve-favicon": "~2.1.3",
"spotify": "^0.3.0",
"superagent": "^0.21.0",
diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css
index 3d7dd64..24821f7 100644
--- a/public/stylesheets/style.css
+++ b/public/stylesheets/style.css
@@ -60,7 +60,7 @@ header h1 a:hover, header h1 a:focus{
outline: 0 none;
}
-.album header h1, .track header h1 {
+.share header h1, .share header h1 {
text-align: left;
font-size: 1.5em;
line-height: 36px;
diff --git a/routes/index.js b/routes/index.js
index f955d23..949d926 100644
--- a/routes/index.js
+++ b/routes/index.js
@@ -2,18 +2,23 @@
var React = require('react');
var nodejsx = require('node-jsx').install({extension: '.jsx'});
-var Home = React.createFactory(require('../client/index.jsx').Home);
+var Router = require('react-router');
+var routes = require('../views/app.jsx').routes;
module.exports = function(req, res, next) {
req.db.matches.find().sort({created_at:-1}).limit(6).toArray().then(function(docs){
- var recent = [];
+ var recents = [];
docs.forEach(function(doc) {
- recent.push(doc.services[doc._id.split("$$")[0]]);
- })
+ recents.push(doc.services[doc._id.split("$$")[0]]);
+ });
- var home = Home({recent: recent});
- res.send('\n' + React.renderToString(home).replace("