diff --git a/client/actions/userDataActions.jsx b/client/actions/userDataActions.jsx index 8bfcb0d..e8d7d98 100644 --- a/client/actions/userDataActions.jsx +++ b/client/actions/userDataActions.jsx @@ -8,4 +8,13 @@ export function currentUserDataRequest() { return res.data; }); } +} + +export function userUpdateProfile(userProfileData) { + return dispatch => { + return axios.post('/api/profileupdate', userProfileData).then(res => { + console.log('outcoming data' + res.data); + return res.data; + }); + } } \ No newline at end of file diff --git a/client/src/App.jsx b/client/src/App.jsx index 33c1778..8cb9bf0 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -8,6 +8,7 @@ import LoginPage from './LoginPage.jsx'; import ProfilePage from './ProfilePage.jsx'; import MatchmakerPage from './MainApp/MatchmakerPage.jsx'; import { connect } from 'react-redux'; +import ProfileForm from './ProfileForm.jsx'; class App extends Component { constructor(props) { @@ -29,6 +30,7 @@ class App extends Component { ( isAuthenticated ? : )} /> + ); } diff --git a/client/src/Profile.jsx b/client/src/Profile.jsx index ede4025..78dc11b 100644 --- a/client/src/Profile.jsx +++ b/client/src/Profile.jsx @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import axios from 'axios'; import { currentUserDataRequest } from '../actions/userDataActions.jsx' import { connect } from 'react-redux'; +import { Link } from 'react-router-dom'; class Profile extends Component { @@ -25,17 +26,27 @@ class Profile extends Component { email: data.email, tagline: data.tagline, blurb: data.blurb, - imageurl: data.imageurl + imageurl: `https://api.adorable.io/avatars/285/${data.username}@adorable.io.png`, }) }); } render() { const { username, email, tagline, blurb, imageurl } = this.state + console.log(imageurl); return ( -
-

{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 ( +
+

Update Profileeeee

+ + + + +
+ +
+ + ) + } +} + +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);