diff --git a/server-config/letsencrypt.conf b/nginx-config/letsencrypt.conf similarity index 100% rename from server-config/letsencrypt.conf rename to nginx-config/letsencrypt.conf diff --git a/nginx-config/nginx-basic b/nginx-config/nginx-basic new file mode 100644 index 0000000..843eb9e --- /dev/null +++ b/nginx-config/nginx-basic @@ -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; + } +} + diff --git a/server-config/ssl b/nginx-config/nginx-ssl similarity index 68% rename from server-config/ssl rename to nginx-config/nginx-ssl index 9111c27..652e471 100644 --- a/server-config/ssl +++ b/nginx-config/nginx-ssl @@ -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; } } diff --git a/package-lock.json b/package-lock.json index 9ed4427..373ba6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index c98956a..18783d3 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/server-config/basic b/server-config/basic deleted file mode 100644 index df5bd80..0000000 --- a/server-config/basic +++ /dev/null @@ -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; - } -} - diff --git a/src/js/App.js b/src/js/App.js index 5e4df91..3bc5716 100644 --- a/src/js/App.js +++ b/src/js/App.js @@ -30,7 +30,7 @@ class App extends React.Component { - + diff --git a/src/js/components/CommentSection.js b/src/js/components/CommentSection.js new file mode 100644 index 0000000..e69de29 diff --git a/src/js/components/Menu.js b/src/js/components/Menu.js index c0ab3d6..7008003 100644 --- a/src/js/components/Menu.js +++ b/src/js/components/Menu.js @@ -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 (
@@ -17,24 +15,8 @@ class Menu extends React.Component { about - +
) } -} - -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) \ No newline at end of file +} \ No newline at end of file diff --git a/src/js/components/StatusBox.js b/src/js/components/StatusBox.js index 971b5c0..7664ad1 100644 --- a/src/js/components/StatusBox.js +++ b/src/js/components/StatusBox.js @@ -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 (
@@ -11,4 +13,14 @@ export default class StatusBox extends React.Component {
) } -} \ No newline at end of file +} + +const mapStateToProps = (state) => { + return { + text: state.status.text, + image: state.status.image + + } +} + +export default connect(mapStateToProps)(StatusBox) \ No newline at end of file diff --git a/src/js/components/ThreadHead.js b/src/js/components/ThreadHead.js new file mode 100644 index 0000000..b2f5a70 --- /dev/null +++ b/src/js/components/ThreadHead.js @@ -0,0 +1,60 @@ +import React from 'react' +import {prettyScore, prettyDate, redditThumbnails} from 'utils' + +export default (props) => { + if(!props.title) { + return
+ } + + 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 = + } else if(props.thumbnail !== ''){ + thumbnail = ( + + + + ) + } + + return ( +
+ {props.position && + {props.position}} +
+
+
{prettyScore(props.score)}
+
+
+ {thumbnail} +
+ {props.title} + {props.link_flair_text && + {props.link_flair_text}} + ({props.domain}) +
+ submitted {prettyDate(props.created_utc)} by  + {props.author} +  to /r/{props.subreddit} +
+
+ + {props.num_comments} comments + + + reddit + + + ceddit + +
+
+
+ ) +} \ No newline at end of file diff --git a/src/js/index.js b/src/js/index.js index 125897f..21417f4 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -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) \ No newline at end of file +// import { getThread } from 'reddit' +// getThread('videos', '7q4vxi') \ No newline at end of file diff --git a/src/js/pages/Thread.js b/src/js/pages/Thread.js index dd3e73f..d0fabbf 100644 --- a/src/js/pages/Thread.js +++ b/src/js/pages/Thread.js @@ -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 = - // } else { - // thumbnail = ( - // - // - // - // ) - // } - return ( -

Lol

- //
- // {this.state.position && - // {this.state.position}} - //
- //
- //
{prettyScore(this.state.score)}
- //
- //
- // {thumbnail} - //
- - // {this.state.title} - // {thread.link_flair_text && - // {this.state.link_flair_text}} - // ({this.state.domain}) - //
- // submitted {prettyDate(this.state.created_utc)} by - // {this.state.author} - // {/* <% if(Reddit.isAll){ %> - // to /r/<%= thread.subreddit %> - // <% } %> */} - //
- //
- // - // {this.state.num_comments} comments - // - // - // reddit - // - //
- //
- //
+ <> + +

lol

+ ) } } \ No newline at end of file diff --git a/src/js/reddit/index.js b/src/js/reddit/index.js index 7d9ace2..b4cb03c 100644 --- a/src/js/reddit/index.js +++ b/src/js/reddit/index.js @@ -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){