From 7e53b28fda33761d9a26c05c9804c0388bc5d131 Mon Sep 17 00:00:00 2001 From: Anand Date: Sat, 30 Jan 2021 21:10:04 +0530 Subject: [PATCH] invite --- pages/404.tsx | 13 +- pages/_app.tsx | 2 +- pages/poll/[id].tsx | 38 +---- src/components/PollInfo.tsx | 2 +- src/components/PollsList.tsx | 26 +-- src/components/ResponseMessage.tsx | 24 +-- .../{shareinvite.tsx => ShareInvite.tsx} | 148 ++++++++++-------- src/components/SubmitChoices.tsx | 2 +- src/components/SubmitFinalChoice.tsx | 2 +- src/styles/index.css | 82 +++++++++- 10 files changed, 210 insertions(+), 129 deletions(-) rename src/components/{shareinvite.tsx => ShareInvite.tsx} (65%) diff --git a/pages/404.tsx b/pages/404.tsx index dcc46df..1fe7670 100644 --- a/pages/404.tsx +++ b/pages/404.tsx @@ -5,14 +5,17 @@ import Layout from "../src/components/Layout"; const NotFound = (): JSX.Element => { return ( - - + + -

Page not found

+

404

+

We can't seem to find the page you're looking for.

+ But here's the link to our - Landing page - + homepage! + {" "} + :D

diff --git a/pages/_app.tsx b/pages/_app.tsx index f261149..8b25c28 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -12,7 +12,7 @@ const App = ({ Component, pageProps }: AppProps): JSX.Element => { const persistor = persistStore(store); return ( - Loading}> + }> ); diff --git a/pages/poll/[id].tsx b/pages/poll/[id].tsx index 7bbd2eb..cc2dd2b 100644 --- a/pages/poll/[id].tsx +++ b/pages/poll/[id].tsx @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { GetServerSideProps } from "next"; -import { Row, Container, Jumbotron, Alert } from "react-bootstrap"; +import { Row, Container, Jumbotron } from "react-bootstrap"; import { useSelector } from "react-redux"; import dayjs from "dayjs"; import localizedFormat from "dayjs/plugin/localizedFormat"; @@ -15,7 +15,7 @@ import { RocketMeetPollFromDB, } from "../../src/models/poll"; import { decrypt } from "../../src/helpers/helpers"; -import ShareInvite from "../../src/components/shareinvite"; +import ShareInvite from "../../src/components/ShareInvite"; import { RootState } from "../../src/store/store"; dayjs.extend(localizedFormat); @@ -37,15 +37,6 @@ const Poll = (props: { choices: [], }); const [finalChoice, setFinalChoice] = useState(); - const [showPopS, setShowPopS] = useState(false); - const [showPopF, setShowPopF] = useState(false); - - const handleChangeS = (newValS: boolean): void => { - setShowPopS(newValS); - }; - const handleChangeF = (newValF: boolean): void => { - setShowPopF(newValF); - }; return ( @@ -56,12 +47,7 @@ const Poll = (props: { {pollFromDB.open && loggedInUserEmailID === pollCreatorEmailID && ( - + )} @@ -81,24 +67,6 @@ const Poll = (props: {
-
- setShowPopS(false)} - dismissible - > - Successfully sent mails - - setShowPopF(false)} - dismissible - > - Mails not sent - -
); diff --git a/src/components/PollInfo.tsx b/src/components/PollInfo.tsx index 1e6ebe1..3af3e25 100644 --- a/src/components/PollInfo.tsx +++ b/src/components/PollInfo.tsx @@ -19,7 +19,7 @@ const PollInfo = (props: { poll: RocketMeetPollFromDB }): JSX.Element => { {poll.open ? "Open" : "Closed"} diff --git a/src/components/PollsList.tsx b/src/components/PollsList.tsx index 87c5988..a874495 100644 --- a/src/components/PollsList.tsx +++ b/src/components/PollsList.tsx @@ -48,16 +48,22 @@ const PollsList = (): JSX.Element => { return pollList.reverse().map((item: RocketMeetPollFromDB) => (
- - {item.title} - - {item.open ? "open" : "closed"} - - + +
+ + {item.title} + +
+
+ + {item.open ? "open" : "closed"} + +
+
{ const { response, onHide } = props; + let responseClassName: string; + + if (response.type === "error") { + responseClassName = "rm-response-error"; + } else if (response.type === "success") { + responseClassName = "rm-response-success"; + } else { + responseClassName = "rm-response-null"; + } + return ( - - + + {response.msg} diff --git a/src/components/shareinvite.tsx b/src/components/ShareInvite.tsx similarity index 65% rename from src/components/shareinvite.tsx rename to src/components/ShareInvite.tsx index 7431f41..2dcb76c 100644 --- a/src/components/shareinvite.tsx +++ b/src/components/ShareInvite.tsx @@ -8,15 +8,14 @@ import { import copy from "copy-to-clipboard"; import { useState } from "react"; import { useSelector } from "react-redux"; +import ResponseMessage from "./ResponseMessage"; import { MailerPollArgs } from "../models/poll"; import { RootState } from "../store/store"; import { mailerAPI } from "../api/mailer"; -const Invitation = (props: { +const ShareInvite = (props: { pollid: string; polltitle: string; - onChangeS(arg: boolean): void; - onChangeF(arg: boolean): void; }): JSX.Element => { const { pollid } = props; const { polltitle } = props; @@ -32,20 +31,30 @@ const Invitation = (props: { const [emailList, setEmails] = useState([]); const [error, setError] = useState(""); + const [response, setResponse] = useState({ + status: false, + type: "null", + msg: "", + }); + const handleCopy = (): void => { copy(pollurl); }; + const popover = ( - Copied + Copied! ); + const isInList = (email: string): boolean => { return emailList.includes(email); }; + const isEmail = (email: string): boolean => { return /[\w\d.-]+@[\w\d.-]+\.[\w\d.-]+/.test(email); }; + const isValid = (email: string): boolean => { let mailerror = null; if (isInList(email)) { @@ -60,8 +69,9 @@ const Invitation = (props: { } return true; }; + const handleKeyDown = (evt: React.KeyboardEvent): void => { - if (["Enter", "Tab", " ", ","].includes(evt.key)) { + if ([","].includes(evt.key)) { evt.preventDefault(); let value = currentEmail.trim(); if (value && isValid(value)) { @@ -70,14 +80,16 @@ const Invitation = (props: { } } }; + const handleChange = (evt: React.ChangeEvent): void => { setCurrentEmail(evt.target.value); setError(""); }; - /* added void and removed email:any to email:string ( remove this comment at last PR) */ + const handleDelete = (email: string): void => { setEmails(emailList.filter((i) => i !== email)); }; + const handlePaste = (evt: React.ClipboardEvent): void => { evt.preventDefault(); let paste = evt.clipboardData.getData("text"); @@ -87,18 +99,8 @@ const Invitation = (props: { setEmails([...emailList, ...toBeAdded]); } }; - const handlePreSubmit = (): void => { - let value = currentEmail.trim(); - if (value && isValid(value)) { - setEmails([...emailList, value]); - setCurrentEmail(""); - } - handleSubmit(); - } - /* added void below( remove this comment at last PR) */ - const handleSubmit = async (): Promise => { - /* console.log(emailList); which is also to be removed */ + const handleSubmit = async (): Promise => { const mailerArgs: MailerPollArgs = { pollID: pollid, pollTitle: polltitle, @@ -106,75 +108,97 @@ const Invitation = (props: { senderName: displayName, senderEmailID: loggedInUserEmailID, }; - const { statusCode } = await mailerAPI.sendPollInvites(mailerArgs, token); - if (statusCode === 200) { - props.onChangeS(true); + const sendEmailsResponse = await mailerAPI.sendPollInvites( + mailerArgs, + token + ); + if (sendEmailsResponse.statusCode === 200) { + setResponse({ + status: true, + type: "success", + msg: "Emails successfully sent.", + }); } else { - props.onChangeF(true); + setResponse({ + status: true, + type: "error", + msg: "Unable to send emails. Please try again later.", + }); } }; return ( -
+
{ e.preventDefault(); }} > - + + Share link + + + + + + + + + + + - Invite participants by email -
- {emailList.map((email) => ( -
- {email} - -
- ))} -
+ Invite participants
- +
+ ))} + {error &&

{error}

} +
+ - {error &&

{error}

} - - - Share Link - - - - - - - - - + + setResponse({ status: false, type: "null", msg: "" }) + } + />
); }; -export default Invitation; +export default ShareInvite; diff --git a/src/components/SubmitChoices.tsx b/src/components/SubmitChoices.tsx index 8082ecc..9497f85 100644 --- a/src/components/SubmitChoices.tsx +++ b/src/components/SubmitChoices.tsx @@ -34,7 +34,7 @@ const SubmitChoices = (props: { setResponse({ status: true, type: "error", - msg: `${JSON.stringify(submitChoiceResponse.data.message)}`, + msg: "Please try again later.", }); } }; diff --git a/src/components/SubmitFinalChoice.tsx b/src/components/SubmitFinalChoice.tsx index a1aa142..447ffd1 100644 --- a/src/components/SubmitFinalChoice.tsx +++ b/src/components/SubmitFinalChoice.tsx @@ -45,7 +45,7 @@ const SubmitFinalChoice = (props: { setResponse({ status: true, type: "error", - msg: `${JSON.stringify(submitFinalChoiceResponse.data.message)}`, + msg: "Please try again later.", }); } }; diff --git a/src/styles/index.css b/src/styles/index.css index 57ac252..b7ce4ff 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -392,7 +392,15 @@ h4 { float: right; } -.rm-badge { +.rm-badge-dash { + padding-top: 0.6em !important; + padding-left: 0.6em !important; + padding-right: 0.6em !important; + padding-bottom: 0.6em !important; + float: right !important; +} + +.rm-badge-poll { padding-top: 0.6em !important; padding-left: 0.6em !important; padding-right: 0.6em !important; @@ -427,6 +435,12 @@ h4 { padding-right: 3rem; } +.poll-shareinvite-content { + margin-top: 3rem; + padding-left: 2rem; + padding-right: 3rem; +} + .poll-info-title { font-size: 3.5rem; font-weight: 700; @@ -462,6 +476,11 @@ h4 { padding-right: 0; } + .poll-shareinvite-content { + padding-left: 0; + padding-right: 0; + } + .poll-info-title { font-size: 2.3rem; } @@ -471,6 +490,10 @@ h4 { } } +.emailList { + margin-top: 0.5rem; +} + .poll-info-final-date { padding-top: 2rem; display: block; @@ -662,7 +685,7 @@ h4 { min-height: inherit !important; } .card-body { - padding: 0.5rem !important; + padding: 0 !important; min-height: 80px !important; } @@ -685,8 +708,8 @@ h4 { } .tag-item { - background-color: #d4d5d6; - color: #000000; + background-color: #575757; + color: #ffffff; display: inline-block; font-size: 14px; font-weight: 300; @@ -886,6 +909,10 @@ h4 { position: absolute; } +.rm-response-null { + display: none !important; +} + .rm-response-error { background-color: #f8d7da !important; color: #721c24 !important; @@ -895,3 +922,50 @@ h4 { background-color: #d4edda !important; color: #155724 !important; } + +.rm-response-title { + font-size: 1.2rem !important; +} + +@media (min-width: 0) and (max-width: 992px) { + .rm-response-title { + font-size: 1rem !important; + } +} + +.share-textbox { + background-color: #101010 !important; + color: #e0e0e0 !important; + border: 2px solid #6c757d !important; + border-top-left-radius: 1rem !important; + border-bottom-left-radius: 1rem !important; +} + +.share-textbox:focus { + border: 2px solid #a9aaac !important; +} + +.invite-textbox { + background-color: #101010 !important; + color: #e0e0e0 !important; + border: 2px solid #6c757d !important; + border-radius: 1rem !important; +} + +.invite-textbox:focus { + border: 2px solid #a9aaac !important; +} + +.invite-textbox::placeholder { + color: #e0e0e0 !important; +} + +@media (min-width: 0) and (max-width: 992px) { + .share-textbox { + font-size: 1rem !important; + } + + .invite-textbox { + font-size: 1rem !important; + } +}