diff --git a/package.json b/package.json index c4bce2b..ce63795 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ }, "scripts": { "build": "npm run lint && cp node_modules/sw-toolbox/sw-toolbox.js public/sw-toolbox.js && nwb build && npm run precache", - "lint": "eslint src", - "lint:fix": "eslint --fix .", + "lint": "./node_modules/eslint-config-jonnybuchanan/bin/lint.js src", + "lint:fix": "./node_modules/eslint-config-jonnybuchanan/bin/lint.js --fix .", "start": "nwb serve", "precache": "sw-precache --root=public --config=sw-precache-config.json" }, @@ -20,6 +20,7 @@ "firebase": "2.4.2", "firetruck.js": "0.1.1", "history": "2.1.1", + "isomorphic-fetch": "^2.2.1", "react": "15.0.2", "react-dom": "15.0.2", "react-router": "2.4.0", diff --git a/public/runtime-caching.js b/public/runtime-caching.js index 2824bd5..8b5065f 100644 --- a/public/runtime-caching.js +++ b/public/runtime-caching.js @@ -12,10 +12,10 @@ origin: /\.(?:googleapis|gstatic|firebaseio)\.com$/ }) global.toolbox.router.get('/(.+)', global.toolbox.fastest, { - origin: 'https://hacker-news.firebaseio.com' + origin: 'https://hacker-news.firebaseio.com' }) global.toolbox.router.get('/(.+)', global.toolbox.fastest, { - origin: 'https://s-usc1c-nss-136.firebaseio.com' + origin: 'https://s-usc1c-nss-136.firebaseio.com' }) })(self) diff --git a/src/Comment.js b/src/Comment.js index 850ec78..db91788 100644 --- a/src/Comment.js +++ b/src/Comment.js @@ -3,6 +3,7 @@ var ReactFireMixin = require('reactfire') var CommentThreadStore = require('./stores/CommentThreadStore') var HNService = require('./services/HNService') +var HNServiceRest = require('./services/HNServiceRest') var SettingsStore = require('./stores/SettingsStore') var CommentMixin = require('./mixins/CommentMixin') @@ -86,7 +87,17 @@ var Comment = React.createClass({ }, bindFirebaseRef() { - this.bindAsObject(HNService.itemRef(this.props.id), 'comment', this.handleFirebaseRefCancelled) + if (SettingsStore.offlineMode) { + HNServiceRest.itemRef(this.props.id).then(function(res) { + return res.json() + }).then(function(snapshot) { + this.replaceState({ comment: snapshot }) + }.bind(this)) + } + else { + this.bindAsObject(HNService.itemRef(this.props.id), 'comment', this.handleFirebaseRefCancelled) + } + if (this.timeout) { this.timeout = null } diff --git a/src/Item.js b/src/Item.js index f14a4fc..8369620 100644 --- a/src/Item.js +++ b/src/Item.js @@ -3,6 +3,7 @@ var ReactFireMixin = require('reactfire') var TimeAgo = require('react-timeago').default var HNService = require('./services/HNService') +var HNServiceRest = require('./services/HNServiceRest') var StoryCommentThreadStore = require('./stores/StoryCommentThreadStore') var ItemStore = require('./stores/ItemStore') @@ -14,6 +15,8 @@ var ItemMixin = require('./mixins/ItemMixin') var cx = require('./utils/buildClassName') var setTitle = require('./utils/setTitle') +var SettingsStore = require('./stores/SettingsStore') + function timeUnitsAgo(value, unit, suffix) { if (value === 1) { return unit @@ -31,7 +34,17 @@ var Item = React.createClass({ }, componentWillMount() { - this.bindAsObject(HNService.itemRef(this.props.params.id), 'item') + if (SettingsStore.offlineMode) { + HNServiceRest.itemRef(this.props.params.id).then(function(res) { + return res.json() + }).then(function(snapshot) { + this.replaceState({ item: snapshot }) + }.bind(this)) + } + else { + this.bindAsObject(HNService.itemRef(this.props.params.id), 'item') + } + if (this.state.item.id) { this.threadStore = new StoryCommentThreadStore(this.state.item, this.handleCommentsChanged, {cached: true}) setTitle(this.state.item.title) @@ -58,8 +71,18 @@ var Item = React.createClass({ this.threadStore = new StoryCommentThreadStore(item, this.handleCommentsChanged, {cached: true}) setTitle(item.title) } - this.bindAsObject(HNService.itemRef(nextProps.params.id), 'item') - this.setState({item: item || {}}) + + if (SettingsStore.offlineMode) { + HNServiceRest.itemRef(nextProps.params.id).then(function(res) { + return res.json() + }).then(function(snapshot) { + this.replaceState({ item: snapshot }) + }.bind(this)) + } + else { + this.bindAsObject(HNService.itemRef(nextProps.params.id), 'item') + this.setState({item: item || {}}) + } } }, diff --git a/src/PermalinkedComment.js b/src/PermalinkedComment.js index 4d14230..47a40bc 100644 --- a/src/PermalinkedComment.js +++ b/src/PermalinkedComment.js @@ -4,6 +4,7 @@ var withRouter = require('react-router/lib/withRouter') var CommentThreadStore = require('./stores/CommentThreadStore') var HNService = require('./services/HNService') +var HNServiceRest = require('./services/HNServiceRest') var SettingsStore = require('./stores/SettingsStore') var UpdatesStore = require('./stores/UpdatesStore') @@ -32,7 +33,16 @@ var PermalinkedComment = React.createClass({ }, componentWillMount() { - this.bindAsObject(HNService.itemRef(this.props.params.id), 'comment') + if (SettingsStore.offlineMode) { + HNServiceRest.itemRef(this.props.params.id).then(function(res) { + return res.json() + }).then(function(snapshot) { + this.replaceState({ comment: snapshot }) + }.bind(this)) + } + else { + this.bindAsObject(HNService.itemRef(this.props.params.id), 'comment') + } if (this.state.comment.id) { this.commentLoaded(this.state.comment) } diff --git a/src/Settings.js b/src/Settings.js index 16f423e..faa2603 100644 --- a/src/Settings.js +++ b/src/Settings.js @@ -38,6 +38,12 @@ var Settings = React.createClass({

Show "reply" links to Hacker News

+
+ +

Cache comments and content offline.

+