mirror of
https://github.com/gurnec/removeddit.git
synced 2026-03-11 08:54:27 +00:00
Can now fetch reddit threads and display the the thread body
This commit is contained in:
parent
c8dd37d6ae
commit
af4787a77a
14 changed files with 347 additions and 192 deletions
15
nginx-config/nginx-basic
Normal file
15
nginx-config/nginx-basic
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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
246
package-lock.json
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
0
src/js/components/CommentSection.js
Normal file
0
src/js/components/CommentSection.js
Normal 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)
|
||||
}
|
||||
|
|
@ -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)
|
||||
60
src/js/components/ThreadHead.js
Normal file
60
src/js/components/ThreadHead.js
Normal 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
|
||||
<a className='thread-author author' href={userLink}>{props.author}</a>
|
||||
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>
|
||||
)
|
||||
}
|
||||
|
|
@ -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')
|
||||
|
|
@ -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>
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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){
|
||||
|
|
|
|||
Loading…
Reference in a new issue