-
{username + email + tagline + blurb + imageurl}
+
+
+
+

+
{username}
+
+
{tagline}
+
{blurb}
+
Edit Profile
+
+
);
}
}
diff --git a/client/src/ProfileForm.jsx b/client/src/ProfileForm.jsx
new file mode 100644
index 0000000..643d3d8
--- /dev/null
+++ b/client/src/ProfileForm.jsx
@@ -0,0 +1,72 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import TextFieldGroup from './common/TextFieldGroup.jsx';
+import { browserHistory } from 'react-router';
+import { connect } from 'react-redux';
+import { userUpdateProfile } from '../actions/userDataActions.jsx'
+
+class ProfileForm extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ username: '',
+ tagline: '',
+ blurb:'',
+ }
+ this.onChange = this.onChange.bind(this);
+ this.onSubmit = this.onSubmit.bind(this);
+
+ }
+
+ onChange(e) {
+ this.setState({ [e.target.name]: e.target.value });
+ }
+
+ onSubmit(e) {
+ e.preventDefault();
+
+ this.setState({ errors:{}, isLoading: true });
+ this.props.userUpdateProfile(this.state).then(
+ () => {
+ this.context.router.history.push('/matchmaker');
+ },
+ );
+ }
+
+ render () {
+ const { errors } = this.state;
+ return (
+
+ )
+ }
+}
+
+ProfileForm.propTypes = {
+ userUpdateProfile: PropTypes.func.isRequired
+}
+ProfileForm.contextTypes = {
+ router: React.PropTypes.object.isRequired
+}
+
+export default connect(null, {userUpdateProfile})(ProfileForm);
\ No newline at end of file
diff --git a/client/src/ProfilePage.jsx b/client/src/ProfilePage.jsx
index 6275244..78980d9 100644
--- a/client/src/ProfilePage.jsx
+++ b/client/src/ProfilePage.jsx
@@ -1,5 +1,7 @@
import React, { Component } from 'react';
import Profile from './Profile.jsx';
+import ProfileForm from './ProfileForm.jsx';
+
class ProfilePage extends Component {
render () {
diff --git a/client/src/SignupForm.jsx b/client/src/SignupForm.jsx
index a4d12df..153c074 100644
--- a/client/src/SignupForm.jsx
+++ b/client/src/SignupForm.jsx
@@ -32,7 +32,7 @@ class SignupForm extends Component {
this.setState({ errors:{}, isLoading: true });
this.props.userSignupRequest(this.state).then(
() => {
- this.context.router.history.push('/matchmaker');
+ this.context.router.history.push('/profileupdate');
window.location.reload();
},
({ data }) => this.setState({ errors:data, isLoading: false })
diff --git a/client/styles/main.scss b/client/styles/main.scss
index 2f4fe89..8aa8ceb 100644
--- a/client/styles/main.scss
+++ b/client/styles/main.scss
@@ -124,3 +124,9 @@ nav {
transform: translate(-50%, 0);
margin-left: 50%;
}
+
+.bordered-image {
+ border: 3px solid black;
+ width: 25%;
+ height: 25%;
+}
\ No newline at end of file
diff --git a/server/package-lock.json b/server/package-lock.json
index a055516..8d3d2f4 100644
--- a/server/package-lock.json
+++ b/server/package-lock.json
@@ -1033,6 +1033,37 @@
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
"integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE="
},
+ "bl": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-0.4.2.tgz",
+ "integrity": "sha1-XbMdcvA4xU5orcOVeBJf47Ct3JY=",
+ "requires": {
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
"blob": {
"version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
"integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
@@ -1183,6 +1214,11 @@
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
+ "coffee-script": {
+ "version": "1.12.7",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw=="
+ },
"combined-stream": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
@@ -1344,6 +1380,15 @@
"version": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz",
"integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4="
},
+ "deasync": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.10.tgz",
+ "integrity": "sha1-TkpoNvvgR3vV+Qgwi9KpZVfV1/4=",
+ "requires": {
+ "bindings": "1.2.1",
+ "nan": "https://registry.npmjs.org/nan/-/nan-2.5.0.tgz"
+ }
+ },
"debug": {
"version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
@@ -3851,6 +3896,63 @@
"ipaddr.js": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz"
}
},
+ "pryjs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pryjs/-/pryjs-1.0.3.tgz",
+ "integrity": "sha1-msqACY7l3edrenu2047CrHIJR80=",
+ "requires": {
+ "chalk": "0.5.1",
+ "coffee-script": "1.12.7",
+ "deasync": "0.1.10",
+ "pygmentize-bundled": "2.3.0",
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
+ "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk="
+ },
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94="
+ },
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "has-ansi": "0.1.0",
+ "strip-ansi": "0.3.0",
+ "supports-color": "0.2.0"
+ }
+ },
+ "has-ansi": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "supports-color": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
+ "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo="
+ }
+ }
+ },
"ps-tree": {
"version": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
"integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
@@ -3863,6 +3965,15 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
+ "pygmentize-bundled": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pygmentize-bundled/-/pygmentize-bundled-2.3.0.tgz",
+ "integrity": "sha1-1CXe2o0TaXW5M+3jYxNfYjNQgUo=",
+ "requires": {
+ "bl": "0.4.2",
+ "through2": "0.2.3"
+ }
+ },
"qs": {
"version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
"integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
@@ -4481,6 +4592,46 @@
"version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
+ "through2": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
+ "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
+ "requires": {
+ "readable-stream": "1.1.14",
+ "xtend": "2.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "requires": {
+ "object-keys": "0.4.0"
+ }
+ }
+ }
+ },
"tildify": {
"version": "https://registry.npmjs.org/tildify/-/tildify-1.0.0.tgz",
"integrity": "sha1-KgIdtej73gqPi03zetqo+x05190=",
@@ -4572,6 +4723,11 @@
"version": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz",
"integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8="
},
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
+ },
"unpipe": {
"version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
diff --git a/server/package.json b/server/package.json
index 44f5016..5d3b7e7 100644
--- a/server/package.json
+++ b/server/package.json
@@ -18,6 +18,7 @@
"morgan": "^1.8.2",
"nodemon": "^1.11.0",
"pg": "^7.1.0",
+ "pryjs": "^1.0.3",
"socket.io": "^2.0.3",
"socketio-jwt": "^4.5.0",
"validator": "^8.0.0"
diff --git a/server/routes/profileUpdate.js b/server/routes/profileUpdate.js
new file mode 100644
index 0000000..c7383d7
--- /dev/null
+++ b/server/routes/profileUpdate.js
@@ -0,0 +1,22 @@
+const express = require('express');
+const User = require('../models/user.js');
+const jwt = require('jsonwebtoken');
+
+let router = express.Router();
+
+router.post('/', (req, res) => {
+ const { tagline, blurb } = req.body;
+ let token = req.headers.authorization.split(' ')[1]
+ jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
+ if (err) {
+ res.status(401).json({ error: 'Failed to Authenticate' });
+ } else {
+ User.where({ username: decoded.username })
+ .save({ tagline: tagline, blurb: blurb }, { patch: true })
+ .then((model) => res.json(model)
+ )
+ };
+ });
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/server.js b/server/server.js
index 70b72d5..866b873 100644
--- a/server/server.js
+++ b/server/server.js
@@ -12,9 +12,10 @@ const knex = require("knex")(knexConfig[ENV]);
const socketio = require('socket.io');
const helmet = require('helmet');
-const userData = require('./routes/userData.js')
-const users = require('./routes/users.js');
-const auth = require('./routes/auth.js');
+const userData = require('./routes/userData.js')
+const users = require('./routes/users.js');
+const auth = require('./routes/auth.js');
+const profileUpdate = require('./routes/profileUpdate.js')
// external files
const socketEvent = require('./sockets.js');
@@ -47,6 +48,8 @@ app.get(/.*/, (req, res) => {
app.use('/api/users', users);
app.use('/api/auth', auth);
+//profile update
+app.use('/api/profileupdate', profileUpdate)
// socket.io listener
socketEvent(io, knex);