Can now fetch reddit threads and display the the thread body

This commit is contained in:
Jesper Wrang 2018-01-14 00:40:51 +01:00
parent c8dd37d6ae
commit af4787a77a
14 changed files with 347 additions and 192 deletions

15
nginx-config/nginx-basic Normal file
View file

@ -0,0 +1,15 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/removeddit;
index index.html;
server_name _;
error_page 404 /index.html
location / {
try_files $uri $uri/ /index.html =404;
}
}

View file

@ -13,24 +13,8 @@ server {
#ssl_certificate /etc/letsencrypt/live/removeddit.com/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/removeddit.com/privkey.pem;
location ~* /r/[a-zA-Z0-9]+/[a-zA-Z0-9] {
try_files /thread.html /thread.html =404;
}
location /r/ {
try_files /subreddit.html /subreddit.html =404;
}
location /static/ {
try_files $uri $uri/ =404;
}
location /about/ {
try_files /about.html /about.html =404;
}
location / {
try_files /subreddit.html /subreddit.html =404;
try_files $uri $uri/ /index.html =404;
}
}

246
package-lock.json generated
View file

@ -593,6 +593,11 @@
"to-fast-properties": "2.0.0"
}
},
"@r/api-client": {
"version": "3.37.0",
"resolved": "https://registry.npmjs.org/@r/api-client/-/api-client-3.37.0.tgz",
"integrity": "sha1-VdsEk/mQGcccvfAwfwK0BkwM5KQ="
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -872,8 +877,7 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"atob": {
"version": "2.0.3",
@ -1564,6 +1568,12 @@
}
}
},
"classnames": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz",
"integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=",
"dev": true
},
"clean-css": {
"version": "4.1.9",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz",
@ -1709,7 +1719,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
"integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
"dev": true,
"requires": {
"delayed-stream": "1.0.0"
}
@ -1729,8 +1738,7 @@
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
"dev": true
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"compressible": {
"version": "2.0.12",
@ -1841,6 +1849,11 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
"dev": true
},
"cookiejar": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz",
"integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o="
},
"copy-concurrently": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
@ -1916,8 +1929,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"create-ecdh": {
"version": "4.0.0",
@ -1955,6 +1967,17 @@
"sha.js": "2.4.9"
}
},
"create-react-class": {
"version": "15.6.2",
"resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz",
"integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=",
"dev": true,
"requires": {
"fbjs": "0.8.16",
"loose-envify": "1.3.1",
"object-assign": "4.1.1"
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
@ -2192,7 +2215,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
@ -2286,8 +2308,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegates": {
"version": "1.0.0",
@ -2858,8 +2879,7 @@
"extend": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
"dev": true
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
},
"extend-shallow": {
"version": "2.0.1",
@ -3064,6 +3084,11 @@
"mime-types": "2.1.17"
}
},
"formidable": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz",
"integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak="
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@ -4802,8 +4827,7 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"internal-ip": {
"version": "1.2.0",
@ -5680,8 +5704,7 @@
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
"dev": true
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"micromatch": {
"version": "2.3.11",
@ -5717,20 +5740,17 @@
"mime": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
"dev": true
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
},
"mime-db": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
"dev": true
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
},
"mime-types": {
"version": "2.1.17",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
"integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
"dev": true,
"requires": {
"mime-db": "1.30.0"
}
@ -5834,6 +5854,12 @@
"minimist": "0.0.8"
}
},
"moment": {
"version": "2.20.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz",
"integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==",
"dev": true
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@ -5851,8 +5877,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multicast-dns": {
"version": "6.2.1",
@ -6126,6 +6151,15 @@
"sort-keys": "1.1.2"
}
},
"normalizr": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/normalizr/-/normalizr-2.3.1.tgz",
"integrity": "sha1-rBLXcc4f5qQwlMPYKMqtpO2aRUA=",
"dev": true,
"requires": {
"lodash": "4.17.4"
}
},
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -7170,8 +7204,7 @@
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
"dev": true
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"promise": {
"version": "7.3.1",
@ -7280,8 +7313,7 @@
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
"dev": true
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
},
"query-string": {
"version": "4.3.4",
@ -7400,6 +7432,23 @@
"prop-types": "15.6.0"
}
},
"react-click-outside": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/react-click-outside/-/react-click-outside-2.3.1.tgz",
"integrity": "sha1-MYc3698IGko7zUaCVmNnTL6YNus=",
"dev": true,
"requires": {
"hoist-non-react-statics": "1.2.0"
},
"dependencies": {
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
"integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=",
"dev": true
}
}
},
"react-dom": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz",
@ -7411,6 +7460,15 @@
"prop-types": "15.6.0"
}
},
"react-moment-proptypes": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/react-moment-proptypes/-/react-moment-proptypes-1.5.0.tgz",
"integrity": "sha512-0dQJNs0aaiMeGp1AJACDTzGMM7N4qv4Wgg1948/ARdLt3VKlkcem6Yjm5ExUmUtoXk6WpSXvFQ204l7E+RTEEQ==",
"dev": true,
"requires": {
"moment": "2.20.1"
}
},
"react-redux": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.6.tgz",
@ -7493,7 +7551,6 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"dev": true,
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
@ -7507,8 +7564,7 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
}
}
},
@ -7544,6 +7600,64 @@
}
}
},
"reddit-comments": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reddit-comments/-/reddit-comments-1.1.0.tgz",
"integrity": "sha1-jgYd4PDmul59e2xkDCHt9HOvw/s=",
"dev": true,
"requires": {
"classnames": "2.2.5",
"html-entities": "1.2.1",
"lodash": "4.17.4",
"moment": "2.20.1",
"normalizr": "2.3.1",
"react-click-outside": "2.3.1",
"react-moment-proptypes": "1.5.0",
"react-redux": "4.4.8",
"redux": "3.7.2",
"redux-logger": "2.10.2",
"redux-saga": "0.11.1",
"reselect": "2.5.4",
"snoocore": "3.3.1"
},
"dependencies": {
"deep-diff": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.4.tgz",
"integrity": "sha1-qsXDmVIjar5fA3ojSQYLoBsArkg=",
"dev": true
},
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
"integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=",
"dev": true
},
"react-redux": {
"version": "4.4.8",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.8.tgz",
"integrity": "sha1-57wd0QDotk6WrIIS2xEyObni4I8=",
"dev": true,
"requires": {
"create-react-class": "15.6.2",
"hoist-non-react-statics": "1.2.0",
"invariant": "2.2.2",
"lodash": "4.17.4",
"loose-envify": "1.3.1",
"prop-types": "15.6.0"
}
},
"redux-logger": {
"version": "2.10.2",
"resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-2.10.2.tgz",
"integrity": "sha1-PFpfCm8yV3wd6t9mVfJX+CxsOTc=",
"dev": true,
"requires": {
"deep-diff": "0.3.4"
}
}
}
},
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
@ -7610,6 +7724,12 @@
"deep-diff": "0.3.8"
}
},
"redux-saga": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-0.11.1.tgz",
"integrity": "sha1-3CAj0FmvC5HAsbT+vOIRlLZ9Wlg=",
"dev": true
},
"regenerate": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
@ -7802,6 +7922,12 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
"dev": true
},
"reselect": {
"version": "2.5.4",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-2.5.4.tgz",
"integrity": "sha1-t9I/3wC4P6etAnlUb427vXZccEc=",
"dev": true
},
"resolve": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
@ -7877,8 +8003,7 @@
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
"dev": true
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"sass-graph": {
"version": "2.2.4",
@ -8417,6 +8542,24 @@
"kind-of": "3.2.2"
}
},
"snoocore": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/snoocore/-/snoocore-3.3.1.tgz",
"integrity": "sha1-0n7weCmZo7fKBZ7sK2+JcQ5XmEA=",
"dev": true,
"requires": {
"he": "0.5.0",
"when": "3.7.8"
},
"dependencies": {
"he": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/he/-/he-0.5.0.tgz",
"integrity": "sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI=",
"dev": true
}
}
},
"sntp": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
@ -8826,7 +8969,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
@ -8867,6 +9009,35 @@
"get-stdin": "4.0.1"
}
},
"superagent": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz",
"integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==",
"requires": {
"component-emitter": "1.2.1",
"cookiejar": "2.1.1",
"debug": "3.1.0",
"extend": "3.0.1",
"form-data": "2.3.1",
"formidable": "1.1.1",
"methods": "1.1.2",
"mime": "1.4.1",
"qs": "6.5.1",
"readable-stream": "2.3.3"
},
"dependencies": {
"form-data": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
"integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
"requires": {
"asynckit": "0.4.0",
"combined-stream": "1.0.5",
"mime-types": "2.1.17"
}
}
}
},
"supports-color": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
@ -9550,8 +9721,7 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utila": {
"version": "0.4.0",
@ -10309,6 +10479,12 @@
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
"integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
},
"when": {
"version": "3.7.8",
"resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
"integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
"dev": true
},
"whet.extend": {
"version": "0.9.9",
"resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",

View file

@ -32,6 +32,7 @@
"react-redux": "^5.0.6",
"react-router-dom": "^4.2.2",
"redux": "^3.7.2",
"superagent": "^3.8.2",
"whatwg-fetch": "^2.0.3"
},
"devDependencies": {

View file

@ -1,29 +0,0 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/removeddit;
index about.html;
server_name _;
location ~* /r/[a-zA-Z0-9]+/[a-zA-Z0-9] {
try_files /thread.html /thread.html =404;
}
location /r/ {
try_files /subreddit.html /subreddit.html =404;
}
location /static/ {
try_files $uri $uri/ =404;
}
location /about/ {
try_files /about.html /about.html =404;
}
location / {
try_files /subreddit.html /subreddit.html =404;
}
}

View file

@ -30,7 +30,7 @@ class App extends React.Component {
<Switch>
<Route exact path='/' component={Thread} />
<Route path='/about' component={About}/>
<Route path='/r/:subreddit/comments' component={Thread}/>
<Route path='/r/:subreddit/comments/:threadID' component={Thread}/>
</Switch>
</>
</BrowserRouter>

View file

View file

@ -1,10 +1,8 @@
import React from 'react'
import {Link} from 'react-router-dom'
import StatusBox from 'components/StatusBox'
import { setStatusLoading, setStatusSuccess, setStatusError } from 'state'
import {connect} from 'react-redux'
class Menu extends React.Component {
export default class Menu extends React.Component {
render () {
return (
<header>
@ -17,24 +15,8 @@ class Menu extends React.Component {
<Link to='/about/'>about</Link>
</nav>
</div>
<StatusBox {...this.props.status} />
<StatusBox />
</header>
)
}
}
const mapStateToProps = (state) => {
return {
status: state.status
}
}
const mapDispatchToProps = (dispatch) => {
return {
setStatusSuccess: text => dispatch(setStatusSuccess(text)),
setStatusLoading: text => dispatch(setStatusLoading(text)),
setStatusError: text => dispatch(setStatusError(text)),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Menu)
}

View file

@ -1,6 +1,8 @@
import React from 'react'
import {connect} from 'react-redux'
import { setStatusLoading, setStatusSuccess, setStatusError } from 'state'
export default class StatusBox extends React.Component {
class StatusBox extends React.Component {
render() {
return (
<div id='status'>
@ -11,4 +13,14 @@ export default class StatusBox extends React.Component {
</div>
)
}
}
}
const mapStateToProps = (state) => {
return {
text: state.status.text,
image: state.status.image
}
}
export default connect(mapStateToProps)(StatusBox)

View file

@ -0,0 +1,60 @@
import React from 'react'
import {prettyScore, prettyDate, redditThumbnails} from 'utils'
export default (props) => {
if(!props.title) {
return <div></div>
}
const url = props.url.replace('reddit.com', 'removeddit.com')
const userLink = props.author !== '[deleted]' ? `https://www.reddit.com/user/${props.author}` : ''
let thumbnail
const thumbnailWidth = props.thumbnail_width ? props.thumbnail_width * 0.5 : 70
const thumbnailHeight = props.thumbnail_height ? props.thumbnail_height * 0.5 : 70
if(redditThumbnails.includes(props.thumbnail)) {
thumbnail = <a href={url} className={`thumbnail thumbnail-${props.thumbnail}`}></a>
} else if(props.thumbnail !== ''){
thumbnail = (
<a href={url}>
<img className='thumbnail' src={props.thumbnail} width={thumbnailWidth} height={thumbnailHeight}/>
</a>
)
}
return (
<div className='thread'>
{props.position &&
<span className='post-rank'>{props.position}</span>}
<div className='thread-score-box'>
<div className='vote upvote'></div>
<div className='thread-score'>{prettyScore(props.score)}</div>
<div className='vote downvote'></div>
</div>
{thumbnail}
<div className='thread-content'>
<a className='thread-title' href={props.url}>{props.title}</a>
{props.link_flair_text &&
<span className='link-flair'>{props.link_flair_text}</span>}
<span className='domain'>({props.domain})</span>
<div className='thread-info'>
submitted <span className='thread-time'>{prettyDate(props.created_utc)}</span> by&nbsp;
<a className='thread-author author' href={userLink}>{props.author}</a>
&nbsp;to <a className='subreddit-link author' href={`/r/${props.subreddit}`}>/r/{props.subreddit}</a>
</div>
<div className='total-comments'>
<a className='grey-link' href={props.permalink}>
<b>{props.num_comments} comments</b>
</a>
<a className='grey-link' href={`https://www.reddit.com${props.permalink}`}>
<b>reddit</b>
</a>
<a className='grey-link' href={`https://snew.github.io${props.permalink}`}>
<b>ceddit</b>
</a>
</div>
</div>
</div>
)
}

View file

@ -12,15 +12,8 @@ ReactDOM.render(
document.getElementById("app")
)
// console.log(store.getState())
// import {setStatusLoading} from 'state'
// store.dispatch(setStatusLoading('hi'))
import {setStatusError} from 'state'
// store.subscribe(() => console.log(store.getState()))
store.dispatch(setStatusError('Hello world'))
store.dispatch(setStatusError('Hi again :)'))
// import {json} from 'utils'
// import {test} from 'pushshift'
// test('7q2k2g').then(console.log)
// import { getThread } from 'reddit'
// getThread('videos', '7q4vxi')

View file

@ -1,70 +1,34 @@
import React from 'react'
import {prettyScore, statusImages, redditThumbnails} from 'utils'
import ThreadHead from 'components/ThreadHead'
import { getThread } from 'reddit'
export default class Thread extends React.Component {
constructor(props) {
super(props)
this.state = {
url: '',
thumbnailWidth: 70,
thumbnailHeight: 70,
thumbnail: '',
position: 0,
score: 0
thread: {}
}
}
componentDidMount() {
getThread(this.props.match.params.subreddit, this.props.match.params.threadID)
.then(thread => {
this.setState({thread})
// check if thread is deleted
//if(thread.)
return thread
})
}
render () {
// const url = this.props.url.replace('reddit.com', 'removeddit.com')
// let thumbnail
// const thumbnailWidth = this.state.thumbnail_width ? this.state.thumbnail_width * 0.5 : 70
// const thumbnailHeight = this.state.thumbnail_height ? this.state.thumbnail_height * 0.5 : 70
// if(redditThumbnails.includes(this.state.thumbnail)) {
// thumbnail = <a href={url} className='thumbnail thumbnail-${this.props..thumbnail}'></a>
// } else {
// thumbnail = (
// <a href={url}>
// <img className='thumbnail' src={this.state.thumbnail} width='<%= thumbnailWidth %>' height='<%= thumbnailHeight %>'/>
// </a>
// )
// }
return (
<h1>Lol</h1>
// <div className='thread'>
// {this.state.position &&
// <span className='post-rank'>{this.state.position}</span>}
// <div className='thread-score-box'>
// <div className='vote upvote'></div>
// <div className='thread-score'>{prettyScore(this.state.score)}</div>
// <div className='vote downvote'></div>
// </div>
// {thumbnail}
// <div className='thread-content'>
// <a className='thread-title' href={this.props.url}>{this.state.title}</a>
// {thread.link_flair_text &&
// <span className='link-flair'>{this.state.link_flair_text}</span>}
// <span className='domain'>({this.state.domain})</span>
// <div className='thread-info'>
// submitted <span className='thread-time'>{prettyDate(this.state.created_utc)}</span> by
// <a className='thread-author author' href={`https://www.reddit.com/user/${this.state.author}`}>{this.state.author}</a>
// {/* <% if(Reddit.isAll){ %>
// to <a className='subreddit-link author' href='/r/<%= thread.subreddit %>'>/r/<%= thread.subreddit %></a>
// <% } %> */}
// </div>
// <div className='total-comments'>
// <a className='grey-link' href='<%= thread.permalink %>'>
// <b>{this.state.num_comments} comments</b>
// </a>
// <a className='grey-link' href={`https://www.reddit.com${this.state.permalink}`}>
// <b>reddit</b>
// </a>
// </div>
// </div>
// </div>
<>
<ThreadHead {...this.state.thread} />
<h1>lol</h1>
</>
)
}
}

View file

@ -1,7 +1,10 @@
import clientID from './clientID'
import {json} from 'utils'
// Reddit API
// Headers for general api calls
const init = {
headers: {
'Authorization': ''
@ -9,7 +12,9 @@ const init = {
}
let hasToken = false
let baseCommentTree = {}
// Headers for getting reddit api token
const tokenInit = {
headers: {
'Authorization': 'Basic ' + btoa(clientID + ':'),
@ -32,32 +37,24 @@ const fetchToken = () => {
})
}
export const getComments = (subreddit, threadID) => {
export const getThread = (subreddit, threadID) => {
return fetchToken()
.then(() => {
return Promise.all([
fetch(URLs.thread, Reddit.init)
.then(Fetch2.json)
.then(ThreadHTML.createThread)
.catch(function(error) {
return Promise.reject("Could not get thread from Reddit");
}),
.then(() => fetch(`https://oauth.reddit.com/r/${subreddit}/comments/${threadID}`, init))
.then(json)
.then(results => {
// Save the comments for later
baseCommentTree = results[1].data.children
fetch(URLs.pushshiftIDs)
.then(Fetch2.json)
.then(_.property("data"))
.catch(function(error) {
return Promise.reject("Could not get removed comment IDs");
}),
])
// Return the thread
return results[0].data.children[0].data
})
}
// .then(function(results) {
// var thread = results[0];
// Comments.allIDs = results[1];
// Status.loading("Loading comments from reddit...");
export const getCommentIDs = () => {
}
// HandleIDs.normal(thread);
// return HandleIDs.morechildren()
// .catch(function(error){