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.
+