diff --git a/functions/handlers/post.js b/functions/handlers/post.js index 2be5bda..af1b854 100644 --- a/functions/handlers/post.js +++ b/functions/handlers/post.js @@ -1,6 +1,8 @@ /* eslint-disable prefer-arrow-callback */ /* eslint-disable promise/always-return */ const admin = require('firebase-admin'); +const { db } = require('../util/admin'); + exports.putPost = (req, res) => { const newPost = { @@ -12,11 +14,13 @@ exports.putPost = (req, res) => { createdAt: new Date().toISOString(), likeCount: 0, commentCount: 0, - microBlogTopics: req.body.microBlogTopics + microBlogTopics: req.body.microBlogTopics, + quoteBody: null }; admin.firestore().collection('posts').add(newPost) .then((doc) => { + doc.update({postId: doc.id}) const resPost = newPost; resPost.postId = doc.id; return res.status(200).json(resPost); @@ -29,6 +33,7 @@ exports.putPost = (req, res) => { exports.getallPostsforUser = (req, res) => { var post_query = admin.firestore().collection("posts").where("userHandle", "==", req.user.handle); + post_query.get() .then(function(myPosts) { let posts = []; @@ -38,11 +43,11 @@ exports.getallPostsforUser = (req, res) => { return res.status(200).json(posts); }) .then(function() { - res.status(200).send("Successfully retrieved all user's posts from database."); - return; + return res.status(200).json("Successfully retrieved all user's posts from database."); + }) .catch(function(err) { - res.status(500).send("Failed to retrieve user's posts from database.", err); + return res.status(500).json("Failed to retrieve user's posts from database.", err); }); }; @@ -57,14 +62,236 @@ exports.getallPosts = (req, res) => { return res.status(200).json(posts); }) .then(function() { - res.status(200).send("Successfully retrieved every post from database."); - return; + return res.status(200).json("Successfully retrieved every post from database."); }) .catch(function(err) { - res.status(500).send("Failed to retrieve posts from database.", err); + return res.status(500).json("Failed to retrieve posts from database.", err); }); }; +exports.quoteWithPost = (req, res) => { + + let quoteData; + const quoteDoc = admin.firestore().collection('quote'). + where('userHandle', '==', req.user.handle). + where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + quoteData = doc.data(); + return quoteDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if(data.empty) { + return admin.firestore().collection('quote').add({ + quoteId : req.params.postId, + userHandle : req.user.handle, + quoteBody : req.body.quoteBody + }) + .then(() => { + const post = { + body: quoteData.body, + userHandle : req.user.handle, + quoteBody: req.body.quoteBody, + createdAt : new Date().toISOString(), + userImage: req.body.userImage, + likeCount: 0, + commentCount: 0, + userID: req.user.uid, + microBlogTitle: quoteData.microBlogTitle, + microBlogTopics: quoteData.microBlogTopics, + quoteId: req.params.postId + } + return admin.firestore().collection('posts').add(post) + .then((doc) => { + doc.update({postId: doc.id}) + const resPost = post; + resPost.postId = doc.id; + return res.status(200).json(resPost); + }) + }) + } + else { + return res.status(400).json({ error: 'Post has already been quoted.' }); + } + }) + .catch((err) => { + return res.status(500).json({error: err}); + + }) + +} + +exports.quoteWithoutPost = (req, res) => { + let quoteData; + const quoteDoc = admin.firestore().collection('quote'). + where('userHandle', '==', req.user.handle). + where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + quoteData = doc.data(); + return quoteDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if(data.empty) { + return admin.firestore().collection('quote').add({ + quoteId : req.params.postId, + userHandle : req.user.handle, + quoteBody: null + }) + .then(() => { + const post = { + userHandle : req.user.handle, + body: quoteData.body, + quoteBody: null, + createdAt : new Date().toISOString(), + likeCount: 0, + commentCount: 0, + userID: req.user.uid, + userImage: req.body.userImage, + microBlogTitle: quoteData.microBlogTitle, + microBlogTopics: quoteData.microBlogTopics, + quoteId: req.params.postId + } + return admin.firestore().collection('posts').add(post) + .then((doc) => { + doc.update({postId: doc.id}) + const resPost = post; + resPost.postId = doc.id; + return res.status(200).json(resPost); + }) + + + + }) + } + else { + return res.status(400).json({ error: 'Post has already been quoted.' }); + } + }) + .catch((err) => { + return res.status(500).json({error: 'Something is wrong'}); + + }) + +} + +exports.checkforLikePost = (req, res) => { + const likedPostDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + let result; + + likedPostDoc.get() + .then((data) => { + if (data.empty) { + result = false; + return res.status(200).json(result); + } + else + { + result = true; + return res.status(200).json(result); + } + }) +} + +exports.likePost = (req, res) => { + let postData; + const likeDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + postData = doc.data(); + return likeDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + if (data.empty) { + return admin.firestore().collection('likes').add({ + postId : req.params.postId, + userHandle: req.user.handle + + }) + .then(() => { + postData.likeCount++; + return postDoc.update({likeCount : postData.likeCount}) + }) + .then(() => { + return res.status(200).json(postData); + }) + } + }) + .catch((err) => { + return res.status(500).json({error: 'Something is wrong'}); + }) + +} + + +exports.unlikePost = (req, res) => { + + let postData; + const likeDoc = admin.firestore().collection('likes').where('userHandle', '==', req.user.handle) + .where('postId', '==', req.params.postId).limit(1); + + const postDoc = db.doc(`/posts/${req.params.postId}`); + + postDoc.get() + .then((doc) => { + if(doc.exists) { + postData = doc.data(); + return likeDoc.get(); + } + else + { + return res.status(404).json({error: 'Post not found'}); + } + }) + .then((data) => { + return db + .doc(`/likes/${data.docs[0].id}`) + .delete() + .then(() => { + postData.likeCount--; + return postDoc.update({ likeCount: postData.likeCount }); + }) + .then(() => { + res.status(200).json(postData); + }); + + }) + .catch((err) => { + console.error(err); + return res.status(500).json({error: 'Something is wrong'}); + }) + +} + exports.getFilteredPosts = (req, res) => { admin.firestore().collection('posts').where('userHandle', '==', 'new user').where('microBlogTopics', '==') -}; \ No newline at end of file +}; diff --git a/functions/handlers/topic.js b/functions/handlers/topic.js index a55f748..88e014e 100644 --- a/functions/handlers/topic.js +++ b/functions/handlers/topic.js @@ -1,20 +1,28 @@ const { admin, db } = require("../util/admin"); exports.putTopic = (req, res) => { - const newTopic = { - topic: req.body.topic - }; - - admin - .firestore() - .collection("topics") - .add(newTopic) + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef + .get() .then(doc => { - const resTopic = newTopic; - return res.status(200).json(resTopic); + new_following = doc.data().followedTopics; + new_following.push(req.body.following); + + // add stuff + userRef + .set({ followedTopics: new_following }, { merge: true }) + .then(doc => { + return res + .status(201) + .json({ message: `Following ${req.body.following}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + return res.status(200).json({ message: "OK" }); }) .catch(err => { - console.error(err); - return res.status(500).json({ error: "something is wrong" }); + return res.status(500).json({ err }); }); }; @@ -40,21 +48,46 @@ exports.getAllTopics = (req, res) => { }; exports.deleteTopic = (req, res) => { - const topic = db.doc(`/topics/${req.params.topicId}`); - topic + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef .get() .then(doc => { - if (!doc.exists) { - return res.status(404).json({ error: "Topic not found" }); - } else { - return topic.delete(); - } - }) - .then(() => { - return res.json({ message: "Topic successfully deleted!" }); + new_following = doc.data().followedTopics; + // remove username from array + new_following.forEach(function(follower, index) { + if (follower === `${req.body.unfollow}`) { + new_following.splice(index, 1); + } + }); + + // update database + userRef + .set({ followedTopics: new_following }, { merge: true }) + .then(doc => { + return res + .status(202) + .json({ message: `Successfully unfollow ${req.body.unfollow}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + return res.status(200).json({ message: "ok" }); }) .catch(err => { - console.error(err); - return res.status(500).json({ error: "Failed to delete topic." }); + return res.status(500).json({ err }); + }); +}; + +exports.getUserTopics = (req, res) => { + let data = []; + db.doc(`/users/${req.body.handle}`) + .get() + .then(doc => { + data = doc.data().followedTopics; + return res.status(200).json({ data }); + }) + .catch(err => { + return res.status(500).json({ err }); }); }; diff --git a/functions/handlers/users.js b/functions/handlers/users.js index 42e1a35..5350d19 100644 --- a/functions/handlers/users.js +++ b/functions/handlers/users.js @@ -70,12 +70,15 @@ exports.signup = (req, res) => { }) .then(idToken => { token = idToken; + const defaultImageUrl = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/no-img.png?alt=media`; const userCred = { email: newUser.email, handle: newUser.handle, createdAt: newUser.createdAt, userId, - followedTopics: [] + followedTopics: [], + imageUrl: defaultImageUrl, + verified: false }; return db.doc(`/users/${newUser.handle}`).set(userCred); }) @@ -193,62 +196,83 @@ exports.login = (req, res) => { } }; -//Deletes user account +//Deletes user account and all associated data exports.deleteUser = (req, res) => { - var currentUser; - firebase.auth().onAuthStateChanged(function(user) { - currentUser = user; - if (currentUser) { - var post_query = db - .collection("posts") - .where("userHandle", "==", req.user.handle); - post_query - .get() - .then(function(myPosts) { - myPosts.forEach(function(doc) { - doc.ref.delete(); - }); - return; - }) - .then(function() { - res - .status(200) - .send("Successfully removed all user's posts from database."); - return; - }) - .catch(function(err) { - res - .status(500) - .send("Failed to remove all user's posts from database.", err); - }); + // Get the profile image filename + // `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media` + let imageFileName; + req.userData.imageUrl + ? (imageFileName = req.userData.imageUrl.split("/o/")[1].split("?alt=")[0]) + : (imageFileName = "no-img.png"); - db.collection("users") - .doc(`${req.user.handle}`) - .delete() - .then(function() { - res.status(200).send("Sucessfully removed user from database."); - return; - }) - .catch(function(err) { - res.status(500).send("Failed to remove user from database.", err); - }); + const userId = req.userData.userId; + let errors = {}; - currentUser - .delete() - .then(function() { - console.log("Successfully deleted user."); - res.status(200).send("Sucessfully deleted user."); - return; - }) - .catch(function(err) { - console.log("Failed to delete user.", err); - res.status(500).send("Failed to delete user."); + function thenFunction(data) { + console.log(`${data} data for ${req.userData.handle} has been deleted.`); + } + + function catchFunction(data, err) { + console.error(err); + errors[data] = err; + } + + // Deletes user from authentication + let auth = admin.auth().deleteUser(userId); + + // Deletes database data + let data = db + .collection("users") + .doc(`${req.user.handle}`) + .delete(); + + // Deletes any custom profile image + let image; + if (imageFileName !== "no-img.png") { + image = admin + .storage() + .bucket() + .file(imageFileName) + .delete(); + } else { + image = Promise.resolve(); + } + + // Deletes all users posts + let posts = db + .collection("posts") + .where("userHandle", "==", req.user.handle) + .get() + .then(query => { + query.forEach(snap => { + snap.ref.delete(); + }); + return; + }); + + let promises = [ + auth.then(thenFunction("auth")).catch(err => catchFunction("auth", err)), + data.then(thenFunction("data")).catch(err => catchFunction("data", err)), + image.then(thenFunction("image")).catch(err => catchFunction("image", err)), + posts.then(thenFunction("posts")).catch(err => catchFunction("image", err)) + ]; + + // Wait for all promises to resolve + let waitPromise = Promise.all(promises); + + waitPromise + .then(() => { + if (Object.keys(errors) > 0) { + return res.status(500).json(errors); + } else { + return res.status(200).json({ + message: `All data for ${req.userData.handle} has been deleted.` }); - } else { - console.log("Failed to deleter user or cannot get user."); - res.status(500).send("Failed to deleter user or cannot get user."); - } - }); + } + }) + .catch(err => { + return res.status(500).json({ error: err }); + }); }; // Returns all data in the database for the user who is currently signed in @@ -325,20 +349,146 @@ exports.getAuthenticatedUser = (req, res) => { }); }; -exports.getUserHandles = (req, res) => { - admin - .firestore() - .collection("users") +// Verifies the user sent to the request +// Must be run by the Admin user +exports.verifyUser = (req, res) => { + if (req.userData.handle !== "Admin") { + return res.status(403).json({ error: "This must be done as Admin" }); + } + + db.doc(`/users/${req.body.user}`) .get() - .then(data => { - let users = []; - data.forEach(function(doc) { - users.push(doc.data().handle); - }); - return res.status(200).json(users); + .then(doc => { + if (doc.exists) { + let verifiedUser = doc.data(); + verifiedUser.verified = true; + return db + .doc(`/users/${req.body.user}`) + .set(verifiedUser, { merge: true }); + } else { + return res + .status(400) + .json({ error: `User ${req.body.user} was not found` }); + } + }) + .then(() => { + return res + .status(201) + .json({ message: `${req.body.user} is now verified` }); + }) + .catch(err => { + console.error(err); + return res.status(500).json({ error: err.code }); + }); +}; + +// Unverifies the user sent to the request +// Must be run by admin +exports.unverifyUser = (req, res) => { + if (req.userData.handle !== "Admin") { + return res.status(403).json({ error: "This must be done as Admin" }); + } + + db.doc(`/users/${req.body.user}`) + .get() + .then(doc => { + if (doc.exists) { + let unverifiedUser = doc.data(); + unverifiedUser.verified = false; + return db + .doc(`/users/${req.body.user}`) + .set(unverifiedUser, { merge: true }); + } else { + return res + .status(400) + .json({ error: `User ${req.body.user} was not found` }); + } + }) + .then(() => { + return res + .status(201) + .json({ message: `${req.body.user} is no longer verified` }); + }) + .catch(err => { + console.error(err); + return res.status(500).json({ error: err.code }); + }); +}; +exports.getUserHandles = (req, res) => { + db.doc(`/users/${req.body.userHandle}`) + .get() + .then(doc => { + if (doc.exists) { + let userHandle = doc.data().handle; + return res.status(200).json(userHandle); + } else { + return res.status(404).json({ error: "user not found" }); + } }) .catch(err => { console.error(err); return res.status(500).json({ error: "Failed to get all user handles." }); }); }; + +exports.addSubscription = (req, res) => { + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef.get().then(doc => { + new_following = doc.data().following; + new_following.push(req.body.following); + + // add stuff + userRef + .set({ following: new_following }, { merge: true }) + .then(doc => { + return res + .status(201) + .json({ message: `Following ${req.body.following}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + return res.status(200).json({ message: "ok" }); + }); +}; + +exports.getSubs = (req, res) => { + let data = []; + db.doc(`/users/${req.userData.handle}`) + .get() + .then(doc => { + data = doc.data().following; + return res.status(200).json({ data }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); +}; + +exports.removeSub = (req, res) => { + let new_following = []; + let userRef = db.doc(`/users/${req.userData.handle}`); + userRef.get().then(doc => { + new_following = doc.data().following; + // remove username from array + new_following.forEach(function(follower, index) { + if (follower === `${req.body.unfollow}`) { + new_following.splice(index, 1); + } + }); + + // update database + userRef + .set({ following: new_following }, { merge: true }) + .then(doc => { + return res + .status(202) + .json({ message: `Successfully unfollow ${req.body.unfollow}` }); + }) + .catch(err => { + return res.status(500).json({ err }); + }); + return res.status(200).json({ message: "ok" }); + }); +}; diff --git a/functions/index.js b/functions/index.js index 32adda0..ee203eb 100644 --- a/functions/index.js +++ b/functions/index.js @@ -17,7 +17,12 @@ const { signup, deleteUser, updateProfileInfo, - getUserHandles + verifyUser, + unverifyUser, + getUserHandles, + addSubscription, + getSubs, + removeSub } = require("./handlers/users"); // Adds a user to the database and registers them in firebase with @@ -32,7 +37,7 @@ app.post("/login", login); //Deletes user account app.delete("/delete", fbAuth, deleteUser); -app.get("/getUser", fbAuth, getUserDetails); +app.post("/getUserDetails", fbAuth, getUserDetails); // Returns all profile data of the currently logged in user app.get("/getProfileInfo", fbAuth, getProfileInfo); @@ -42,13 +47,30 @@ app.post("/updateProfileInfo", fbAuth, updateProfileInfo); app.get("/user", fbAuth, getAuthenticatedUser); +// Verifies the user sent to the request +// Must be run by the Admin user +app.post("/verifyUser", fbAuth, verifyUser); + +// Unverifies the user sent to the request +// Must be run by admin +app.post("/unverifyUser", fbAuth, unverifyUser); + // get user handles with search phase -app.get("/getUserHandles", fbAuth, getUserHandles); +app.post("/getUserHandles", fbAuth, getUserHandles); + +// get user's subscription +app.get("/getSubs", fbAuth, getSubs); + +// add user to another user's "following" data field +app.post("/addSubscription", fbAuth, addSubscription); + +// remove one subscription +app.post("/removeSub", fbAuth, removeSub); /*------------------------------------------------------------------* * handlers/post.js * *------------------------------------------------------------------*/ -const { getallPostsforUser, getallPosts, putPost } = require("./handlers/post"); +const { getallPostsforUser, getallPosts, putPost, likePost, unlikePost, quoteWithPost, quoteWithoutPost, checkforLikePost} = require("./handlers/post"); app.get("/getallPostsforUser", fbAuth, getallPostsforUser); @@ -57,10 +79,24 @@ app.get("/getallPosts", getallPosts); // Adds one post to the database app.post("/putPost", fbAuth, putPost); +app.get("/like/:postId", fbAuth, likePost); +app.get("/unlike/:postId", fbAuth, unlikePost); +app.get("/checkforLikePost/:postId", fbAuth, checkforLikePost); + +app.post("/quoteWithPost/:postId", fbAuth, quoteWithPost); +app.post("/quoteWithoutPost/:postId", fbAuth, quoteWithoutPost); + + + /*------------------------------------------------------------------* * handlers/topic.js * *------------------------------------------------------------------*/ -const { putTopic, getAllTopics, deleteTopic } = require("./handlers/topic"); +const { + putTopic, + getAllTopics, + deleteTopic, + getUserTopics +} = require("./handlers/topic"); // add topic to database app.post("/putTopic", fbAuth, putTopic); @@ -69,6 +105,9 @@ app.post("/putTopic", fbAuth, putTopic); app.get("/getAllTopics", fbAuth, getAllTopics); // delete a specific topic -app.delete("/deleteTopic/:topicId", fbAuth, deleteTopic); +app.post("/deleteTopic", fbAuth, deleteTopic); + +// get topic for this user +app.post("/getUserTopics", fbAuth, getUserTopics); exports.api = functions.https.onRequest(app); diff --git a/twistter-frontend/package.json b/twistter-frontend/package.json index f7dd12f..a0cec16 100644 --- a/twistter-frontend/package.json +++ b/twistter-frontend/package.json @@ -41,5 +41,5 @@ "last 1 safari version" ] }, - "proxy": "https://us-central1-twistter-e4649.cloudfunctions.net/api" + "proxy": "http://localhost:5001/twistter-e4649/us-central1/api" } diff --git a/twistter-frontend/src/App.js b/twistter-frontend/src/App.js index 71c16a2..9e29d2e 100644 --- a/twistter-frontend/src/App.js +++ b/twistter-frontend/src/App.js @@ -19,8 +19,6 @@ import { logoutUser, getUserData } from "./redux/actions/userActions"; // Components import AuthRoute from "./util/AuthRoute"; -// axios.defaults.baseURL = 'http://localhost:5006/twistter-e4649/us-central1/api'; - // Pages import home from "./pages/Home"; import signup from "./pages/Signup"; @@ -31,7 +29,9 @@ import Delete from "./pages/Delete"; import writeMicroblog from "./Writing_Microblogs.js"; import editProfile from "./pages/editProfile"; import userLine from "./Userline.js"; +import verify from "./pages/verify"; import Search from "./pages/Search.js"; +import otherUser from "./pages/otherUser"; const theme = createMuiTheme(themeObject); @@ -64,11 +64,10 @@ class App extends Component {
- {/* AuthRoute checks if the user is logged in and if they are it redirects them to /home */} - + @@ -76,10 +75,11 @@ class App extends Component { + + -
diff --git a/twistter-frontend/src/components/layout/NavBar.js b/twistter-frontend/src/components/layout/NavBar.js index 9c720b0..f1e1b4a 100644 --- a/twistter-frontend/src/components/layout/NavBar.js +++ b/twistter-frontend/src/components/layout/NavBar.js @@ -1,71 +1,84 @@ /* eslint-disable */ -import React, { Component } from 'react'; -import { Link } from 'react-router-dom'; -import PropTypes from 'prop-types'; +import React, { Component } from "react"; +import { Link } from "react-router-dom"; +import PropTypes from "prop-types"; // Material UI stuff -import AppBar from '@material-ui/core/AppBar'; -import ToolBar from '@material-ui/core/Toolbar'; -import Button from '@material-ui/core/Button'; +import AppBar from "@material-ui/core/AppBar"; +import ToolBar from "@material-ui/core/Toolbar"; +import Button from "@material-ui/core/Button"; import withStyles from "@material-ui/core/styles/withStyles"; // Redux stuff -import { logoutUser } from '../../redux/actions/userActions'; -import { connect } from 'react-redux'; +import { logoutUser } from "../../redux/actions/userActions"; +import { connect } from "react-redux"; const styles = { - form: { - textAlign: "center" - }, - textField: { - marginBottom: 30 - }, - pageTitle: { - marginBottom: 40 - }, - button: { - positon: "relative", - marginBottom: 30 - }, - progress: { - position: "absolute" - } - }; - + form: { + textAlign: "center" + }, + textField: { + marginBottom: 30 + }, + pageTitle: { + marginBottom: 40 + }, + button: { + positon: "relative", + marginBottom: 30 + }, + progress: { + position: "absolute" + } +}; + export class Navbar extends Component { - render() { - const authenticated = this.props.user.authenticated; - return ( - - - - {authenticated && } - {!authenticated && } - {!authenticated && } - {authenticated && } - - - ) - } + render() { + const authenticated = this.props.user.authenticated; + return ( + + + + {authenticated && ( + + )} + {!authenticated && ( + + )} + {!authenticated && ( + + )} + {authenticated && ( + + )} + {authenticated && ( + + )} + + + ); + } } -const mapStateToProps = (state) => ({ - user: state.user -}) +const mapStateToProps = state => ({ + user: state.user +}); Navbar.propTypes = { - user: PropTypes.object.isRequired, - classes: PropTypes.object.isRequired -} + user: PropTypes.object.isRequired, + classes: PropTypes.object.isRequired +}; export default connect(mapStateToProps)(withStyles(styles)(Navbar)); diff --git a/twistter-frontend/src/pages/Home.js b/twistter-frontend/src/pages/Home.js index 37cebf9..ab1cc71 100644 --- a/twistter-frontend/src/pages/Home.js +++ b/twistter-frontend/src/pages/Home.js @@ -16,6 +16,8 @@ import '../App.css'; import logo from '../images/twistter-logo.png'; import noImage from '../images/no-img.png'; import Writing_Microblogs from '../Writing_Microblogs'; +import ReactModal from 'react-modal'; + const styles = { card: { @@ -24,7 +26,10 @@ const styles = { } class Home extends Component { - state = {}; + state = { + + }; + componentDidMount() { axios @@ -46,6 +51,8 @@ class Home extends Component { render() { let authenticated = this.props.user.authenticated; let {classes} = this.props; + let username = this.props.user.credentials.handle; + let postMarkup = this.state.posts ? ( this.state.posts.map(post => @@ -60,11 +67,15 @@ class Home extends Component { {this.formatDate(post.createdAt)}
{post.microBlogTitle} + {post.quoteBody} +
{post.body}
- Topics: {post.microBlogTopics} + Topics: {post.microBlogTopics}
- Likes {post.likeCount} Comments {post.commentCount} + {/* Likes {post.likeCount} */} + +
) @@ -108,6 +119,217 @@ class Home extends Component { } } + +class Quote extends Component { + constructor(props) { + super(props); + this.state = { + characterCount: 250, + showModal: false, + value: "" + } + + this.handleSubmitWithoutPost = this.handleSubmitWithoutPost.bind(this); + this.handleOpenModal = this.handleOpenModal.bind(this); + this.handleCloseModal = this.handleCloseModal.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + handleSubmitWithoutPost(event) { + const post = { + + userImage: "bing-url", + } + const headers = { + headers: { "Content-Type": "application/json" } + }; + axios.post(`/quoteWithoutPost/${this.props.microblog}`, post, headers) + .then((res) => { + + console.log(res.data); + }) + .catch(err => { + + console.error(err); + }); + event.preventDefault(); + } + + handleOpenModal() { + this.setState({ showModal: true }); + } + + handleCloseModal() { + this.setState({ showModal: false }); + } + + handleChangeforPost(event) { + this.setState({ value: event.target.value }); + } + + handleChangeforCharacterCount(event) { + const charCount = event.target.value.length; + const charRemaining = 250 - charCount; + this.setState({ characterCount: charRemaining }); + } + + handleSubmit(event) { + const quotedPost = { + quoteBody: this.state.value, + userImage: "bing-url", + }; + const headers = { + headers: { "Content-Type": "application/json" } + }; + axios.post(`/quoteWithPost/${this.props.microblog}`, quotedPost, headers) + .then((res) => { + + console.log(res.data); + }) + .catch(err => { + + console.error(err); + }); + event.preventDefault(); + this.setState({ showModal: false, characterCount: 250, value: "" }); + } + + render() { + return ( +
+ + +
+
+