Merge branch 'master' into edit-profile-frontend

This commit is contained in:
Clayton Wilson 2019-10-01 16:54:13 -04:00 committed by GitHub
commit 76caf4de12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 348 additions and 83 deletions

View File

@ -17,9 +17,14 @@
"firebase.json", "firebase.json",
"**/.*", "**/.*",
"**/node_modules/**" "**/node_modules/**"
] ],
"rewrites": [{
"source": "/feed",
"destination": "/feed.html"
}]
}, },
"storage": { "storage": {
"rules": "storage.rules" "rules": "storage.rules"
} }
} }

View File

@ -1,19 +1,20 @@
const admin = require('firebase-admin');
/* eslint-disable promise/always-return */ /* eslint-disable promise/always-return */
exports.putPost = (req, res) => { exports.putPost = (req, res) => {
if (req.body.body.trim() === '') {
return res.status(400).json({ body: 'Body must not be empty!'});
}
const newPost = { const newPost = {
body: req.body.body, body: req.body.body,
userHandle: req.user.handle, userHandle: req.body.userHandle,
userImage: req.user.imageUrl, userImage: req.body.userImage,
microBlogTitle: req.body.microBlogTitle,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
likeCount: 0, likeCount: 0,
commentCount: 0 commentCount: 0,
}; };
db.collection('post').add(newPost) admin.firestore().collection('posts').add(newPost)
.then((doc) => { .then((doc) => {
const resPost = newPost; const resPost = newPost;
resPost.postId = doc.id; resPost.postId = doc.id;
@ -25,3 +26,20 @@ exports.putPost = (req, res) => {
}); });
}; };
exports.getallPostsforUser = (req, res) => {
admin.firestore().collection('posts').where('userHandle', '==', 'user' ).get()
.then((data) => {
let posts = [];
data.forEach(function(doc) {
posts.push(doc.data());
});
return res.status(200).json(posts);
})
.catch((err) => {
console.error(err);
return res.status(500).json({error: 'Failed to fetch all posts written by specific user.'})
})
}

View File

@ -1,6 +1,138 @@
const {db} = require('../util/admin'); /* eslint-disable promise/catch-or-return */
const {admin, db} = require('../util/admin');
const config = require('../util/config');
const {validateUpdateProfileInfo} = require('../util/validator'); const {validateUpdateProfileInfo} = require('../util/validator');
const firebase = require('firebase');
firebase.initializeApp(config);
exports.signup = (req, res) => {
const newUser = {
email: req.body.email,
handle: req.body.handle,
password: req.body.password,
confirmPassword: req.body.confirmPassword,
createdAt: new Date().toISOString()
};
// console.log(newUser);
let errors = {};
const emailRegEx = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@(([[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
//Email check
if(newUser.email.trim() === '') {
errors.email = 'Email must not be blank.';
}
else if(!newUser.email.match(emailRegEx)) {
errors.email = 'Email is invalid.';
}
//handle check
if(newUser.handle.trim() === '') {
errors.handle = 'Username must not be blank.';
}
else if(newUser.handle.length < 4 || newUser.handle.length > 30) {
errors.handle = 'Username must be between 4-30 characters long.';
}
//Password check
if(newUser.password.trim() === '') {
errors.password = 'Password must not be blank.';
}
else if(newUser.password.length < 8 || newUser.password.length > 20) {
errors.password = 'Password must be between 8-20 characters long.';
}
//Confirm password check
if(newUser.confirmPassword !== newUser.password) {
errors.confirmPassword = 'Passwords must match.';
}
//Overall check
if(Object.keys(errors).length > 0) {
return res.status(400).json(errors);
}
let idToken, userId;
db.doc(`/users/${newUser.handle}`).get()
.then(doc => {
if(doc.exists) {
return res.status(400).json({ handle: 'This username is already taken.' });
}
return firebase.auth().createUserWithEmailAndPassword(newUser.email, newUser.password);
})
.then(data => {
userId = data.user.uid;
return data.user.getIdToken();
})
.then(token => {
idToken = token;
const userCred = {
email: req.body.email,
handle: newUser.handle,
createdAt: newUser.createdAt,
userId
}
return db.doc(`/users/${newUser.handle}`).set(userCred);
})
.then(() => {
return res.status(201).json({ idToken });
})
.catch(err => {
console.error(err);
if(err.code === 'auth/email-already-in-use') {
return res.status(500).json({ email: 'This email is already taken.' });
}
return res.status(500).json({ error: err.code });
});
};
exports.login = (req, res) => {
const user = {
email: req.body.email,
password: req.body.password
}
//Auth validation
let errors = {};
//Email check
if(user.email.trim() === '') {
errors.email = 'Email must not be blank.';
}
//Password check
if(user.password.trim() === '') {
errors.password = 'Password must not be blank.';
}
//Overall check
if(Object.keys(errors).length > 0) {
return res.status(400).json(errors);
}
firebase.auth().signInWithEmailAndPassword(user.email, user.password)
.then(data => {
return data.user.getIdToken();
})
.then(token => {
return res.json({token});
})
.catch(err => {
console.error(err);
if(err.code === 'auth/wrong-password') {
return res.status(403).json({ general: 'Invalid credentials. Please try again.' });
}
return res.status(500).json({ error: err.code });
});
};
exports.getProfileInfo = (req, res) => { exports.getProfileInfo = (req, res) => {
// FIXME: Delete this after login is implemented // FIXME: Delete this after login is implemented
req.user = {}; req.user = {};

View File

@ -6,10 +6,24 @@ app.use(cors());
const fbAuth = require('./util/fbAuth'); const fbAuth = require('./util/fbAuth');
const {db} = require('./util/admin');
// const firebase = require('firebase');
// firebase.initializeApp(config);
/*------------------------------------------------------------------* /*------------------------------------------------------------------*
* handlers/users.js * * handlers/users.js *
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
const {getUserDetails, getProfileInfo, updateProfileInfo} = require('./handlers/users'); const {getUserDetails, getProfileInfo, updateProfileInfo, signup, login} = require('./handlers/users');
app.post('/signup', signup);
app.post('/login', login);
app.get('/getUser/:handle', getUserDetails); app.get('/getUser/:handle', getUserDetails);
@ -24,7 +38,9 @@ app.post('/updateProfileInfo', updateProfileInfo);
/*------------------------------------------------------------------* /*------------------------------------------------------------------*
* handlers/post.js * * handlers/post.js *
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
const {putPost} = require('./handlers/post'); const {putPost, getallPostsforUser} = require('./handlers/post');
app.get('/getallPostsforUser', getallPostsforUser);
// Adds one post to the database // Adds one post to the database
app.post('/putPost', fbAuth, putPost); app.post('/putPost', fbAuth, putPost);

View File

@ -70,9 +70,15 @@
"integrity": "sha512-foQHhvyB0RR+mb/+wmHXd/VOU+D8fruFEW1k79Q9wzyTPpovMBa1Mcns5fwEWBhUfi8bmoEtaGB8RSAHnTFzTg==" "integrity": "sha512-foQHhvyB0RR+mb/+wmHXd/VOU+D8fruFEW1k79Q9wzyTPpovMBa1Mcns5fwEWBhUfi8bmoEtaGB8RSAHnTFzTg=="
}, },
"@firebase/database": { "@firebase/database": {
<<<<<<< HEAD
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.3.tgz",
"integrity": "sha512-LnXKRE1AmjlS+iRF7j8vx+Ni8x85CmLP5u5Pw5rDKhKLn2eTR1tJKD937mUeeGEtDHwR1rrrkLYOqRR2cSG3hQ==",
=======
"version": "0.5.4", "version": "0.5.4",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.4.tgz", "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.4.tgz",
"integrity": "sha512-Hz1Bi3fzIcNNocE4EhvvwoEQGurG2BGssWD3/6a2bzty+K1e57SLea2Ied8QYNBUU1zt/4McHfa3Y71EQIyn/w==", "integrity": "sha512-Hz1Bi3fzIcNNocE4EhvvwoEQGurG2BGssWD3/6a2bzty+K1e57SLea2Ied8QYNBUU1zt/4McHfa3Y71EQIyn/w==",
>>>>>>> 7969d3b10bc35a9078834c5ee2ba8c8fd60d338f
"requires": { "requires": {
"@firebase/database-types": "0.4.3", "@firebase/database-types": "0.4.3",
"@firebase/logger": "0.1.25", "@firebase/logger": "0.1.25",
@ -107,7 +113,11 @@
"@firebase/firestore": { "@firebase/firestore": {
"version": "1.5.3", "version": "1.5.3",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.5.3.tgz", "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.5.3.tgz",
<<<<<<< HEAD
"integrity": "sha512-CPYLvkGZBKE47oQC9a0q13UMVRj3LvnSbB1nOerktE3CGRHKy44LxDumamN8Kj067hV/80mKK9FdbeUufwO/Rg==",
=======
"integrity": "sha512-O/yAbXpitOA6g627cUl0/FHYlkTy1EiEKMKOlnlMOJF2fH+nLVZREXjsrCC7N2tIvTn7yYwfpZ4zpSNvrhwiTA==", "integrity": "sha512-O/yAbXpitOA6g627cUl0/FHYlkTy1EiEKMKOlnlMOJF2fH+nLVZREXjsrCC7N2tIvTn7yYwfpZ4zpSNvrhwiTA==",
>>>>>>> 7969d3b10bc35a9078834c5ee2ba8c8fd60d338f
"requires": { "requires": {
"@firebase/firestore-types": "1.5.0", "@firebase/firestore-types": "1.5.0",
"@firebase/logger": "0.1.25", "@firebase/logger": "0.1.25",
@ -600,7 +610,7 @@
"ansi-regex": { "ansi-regex": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true "dev": true
}, },
"ansi-styles": { "ansi-styles": {
@ -841,7 +851,7 @@
} }
} }
} }
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@ -1180,9 +1190,15 @@
} }
}, },
"end-of-stream": { "end-of-stream": {
<<<<<<< HEAD
"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==",
=======
"version": "1.4.3", "version": "1.4.3",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz",
"integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", "integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==",
>>>>>>> 7969d3b10bc35a9078834c5ee2ba8c8fd60d338f
"optional": true, "optional": true,
"requires": { "requires": {
"once": "^1.4.0" "once": "^1.4.0"
@ -1694,7 +1710,8 @@
"functional-red-black-tree": { "functional-red-black-tree": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"optional": true
}, },
"gaxios": { "gaxios": {
"version": "2.0.1", "version": "2.0.1",
@ -2242,9 +2259,15 @@
} }
}, },
"gtoken": { "gtoken": {
<<<<<<< HEAD
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.0.0.tgz",
"integrity": "sha512-XaRCfHJxhj06LmnWNBzVTAr85NfAErq0W1oabkdqwbq3uL/QTB1kyvGog361Uu2FMG/8e3115sIy/97Rnd4GjQ==",
=======
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.0.tgz", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.0.tgz",
"integrity": "sha512-wqyn2gf5buzEZN4QNmmiiW2i2JkEdZnL7Z/9p44RtZqgt4077m4khRgAYNuu8cBwHWCc6MsP6eDUn/KkF6jFIw==", "integrity": "sha512-wqyn2gf5buzEZN4QNmmiiW2i2JkEdZnL7Z/9p44RtZqgt4077m4khRgAYNuu8cBwHWCc6MsP6eDUn/KkF6jFIw==",
>>>>>>> 7969d3b10bc35a9078834c5ee2ba8c8fd60d338f
"optional": true, "optional": true,
"requires": { "requires": {
"gaxios": "^2.0.0", "gaxios": "^2.0.0",
@ -2418,7 +2441,8 @@
"imurmurhash": { "imurmurhash": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"optional": true
}, },
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
@ -2433,7 +2457,8 @@
"inherits": { "inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"optional": true
}, },
"inquirer": { "inquirer": {
"version": "6.5.2", "version": "6.5.2",
@ -2503,8 +2528,10 @@
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true "requires": {
"number-is-nan": "^1.0.0"
}
}, },
"is-obj": { "is-obj": {
"version": "2.0.0", "version": "2.0.0",
@ -2902,6 +2929,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -3346,7 +3374,8 @@
"signal-exit": { "signal-exit": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"optional": true
}, },
"slice-ansi": { "slice-ansi": {
"version": "2.1.0", "version": "2.1.0",
@ -3399,9 +3428,9 @@
"string-width": { "string-width": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": { "requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^2.0.0", "is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0" "strip-ansi": "^4.0.0"
} }
@ -3415,7 +3444,7 @@
"strip-ansi": { "strip-ansi": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true, "dev": true,
"requires": { "requires": {
"ansi-regex": "^3.0.0" "ansi-regex": "^3.0.0"
@ -3726,7 +3755,8 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"optional": true
}, },
"write": { "write": {
"version": "1.0.3", "version": "1.0.3",

View File

@ -10,7 +10,7 @@
"logs": "firebase functions:log" "logs": "firebase functions:log"
}, },
"engines": { "engines": {
"node": "8" "node": "10"
}, },
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",

View File

@ -7,8 +7,8 @@ module.exports = (req, res, next) => {
let idToken; let idToken;
// Checking that the token exists in the header of the request // Checking that the token exists in the header of the request
if (req.headers.authorization) { if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
idToken = req.headers.authorization; idToken = req.headers.authorization.split('Bearer ')[1];
} else { } else {
console.error('No token found'); console.error('No token found');
return res.status(403).json({ error: 'Unauthorized'}); return res.status(403).json({ error: 'Unauthorized'});

View File

@ -23,6 +23,18 @@
"build": "react-scripts build", "build": "react-scripts build",
"test": "react-scripts test --env=jsdom", "test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject" "eject": "react-scripts eject"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}, },
"proxy": "https://us-central1-twistter-e4649.cloudfunctions.net/api" "proxy": "https://us-central1-twistter-e4649.cloudfunctions.net/api"
} }

View File

@ -5,6 +5,7 @@ import './App.css';
import { BrowserRouter as Router } from 'react-router-dom'; import { BrowserRouter as Router } from 'react-router-dom';
import Route from 'react-router-dom/Route'; import Route from 'react-router-dom/Route';
import NavBar, { Navbar } from './components/layout/NavBar';
// Pages // Pages
import home from './Home.js'; import home from './Home.js';
@ -13,12 +14,15 @@ import login from './Login.js';
import user from './pages/user'; import user from './pages/user';
import writeMicroblog from './Writing_Microblogs.js'; import writeMicroblog from './Writing_Microblogs.js';
import edit from './pages/edit.js'; import edit from './pages/edit.js';
import userLine from './Userline.js';
class App extends Component { class App extends Component {
render() { render() {
return ( return (
<Router> <Router>
<div className='container'>
<Navbar />
</div>
<div className="app"> <div className="app">
<Route exact path="/" component={home}/> <Route exact path="/" component={home}/>
@ -27,6 +31,7 @@ class App extends Component {
<Route exact path="/user" component={user}/> <Route exact path="/user" component={user}/>
<Route exact path="/home" component={writeMicroblog}/> <Route exact path="/home" component={writeMicroblog}/>
<Route exact path="/edit" component={edit}/> <Route exact path="/edit" component={edit}/>
<Route exact path="/userline" component={userLine}/>
</div> </div>
</Router> </Router>

View File

@ -5,8 +5,6 @@ import './App.css';
import logo from './images/twistter-logo.png'; import logo from './images/twistter-logo.png';
import TextField from '@material-ui/core/TextField'; import TextField from '@material-ui/core/TextField';
import axios from 'axios';
class Login extends Component { class Login extends Component {
render() { render() {
return ( return (

View File

@ -4,8 +4,6 @@ import './App.css';
import logo from './images/twistter-logo.png'; import logo from './images/twistter-logo.png';
import TextField from '@material-ui/core/TextField'; import TextField from '@material-ui/core/TextField';
//import axios from 'axios';
class Register extends Component { class Register extends Component {
render() { render() {
return ( return (

View File

@ -0,0 +1,37 @@
import React, { Component } from "react";
import { BrowserRouter as Router } from 'react-router-dom';
import Route from 'react-router-dom/Route';
import axios from 'axios';
class Userline extends Component {
constructor(props)
{
super(props);
this.state = {
microBlogs : []
}
}
componentDidMount() {
axios.get('http://localhost:5001/twistter-e4649/us-central1/api/getallPostsforUser')
.then(res => {
const post = res.data;
this.setState({microBlogs : post})
})
}
render() {
return (
<ul>
{ this.state.microBlogs.map(microBlog => <p>{microBlog.body}</p>)}
</ul>
)
}
}
export default Userline;

View File

@ -1,6 +1,7 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { BrowserRouter as Router } from 'react-router-dom'; import { BrowserRouter as Router } from 'react-router-dom';
import Route from 'react-router-dom/Route'; import Route from 'react-router-dom/Route';
import axios from 'axios';
class Writing_Microblogs extends Component { class Writing_Microblogs extends Component {
@ -25,8 +26,22 @@ class Writing_Microblogs extends Component {
} }
handleSubmit(event) { handleSubmit(event) {
alert('A title for the microblog was inputted: ' + this.state.title + '\nA microblog was posted: ' + this.state.value); // alert('A title for the microblog was inputted: ' + this.state.title + '\nA microblog was posted: ' + this.state.value);
const response = axios.post(
'http://localhost:5001/twistter-e4649/us-central1/api/putPost',
{ body: this.state.value,
userHandle: "new user",
userImage: "bing-url",
microBlogTitle: this.state.title
},
{ headers: { 'Content-Type': 'application/json'} }
)
console.log(response.data);
event.preventDefault(); event.preventDefault();
this.setState({value: '', title: '',characterCount: 10})
} }
handleChangeforPost(event) { handleChangeforPost(event) {
@ -37,6 +52,7 @@ class Writing_Microblogs extends Component {
const charCount = event.target.value.length const charCount = event.target.value.length
const charRemaining = 10 - charCount const charRemaining = 10 - charCount
this.setState({characterCount: charRemaining }) this.setState({characterCount: charRemaining })
} }

View File

@ -10,8 +10,8 @@ export class Navbar extends Component {
return ( return (
<AppBar> <AppBar>
<ToolBar> <ToolBar>
<Button component={ Link } to='/user'> <Button component={ Link } to='/'>
User Home
</Button> </Button>
<Button component={ Link } to='/login'> <Button component={ Link } to='/login'>
Login Login
@ -19,9 +19,7 @@ export class Navbar extends Component {
<Button component={ Link } to='/register'> <Button component={ Link } to='/register'>
Register Register
</Button> </Button>
<Button component={ Link } to='/'>
Home
</Button>
</ToolBar> </ToolBar>
</AppBar> </AppBar>
) )