From fea8367fc53bc978110ee0dfd1cea17aa92d8fec Mon Sep 17 00:00:00 2001 From: ionush Date: Mon, 22 Jan 2018 16:47:56 +0200 Subject: [PATCH 01/10] building public chat components also added to actioncreators and reducers --- config.env | 1 + package-lock.json | 350 +++++++++++++++++++++++++++++++++- package.json | 1 + src/backEnd/server.js | 16 ++ src/js/App.jsx | 3 + src/js/ClientApp.jsx | 24 +-- src/js/PublicAddMessage.jsx | 36 ++++ src/js/PublicChat.jsx | 51 +++++ src/js/PublicMessage.jsx | 15 ++ src/js/PublicMessagesList.jsx | 31 +++ src/js/PublicSidebar.jsx | 25 +++ src/js/actionCreators.js | 36 ++++ src/js/reducers/index.js | 14 +- src/js/reducers/reducers.js | 26 +++ webpack.config.js | 1 + 15 files changed, 610 insertions(+), 20 deletions(-) create mode 100644 config.env create mode 100644 src/backEnd/server.js create mode 100644 src/js/PublicAddMessage.jsx create mode 100644 src/js/PublicMessage.jsx create mode 100644 src/js/PublicMessagesList.jsx create mode 100644 src/js/PublicSidebar.jsx diff --git a/config.env b/config.env new file mode 100644 index 0000000..f9f4b92 --- /dev/null +++ b/config.env @@ -0,0 +1 @@ +DATABASE_URL= postgres://postgress:12345678@localhost:5432/cryptodb diff --git a/package-lock.json b/package-lock.json index 0f99ac8..680605e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -142,6 +142,12 @@ "normalize-path": "2.1.1" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -1256,6 +1262,12 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1460,6 +1472,27 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cacache": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.2.tgz", + "integrity": "sha512-dljb7dk1jqO5ogE+dRpoR9tpHYv5xz9vPSNunh1+0wRuNdYxmzp9WmsyokgW/DUF1FDRVA/TMsmxt027R8djbQ==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "1.3.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.1.0", + "unique-filename": "1.1.0", + "y18n": "3.2.1" + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1656,6 +1689,12 @@ "readdirp": "2.1.0" } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, "ci-info": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", @@ -1899,6 +1938,12 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2029,6 +2074,20 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2275,6 +2334,12 @@ "array-find-index": "1.0.2" } }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -2516,6 +2581,18 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "duplexify": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", + "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2576,6 +2653,15 @@ "iconv-lite": "0.4.19" } }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -3499,6 +3585,16 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "follow-redirects": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.3.0.tgz", @@ -3551,6 +3647,28 @@ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4959,6 +5077,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", @@ -6020,6 +6144,24 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, + "mississippi": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, "mixin-deep": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", @@ -6059,6 +6201,20 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6838,6 +6994,17 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -7670,6 +7837,12 @@ "asap": "2.0.6" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "prop-types": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", @@ -7728,6 +7901,39 @@ "randombytes": "2.0.6" } }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.0.tgz", + "integrity": "sha512-6MYypjOvtiXhBSTOD0Zs5eNjCGfnqi5mPsCsW+dgKTxrZzQMZQNpBo3XRkLx7id753f3EeyHLBqzqqUymIolgw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -8363,6 +8569,15 @@ "is-promise": "2.1.0" } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -8464,6 +8679,12 @@ } } }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -8912,6 +9133,15 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssri": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.1.0.tgz", + "integrity": "sha512-TevC8fgxQKTfQ1nWtM9GNzr3q5rrHNntG9CDMH1k3QhSZI6Kb+NbjLRs8oPFZa2Hgo7zoekL+UTvoEk7tsbjQg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stackframe": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", @@ -9011,6 +9241,16 @@ "duplexer": "0.1.1" } }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", @@ -9023,6 +9263,12 @@ "xtend": "4.0.1" } }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -9241,6 +9487,16 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, "thunky": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", @@ -9438,6 +9694,24 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, + "uglify-es": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.8.tgz", + "integrity": "sha512-j8li0jWcAN6yBuAVYFZEFyYINZAm4WEdMwkA6qXFi4TLrze3Mp0Le7QjW6LR9HQjQJ2zRa9VgnFLs3PatijWOw==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -9473,13 +9747,37 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.6.tgz", + "integrity": "sha512-VUja+7rYbznEvUaeb8IxOCTUrq4BCb1ml0vffa+mfwKtrAwlqnU0ENF14DtYltV1cxd/HSuK51CCA/D/8kMQVw==", + "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "cacache": "10.0.2", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.3", + "serialize-javascript": "1.4.0", + "source-map": "0.6.1", + "uglify-es": "3.3.8", + "webpack-sources": "1.1.0", + "worker-farm": "1.5.2" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.3.tgz", + "integrity": "sha512-sgv/iF/T4/SewJkaVpldKC4WjSkz0JsOh2eKtxCPpCO1oR05+7MOF+H476HVRbLArkgA7j5TRJJ4p2jdFkUGQQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "undefsafe": { @@ -9545,6 +9843,24 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -9984,6 +10300,18 @@ "watchpack": "1.4.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" + }, + "dependencies": { + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + } } }, "webpack-dev-middleware": { @@ -10407,6 +10735,16 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, + "worker-farm": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", + "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", + "dev": true, + "requires": { + "errno": "0.1.6", + "xtend": "4.0.1" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/package.json b/package.json index 11b20f2..5957386 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "react-addons-perf": "^15.4.2", "react-hot-loader": "3.0.0-beta.6", "style-loader": "^0.19.1", + "uglifyjs-webpack-plugin": "^1.1.6", "webpack-dev-server": "^2.10.1" }, "scripts": { diff --git a/src/backEnd/server.js b/src/backEnd/server.js new file mode 100644 index 0000000..1a6dbfc --- /dev/null +++ b/src/backEnd/server.js @@ -0,0 +1,16 @@ +const express = require('express'); +const path = require('path'); +const bodyParser = require('body-parser'); + +const router = require('./router'); + +const app = express(); +app.use(express.static(path.resolve(__dirname, '../..'))); +app.use(bodyParser.json()); + +app.use('/api', router); +app.get('/*', (req, res) => { + res.sendFile(path.resolve(__dirname, '../..', 'index.html')); +}); + +app.listen(8080, () => console.log('on 8080')); diff --git a/src/js/App.jsx b/src/js/App.jsx index 14586ea..6c0a666 100644 --- a/src/js/App.jsx +++ b/src/js/App.jsx @@ -7,6 +7,9 @@ import Learn from './Learn'; import Markets from './Markets'; import Buy from './Buy'; import PublicChat from './PublicChat'; +import { addUser } from './actionCreators'; + +store.dispatch(addUser('Me')); const App = () => ( diff --git a/src/js/ClientApp.jsx b/src/js/ClientApp.jsx index 1da7d4c..ee129ce 100644 --- a/src/js/ClientApp.jsx +++ b/src/js/ClientApp.jsx @@ -14,18 +14,18 @@ const renderApp = () => { }; renderApp(); -// if (module.hot) { -// module.hot.accept('./App', () => { -// const NextApp = require('./App').default; -// -// render( -// -// -// , -// document.getElementById('root') -// ); -// }); -// } +if (module.hot) { + module.hot.accept('./App', () => { + const NextApp = require('./App').default; + + render( + + + , + document.getElementById('root') + ); + }); +} // const renderApp = () => { // render( diff --git a/src/js/PublicAddMessage.jsx b/src/js/PublicAddMessage.jsx new file mode 100644 index 0000000..1a297c2 --- /dev/null +++ b/src/js/PublicAddMessage.jsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { addMessage } from './actionCreators'; +// import PropTypes from 'prop-types' + +const PublicAddMessage = props => { + let input; + + return ( +
+ { + if (e.key === 'Enter') { + props.dispatch(input.value, 'Me'); + input.value = ''; + } + }} + type="text" + ref={node => { + input = node; + }} + /> +
+ ); +}; + +// AddMessage.propTypes = { +// dispatch: PropTypes.func.isRequired +// } +const mapDispatchToProps = dispatch => ({ + dispatch: (message, author) => { + dispatch(addMessage(message, author)); + } +}); + +export default connect(() => ({}), mapDispatchToProps)(PublicAddMessage); diff --git a/src/js/PublicChat.jsx b/src/js/PublicChat.jsx index 4a0ec13..209c139 100644 --- a/src/js/PublicChat.jsx +++ b/src/js/PublicChat.jsx @@ -1,11 +1,62 @@ import React from 'react'; +import styled from 'styled-components'; import Navbar from './Navbar'; +import PublicSidebar from './PublicSidebar'; +import PublicMessagesList from './PublicMessagesList'; +import PublicAddMessage from './PublicAddMessage'; + +const Wrapper = styled.div` + * { + box-sizing: border-box; + padding: 0; + margin: 0; + } + body { + font-family: 'Press Start 2P'; + } + #container { + display: grid; + grid-template-columns: 1fr 3fr; + grid-template-areas: 'sidebar main'; + width: 100vw; + height: 100vh; + } + #main { + grid-area: main; + } + #new-message { + position: fixed; + bottom: 0; + width: 100%; + padding: 5px; + margin-left: 0px; + border-top: 1px solid #3f3f3f; + } + #messages-list { + padding: 5px 0 0 5px; + } + #sidebar { + grid-area: sidebar; + padding: 5px 0 0 5px; + border-right: 1px solid #3f3f3f; + height: 100%; + } +`; const PublicChat = () => (

this is the public chat page

hello

+
+ + +
+ + +
+
+
); diff --git a/src/js/PublicMessage.jsx b/src/js/PublicMessage.jsx new file mode 100644 index 0000000..aa1c50d --- /dev/null +++ b/src/js/PublicMessage.jsx @@ -0,0 +1,15 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const PublicMessage = ({ message, author }) => ( +

+ {author}: {message} +

+); + +PublicMessage.propTypes = { + message: PropTypes.string.isRequired, + author: PropTypes.string.isRequired +}; + +export default PublicMessage; diff --git a/src/js/PublicMessagesList.jsx b/src/js/PublicMessagesList.jsx new file mode 100644 index 0000000..da175bf --- /dev/null +++ b/src/js/PublicMessagesList.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import PublicMessage from './PublicMessage'; + +const PublicMessagesList = ({ publicmessages }) => ( +
+
    + {publicmessages.map(message => ( + + ))} +
+
+); + +// PublicMessagesList.propTypes = { +// publicmessages: PropTypes.arrayOf( +// PropTypes.shape({ +// id: PropTypes.number.isRequired, +// message: PropTypes.string.isRequired, +// author: PropTypes.string.isRequired +// }).isRequired +// ).isRequired +// }; + +export default connect( + state => ({ + publicmessages: state.publicmessages + }), + {} +)(PublicMessagesList); diff --git a/src/js/PublicSidebar.jsx b/src/js/PublicSidebar.jsx new file mode 100644 index 0000000..5238d2a --- /dev/null +++ b/src/js/PublicSidebar.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +const PublicSidebar = ({ publicusers }) => ( + +); + +PublicSidebar.propTypes = { + publicusers: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + name: PropTypes.string.isRequired + }).isRequired + ).isRequired +}; + +export default connect( + state => ({ + publicusers: state.publicusers + }), + {} +)(PublicSidebar); diff --git a/src/js/actionCreators.js b/src/js/actionCreators.js index 47f3b01..0cb4730 100644 --- a/src/js/actionCreators.js +++ b/src/js/actionCreators.js @@ -1,3 +1,6 @@ +let nextMessageId = 0; +let nextUserId = 0; + export function setCoin(coin) { return { type: 'SET_COIN', payload: coin }; } @@ -24,3 +27,36 @@ export function setActivePoint(activePoint) { export function setHoverLoc(hoverLoc) { return { type: 'SET_HOVER_LOC', payload: hoverLoc }; } + +export function addMessage(message, author) { + return { + type: 'ADD_MESSAGE', + id: nextMessageId++, + message, + author + }; +} + +export function addUser(name) { + return { + type: 'ADD_USER', + id: nextUserId++, + name + }; +} + +export function messageReceived(message, author) { + return { + type: 'MESSAGE_RECEIVED', + id: nextMessageId++, + message, + author + }; +} + +export function populateUsersList(users) { + return { + type: 'USERS_LIST', + users + }; +} diff --git a/src/js/reducers/index.js b/src/js/reducers/index.js index 3f75b85..210acb0 100644 --- a/src/js/reducers/index.js +++ b/src/js/reducers/index.js @@ -1,12 +1,22 @@ import { combineReducers } from 'redux'; -import { data, coin, duration, hoverLoc, activePoint } from './reducers'; +import { + data, + coin, + duration, + hoverLoc, + activePoint, + publicmessages, + publicusers +} from './reducers'; const rootReducer = combineReducers({ coin, duration, hoverLoc, activePoint, - data + data, + publicmessages, + publicusers }); export default rootReducer; diff --git a/src/js/reducers/reducers.js b/src/js/reducers/reducers.js index 06928c7..67e524c 100644 --- a/src/js/reducers/reducers.js +++ b/src/js/reducers/reducers.js @@ -79,3 +79,29 @@ export function data(state = defaultState, action) { return state; } } +export function publicmessages(state = [], action) { + switch (action.type) { + case 'ADD_MESSAGE': + case 'MESSAGE_RECEIVED': + return state.concat([ + { + message: action.message, + author: action.author, + id: action.id + } + ]); + default: + return state; + } +} + +export function publicusers(state = [], action) { + switch (action.type) { + case 'ADD_USER': + return state.concat([{ name: action.name, id: action.id }]); + case 'USERS_LIST': + return action.users; + default: + return state; + } +} diff --git a/webpack.config.js b/webpack.config.js index 0808e54..3bb037f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -29,6 +29,7 @@ module.exports = { chunks: false }, plugins: [ + // new webpack.optimize.UglifyJsPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NamedModulesPlugin() ], From b2a18c9b82d821fe63c8597974f720bd281c1ad3 Mon Sep 17 00:00:00 2001 From: MarlenAwwad Date: Mon, 22 Jan 2018 17:37:21 +0200 Subject: [PATCH 02/10] authentication set up relates #4 to be continued --- database/db_build.sql | 8 +- database/posts.json | 32 -- database/queries/addUsers.js | 20 + database/queries/validateUser.js | 26 ++ package-lock.json | 759 ++++++++++++++++++++++++++++++- package.json | 6 + src/backEnd/router.js | 40 +- src/backEnd/server.js | 6 + src/js/App.jsx | 5 +- src/js/Landing.jsx | 20 +- src/js/Login.jsx | 282 ++++++++++++ src/js/PostRendering.jsx | 3 +- src/js/PostTemplate.jsx | 6 +- src/js/Signup.jsx | 276 +++++++++++ 14 files changed, 1426 insertions(+), 63 deletions(-) delete mode 100644 database/posts.json create mode 100644 database/queries/addUsers.js create mode 100644 database/queries/validateUser.js create mode 100644 src/js/Login.jsx create mode 100644 src/js/Signup.jsx diff --git a/database/db_build.sql b/database/db_build.sql index 7af8fcd..fa9f378 100644 --- a/database/db_build.sql +++ b/database/db_build.sql @@ -5,7 +5,7 @@ DROP TABLE IF EXISTS posts CASCADE; CREATE TABLE users ( user_id SERIAL PRIMARY KEY , -user_name VARCHAR(100) NOT NULL UNIQUE , +username VARCHAR(100) NOT NULL UNIQUE , password VARCHAR(100) NOT NULL , email TEXT NOT NULL UNIQUE, country TEXT NOT NULL, @@ -16,7 +16,7 @@ added_date DATE DEFAULT now() CREATE TABLE posts( post_id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL , - prefferedPayment VARCHAR(100) NOT NULL, + prefferedpayment VARCHAR(100) NOT NULL, country TEXT NOT NULL, city TEXT NOT NULL, coin TEXT NOT NULL, @@ -26,10 +26,10 @@ CREATE TABLE posts( added_date DATE DEFAULT now() ); -INSERT INTO users(user_name , password ,email, country,city) VALUES +INSERT INTO users(username , password ,email, country,city) VALUES ('hawk Kayleb' , '123' , 'user@gmail.com' , 'Israel' ,'Haifa' ); -INSERT INTO posts(user_id, prefferedPayment, country, city, coin, qty, price, buyerSeller) +INSERT INTO posts(user_id, prefferedpayment, country, city, coin, qty, price, buyerSeller) VALUES (1, 'Bank Transfer', 'Israel', 'Tel Aviv', 'Bitcoin', 1, 17000, 'Seller'); COMMIT; diff --git a/database/posts.json b/database/posts.json deleted file mode 100644 index bc70f4a..0000000 --- a/database/posts.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "name": "Samir Doe", - "preferedPaymentMethod": "Bank Transfer", - "country": "Israel", - "city": "Umm El Fahem", - "coin": "Bitcoin", - "amount": "1", - "price": "10,000 Shekel", - "buyerSeller": "Buyer" - }, - { - "name": "Jana Poe", - "preferedPaymentMethod": "Bank Transfer", - "country": "Israel", - "city": "Nazareth", - "coin": "Ripple", - "amount": "150", - "price": "8,000 Shekel", - "buyerSeller": "Seller" - }, - { - "name": "Max Jackson", - "preferedPaymentMethod": "Bank Transfer", - "country": "Israel", - "city": "Tel Aviv", - "coin": "Ethereum", - "amount": "2", - "price": "7,000 Shekel", - "buyerSeller": "Seller" - } -] diff --git a/database/queries/addUsers.js b/database/queries/addUsers.js new file mode 100644 index 0000000..feaf9b1 --- /dev/null +++ b/database/queries/addUsers.js @@ -0,0 +1,20 @@ +const connect = require("../db_connection"); +const bcrypt = require("bcrypt"); + +const salt = 10; + + const addUser = (username, password, email, country, city, cb) => { + bcrypt.hash(password, salt, (err, hash) => { + connect.query(`INSERT INTO users (username, password, email, country, city) VALUES ($1, $2, $3, $4, $5)`, + [username, hash, email, country, city], (err, result) => { + if(err){ + console.log("error in writing the query", err); + cb(err); + }else{ + cb(null, result); + } + }); + }); + } + + module.exports = {addUser}; diff --git a/database/queries/validateUser.js b/database/queries/validateUser.js new file mode 100644 index 0000000..08e0953 --- /dev/null +++ b/database/queries/validateUser.js @@ -0,0 +1,26 @@ +const connect = require("../db_connection"); +const bcrypt = require("bcrypt"); + +const validateUser = (user,cb)=>{ + connect.query(`SELECT * FROM users WHERE username = $1`,[user.username],(err,res)=>{ + if(err){ + return cb(err) + } + if(!res){ + return cb(null,0); + } + + bcrypt.compare(user.password,res.rows[0].password,(err,isValid)=>{ + if(err){ + return cb(err); + } + if(!isValid){ + return cb(null,0); + } + return cb(null , res.rows[0]); + }) + + }) +} + +module.exports = validateUser; diff --git a/package-lock.json b/package-lock.json index 218718f..75f9c93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,58 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/body-parser": { + "version": "1.16.8", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", + "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", + "requires": { + "@types/express": "4.0.39", + "@types/node": "9.3.0" + } + }, + "@types/events": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz", + "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==" + }, + "@types/express": { + "version": "4.0.39", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.39.tgz", + "integrity": "sha512-dBUam7jEjyuEofigUXCtublUHknRZvcRgITlGsTbFgPvnTwtQUt2NgLakbsf+PsGo/Nupqr3IXCYsOpBpofyrA==", + "requires": { + "@types/body-parser": "1.16.8", + "@types/express-serve-static-core": "4.11.1", + "@types/serve-static": "1.13.1" + } + }, + "@types/express-serve-static-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz", + "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", + "requires": { + "@types/events": "1.1.0", + "@types/node": "9.3.0" + } + }, + "@types/mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" + }, + "@types/node": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz", + "integrity": "sha512-wNBfvNjzsJl4tswIZKXCFQY0lss9nKUyJnG6T94X/eqjRgI2jHZ4evdjhQYBSan/vGtF6XVXPApOmNH2rf0KKw==" + }, + "@types/serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==", + "requires": { + "@types/express-serve-static-core": "4.11.1", + "@types/mime": "2.0.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -136,6 +188,20 @@ "normalize-path": "2.1.1" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -221,6 +287,11 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "asn1.js": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", @@ -239,6 +310,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -263,11 +339,26 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atob": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, "axios": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", @@ -1034,7 +1125,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, "requires": { "core-js": "2.5.3", "regenerator-runtime": "0.11.1" @@ -1043,8 +1133,7 @@ "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" } } }, @@ -1143,6 +1232,24 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "bcrypt": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-1.0.3.tgz", + "integrity": "sha512-pRyDdo73C8Nim3jwFJ7DWe3TZCgwDfWZ6nHS5LSdU77kWbj1frruvdndP02AOavtD4y8v6Fp2dolbHgp4SDrfg==", + "requires": { + "nan": "2.6.2", + "node-pre-gyp": "0.6.36" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1153,6 +1260,14 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1199,6 +1314,14 @@ "multicast-dns-service-types": "1.1.0" } }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -1424,6 +1547,11 @@ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -1570,6 +1698,11 @@ } } }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", @@ -1632,6 +1765,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1720,6 +1861,11 @@ "date-now": "0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -1773,6 +1919,11 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, "create-ecdh": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", @@ -1824,6 +1975,24 @@ "which": "1.3.0" } }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -1884,6 +2053,14 @@ "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1907,6 +2084,11 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -1965,6 +2147,16 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2072,6 +2264,15 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2848,6 +3049,47 @@ } } }, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "1.1.2", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "uid-safe": "2.1.5", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "express-validator": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-4.3.0.tgz", + "integrity": "sha512-EYU+JJ2EoLpcw+GKwbB1K8UGb/w1A70Wf3gD/zE9QScQxeSt8qad93lxGtsLwZFoiYM0EByVoSzHJnskp+eVHQ==", + "requires": { + "@types/express": "4.0.39", + "lodash": "4.17.4", + "validator": "8.2.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -2882,6 +3124,11 @@ "to-regex": "3.0.1" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -3051,6 +3298,21 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "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" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -3079,6 +3341,27 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3091,6 +3374,41 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -3112,6 +3430,14 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -3259,6 +3585,20 @@ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3282,6 +3622,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3328,6 +3673,17 @@ "minimalistic-assert": "1.0.0" } }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, "history": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", @@ -3350,6 +3706,11 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, "hoist-non-react-statics": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", @@ -3554,6 +3915,16 @@ } } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -3954,6 +4325,11 @@ "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3990,6 +4366,11 @@ "whatwg-fetch": "2.0.3" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "jest-docblock": { "version": "21.2.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", @@ -4016,6 +4397,12 @@ "esprima": "4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -4027,6 +4414,11 @@ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -4038,6 +4430,11 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -4049,6 +4446,17 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", @@ -4195,6 +4603,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" }, + "lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" + }, "lodash.cond": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", @@ -4575,6 +4988,11 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" + }, "nanomatch": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", @@ -4673,6 +5091,33 @@ } } }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.4", + "request": "2.83.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + } + } + }, "nodemon": { "version": "1.14.11", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.14.11.tgz", @@ -4724,11 +5169,27 @@ "path-key": "2.0.1" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4848,8 +5309,7 @@ "on-headers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { "version": "1.4.0", @@ -4928,8 +5388,7 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "2.1.0", @@ -4944,8 +5403,16 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } }, "p-finally": { "version": "1.0.0", @@ -5056,6 +5523,28 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.0.0", + "pause": "0.0.1" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.0.0" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -5115,6 +5604,11 @@ } } }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -5135,6 +5629,11 @@ "sha.js": "2.4.9" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pg": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.1.tgz", @@ -5425,6 +5924,11 @@ "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", "dev": true }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -5526,6 +6030,28 @@ "prop-types": "15.6.0" } }, + "react-form": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/react-form/-/react-form-2.16.1.tgz", + "integrity": "sha512-9Sg/XbYKrX9x+HyaUZydp27RPORSj7Gsk9BpfMIX7XqhG6ihvU6//aWQGC11JGoPFei5E82lCbm6kmU+ObWoCw==", + "requires": { + "babel-runtime": "6.26.0", + "circular-json": "0.4.0", + "classnames": "2.2.5", + "prop-types": "15.6.0", + "react-redux": "5.0.6", + "redux": "3.7.2", + "redux-logger": "3.0.6", + "redux-thunk": "2.2.0" + }, + "dependencies": { + "circular-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.4.0.tgz", + "integrity": "sha512-tKV502ADgm9Z37s6B1QOohegjJJrCl2iyMMb1+8ITHrh1fquW8Jdbkb4s5r4Iwutr1UfL1qvkqvc1wZZlLvwow==" + } + } + }, "react-hot-loader": { "version": "3.0.0-beta.6", "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.0.0-beta.6.tgz", @@ -5560,6 +6086,19 @@ "lodash": "4.17.4" } }, + "react-redux": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.6.tgz", + "integrity": "sha512-8taaaGu+J7PMJQDJrk/xiWEYQmdo3mkXw6wPr3K3LxvXis3Fymiq7c13S+Tpls/AyNUAsoONkU81AP0RA6y6Vw==", + "requires": { + "hoist-non-react-statics": "2.3.1", + "invariant": "2.2.2", + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "prop-types": "15.6.0" + } + }, "react-router": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", @@ -5670,6 +6209,30 @@ "strip-indent": "1.0.1" } }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "4.17.4", + "lodash-es": "4.17.4", + "loose-envify": "1.3.1", + "symbol-observable": "1.1.0" + } + }, + "redux-logger": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", + "requires": { + "deep-diff": "0.3.8" + } + }, + "redux-thunk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", + "integrity": "sha1-5hWhbha0ehmlFXZhM9Hj6Zt4UuU=" + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -5679,8 +6242,7 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { "version": "0.10.1", @@ -5784,6 +6346,35 @@ "is-finite": "1.0.2" } }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6209,6 +6800,14 @@ } } }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", @@ -6416,6 +7015,21 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, "stackframe": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", @@ -6558,6 +7172,11 @@ "safe-buffer": "5.1.1" } }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -6646,6 +7265,11 @@ "has-flag": "2.0.0" } }, + "symbol-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", + "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==" + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -6665,6 +7289,41 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -6835,6 +7494,14 @@ "nopt": "1.0.10" } }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -6852,6 +7519,20 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -6925,6 +7606,19 @@ "webpack-sources": "1.1.0" } }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "1.0.0" + } + }, "undefsafe": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.1.tgz", @@ -7204,6 +7898,11 @@ "spdx-expression-parse": "1.0.4" } }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, "value-equal": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", @@ -7214,6 +7913,16 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -7789,6 +8498,34 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, "widest-line": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", diff --git a/package.json b/package.json index 46cdec3..e72ed39 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,20 @@ "main": "index.js", "dependencies": { "axios": "^0.17.1", + "bcrypt": "^1.0.3", "body-parser": "^1.18.2", "env2": "^2.2.0", "eslint-loader": "^1.9.0", "express": "^4.16.2", + "express-session": "^1.15.6", + "express-validator": "^4.3.0", "nodemon": "^1.14.11", + "passport": "^0.4.0", + "passport-local": "^1.0.0", "pg": "^7.4.1", "react": "^16.2.0", "react-dom": "^16.2.0", + "react-form": "^2.16.1", "react-router-dom": "^4.2.2", "styled-components": "^2.4.0", "webpack": "^3.10.0", diff --git a/src/backEnd/router.js b/src/backEnd/router.js index d15684e..dfb4af3 100644 --- a/src/backEnd/router.js +++ b/src/backEnd/router.js @@ -1,7 +1,45 @@ const router = require('express').Router(); const path = require('path'); -const fetchPosts = require('../../database/queries/fetchPosts') +const fetchPosts = require('../../database/queries/fetchPosts'); +const {addUser} = require('../../database/queries/addUsers'); +const connect = require('../../database/db_connection'); +const bcrypt = require("bcrypt"); +const validateUser = require("../../database/queries/validateUser"); + + router.get("/posts",fetchPosts); + router.post("/newUser", (req, res)=>{ + const {username, password, email, country, city} = req.body; + addUser(username, password, email, country, city, (err, result) => { + if(err){ + console.log("error on routing adduser", err); + res.redirect('/signup'); + }else{ + res.redirect('/login'); + } + }); + }) + +router.post("/login",(req,res)=>{ + validateUser(req.body,(err,res)=>{ + if(err){ + res.writeHead(500, { "Content-Type": "text/html" }); + res.end(err); + }else{ + if(res==0){ + res.writeHead(200, { "Content-Type": "text/html" }); + res.end("Invalid username or password"); + }else{ + res.writeHead(302, { + Location: "/learn", + "Content-Type": "application/json" + }); + res.end(); + } + } + }) +}) + module.exports = router; diff --git a/src/backEnd/server.js b/src/backEnd/server.js index 688fb02..175153a 100644 --- a/src/backEnd/server.js +++ b/src/backEnd/server.js @@ -9,6 +9,9 @@ console.log(path.join(__dirname, "../..")); console.log(express.static(path.resolve(__dirname, "../..","public"))); app.use(express.static(path.resolve(__dirname, "../..","public"))) app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ + extended: true +})); app.use("/api", router); app.get("/*", (req, res) => { @@ -16,4 +19,7 @@ app.get("/*", (req, res) => { res.sendFile(path.resolve(__dirname, '../..', 'index.html')); }); + + + app.listen(8080, () => console.log('on 8080')); diff --git a/src/js/App.jsx b/src/js/App.jsx index 28c578b..12a16cb 100644 --- a/src/js/App.jsx +++ b/src/js/App.jsx @@ -5,7 +5,8 @@ import Learn from "./Learn"; import Markets from "./Markets"; import Buy from "./Buy"; import Sell from "./Sell"; - +import Login from "./Login"; +import Signup from "./Signup"; const App = () => (
@@ -16,6 +17,8 @@ const App = () => ( + +
diff --git a/src/js/Landing.jsx b/src/js/Landing.jsx index a06fd20..8bddbe7 100644 --- a/src/js/Landing.jsx +++ b/src/js/Landing.jsx @@ -1,6 +1,6 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import styled from 'styled-components'; +import React from "react"; +import { Link } from "react-router-dom"; +import styled from "styled-components"; const Wrapper = styled.div` background-color: #2f9999; @@ -17,6 +17,8 @@ const LandingNavbar = styled.div` float: right; margin: 5px; font-weight: bolder; + text-decoration: none; + color: #fff; } font-family: Roboto; `; @@ -26,7 +28,7 @@ const LandingHeader = styled.div` word-wrap: break-word; padding-top: 50px; padding-bottom: 10vh; - font-family: 'Questrial'; + font-family: "Questrial"; font-size: 150%; button:hover:not(.active) { @@ -43,7 +45,7 @@ const LandingGraph = styled.div` text-align: center; select { - font-family: 'Questrial'; + font-family: "Questrial"; font-weight: bold; font-size: 120%; background-color: #f7b733; @@ -56,7 +58,7 @@ const LandingGraph = styled.div` const LandingSafety = styled.div` padding: 10vh; text-align: center; - font-family: 'Quicksand'; + font-family: "Quicksand"; h2 { font-weight: 100; @@ -73,8 +75,8 @@ const Landing = () => (

CryptoCoin

- sign in - sign up + Sign In + Sign Up
@@ -98,7 +100,7 @@ const Landing = () => (

SAFELY MAKE YOUR FIRST TRADE

learn how to buy cryptocurrency, which coin to invest in, all in one - place.{' '} + place.{" "}

diff --git a/src/js/Login.jsx b/src/js/Login.jsx new file mode 100644 index 0000000..7a8b281 --- /dev/null +++ b/src/js/Login.jsx @@ -0,0 +1,282 @@ +import React from "react"; +import styled from "styled-components"; +import { Link } from "react-router-dom"; + + +const LandingNavbar = styled.div` + a { + float: right; + margin: 5px; + font-weight: bolder; + text-decoration: none; + color: #fff; + } + font-family: Roboto; +`; + +const LoginDiv = styled.div` + /* Demo 3 */ + + .form-3 { + font-family: "Ubuntu", "Lato", sans-serif; + font-weight: 400; + /* Size and position */ + width: 300px; + position: relative; + margin: 60px auto 30px; + padding: 10px; + overflow: hidden; + + /* Styles */ + background: #111; + border-radius: 0.4em; + border: 1px solid #191919; + box-shadow: inset 0 0 2px 1px rgba(255, 255, 255, 0.08), + 0 16px 10px -8px rgba(0, 0, 0, 0.6); + } + + .form-3 label { + /* Size and position */ + width: 50%; + float: left; + padding-top: 9px; + + /* Styles */ + color: #ddd; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 1px; + text-shadow: 0 1px 0 #000; + text-indent: 10px; + font-weight: 700; + cursor: pointer; + } + + .form-3 input[type="text"], + .form-3 input[type="password"] { + /* Size and position */ + width: 50%; + float: left; + padding: 8px 5px; + margin-bottom: 10px; + font-size: 12px; + + /* Styles */ + background: #1f2124; /* Fallback */ + background: -moz-linear-gradient(#1f2124, #27292c); + background: -ms-linear-gradient(#1f2124, #27292c); + background: -o-linear-gradient(#1f2124, #27292c); + background: -webkit-gradient( + linear, + 0 0, + 0 100%, + from(#1f2124), + to(#27292c) + ); + background: -webkit-linear-gradient(#1f2124, #27292c); + background: linear-gradient(#1f2124, #27292c); + border: 1px solid #000; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1); + border-radius: 3px; + + /* Font styles */ + font-family: "Ubuntu", "Lato", sans-serif; + color: #fff; + } + + .form-3 input[type="text"]:hover, + .form-3 input[type="password"]:hover, + .form-3 label:hover ~ input[type="text"], + .form-3 label:hover ~ input[type="password"] { + background: #27292c; + } + + .form-3 input[type="text"]:focus, + .form-3 input[type="password"]:focus { + box-shadow: inset 0 0 2px #000; + background: #494d54; + border-color: #51cbee; + outline: none; /* Remove Chrome outline */ + } + + .form-3 p:nth-child(3), + .form-3 p:nth-child(4) { + float: left; + width: 50%; + } + + .form-3 label[for="remember"] { + width: auto; + float: none; + display: inline-block; + text-transform: capitalize; + font-size: 11px; + font-weight: 400; + letter-spacing: 0px; + text-indent: 2px; + } + + .form-3 input[type="checkbox"] { + margin-left: 10px; + vertical-align: middle; + } + + .form-3 input[type="submit"] { + /* Width and position */ + width: 100%; + padding: 8px 5px; + + /* Styles */ + border: 1px solid #0273dd; /* Fallback */ + border: 1px solid rgba(0, 0, 0, 0.4); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), + inset 0 10px 10px rgba(255, 255, 255, 0.1); + border-radius: 3px; + background: #38a6f0; + cursor: pointer; + + /* Font styles */ + font-family: "Ubuntu", "Lato", sans-serif; + color: white; + font-weight: 700; + font-size: 15px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.8); + } + + .form-3 input[type="submit"]:hover { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6); + } + + .form-3 input[type="submit"]:active { + background: #287db5; + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.6); + border-color: #000; /* Fallback */ + border-color: rgba(0, 0, 0, 0.9); + } + + .no-boxshadow .form-3 input[type="submit"]:hover { + background: #2a92d8; + } + + .form-3:after { + /* Size and position */ + content: ""; + height: 1px; + width: 33%; + position: absolute; + left: 20%; + top: 0; + + background: -webkit-gradient( + linear, + 0 0, + 100% 0, + from(transparent), + color-stop(0.25, #444), + color-stop(0.5, #b6b6b8), + color-stop(0.75, #444), + to(transparent) + ); + background: -webkit-linear-gradient( + left, + transparent, + #444, + #b6b6b8, + #444, + transparent + ); + background: linear-gradient( + left, + transparent, + #444, + #b6b6b8, + #444, + transparent + ); + } + + .form-3:before { + /* Size and position */ + content: ""; + width: 8px; + height: 5px; + position: absolute; + left: 34%; + top: -7px; + + /* Styles */ + border-radius: 50%; + box-shadow: 0 0 6px 4px #fff; + } + + .form-3 p:nth-child(1):before { + /* Size and position */ + content: ""; + width: 250px; + height: 100px; + position: absolute; + top: 0; + left: 45px; + + /* Styles */ + -webkit-transform: rotate(75deg); + transform: rotate(75deg); + + background: -webkit-linear-gradient( + 50deg, + rgba(255, 255, 255, 0.15), + rgba(0, 0, 0, 0) + ); + background: linear-gradient( + 50deg, + rgba(255, 255, 255, 0.15), + rgba(0, 0, 0, 0) + ); + pointer-events: none; + } + + .no-pointerevents .form-3 p:nth-child(1):before { + display: none; + } +`; + +const LoginPage = () => ( +
+ + + + Sign In + Sign Up + + + + + + + + + + + + + + + +
+); + +document.getElementById('submitButton').eventListener("submit",()=>{ + axios.post("/api/login",{ + username:document.getElementById('username').value , + password:document.getElementById('password').value + }).then(response => { + }); +}) +}) + +export default LoginPage; diff --git a/src/js/PostRendering.jsx b/src/js/PostRendering.jsx index df35524..3965b4c 100644 --- a/src/js/PostRendering.jsx +++ b/src/js/PostRendering.jsx @@ -35,8 +35,7 @@ class BuildPosts extends React.Component { render() { if (this.state.posts) { return ( - { - (this.state.posts.map(post => { + {(this.state.posts.map(post => { if (this.props.page == post.buyerseller) { return ; } diff --git a/src/js/PostTemplate.jsx b/src/js/PostTemplate.jsx index 3a45e84..ae94634 100644 --- a/src/js/PostTemplate.jsx +++ b/src/js/PostTemplate.jsx @@ -22,16 +22,16 @@ const p = { const posts = props => (
-

{props.post.user_name}

+

{props.post.username}

-

{props.post.preferedPaymentMethod}

+

{props.post.prefferedpayment}

{props.post.country}

{props.post.city}
-

{props.post.coin}

{props.post.amount} - QTY
+

{props.post.coin}

{props.post.qty} - QTY
diff --git a/src/js/Signup.jsx b/src/js/Signup.jsx new file mode 100644 index 0000000..09ea5bf --- /dev/null +++ b/src/js/Signup.jsx @@ -0,0 +1,276 @@ +import React from "react"; +import styled from "styled-components"; +import { Link } from "react-router-dom"; + + +const LandingNavbar = styled.div` + a { + float: right; + margin: 5px; + font-weight: bolder; + text-decoration: none; + color: #fff; + } + font-family: Roboto; +`; + +const SignupDiv = styled.div` + /* Demo 3 */ + + .form-3 { + font-family: "Ubuntu", "Lato", sans-serif; + font-weight: 400; + /* Size and position */ + width: 300px; + position: relative; + margin: 60px auto 30px; + padding: 10px; + overflow: hidden; + + /* Styles */ + background: #111; + border-radius: 0.4em; + border: 1px solid #191919; + box-shadow: inset 0 0 2px 1px rgba(255, 255, 255, 0.08), + 0 16px 10px -8px rgba(0, 0, 0, 0.6); + } + + .form-3 label { + /* Size and position */ + width: 50%; + float: left; + padding-top: 9px; + + /* Styles */ + color: #ddd; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 1px; + text-shadow: 0 1px 0 #000; + text-indent: 10px; + font-weight: 700; + cursor: pointer; + } + + .form-3 input[type="text"], + .form-3 input[type="password"], + .form-3 input[type="country"], + .form-3 input[type="city"], + .form-3 input[type="email"] { + /* Size and position */ + width: 50%; + float: left; + padding: 8px 5px; + margin-bottom: 10px; + font-size: 12px; + + /* Styles */ + background: #1f2124; /* Fallback */ + background: -moz-linear-gradient(#1f2124, #27292c); + background: -ms-linear-gradient(#1f2124, #27292c); + background: -o-linear-gradient(#1f2124, #27292c); + background: -webkit-gradient( + linear, + 0 0, + 0 100%, + from(#1f2124), + to(#27292c) + ); + background: -webkit-linear-gradient(#1f2124, #27292c); + background: linear-gradient(#1f2124, #27292c); + border: 1px solid #000; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1); + border-radius: 3px; + + /* Font styles */ + font-family: "Ubuntu", "Lato", sans-serif; + color: #fff; + } + + .form-3 input[type="text"]:hover, + .form-3 input[type="password"]:hover, + .form-3 input[type="email"]:hover, + .form-3 input[type="country"]:hover, + .form-3 input[type="city"]:hover, + .form-3 label:hover ~ input[type="text"], + .form-3 label:hover ~ input[type="password"], .form-3 label:hover ~ input[type="email"] { + background: #27292c; + } + + .form-3 input[type="text"]:focus, + .form-3 input[type="password"]:focus, + .form-3 input[type="country"]:focus, + .form-3 input[type="city"]:focus, + .form-3 input[type="email"]:focus { + box-shadow: inset 0 0 2px #000; + background: #494d54; + border-color: #51cbee; + outline: none; /* Remove Chrome outline */ + } + + + .form-3 p:nth-child(3), + .form-3 p:nth-child(4) { + float: left; + width: 50%; + } + + .form-3 input[type="checkbox"] { + margin-left: 10px; + vertical-align: middle; + } + + .form-3 input[type="submit"] { + /* Width and position */ + width: 100%; + padding: 8px 5px; + + /* Styles */ + border: 1px solid #0273dd; /* Fallback */ + border: 1px solid rgba(0, 0, 0, 0.4); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), + inset 0 10px 10px rgba(255, 255, 255, 0.1); + border-radius: 3px; + background: #38a6f0; + cursor: pointer; + + /* Font styles */ + font-family: "Ubuntu", "Lato", sans-serif; + color: white; + font-weight: 700; + font-size: 15px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.8); + } + + .form-3 input[type="submit"]:hover { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6); + } + + .form-3 input[type="submit"]:active { + background: #287db5; + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.6); + border-color: #000; /* Fallback */ + border-color: rgba(0, 0, 0, 0.9); + } + + .no-boxshadow .form-3 input[type="submit"]:hover { + background: #2a92d8; + } + + .form-3:after { + /* Size and position */ + content: ""; + height: 1px; + width: 33%; + position: absolute; + left: 20%; + top: 0; + + background: -webkit-gradient( + linear, + 0 0, + 100% 0, + from(transparent), + color-stop(0.25, #444), + color-stop(0.5, #b6b6b8), + color-stop(0.75, #444), + to(transparent) + ); + background: -webkit-linear-gradient( + left, + transparent, + #444, + #b6b6b8, + #444, + transparent + ); + background: linear-gradient( + left, + transparent, + #444, + #b6b6b8, + #444, + transparent + ); + } + + .form-3:before { + /* Size and position */ + content: ""; + width: 8px; + height: 5px; + position: absolute; + left: 34%; + top: -7px; + + /* Styles */ + border-radius: 50%; + box-shadow: 0 0 6px 4px #fff; + } + + .form-3 p:nth-child(1):before { + /* Size and position */ + content: ""; + width: 250px; + height: 100px; + position: absolute; + top: 0; + left: 45px; + + /* Styles */ + -webkit-transform: rotate(75deg); + transform: rotate(75deg); + + background: -webkit-linear-gradient( + 50deg, + rgba(255, 255, 255, 0.15), + rgba(0, 0, 0, 0) + ); + background: linear-gradient( + 50deg, + rgba(255, 255, 255, 0.15), + rgba(0, 0, 0, 0) + ); + pointer-events: none; + } + + .no-pointerevents .form-3 p:nth-child(1):before { + display: none; + } +`; + +const SignupPage = () => ( +
+ + Sign In + Sign Up + + + +
+ + + + + + + + + + + + + + + + + + + + +
​ +
+
+); + +export default SignupPage; From b087124867d146e5d5756089c2470ca26e3213ec Mon Sep 17 00:00:00 2001 From: hasansaad1 Date: Wed, 24 Jan 2018 10:39:44 +0200 Subject: [PATCH 03/10] set up the authentication and the userPage #4 , set up the authintecation and the userPage. --- database/queries/userPosts.js | 14 ++++ database/queries/validateUser.js | 3 +- package-lock.json | 104 +++++++++++++++++++++++++++++ package.json | 2 + src/backEnd/authMiddleware.js | 28 ++++++++ src/backEnd/router.js | 70 +++++++++++-------- src/backEnd/server.js | 18 ++--- src/js/App.jsx | 4 ++ src/js/Landing.jsx | 2 +- src/js/Login.jsx | 111 +++++++++++++++++++------------ src/js/Navbar.jsx | 83 +++++++++++++---------- src/js/Signup.jsx | 12 ++-- src/js/UserPage.js | 41 ++++++++++++ 13 files changed, 370 insertions(+), 122 deletions(-) create mode 100644 database/queries/userPosts.js create mode 100644 src/backEnd/authMiddleware.js create mode 100644 src/js/UserPage.js diff --git a/database/queries/userPosts.js b/database/queries/userPosts.js new file mode 100644 index 0000000..ef30e50 --- /dev/null +++ b/database/queries/userPosts.js @@ -0,0 +1,14 @@ +const connect = require('../db_connection'); + +const userPosts = (username, cb) => { + connect.query('SELECT * FROM posts INNER JOIN users ON (posts.user_id = users.user_id) WHERE username = $1', [username], (err, posts) => { + if (err) { + cb(err); + } else { + // console.log('post.rows:', post.rows); + cb(null, posts.rows); + } + }); +} + +module.exports = userPosts; diff --git a/database/queries/validateUser.js b/database/queries/validateUser.js index 08e0953..6cf2aa9 100644 --- a/database/queries/validateUser.js +++ b/database/queries/validateUser.js @@ -2,11 +2,12 @@ const connect = require("../db_connection"); const bcrypt = require("bcrypt"); const validateUser = (user,cb)=>{ + connect.query(`SELECT * FROM users WHERE username = $1`,[user.username],(err,res)=>{ if(err){ return cb(err) } - if(!res){ + if(res.rows.length==0){ return cb(null,0); } diff --git a/package-lock.json b/package-lock.json index 75f9c93..4e9985c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1226,6 +1226,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1451,6 +1456,11 @@ "ieee754": "1.1.8" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", @@ -2273,6 +2283,15 @@ "jsbn": "0.1.1" } }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "requires": { + "base64url": "2.0.0", + "safe-buffer": "5.1.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2342,6 +2361,11 @@ "tapable": "0.2.8" } }, + "env": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/env/-/env-0.0.2.tgz", + "integrity": "sha1-UMGfMHsSmkWEW2tobfWzndQNHPA=" + }, "env2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env2/-/env2-2.2.0.tgz", @@ -4446,6 +4470,30 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonwebtoken": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.1.tgz", + "integrity": "sha512-+ijVOtfLMlCII8LJkvabaKX3+8tGrGjiCTfzoed2D1b/ebKTO1hIYBQUJHbd9dJ9Fa4kH+dhYEd1qDwyzDLUUw==", + "requires": { + "jws": "3.1.4", + "lodash.includes": "4.3.0", + "lodash.isboolean": "3.0.3", + "lodash.isinteger": "4.0.4", + "lodash.isnumber": "3.0.3", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.once": "4.1.1", + "ms": "2.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4466,6 +4514,27 @@ "array-includes": "3.0.3" } }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "5.1.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "requires": { + "base64url": "2.0.0", + "jwa": "1.1.5", + "safe-buffer": "5.1.1" + } + }, "killable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", @@ -4614,6 +4683,41 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "log-symbols": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", diff --git a/package.json b/package.json index e72ed39..270aa6c 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,13 @@ "axios": "^0.17.1", "bcrypt": "^1.0.3", "body-parser": "^1.18.2", + "env": "0.0.2", "env2": "^2.2.0", "eslint-loader": "^1.9.0", "express": "^4.16.2", "express-session": "^1.15.6", "express-validator": "^4.3.0", + "jsonwebtoken": "^8.1.1", "nodemon": "^1.14.11", "passport": "^0.4.0", "passport-local": "^1.0.0", diff --git a/src/backEnd/authMiddleware.js b/src/backEnd/authMiddleware.js new file mode 100644 index 0000000..216e2d5 --- /dev/null +++ b/src/backEnd/authMiddleware.js @@ -0,0 +1,28 @@ +const jwt = require('jsonwebtoken'); +const exclude = ["/", "/login", "/signup"]; +require('env2')('config.env'); + +const authenticate = (req, res, next) => { + if (req.headers.cookie) { + jwt.verify(req.headers.cookie.split("=")[1], process.env.SECRET, (err, decoded) => { + if (err) { + res.redirect("/cookieError"); + } else { + if (exclude.includes(req.url)) { + res.redirect("/learn"); + } else { + next(); + } + } + }) + } else { + if (exclude.includes(req.url)) { + next(); + } else { + res.redirect("/login"); + } + } + +} + +module.exports = authenticate; diff --git a/src/backEnd/router.js b/src/backEnd/router.js index dfb4af3..8ba35cb 100644 --- a/src/backEnd/router.js +++ b/src/backEnd/router.js @@ -5,41 +5,59 @@ const {addUser} = require('../../database/queries/addUsers'); const connect = require('../../database/db_connection'); const bcrypt = require("bcrypt"); const validateUser = require("../../database/queries/validateUser"); +const jwt = require('jsonwebtoken'); +require('env2')('config.env'); +router.get("/posts", fetchPosts); - router.get("/posts",fetchPosts); - - router.post("/newUser", (req, res)=>{ - const {username, password, email, country, city} = req.body; - addUser(username, password, email, country, city, (err, result) => { - if(err){ - console.log("error on routing adduser", err); - res.redirect('/signup'); - }else{ - res.redirect('/login'); - } - }); - }) +router.post("/newUser", (req, res) => { + const {username, password, email, country, city} = req.body; + addUser(username, password, email, country, city, (err, result) => { + if (err) { + console.log("error on routing adduser", err); + res.redirect('/signup'); + } else { + res.redirect('/login'); + } + }); +}) -router.post("/login",(req,res)=>{ - validateUser(req.body,(err,res)=>{ - if(err){ - res.writeHead(500, { "Content-Type": "text/html" }); +router.post("/login", (req, res) => { + validateUser(req.body, (err, result) => { + if (err) { + res.writeHead(500, {"Content-Type": "text/html"}); res.end(err); - }else{ - if(res==0){ - res.writeHead(200, { "Content-Type": "text/html" }); + } else { + if (!result) { + res.writeHead(200, {"Content-Type": "text/html"}); res.end("Invalid username or password"); - }else{ - res.writeHead(302, { - Location: "/learn", - "Content-Type": "application/json" - }); + } else { + var cookie = jwt.sign(JSON.stringify(result), process.env.SECRET); + + res.cookie("jwt", cookie); res.end(); } } }) }) - +router.get("/username", (req, res) => { + jwt.verify(req.headers.cookie.split("=")[1], process.env.SECRET, (err, decoded) => { + if (err) {} else { + res.send(decoded.username); + } + }) +}) +router.get("/cookieError", (req, res) => { + res.send("Clear your cookies!").; +}) +router.get("/userPosts", (req, res) => { + jwt.verify(req.headers.cookie.split("=")[1], process.env.SECRET, (err, decoded) => { + if (err) {} else { + userPosts(decoded.username, (err, res) => { + res.send(res); + }) + } + }) +}) module.exports = router; diff --git a/src/backEnd/server.js b/src/backEnd/server.js index 175153a..c857b84 100644 --- a/src/backEnd/server.js +++ b/src/backEnd/server.js @@ -1,25 +1,19 @@ const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); - +const authenticate = require('./authMiddleware'); const router = require('./router'); const app = express(); console.log(path.join(__dirname, "../..")); -console.log(express.static(path.resolve(__dirname, "../..","public"))); -app.use(express.static(path.resolve(__dirname, "../..","public"))) +console.log(express.static(path.resolve(__dirname, "../..", "public"))); +app.use(express.static(path.resolve(__dirname, "../..", "public"))) app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ - extended: true -})); +app.use(bodyParser.urlencoded({extended: true})); app.use("/api", router); -app.get("/*", (req, res) => { - console.log(req.url); - res.sendFile(path.resolve(__dirname, '../..', 'index.html')); +app.get("/*", authenticate, (req, res) => { + res.sendFile(path.resolve(__dirname, '../..', 'index.html')); }); - - - app.listen(8080, () => console.log('on 8080')); diff --git a/src/js/App.jsx b/src/js/App.jsx index 12a16cb..d042666 100644 --- a/src/js/App.jsx +++ b/src/js/App.jsx @@ -7,6 +7,8 @@ import Buy from "./Buy"; import Sell from "./Sell"; import Login from "./Login"; import Signup from "./Signup"; +import UserPage from "./UserPage"; + const App = () => (
@@ -19,6 +21,8 @@ const App = () => ( + +
diff --git a/src/js/Landing.jsx b/src/js/Landing.jsx index 8bddbe7..92a8f58 100644 --- a/src/js/Landing.jsx +++ b/src/js/Landing.jsx @@ -83,7 +83,7 @@ const Landing = () => (

GET INTO CRYPTOCURRENCIES
TODAY

- + diff --git a/src/js/Login.jsx b/src/js/Login.jsx index 7a8b281..1923b92 100644 --- a/src/js/Login.jsx +++ b/src/js/Login.jsx @@ -1,9 +1,10 @@ import React from "react"; import styled from "styled-components"; -import { Link } from "react-router-dom"; +import {Link, Redirect} from "react-router-dom"; +import ReactDOM from 'react-dom'; +import axios from 'axios'; - -const LandingNavbar = styled.div` +const LandingNavbar = styled.div ` a { float: right; margin: 5px; @@ -14,7 +15,7 @@ const LandingNavbar = styled.div` font-family: Roboto; `; -const LoginDiv = styled.div` +const LoginDiv = styled.div ` /* Demo 3 */ .form-3 { @@ -63,9 +64,6 @@ const LoginDiv = styled.div` /* Styles */ background: #1f2124; /* Fallback */ - background: -moz-linear-gradient(#1f2124, #27292c); - background: -ms-linear-gradient(#1f2124, #27292c); - background: -o-linear-gradient(#1f2124, #27292c); background: -webkit-gradient( linear, 0 0, @@ -240,43 +238,72 @@ const LoginDiv = styled.div` } `; -const LoginPage = () => ( -
- - - - Sign In - Sign Up - - - - - - - - - - - +class LoginPage extends React.Component { + constructor(props) { + super(props); + this.state = { + invalidInput: null, + loggedin: false, + username: null, + password: null + } - + this.handleUser = this.handleUser.bind(this) + this.handlePassword = this.handlePassword.bind(this) + this.handleSubmit = this.handleSubmit.bind(this) - -
-); + } + + handleSubmit(e) { + e.preventDefault() + const {username} = this.state; + const {password} = this.state; + axios.post("/api/login", {username, password}).then(response => { + if (response.status == 500) { + this.setState({invalidInput: "oooops Server error"}); + } else if (response.status == 200) { + if (response.data == "") { + this.setState({loggedin: true}); + } else { + this.setState({invalidInput: response.data}); + } + } + }) + } + handleUser(e) { + this.setState({username: e.target.value}) + } + handlePassword(e) { + this.setState({password: e.target.value}) + } -document.getElementById('submitButton').eventListener("submit",()=>{ - axios.post("/api/login",{ - username:document.getElementById('username').value , - password:document.getElementById('password').value - }).then(response => { - }); -}) -}) + render() { + if (this.state.loggedin) { + return + } else { + return (
+ + +
+ + + + + + + + + + +
+
+
); + } + } +} export default LoginPage; diff --git a/src/js/Navbar.jsx b/src/js/Navbar.jsx index d392df5..802ca8b 100644 --- a/src/js/Navbar.jsx +++ b/src/js/Navbar.jsx @@ -1,8 +1,9 @@ import React from 'react'; import styled from 'styled-components'; -import { Link } from 'react-router-dom'; +import {Link} from 'react-router-dom'; +import axios from 'axios'; -const NavbarDesktopUser = styled.div` +const NavbarDesktopUser = styled.div ` position: fixed; list-style-type: none; width: -webkit-fill-available; @@ -34,7 +35,7 @@ const NavbarDesktopUser = styled.div` } `; -const NavbarDesktopLinks = styled.ul` +const NavbarDesktopLinks = styled.ul ` list-style-type: none; margin: 0; margin-top: 25px; @@ -70,7 +71,7 @@ const NavbarDesktopLinks = styled.ul` } `; -const NavbarMobileNavbar = styled.ul` +const NavbarMobileNavbar = styled.ul ` position: fixed; list-style-type: none; margin: 0; @@ -95,32 +96,46 @@ const NavbarMobileNavbar = styled.ul` } `; -const Navbar = () => ( -
-
-
- -
  • chat
  • -
  • wallet
  • -
  • user
  • -
    -
    -
    - -

    CryptoCoin

    -
  • - SELL -
  • -
  • - BUY -
  • -
  • - MARKETS -
  • -
  • - LEARN -
  • -
    +class Navbar extends React.Component { + constructor(props){ + super(props); + this.state = { + username:null + } + } + componentDidMount() { + axios.get("/api/username").then(response => { + this.setState({username : response}); + }).catch(err => { + console.log("err => ", err); + }) + } + render() { + return (
    +
    +
    + +
  • chat
  • +
  • wallet
  • +
  • user
  • +
    +
    +
    + +

    CryptoCoin

    +
  • + SELL +
  • +
  • + BUY +
  • +
  • + MARKETS +
  • +
  • + LEARN +
  • +

    CryptoCoin

  • @@ -136,9 +151,9 @@ const Navbar = () => ( LEARN
  • +
    -
    -
    -); - +
    ); + } +} export default Navbar; diff --git a/src/js/Signup.jsx b/src/js/Signup.jsx index 09ea5bf..7ab68f4 100644 --- a/src/js/Signup.jsx +++ b/src/js/Signup.jsx @@ -249,22 +249,22 @@ const SignupPage = () => (
    - + - + - + - + - + - + diff --git a/src/js/UserPage.js b/src/js/UserPage.js new file mode 100644 index 0000000..76982f6 --- /dev/null +++ b/src/js/UserPage.js @@ -0,0 +1,41 @@ +import React from 'react'; +import styled from "styled-components"; +import {Link, Redirect} from "react-router-dom"; +import Navbar from './Navbar'; +import axios from 'axios'; +import PostTemplate from './PostTemplate'; + +class UserPage extends React.Component { + constructor(props) { + super(props); + this.state = { + username: null, + img: null, + posts: null + } + } + componentDidMount() { + axios.get('/api/userPosts').then(response => { + this.setState({posts: response}) + }) + } + render() { + return (
    + +
    +
    + +

    {this.state.username}

    +
    +
    { + this.state.posts + ? (this.state.posts.map(post => { + return ; + })):"" + }
    +
    +
    ) + } +} + +export default UserPage; From 06bf3d0b8b5b1f07975a0a0f7ca3b7d258a1df74 Mon Sep 17 00:00:00 2001 From: ionush Date: Wed, 24 Jan 2018 12:04:26 +0200 Subject: [PATCH 04/10] working version of public chat relates #6 --- .eslintignore | 1 + chat-program | 1 + database/db_build.js | 5 +- database/db_connection.js | 10 +- database/queries/fetchPosts.js | 17 +- package-lock.json | 315 +++++++++++++++++++- package.json | 8 +- src/backEnd/Factories.js | 34 +++ src/backEnd/SocketManager.js | 91 ++++++ src/backEnd/router.js | 5 +- src/backEnd/server.js | 32 ++- src/js/App.jsx | 3 - src/js/Buy.jsx | 32 +-- src/js/ChatContainer.jsx | 144 ++++++++++ src/js/ChatHeading.jsx | 16 ++ src/js/Landing.jsx | 2 - src/js/Layout.jsx | 61 ++++ src/js/LoginForm.jsx | 67 +++++ src/js/MessageInput.jsx | 89 ++++++ src/js/Messages.jsx | 49 ++++ src/js/PublicAddMessage.jsx | 36 --- src/js/PublicChat.jsx | 508 ++++++++++++++++++++++++++++++--- src/js/PublicMessage.jsx | 15 - src/js/PublicMessagesList.jsx | 31 -- src/js/PublicSidebar.jsx | 25 -- src/js/SideBar.jsx | 80 ++++++ src/js/actionCreators.js | 36 --- src/js/reducers/reducers.js | 1 - webpack.config.js | 12 +- 29 files changed, 1487 insertions(+), 239 deletions(-) create mode 160000 chat-program create mode 100644 src/backEnd/Factories.js create mode 100644 src/backEnd/SocketManager.js create mode 100644 src/js/ChatContainer.jsx create mode 100644 src/js/ChatHeading.jsx create mode 100644 src/js/Layout.jsx create mode 100644 src/js/LoginForm.jsx create mode 100644 src/js/MessageInput.jsx create mode 100644 src/js/Messages.jsx delete mode 100644 src/js/PublicAddMessage.jsx delete mode 100644 src/js/PublicMessage.jsx delete mode 100644 src/js/PublicMessagesList.jsx delete mode 100644 src/js/PublicSidebar.jsx create mode 100644 src/js/SideBar.jsx diff --git a/.eslintignore b/.eslintignore index fa9c5eb..86042d8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ public/ node_modules/ +chat-program/ diff --git a/chat-program b/chat-program new file mode 160000 index 0000000..032e0c4 --- /dev/null +++ b/chat-program @@ -0,0 +1 @@ +Subproject commit 032e0c4c6e4f604a40a7be307d1041b546582261 diff --git a/database/db_build.js b/database/db_build.js index 0af5565..a533b50 100644 --- a/database/db_build.js +++ b/database/db_build.js @@ -1,10 +1,11 @@ const fs = require('fs'); const connect = require('./db_connection'); + const buildScript = fs.readFileSync(`${__dirname}/db_build.sql`, `utf8`); -connect.query(buildScript, (err, res) => { +connect.query(buildScript, err => { if (err) { throw err; } connect.end(); -}) +}); diff --git a/database/db_connection.js b/database/db_connection.js index 9f1db62..40e5b49 100644 --- a/database/db_connection.js +++ b/database/db_connection.js @@ -1,11 +1,7 @@ -const {Pool} = require('pg'); -const url = require('url'); +const { Pool } = require('pg'); require('env2')('config.env'); if (!process.env.DATABASE_URL) - throw new Error("enviroment var for database must be set"); + throw new Error('enviroment var for database must be set'); -const params = url.parse(process.env.DATABASE_URL); -const [username, password] = params.auth.split(':'); - -module.exports = new Pool({connectionString: process.env.DATABASE_URL}); +module.exports = new Pool({ connectionString: process.env.DATABASE_URL }); diff --git a/database/queries/fetchPosts.js b/database/queries/fetchPosts.js index 8e15ae6..0d53aa2 100644 --- a/database/queries/fetchPosts.js +++ b/database/queries/fetchPosts.js @@ -1,13 +1,16 @@ const connect = require('../db_connection'); const posts = (req, res) => { - connect.query('SELECT * FROM posts INNER JOIN users ON (posts.user_id = users.user_id)', (err, posts) => { - if (err) { - res.status(500).end("Server Error, Please Try In Other Time"); - } else { - res.send(posts.rows); + connect.query( + `SELECT * FROM posts INNER JOIN users ON (posts.user_id = users.user_id)`, + (err, posts) => { + if (err) { + res.status(500).end('Server Error, Please Try In Other Time'); + } else { + res.send(posts.rows); + } } - }); -} + ); +}; module.exports = posts; diff --git a/package-lock.json b/package-lock.json index 254de37..ef23a0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,11 @@ } } }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -227,6 +232,11 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -281,6 +291,11 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "atob": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", @@ -1229,6 +1244,11 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1249,17 +1269,35 @@ "pascalcase": "0.1.1" } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1270,6 +1308,11 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -1534,8 +1577,7 @@ "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" }, "callsite-record": { "version": "3.2.2", @@ -1974,11 +2016,20 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, "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=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compressible": { "version": "2.0.12", @@ -2689,6 +2740,79 @@ "once": "1.4.0" } }, + "engine.io": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz", + "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=", + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.6.9", + "engine.io-parser": "2.1.2", + "uws": "0.14.5", + "ws": "3.3.3" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz", + "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.6.9", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.2" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -4732,6 +4856,26 @@ "ansi-regex": "2.1.1" } }, + "has-binary2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", + "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -6738,6 +6882,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -7135,6 +7284,22 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -8268,6 +8433,19 @@ } } }, + "react-icon-base": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-icon-base/-/react-icon-base-2.1.0.tgz", + "integrity": "sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50=" + }, + "react-icons": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-2.2.7.tgz", + "integrity": "sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg==", + "requires": { + "react-icon-base": "2.1.0" + } + }, "react-proxy": { "version": "3.0.0-alpha.1", "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz", @@ -9094,6 +9272,89 @@ } } }, + "socket.io": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "requires": { + "debug": "2.6.9", + "engine.io": "3.1.4", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.0.4", + "socket.io-parser": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.6.9", + "engine.io-client": "3.1.4", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.1.2", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", + "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "requires": { + "component-emitter": "1.2.1", + "debug": "2.6.9", + "has-binary2": "1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", @@ -9101,7 +9362,7 @@ "dev": true, "requires": { "faye-websocket": "0.10.0", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "sockjs-client": { @@ -9725,6 +9986,11 @@ "os-tmpdir": "1.0.2" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9985,6 +10251,11 @@ } } }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "undefsafe": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.1.tgz", @@ -10312,9 +10583,15 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "uws": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", + "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", + "optional": true }, "validate-npm-package-license": { "version": "3.0.1", @@ -10882,7 +11159,7 @@ "chalk": "2.3.0", "log-symbols": "2.1.0", "loglevelnext": "1.0.3", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "webpack-sources": { @@ -11024,12 +11301,27 @@ "signal-exit": "3.0.2" } }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -11104,6 +11396,11 @@ "requires": { "camelcase": "4.1.0" } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/package.json b/package.json index c042176..b8eac0d 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,26 @@ "main": "index.js", "dependencies": { "axios": "^0.17.1", + "babel-preset-stage-2": "^6.24.1", "body-parser": "^1.18.2", "env2": "^2.2.0", "eslint-loader": "^1.9.0", "express": "^4.16.2", - "pg": "^7.4.1", - "babel-preset-stage-2": "^6.24.1", "moment": "^2.20.1", + "pg": "^7.4.1", "prop-types": "^15.6.0", "react": "^16.2.0", "react-dom": "^16.2.0", + "react-icons": "^2.2.7", "react-redux": "^5.0.6", "react-router-dom": "^4.2.2", "redux": "^3.7.2", "redux-promise-middleware": "^5.0.0", "redux-thunk": "^2.2.0", + "socket.io": "^2.0.4", + "socket.io-client": "^2.0.4", "styled-components": "^2.4.0", + "uuid": "^3.2.1", "webpack": "^3.10.0", "webpack-dev-middleware": "^2.0.4", "webpack-hot-middleware": "^2.21.0" diff --git a/src/backEnd/Factories.js b/src/backEnd/Factories.js new file mode 100644 index 0000000..3b9763f --- /dev/null +++ b/src/backEnd/Factories.js @@ -0,0 +1,34 @@ +const uuidv4 = require('uuid/v4'); + +const getTime = date => + `${date.getHours()}:${('0' + date.getMinutes()).slice(-2)}`; + +const createUser = ({ name = '' } = {}) => ({ + id: uuidv4(), + name +}); + +const createMessage = ({ message = '', sender = '' } = {}) => ({ + id: uuidv4(), + time: getTime(new Date(Date.now())), + message, + sender +}); + +const createChat = ({ + messages = [], + name = 'CryptoCoin', + users = [] +} = {}) => ({ + id: uuidv4(), + name, + messages, + users, + typingUsers: [] +}); + +module.exports = { + createMessage, + createChat, + createUser +}; diff --git a/src/backEnd/SocketManager.js b/src/backEnd/SocketManager.js new file mode 100644 index 0000000..0c719ec --- /dev/null +++ b/src/backEnd/SocketManager.js @@ -0,0 +1,91 @@ +const { io } = require('./server.js'); +// console.log('poopoo', io); + +const { createUser, createMessage, createChat } = require('./Factories'); + +let connectedUsers = {}; + +const communityChat = createChat(); +// object of messages, names, users +function sendTypingToChat(user, socket) { + return (chatId, isTyping) => { + io.emit(`TYPING-${chatId}`, { user, isTyping }); + }; +} + +function sendMessageToChat(sender, socket) { + return (chatId, message) => { + console.log(`MESSAGE_RECIEVED-${chatId}`); + io.emit(`MESSAGE_RECIEVED-${chatId}`, createMessage({ message, sender })); + }; +} + +function addUser(userList, user) { + const newList = Object.assign({}, userList); + newList[user.name] = user; + return newList; +} + +function removeUser(userList, username) { + const newList = Object.assign({}, userList); + delete newList[username]; + return newList; +} + +function isUser(userList, username) { + return username in userList; +} + +module.exports = function(socket) { + console.log('Socket Id:' + socket.id); + + let sendMessageToChatFromUser; + + let sendTypingFromUser; + + socket.on('VERIFY_USER', (nickname, callback) => { + if (isUser(connectedUsers, nickname)) { + callback({ isUser: true, user: null }); + } else { + callback({ isUser: false, user: createUser({ name: nickname }) }); + } + }); + + socket.on('USER_CONNECTED', user => { + connectedUsers = addUser(connectedUsers, user); + socket.user = user; + + sendMessageToChatFromUser = sendMessageToChat(user.name, socket); + sendTypingFromUser = sendTypingToChat(user.name, socket); + + io.emit('USER_CONNECTED', connectedUsers); + console.log(connectedUsers); + }); + + socket.on('disconnect', () => { + if ('user' in socket) { + connectedUsers = removeUser(connectedUsers, socket.user.name); + + io.emit('USER_DISCONNECTED', connectedUsers); + console.log('Disconnect', connectedUsers); + } + }); + + socket.on('LOGOUT', () => { + connectedUsers = removeUser(connectedUsers, socket.user.name); + io.emit('USER_DISCONNECTED', connectedUsers); + console.log('Disconnect', connectedUsers); + }); + + socket.on('COMMUNITY_CHAT', callback => { + callback(communityChat); + }); + + socket.on('MESSAGE_SENT', ({ chatId, message, socket }) => { + sendMessageToChatFromUser(chatId, message, socket); + }); + + socket.on('TYPING', ({ chatId, isTyping }) => { + sendTypingFromUser(chatId, isTyping); + }); +}; diff --git a/src/backEnd/router.js b/src/backEnd/router.js index d15684e..54fd0e3 100644 --- a/src/backEnd/router.js +++ b/src/backEnd/router.js @@ -1,7 +1,6 @@ const router = require('express').Router(); const path = require('path'); -const fetchPosts = require('../../database/queries/fetchPosts') - router.get("/posts",fetchPosts); - +const fetchPosts = require('../../database/queries/fetchPosts'); +router.get('/posts', fetchPosts); module.exports = router; diff --git a/src/backEnd/server.js b/src/backEnd/server.js index 1a6dbfc..a0ab2b8 100644 --- a/src/backEnd/server.js +++ b/src/backEnd/server.js @@ -2,9 +2,16 @@ const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); +const app = express(); +const server = require('http').Server(app); +// const io = require('socket.io')(server); +var io = (module.exports.io = require('socket.io')(server)); + +const SocketManager = require('./SocketManager'); const router = require('./router'); -const app = express(); +const PORT = process.env.PORT || 8080; + app.use(express.static(path.resolve(__dirname, '../..'))); app.use(bodyParser.json()); @@ -13,4 +20,25 @@ app.get('/*', (req, res) => { res.sendFile(path.resolve(__dirname, '../..', 'index.html')); }); -app.listen(8080, () => console.log('on 8080')); +io.on('connection', SocketManager); + +server.listen(PORT, () => console.log(`Connected to port ${PORT}`)); + +// module.exports = io; + +// const express = require('express'); +// const path = require('path'); +// const bodyParser = require('body-parser'); +// +// const router = require('./router'); +// +// const app = express(); +// app.use(express.static(path.resolve(__dirname, '../..'))); +// app.use(bodyParser.json()); +// +// app.use('/api', router); +// app.get('/*', (req, res) => { +// res.sendFile(path.resolve(__dirname, '../..', 'index.html')); +// }); +// +// app.listen(8080, () => console.log('on 8080')); diff --git a/src/js/App.jsx b/src/js/App.jsx index 1c3c118..ee1a6a0 100644 --- a/src/js/App.jsx +++ b/src/js/App.jsx @@ -8,9 +8,6 @@ import Markets from './Markets'; import Buy from './Buy'; import Sell from './Sell'; import PublicChat from './PublicChat'; -import { addUser } from './actionCreators'; - -store.dispatch(addUser('Me')); const App = () => ( diff --git a/src/js/Buy.jsx b/src/js/Buy.jsx index a21bae1..35bacee 100644 --- a/src/js/Buy.jsx +++ b/src/js/Buy.jsx @@ -1,26 +1,22 @@ -import React from "react"; -import Navbar from "./Navbar"; -import PostRendering from "./PostRendering"; -import styled from "styled-components"; +import React from 'react'; +import Navbar from './Navbar'; +import styled from 'styled-components'; +import PostRendering from './PostRendering'; - -const BuyHeader = styled.h2 ` +const BuyHeader = styled.h2` text-align: center; `; -const BuySubheader = styled.h3 ` +const BuySubheader = styled.h3` text-align: center; `; -const Buy = () => (
    - - Strength In Numbers - - Buy CryptoCoins from these sellers - - -
    ) - - - +const Buy = () => ( +
    + + Strength In Numbers + Buy CryptoCoins from these sellers + +
    +); export default Buy; diff --git a/src/js/ChatContainer.jsx b/src/js/ChatContainer.jsx new file mode 100644 index 0000000..99e8764 --- /dev/null +++ b/src/js/ChatContainer.jsx @@ -0,0 +1,144 @@ +import React, { Component } from 'react'; +import SideBar from './SideBar'; +import ChatHeading from './ChatHeading'; +import Messages from './Messages'; +import MessageInput from './MessageInput'; + +export default class ChatContainer extends Component { + constructor(props) { + super(props); + + this.state = { + chats: [], + activeChat: null + }; + this.resetChat = this.resetChat.bind(this); + this.setActiveChat = this.setActiveChat.bind(this); + this.updateTypingInChat = this.updateTypingInChat.bind(this); + this.addMessageToChat = this.addMessageToChat.bind(this); + this.sendMessage = this.sendMessage.bind(this); + this.sendTyping = this.sendTyping.bind(this); + } + + componentDidMount() { + const { socket } = this.props; + socket.emit('COMMUNITY_CHAT', this.resetChat); + } + setActiveChat(activeChat) { + this.setState({ activeChat }); + } + + resetChat(chat) { + return this.addChat(chat, true); + } + + addChat(chat, reset) { + console.log('addchatyo'); + const { socket } = this.props; + const { chats } = this.state; + + const newChats = reset ? [chat] : [...chats, chat]; + this.setState({ + chats: newChats, + activeChat: reset ? chat : this.state.activeChat + }); + + const messageEvent = `MESSAGE_RECIEVED-${chat.id}`; + const typingEvent = `TYPING-${chat.id}`; + + socket.on( + typingEvent, + this.updateTypingInChat(chat.id), + console.log('chatting') + ); + socket.on( + messageEvent, + this.addMessageToChat(chat.id), + console.log('peepee', messageEvent) + ); + } + + addMessageToChat(chatId) { + console.log('echo2'); + return message => { + const { chats } = this.state; + const newChats = chats.map(chat => { + if (chat.id === chatId) chat.messages.push(message); + return chat; + }); + + this.setState({ chats: newChats }); + }; + } + + updateTypingInChat(chatId) { + console.log('echo'); + return ({ isTyping, user }) => { + if (user !== this.props.user.name) { + const { chats } = this.state; + + const newChats = chats.map(chat => { + if (chat.id === chatId) { + if (isTyping && !chat.typingUsers.includes(user)) { + chat.typingUsers.push(user); + } else if (!isTyping && chat.typingUsers.includes(user)) { + chat.typingUsers = chat.typingUsers.filter(u => u !== user); + } + } + return chat; + }); + this.setState({ chats: newChats }); + } + }; + } + + sendMessage(chatId, message) { + const { socket } = this.props; + socket.emit('MESSAGE_SENT', { chatId, message }); + } + + sendTyping(chatId, isTyping) { + const { socket } = this.props; + socket.emit('TYPING', { chatId, isTyping }); + } + + render() { + const { user, logout } = this.props; + const { chats, activeChat } = this.state; + return ( +
    + +
    + {activeChat !== null ? ( +
    + + + { + this.sendMessage(activeChat.id, message); + }} + sendTyping={isTyping => { + this.sendTyping(activeChat.id, isTyping); + }} + /> +
    + ) : ( +
    +

    Choose a chat!

    +
    + )} +
    +
    + ); + } +} diff --git a/src/js/ChatHeading.jsx b/src/js/ChatHeading.jsx new file mode 100644 index 0000000..19b112b --- /dev/null +++ b/src/js/ChatHeading.jsx @@ -0,0 +1,16 @@ +import React from 'react'; + +export default function({ name, numberOfUsers }) { + return ( +
    +
    +
    {name}
    +
    +
    + {numberOfUsers} +
    +
    +
    +
    + ); +} diff --git a/src/js/Landing.jsx b/src/js/Landing.jsx index 83d0ead..7f50ff2 100644 --- a/src/js/Landing.jsx +++ b/src/js/Landing.jsx @@ -3,7 +3,6 @@ import { Link } from 'react-router-dom'; import styled from 'styled-components'; import MarketData from './MarketData'; - const Wrapper = styled.div` background-color: #2f9999; color: white; @@ -88,7 +87,6 @@ const Landing = () => ( -

    SAFELY MAKE YOUR FIRST TRADE

    diff --git a/src/js/Layout.jsx b/src/js/Layout.jsx new file mode 100644 index 0000000..112ab7e --- /dev/null +++ b/src/js/Layout.jsx @@ -0,0 +1,61 @@ +import React, { Component } from 'react'; +import io from 'socket.io-client'; +import LoginForm from './LoginForm'; +import ChatContainer from './ChatContainer'; + +const socketUrl = 'http://localhost:8080'; +class Layout extends Component { + constructor(props) { + super(props); + + this.state = { + socket: null, + user: null + }; + + this.setUser = this.setUser.bind(this); + this.logout = this.logout.bind(this); + this.initSocket = this.initSocket.bind(this); + } + + componentWillMount() { + this.initSocket(); + } + setUser(user) { + const { socket } = this.state; + socket.emit('USER_CONNECTED', user); + this.setState({ user }); + } + + initSocket() { + const socket = io(socketUrl); + + socket.on('connect', () => { + console.log('Connected'); + }); + + this.setState({ socket }); + } + + logout() { + const { socket } = this.state; + socket.emit('LOGOUT'); + this.setState({ user: null }); + } + + render() { + const { title } = this.props; + const { socket, user } = this.state; + return ( +
    + {!user ? ( + + ) : ( + + )} +
    + ); + } +} + +export default Layout; diff --git a/src/js/LoginForm.jsx b/src/js/LoginForm.jsx new file mode 100644 index 0000000..eb3d3e5 --- /dev/null +++ b/src/js/LoginForm.jsx @@ -0,0 +1,67 @@ +import React, { Component } from 'react'; + +class LoginForm extends Component { + constructor(props) { + super(props); + + this.state = { + nickname: '', + error: '' + }; + this.setUser = this.setUser.bind(this); + } + + setUser({ user, isUser }) { + if (isUser) { + this.setError('User name taken'); + } else { + this.props.setUser(user); + this.setError(''); + } + } + + setError(error) { + this.setState({ error }); + } + + handleSubmit(e) { + e.preventDefault(); + + const { socket } = this.props; + const { nickname } = this.state; + socket.emit('VERIFY_USER', nickname, this.setUser); + } + + handleChange(e) { + this.setState({ nickname: e.target.value }); + } + + render() { + const { nickname, error } = this.state; + return ( +
    + this.handleSubmit(e, props)} + className="login-form" + > + + { + // this.textINput = input; + // }} + type="text" + id="nickname" + value={nickname} + onChange={e => this.handleChange(e)} + placeholder="insert username" + /> +
    {error ? error : null}
    + +
    + ); + } +} + +export default LoginForm; diff --git a/src/js/MessageInput.jsx b/src/js/MessageInput.jsx new file mode 100644 index 0000000..9a21114 --- /dev/null +++ b/src/js/MessageInput.jsx @@ -0,0 +1,89 @@ +import React, { Component } from 'react'; + +class MessageInput extends Component { + constructor(props) { + super(props); + + this.state = { + message: '', + isTyping: false + }; + this.handleSubmit = this.handleSubmit.bind(this); + this.sendTyping = this.sendTyping.bind(this); + this.sendMessage = this.sendMessage.bind(this); + this.startCheckingTyping = this.startCheckingTyping.bind(this); + this.stopCheckingTyping = this.stopCheckingTyping.bind(this); + } + + componentWillUnmount() { + this.stopCheckingTyping(); + } + + handleSubmit(e) { + e.preventDefault(); + this.sendMessage(); + this.setState({ message: '' }); + } + + sendMessage() { + this.props.sendMessage(this.state.message); + } + + sendTyping() { + this.lastUpdateTime = Date.now(); + if (!this.state.isTyping) { + this.setState({ isTyping: true }); + this.props.sendTyping(true); + this.startCheckingTyping(); + } + } + + startCheckingTyping() { + console.log('Typing'); + this.typingInterval = setInterval(() => { + if (Date.now() - this.lastUpdateTime > 300) { + this.setState({ isTyping: false }); + this.stopCheckingTyping(); + } + }, 300); + } + + stopCheckingTyping() { + console.log('Stop Typing'); + if (this.typingInterval) { + clearInterval(this.typingInterval); + this.props.sendTyping(false); + } + } + + render() { + const { message } = this.state; + return ( +
    +
    + { + e.keyCode !== 13 && this.sendTyping(); + }} + onChange={({ target }) => { + this.setState({ message: target.value }); + }} + /> + +
    +
    + ); + } +} + +export default MessageInput; diff --git a/src/js/Messages.jsx b/src/js/Messages.jsx new file mode 100644 index 0000000..c0af21d --- /dev/null +++ b/src/js/Messages.jsx @@ -0,0 +1,49 @@ +import React, { Component } from 'react'; + +export default class Messages extends Component { + constructor(props) { + super(props); + + this.scrollDown = this.scrollDown.bind(this); + } + componentDidMount() { + this.scrollDown(); + } + + componentDidUpdate() { + this.scrollDown(); + } + + scrollDown() { + const { container } = this.refs; + container.scrollTop = container.scrollHeight; + } + + render() { + const { messages, user, typingUsers } = this.props; + return ( +
    +
    + {messages.map(mes => ( +
    +
    {mes.time}
    +
    +
    {mes.message}
    +
    {mes.sender}
    +
    +
    + ))} + {typingUsers.map(name => ( +
    + {`${name} is typing . . .`} +
    + ))} +
    +
    + ); + } +} diff --git a/src/js/PublicAddMessage.jsx b/src/js/PublicAddMessage.jsx deleted file mode 100644 index 1a297c2..0000000 --- a/src/js/PublicAddMessage.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { addMessage } from './actionCreators'; -// import PropTypes from 'prop-types' - -const PublicAddMessage = props => { - let input; - - return ( -
    - { - if (e.key === 'Enter') { - props.dispatch(input.value, 'Me'); - input.value = ''; - } - }} - type="text" - ref={node => { - input = node; - }} - /> -
    - ); -}; - -// AddMessage.propTypes = { -// dispatch: PropTypes.func.isRequired -// } -const mapDispatchToProps = dispatch => ({ - dispatch: (message, author) => { - dispatch(addMessage(message, author)); - } -}); - -export default connect(() => ({}), mapDispatchToProps)(PublicAddMessage); diff --git a/src/js/PublicChat.jsx b/src/js/PublicChat.jsx index c8c1c68..7386202 100644 --- a/src/js/PublicChat.jsx +++ b/src/js/PublicChat.jsx @@ -1,45 +1,489 @@ import React from 'react'; import styled from 'styled-components'; import Navbar from './Navbar'; -import PublicSidebar from './PublicSidebar'; -import PublicMessagesList from './PublicMessagesList'; -import PublicAddMessage from './PublicAddMessage'; +import Layout from './Layout'; const Wrapper = styled.div` - * { - box-sizing: border-box; - padding: 0; + html, + body, + #root { margin: 0; + padding: 0; + font-family: sans-serif; + height: 100%; + } + + input, + textarea { + font-family: Arial; + } + + .login { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + .login-form { + display: flex; + justify-content: center; + flex-direction: column; + } + + .login-form input { + max-width: 100%; + border-top: none; + border-left: none; + border-right: none; + height: 20px; + line-height: 20px; + font-size: 20px; + border-bottom: solid 2px #b3b2ca; + transition: all 0.23s ease-in; + } + + .login-form input:focus { + border-bottom: solid 2px black; + outline: none; + } + + .login-form .error { + text-align: center; + margin: 5px 0; + padding: 5px 10px; + color: #c92c43; + } + + .container { + color: #cac8ee; + display: flex; + flex-direction: row; + ${'' /* position: absolute; */} align-items: flex-start; + height: 90%; + width: 100%; + } + + #side-bar { + box-sizing: border-box; + width: 15%; + height: 100%; + display: flex; + justify-content: space-around; + flex-direction: column; } - body { - font-family: 'Press Start 2P'; + + #side-bar .heading { + box-sizing: border-box; + height: 8vh; + max-height: 65px; + padding: 18px 16px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background: #004225; } - #container { - display: grid; - grid-template-columns: 1fr 3fr; - grid-template-areas: 'sidebar main'; - width: 100vw; - height: 100vh; + + #side-bar .search { + background: #008000; + box-sizing: border-box; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border-width: 1px 0; + border-style: solid; + border-color: black; + padding-left: 15px; + padding-right: 20px; + height: 10vh; + max-height: 65px; } - #main { - grid-area: main; + + #side-bar .search .search-icon { + margin-right: 15px; + cursor: pointer; } - #new-message { - position: fixed; - bottom: 0; + + #side-bar .search input { width: 100%; - padding: 5px; - margin-left: 0px; - border-top: 1px solid #3f3f3f; + background: #008000; + flex-grow: 1; + box-sizing: border-box; + border: none; + color: #cac8ee; + } + + #side-bar .search input:focus { + outline: none; + } + + #side-bar .search input::placeholder { + color: #cac8ee; + opacity: 0.6; + } + + #side-bar .search .plus { + display: inline-block; + position: relative; + cursor: pointer; + width: 13px; + height: 13px; + } + + #side-bar .search .plus::after, + #side-bar .search .plus::before { + content: ''; + position: absolute; + background: #b3b2ca; } - #messages-list { - padding: 5px 0 0 5px; + + #side-bar .search .plus::after { + width: 16px; + height: 2px; + top: 5px; + } + + #side-bar .search .plus::before { + width: 2px; + height: 16px; + top: -2px; + left: 7px; + } + + #side-bar .users { + overflow-y: scroll; + background: #006600; + flex-grow: 1; + } + + #side-bar .users::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #cac8ee; + } + + #side-bar .users::-webkit-scrollbar { + width: 5px; + background-color: green; + } + + #side-bar .users::-webkit-scrollbar-thumb { + background-color: #484d79; + } + + #side-bar .users .user { + align-items: center; + display: flex; + height: 66px; + justify-content: flex-start; + padding: 18px 16px; + } + + #side-bar .users .user.active, + #side-bar .users .user:hover { + background: #006600; + } + + #side-bar .users .user:hover:not(.active) { + cursor: pointer; + } + + #side-bar .users .user .user-info { + margin-left: 15px; + flex-grow: 1; + } + + #side-bar .users .user .user-info .last-message { + font-size: 12px; + opacity: 0.56; + } + + #side-bar .users .user .new-message { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + + #side-bar .current-user { + align-items: center; + background: #008000; + box-sizing: border-box; + display: flex; + flex-direction: row; + height: 10vh; + max-height: 65px; + justify-content: space-between; + padding-left: 16px; + padding-right: 16px; + } + + #side-bar .current-user .logout { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + font-size: 2em; + } + + .chat-header { + background: #008000; + box-shadow: 0px 6px 5px -2px rgba(225, 225, 225, 0.7); + box-sizing: border-box; + display: flex; + justify-content: space-between; + align-items: center; + height: 12vh; + max-height: 65px; + padding: 18px 16px; + } + + .chat-header .user-info { + align-items: center; + display: flex; + } + + .chat-header .user-info .user-name { + margin-right: 10px; + } + + .chat-header .user-info .status { + align-items: center; + display: flex; } - #sidebar { - grid-area: sidebar; - padding: 5px 0 0 5px; - border-right: 1px solid #3f3f3f; + + .chat-header .options { + display: flex; + align-items: center; + flex-direction: row; + justify-content: space-around; height: 100%; + width: 15%; + } + + .chat-header .options svg { + cursor: pointer; + } + + .chat-room-container { + height: 100%; + width: 76.25%; + } + + @media screen and (max-width: 510px) { + #side-bar { + position: absolute; + left: -100%; + } + .chat-room-container { + width: 100%; + } + } + + .chat-room { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + width: 100%; + } + + .chat-room.choose { + align-items: center; + justify-content: center; + font-size: 2em; + } + + .thread-container { + flex-grow: 1; + overflow-y: scroll; + position: relative; + } + + .thread-container::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #cac8ee; + } + + .thread-container::-webkit-scrollbar { + width: 5px; + background-color: green; + } + + .thread-container::-webkit-scrollbar-thumb { + background-color: #008000; + } + + .thread-container .thread { + position: relative; + width: 100%; + min-height: 800px; + display: flex; + flex-direction: column; + justify-content: flex-end; + color: #b3b2ca; + background: #dcddf5; + } + + .message-container { + display: flex; + justify-content: flex-start; + min-height: 50px; + margin: 10px 15px; + animation: 0.65s ease-out 0s show; + } + + .message-container .time { + order: 1; + } + + .message-container .data { + order: 2; + height: 100%; + margin-left: 25px; + } + + .message-container .name { + font-size: 0.65em; + margin-top: 5px; + text-align: right; + } + + .message-container .message { + background: #fff; + border-radius: 5px; + border-top-left-radius: 0; + box-sizing: border-box; + color: #b3b2ca; + height: 100%; + padding: 10px 15px; + position: relative; + } + + @keyframes show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + + .message-container .message::before { + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: #fff; + border-style: solid; + border-top-color: #fff; + border-width: 4px; + content: ''; + height: 0; + left: -7px; + position: absolute; + top: 0; + width: 0; + } + + .message-container.right { + text-align: right; + justify-content: flex-end; + } + + .message-container.right .time { + order: 2; + margin-left: 25px; + } + + .message-container.right .data { + margin-left: 0; + order: 1; + } + + .message-container.right .name { + display: none; + } + + .message-container.right .message { + background: #2e8b57; + color: #fff; + border-top-right-radius: 0; + border-top-left-radius: 5px; + } + + .message-container.right .message::before { + border-top-color: #2e8b57; + border-left-color: #2e8b57; + border-right-color: transparent; + left: auto; + right: -7px; + } + + .typing-user { + text-align: right; + margin: 10px 15px; + } + + .message-input { + background: white; + color: #484d79; + box-sizing: border-box; + height: 10vh; + max-height: 65px; + } + + .message-input .message-form { + height: 100%; + width: 100%; + display: flex; + justify-content: space-between; + } + + .message-input .message-form .form-control { + padding-top: 24px; + padding-bottom: 24px; + resize: none; + padding-left: 15px; + box-sizing: border-box; + width: 80%; + height: 100%; + border: none; + } + + .message-input .message-form .form-control::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #cac8ee; + } + + .message-input .message-form .form-control::-webkit-scrollbar { + width: 5px; + background-color: green; + } + + .message-input .message-form .form-control::-webkit-scrollbar-thumb { + background-color: #484d79; + } + + .message-input .message-form .form-control:focus { + outline: none; + } + + .message-input .message-form .send { + width: 20%; + box-sizing: border-box; + font-size: 1.25em; + text-align: center; + border: none; + height: 100%; + color: #fff; + background: #008000; + transition: all 0.35s ease-out; + } + + .message-input .message-form .send:disabled { + opacity: 0.2; + background: #5d5d8a; } `; @@ -49,13 +493,9 @@ const PublicChat = () => (

    this is the public chat page

    hello

    -
    +
    - -
    - - -
    +
    diff --git a/src/js/PublicMessage.jsx b/src/js/PublicMessage.jsx deleted file mode 100644 index aa1c50d..0000000 --- a/src/js/PublicMessage.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const PublicMessage = ({ message, author }) => ( -

    - {author}: {message} -

    -); - -PublicMessage.propTypes = { - message: PropTypes.string.isRequired, - author: PropTypes.string.isRequired -}; - -export default PublicMessage; diff --git a/src/js/PublicMessagesList.jsx b/src/js/PublicMessagesList.jsx deleted file mode 100644 index da175bf..0000000 --- a/src/js/PublicMessagesList.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import PublicMessage from './PublicMessage'; - -const PublicMessagesList = ({ publicmessages }) => ( -
    -
      - {publicmessages.map(message => ( - - ))} -
    -
    -); - -// PublicMessagesList.propTypes = { -// publicmessages: PropTypes.arrayOf( -// PropTypes.shape({ -// id: PropTypes.number.isRequired, -// message: PropTypes.string.isRequired, -// author: PropTypes.string.isRequired -// }).isRequired -// ).isRequired -// }; - -export default connect( - state => ({ - publicmessages: state.publicmessages - }), - {} -)(PublicMessagesList); diff --git a/src/js/PublicSidebar.jsx b/src/js/PublicSidebar.jsx deleted file mode 100644 index 5238d2a..0000000 --- a/src/js/PublicSidebar.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; - -const PublicSidebar = ({ publicusers }) => ( - -); - -PublicSidebar.propTypes = { - publicusers: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.number.isRequired, - name: PropTypes.string.isRequired - }).isRequired - ).isRequired -}; - -export default connect( - state => ({ - publicusers: state.publicusers - }), - {} -)(PublicSidebar); diff --git a/src/js/SideBar.jsx b/src/js/SideBar.jsx new file mode 100644 index 0000000..da7862d --- /dev/null +++ b/src/js/SideBar.jsx @@ -0,0 +1,80 @@ +import React, { Component } from 'react'; +import FAChevronDown from 'react-icons/lib/md/keyboard-arrow-down'; +import FAMenu from 'react-icons/lib/fa/list-ul'; +import FASearch from 'react-icons/lib/fa/search'; +import MdEject from 'react-icons/lib/md/eject'; + +export default class SideBar extends Component { + render() { + const { chats, activeChat, user, setActiveChat, logout } = this.props; + return ( +
    diff --git a/src/js/PublicChat.jsx b/src/js/PublicChat.jsx index 7386202..84af215 100644 --- a/src/js/PublicChat.jsx +++ b/src/js/PublicChat.jsx @@ -57,15 +57,18 @@ const Wrapper = styled.div` } .container { - color: #cac8ee; + padding-bottom: 10vh; + color: #ffffff; display: flex; flex-direction: row; - ${'' /* position: absolute; */} align-items: flex-start; + align-items: flex-start; + justify-content: center; height: 90%; - width: 100%; + width: 90%; } #side-bar { + order: 1; box-sizing: border-box; width: 15%; height: 100%; @@ -75,6 +78,7 @@ const Wrapper = styled.div` } #side-bar .heading { + font-size: 1em; box-sizing: border-box; height: 8vh; max-height: 65px; @@ -83,11 +87,11 @@ const Wrapper = styled.div` flex-direction: row; align-items: center; justify-content: space-between; - background: #004225; + background: #2f9999; } #side-bar .search { - background: #008000; + background: #2f9999; box-sizing: border-box; display: flex; flex-direction: row; @@ -109,11 +113,11 @@ const Wrapper = styled.div` #side-bar .search input { width: 100%; - background: #008000; + background: #2f9999; flex-grow: 1; box-sizing: border-box; border: none; - color: #cac8ee; + color: #2f9999; } #side-bar .search input:focus { @@ -121,7 +125,7 @@ const Wrapper = styled.div` } #side-bar .search input::placeholder { - color: #cac8ee; + color: #2f9999; opacity: 0.6; } @@ -154,14 +158,16 @@ const Wrapper = styled.div` } #side-bar .users { - overflow-y: scroll; - background: #006600; + ${'' /* overflow-y: scroll; */} background: #2f9999; flex-grow: 1; + text-align: center; + height: 4.5vh; + max-height: 65px; + padding: 18px 5px; } #side-bar .users::-webkit-scrollbar-track { - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); - background-color: #cac8ee; + background-color: #484d79; } #side-bar .users::-webkit-scrollbar { @@ -170,7 +176,7 @@ const Wrapper = styled.div` } #side-bar .users::-webkit-scrollbar-thumb { - background-color: #484d79; + background-color: #2f9999; } #side-bar .users .user { @@ -183,7 +189,7 @@ const Wrapper = styled.div` #side-bar .users .user.active, #side-bar .users .user:hover { - background: #006600; + background: #2f9999; } #side-bar .users .user:hover:not(.active) { @@ -209,7 +215,8 @@ const Wrapper = styled.div` #side-bar .current-user { align-items: center; - background: #008000; + background: #fff; + color: #fc4a1a; box-sizing: border-box; display: flex; flex-direction: row; @@ -229,7 +236,8 @@ const Wrapper = styled.div` } .chat-header { - background: #008000; + border-radius: 15px 0 0 0; + background: #2f9999; box-shadow: 0px 6px 5px -2px rgba(225, 225, 225, 0.7); box-sizing: border-box; display: flex; @@ -297,34 +305,35 @@ const Wrapper = styled.div` } .thread-container { + height: 90vh; + overflow: scroll; flex-grow: 1; overflow-y: scroll; position: relative; } .thread-container::-webkit-scrollbar-track { - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); - background-color: #cac8ee; + background-color: #2f9999; } .thread-container::-webkit-scrollbar { width: 5px; - background-color: green; + background-color: #2f9999; } .thread-container::-webkit-scrollbar-thumb { - background-color: #008000; + background-color: #2f9999; } .thread-container .thread { position: relative; width: 100%; - min-height: 800px; + min-height: 89vh; display: flex; flex-direction: column; justify-content: flex-end; - color: #b3b2ca; - background: #dcddf5; + color: #ffffff; + background: #ffffff; } .message-container { @@ -346,17 +355,20 @@ const Wrapper = styled.div` } .message-container .name { + color:#FC4A1A; font-size: 0.65em; margin-top: 5px; text-align: right; } .message-container .message { + border-style: solid; + border-color:#b3b2ca; background: #fff; border-radius: 5px; border-top-left-radius: 0; box-sizing: border-box; - color: #b3b2ca; + color: #FC4A1A; height: 100%; padding: 10px 15px; position: relative; @@ -371,12 +383,13 @@ const Wrapper = styled.div` } } - .message-container .message::before { + ${ + '' /* .message-container .message::before { border-bottom-color: transparent; border-left-color: transparent; - border-right-color: #fff; + border-right-color: #2f9999; border-style: solid; - border-top-color: #fff; + border-top-color: #2f9999; border-width: 4px; content: ''; height: 0; @@ -384,6 +397,7 @@ const Wrapper = styled.div` position: absolute; top: 0; width: 0; + } */ } .message-container.right { @@ -406,19 +420,22 @@ const Wrapper = styled.div` } .message-container.right .message { - background: #2e8b57; + border-style:none; + background: #2f9999; color: #fff; border-top-right-radius: 0; border-top-left-radius: 5px; } - .message-container.right .message::before { - border-top-color: #2e8b57; - border-left-color: #2e8b57; - border-right-color: transparent; + ${ + '' /* .message-container.right .message::before { + ${'' /* border-top-color: #2f999; */ + } + ${'' /* border-left-color: #2f999; */} + ${'' /* border-right-color: transparent; */} left: auto; right: -7px; - } + } */} .typing-user { text-align: right; @@ -426,10 +443,13 @@ const Wrapper = styled.div` } .message-input { + border-radius: 0 0 15px 15px; + + padding: 10px; background: white; color: #484d79; box-sizing: border-box; - height: 10vh; + height: 15vh; max-height: 65px; } @@ -441,6 +461,8 @@ const Wrapper = styled.div` } .message-input .message-form .form-control { + border-radius: 0 0 0 10px; + padding-top: 24px; padding-bottom: 24px; resize: none; @@ -452,17 +474,17 @@ const Wrapper = styled.div` } .message-input .message-form .form-control::-webkit-scrollbar-track { - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); - background-color: #cac8ee; + + background-color: #484d79; } .message-input .message-form .form-control::-webkit-scrollbar { width: 5px; - background-color: green; + background-color: #2f9999; } .message-input .message-form .form-control::-webkit-scrollbar-thumb { - background-color: #484d79; + background-color: #2f9999; } .message-input .message-form .form-control:focus { @@ -470,14 +492,13 @@ const Wrapper = styled.div` } .message-input .message-form .send { - width: 20%; box-sizing: border-box; font-size: 1.25em; text-align: center; border: none; height: 100%; color: #fff; - background: #008000; + background: #f7b733; transition: all 0.35s ease-out; } diff --git a/src/js/SideBar.jsx b/src/js/SideBar.jsx index da7862d..3a984dd 100644 --- a/src/js/SideBar.jsx +++ b/src/js/SideBar.jsx @@ -9,21 +9,19 @@ export default class SideBar extends Component { const { chats, activeChat, user, setActiveChat, logout } = this.props; return ( ); From 10c758f5007b70fdc4d2c84a632178d0fd3a05b8 Mon Sep 17 00:00:00 2001 From: SamiSha99 Date: Wed, 24 Jan 2018 17:41:01 +0200 Subject: [PATCH 07/10] removed console.logs related to #18 --- config.env | 2 +- src/backEnd/SocketManager.js | 6 ------ src/js/ChatContainer.jsx | 5 ----- src/js/Layout.jsx | 4 +--- src/js/MessageInput.jsx | 2 -- 5 files changed, 2 insertions(+), 17 deletions(-) diff --git a/config.env b/config.env index f9f4b92..32617d8 100644 --- a/config.env +++ b/config.env @@ -1 +1 @@ -DATABASE_URL= postgres://postgress:12345678@localhost:5432/cryptodb +DATABASE_URL= postgres://samis:1234@localhost:8080/coin diff --git a/src/backEnd/SocketManager.js b/src/backEnd/SocketManager.js index 0c719ec..73b7fbe 100644 --- a/src/backEnd/SocketManager.js +++ b/src/backEnd/SocketManager.js @@ -1,5 +1,4 @@ const { io } = require('./server.js'); -// console.log('poopoo', io); const { createUser, createMessage, createChat } = require('./Factories'); @@ -15,7 +14,6 @@ function sendTypingToChat(user, socket) { function sendMessageToChat(sender, socket) { return (chatId, message) => { - console.log(`MESSAGE_RECIEVED-${chatId}`); io.emit(`MESSAGE_RECIEVED-${chatId}`, createMessage({ message, sender })); }; } @@ -37,7 +35,6 @@ function isUser(userList, username) { } module.exports = function(socket) { - console.log('Socket Id:' + socket.id); let sendMessageToChatFromUser; @@ -59,7 +56,6 @@ module.exports = function(socket) { sendTypingFromUser = sendTypingToChat(user.name, socket); io.emit('USER_CONNECTED', connectedUsers); - console.log(connectedUsers); }); socket.on('disconnect', () => { @@ -67,14 +63,12 @@ module.exports = function(socket) { connectedUsers = removeUser(connectedUsers, socket.user.name); io.emit('USER_DISCONNECTED', connectedUsers); - console.log('Disconnect', connectedUsers); } }); socket.on('LOGOUT', () => { connectedUsers = removeUser(connectedUsers, socket.user.name); io.emit('USER_DISCONNECTED', connectedUsers); - console.log('Disconnect', connectedUsers); }); socket.on('COMMUNITY_CHAT', callback => { diff --git a/src/js/ChatContainer.jsx b/src/js/ChatContainer.jsx index 99e8764..e9eab91 100644 --- a/src/js/ChatContainer.jsx +++ b/src/js/ChatContainer.jsx @@ -33,7 +33,6 @@ export default class ChatContainer extends Component { } addChat(chat, reset) { - console.log('addchatyo'); const { socket } = this.props; const { chats } = this.state; @@ -49,17 +48,14 @@ export default class ChatContainer extends Component { socket.on( typingEvent, this.updateTypingInChat(chat.id), - console.log('chatting') ); socket.on( messageEvent, this.addMessageToChat(chat.id), - console.log('peepee', messageEvent) ); } addMessageToChat(chatId) { - console.log('echo2'); return message => { const { chats } = this.state; const newChats = chats.map(chat => { @@ -72,7 +68,6 @@ export default class ChatContainer extends Component { } updateTypingInChat(chatId) { - console.log('echo'); return ({ isTyping, user }) => { if (user !== this.props.user.name) { const { chats } = this.state; diff --git a/src/js/Layout.jsx b/src/js/Layout.jsx index 112ab7e..7cc3025 100644 --- a/src/js/Layout.jsx +++ b/src/js/Layout.jsx @@ -30,9 +30,7 @@ class Layout extends Component { initSocket() { const socket = io(socketUrl); - socket.on('connect', () => { - console.log('Connected'); - }); + socket.on('connect'); this.setState({ socket }); } diff --git a/src/js/MessageInput.jsx b/src/js/MessageInput.jsx index 9a21114..d405e51 100644 --- a/src/js/MessageInput.jsx +++ b/src/js/MessageInput.jsx @@ -39,7 +39,6 @@ class MessageInput extends Component { } startCheckingTyping() { - console.log('Typing'); this.typingInterval = setInterval(() => { if (Date.now() - this.lastUpdateTime > 300) { this.setState({ isTyping: false }); @@ -49,7 +48,6 @@ class MessageInput extends Component { } stopCheckingTyping() { - console.log('Stop Typing'); if (this.typingInterval) { clearInterval(this.typingInterval); this.props.sendTyping(false); From 905d133fe27d5e5354556ed8e14b5d0ccba03f8c Mon Sep 17 00:00:00 2001 From: SamiSha99 Date: Wed, 24 Jan 2018 17:53:37 +0200 Subject: [PATCH 08/10] Fixed an issue that caused an Error related to #18 --- config.env | 2 +- src/js/Layout.jsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config.env b/config.env index 32617d8..6566620 100644 --- a/config.env +++ b/config.env @@ -1 +1 @@ -DATABASE_URL= postgres://samis:1234@localhost:8080/coin +DATABASE_URL= postgres://samis:12345@localhost:8080/coin diff --git a/src/js/Layout.jsx b/src/js/Layout.jsx index 7cc3025..112ab7e 100644 --- a/src/js/Layout.jsx +++ b/src/js/Layout.jsx @@ -30,7 +30,9 @@ class Layout extends Component { initSocket() { const socket = io(socketUrl); - socket.on('connect'); + socket.on('connect', () => { + console.log('Connected'); + }); this.setState({ socket }); } From d3944451fe53e6ddf490f709e925d8b9232c98c2 Mon Sep 17 00:00:00 2001 From: SamiSha99 Date: Wed, 24 Jan 2018 18:25:53 +0200 Subject: [PATCH 09/10] Removed all comments and commented codes related to #18 --- src/backEnd/SocketManager.js | 1 - src/backEnd/server.js | 20 -------------------- src/js/ClientApp.jsx | 16 ---------------- src/js/InfoBox.jsx | 1 - src/js/LineChart.jsx | 15 ++------------- src/js/LoginForm.jsx | 3 --- src/js/PublicChat.jsx | 24 +++++------------------- src/js/SideBar.jsx | 33 +-------------------------------- src/js/util/sortData.js | 4 ++-- webpack.config.js | 7 ------- 10 files changed, 10 insertions(+), 114 deletions(-) diff --git a/src/backEnd/SocketManager.js b/src/backEnd/SocketManager.js index 73b7fbe..b08a9cc 100644 --- a/src/backEnd/SocketManager.js +++ b/src/backEnd/SocketManager.js @@ -5,7 +5,6 @@ const { createUser, createMessage, createChat } = require('./Factories'); let connectedUsers = {}; const communityChat = createChat(); -// object of messages, names, users function sendTypingToChat(user, socket) { return (chatId, isTyping) => { io.emit(`TYPING-${chatId}`, { user, isTyping }); diff --git a/src/backEnd/server.js b/src/backEnd/server.js index a0ab2b8..bf2e14d 100644 --- a/src/backEnd/server.js +++ b/src/backEnd/server.js @@ -4,7 +4,6 @@ const bodyParser = require('body-parser'); const app = express(); const server = require('http').Server(app); -// const io = require('socket.io')(server); var io = (module.exports.io = require('socket.io')(server)); const SocketManager = require('./SocketManager'); @@ -23,22 +22,3 @@ app.get('/*', (req, res) => { io.on('connection', SocketManager); server.listen(PORT, () => console.log(`Connected to port ${PORT}`)); - -// module.exports = io; - -// const express = require('express'); -// const path = require('path'); -// const bodyParser = require('body-parser'); -// -// const router = require('./router'); -// -// const app = express(); -// app.use(express.static(path.resolve(__dirname, '../..'))); -// app.use(bodyParser.json()); -// -// app.use('/api', router); -// app.get('/*', (req, res) => { -// res.sendFile(path.resolve(__dirname, '../..', 'index.html')); -// }); -// -// app.listen(8080, () => console.log('on 8080')); diff --git a/src/js/ClientApp.jsx b/src/js/ClientApp.jsx index ee129ce..13b8dff 100644 --- a/src/js/ClientApp.jsx +++ b/src/js/ClientApp.jsx @@ -26,19 +26,3 @@ if (module.hot) { ); }); } - -// const renderApp = () => { -// render( -// -// -// , -// document.getElementById('app') -// ); -// }; -// renderApp(); -// -// if (module.hot) { -// module.hot.accept('./App', () => { -// renderApp(); -// }); -// } diff --git a/src/js/InfoBox.jsx b/src/js/InfoBox.jsx index 0eb23a0..97be53a 100644 --- a/src/js/InfoBox.jsx +++ b/src/js/InfoBox.jsx @@ -123,7 +123,6 @@ class InfoBox extends Component { } } -// DEFAULT PROPS InfoBox.propTypes = { duration: PropTypes.string.isRequired, coin: PropTypes.string.isRequired diff --git a/src/js/LineChart.jsx b/src/js/LineChart.jsx index 7231c22..624d7e5 100644 --- a/src/js/LineChart.jsx +++ b/src/js/LineChart.jsx @@ -12,7 +12,6 @@ class LineChart extends Component { constructor(props) { super(props); } - // GET X & Y || MAX & MIN getX() { const { data, duration, coin } = this.props; const lookAt = data[coin]; @@ -34,7 +33,6 @@ class LineChart extends Component { ) }; } - // GET SVG COORDINATES getSvgX(x) { const { svgWidth, yLabelSize, duration, coin } = this.props; return yLabelSize + x / this.getX().max * (svgWidth - yLabelSize); @@ -47,7 +45,6 @@ class LineChart extends Component { (gY.max - gY.min) ); } - // BUILD SVG PATH makePath() { const { data, color, duration, coin } = this.props; let pathD = @@ -67,7 +64,6 @@ class LineChart extends Component { ); } - // BUILD SHADED AREA makeArea() { const { data, duration, coin } = this.props; let pathD = @@ -99,7 +95,6 @@ class LineChart extends Component { return ; } - // BUILD GRID AXIS makeAxis() { const { yLabelSize } = this.props; const x = this.getX(); @@ -136,7 +131,7 @@ class LineChart extends Component { const padding = 5; return ( - {/* Y AXIS LABELS */} + - {/* X AXIS LABELS */} ); } - // FIND CLOSEST POINT TO MOUSE getCoords(e) { const { svgWidth, data, yLabelSize, duration, coin } = this.props; const svgLocation = document .getElementsByClassName('linechart')[0] .getBoundingClientRect(); - const adjustment = (svgLocation.width - svgWidth) / 2; //takes padding into consideration + const adjustment = (svgLocation.width - svgWidth) / 2; const relativeLoc = e.clientX - svgLocation.left - adjustment; let svgData = []; @@ -208,12 +201,10 @@ class LineChart extends Component { this.props.onChartHover(relativeLoc, closestPoint); } - // STOP HOVER stopHover() { this.props.handleHover(null, null); this.props.onChartHover(null, null); } - // MAKE ACTIVE POINT makeActivePoint() { const { color, pointRadius } = this.props; return ( @@ -226,7 +217,6 @@ class LineChart extends Component { /> ); } - // MAKE HOVER LINE createLine() { const { svgHeight, xLabelSize } = this.props; return ( @@ -264,7 +254,6 @@ class LineChart extends Component { ); } } -// DEFAULT PROPS LineChart.defaultProps = { data: [], color: '#fc4a1a', diff --git a/src/js/LoginForm.jsx b/src/js/LoginForm.jsx index eb3d3e5..607e5d0 100644 --- a/src/js/LoginForm.jsx +++ b/src/js/LoginForm.jsx @@ -48,9 +48,6 @@ class LoginForm extends Component {

    Enter your nickname

    { - // this.textINput = input; - // }} type="text" id="nickname" value={nickname} diff --git a/src/js/PublicChat.jsx b/src/js/PublicChat.jsx index 84af215..253a015 100644 --- a/src/js/PublicChat.jsx +++ b/src/js/PublicChat.jsx @@ -158,7 +158,7 @@ const Wrapper = styled.div` } #side-bar .users { - ${'' /* overflow-y: scroll; */} background: #2f9999; + ${''} background: #2f9999; flex-grow: 1; text-align: center; height: 4.5vh; @@ -384,20 +384,7 @@ const Wrapper = styled.div` } ${ - '' /* .message-container .message::before { - border-bottom-color: transparent; - border-left-color: transparent; - border-right-color: #2f9999; - border-style: solid; - border-top-color: #2f9999; - border-width: 4px; - content: ''; - height: 0; - left: -7px; - position: absolute; - top: 0; - width: 0; - } */ + '' } .message-container.right { @@ -428,11 +415,10 @@ const Wrapper = styled.div` } ${ - '' /* .message-container.right .message::before { - ${'' /* border-top-color: #2f999; */ + '' } - ${'' /* border-left-color: #2f999; */} - ${'' /* border-right-color: transparent; */} + ${'' } + ${'' } left: auto; right: -7px; } */} diff --git a/src/js/SideBar.jsx b/src/js/SideBar.jsx index 3a984dd..2b5b7b5 100644 --- a/src/js/SideBar.jsx +++ b/src/js/SideBar.jsx @@ -9,19 +9,6 @@ export default class SideBar extends Component { const { chats, activeChat, user, setActiveChat, logout } = this.props; return (