From 64d6f536b1bd242251d07838310c569c700a0dbb Mon Sep 17 00:00:00 2001 From: Barry Low Date: Fri, 9 Nov 2018 11:39:46 -0800 Subject: [PATCH 01/14] Setup email-verification page --- client/package-lock.json | 44 +++++++++---------- client/src/App.js | 10 ++++- .../views/common/components/BannerTopBar.js | 26 +++++++++++ client/src/views/common/index.js | 3 ++ client/src/views/email-verification/index.js | 11 +++++ client/src/views/index.js | 3 +- 6 files changed, 73 insertions(+), 24 deletions(-) create mode 100644 client/src/views/common/components/BannerTopBar.js create mode 100644 client/src/views/common/index.js create mode 100644 client/src/views/email-verification/index.js diff --git a/client/package-lock.json b/client/package-lock.json index 0dbd8d1b6..29334fd6c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -44,9 +44,9 @@ } }, "@advancedalgos/teams-client": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@advancedalgos/teams-client/-/teams-client-0.0.24.tgz", - "integrity": "sha512-xJV3GgJRHgjVJeSDGBeR2YjBN5KYczLMYJr0ry/i41a9W2MEilyxeA50j69H+r0zFM5jzr6GwSJp9x+mAnUSyw==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@advancedalgos/teams-client/-/teams-client-0.0.25.tgz", + "integrity": "sha512-hO4eQTe1hpLO9PsI2QrUu80ouQCGbs4uz2xhlHSMtmhcLcBMQaH2QBYOAJI6lcalF8GvdlyhDrlbjr1T/H5I1w==", "dev": true, "requires": { "@advancedalgos/web-components": "0.0.13", @@ -70,9 +70,9 @@ "minilog": "^3.1.0", "prop-types": "^15.6.2", "query-string": "^6.2.0", - "react": "^16.5.2", + "react": "^16.6.1", "react-apollo": "^2.2.4", - "react-dom": "^16.5.2", + "react-dom": "^16.6.1", "react-router-dom": "^4.3.1", "recompose": "^0.30.0", "subscriptions-transport-ws": "^0.9.15" @@ -2269,7 +2269,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -2729,7 +2729,7 @@ "dependencies": { "jsesc": { "version": "1.3.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, @@ -8161,7 +8161,7 @@ }, "hoek": { "version": "4.2.1", - "resolved": "http://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", "dev": true }, @@ -9771,7 +9771,7 @@ }, "jest-get-type": { "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, @@ -16525,14 +16525,14 @@ } }, "react": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.6.0.tgz", - "integrity": "sha512-zJPnx/jKtuOEXCbQ9BKaxDMxR0001/hzxXwYxG8septeyYGfsgAei6NgfbVgOhbY1WOP2o3VPs/E9HaN+9hV3Q==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.6.1.tgz", + "integrity": "sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.10.0" + "scheduler": "^0.11.0" } }, "react-apollo": { @@ -16690,14 +16690,14 @@ } }, "react-dom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.0.tgz", - "integrity": "sha512-Stm2D9dXEUUAQdvpvhvFj/DEXwC2PAL/RwEMhoN4dvvD2ikTlJegEXf97xryg88VIAU22ZAP7n842l+9BTz6+w==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.1.tgz", + "integrity": "sha512-zm+wBuEMGm009Wt1uE4Zw5KcXOW7qC4E/xW/fpJsCsbOco4U/R84u+DzzO/S4SYSdNBcqcaulcp4w3FXl8pImw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.10.0" + "scheduler": "^0.11.0" } }, "react-dropzone": { @@ -16963,7 +16963,7 @@ }, "cacache": { "version": "10.0.4", - "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { @@ -19287,9 +19287,9 @@ } }, "scheduler": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.10.0.tgz", - "integrity": "sha512-+TSTVTCBAA3h8Anei3haDc1IRwMeDmtI/y/o3iBe3Mjl2vwYF9DtPDt929HyRmV/e7au7CLu8sc4C4W0VOs29w==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.0.tgz", + "integrity": "sha512-MAYbBfmiEHxF0W+c4CxMpEqMYK+rYF584VP/qMKSiHM6lTkBKKYOJaDiSILpJHla6hBOsVd6GucPL46o2Uq3sg==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -20541,7 +20541,7 @@ }, "topo": { "version": "2.0.2", - "resolved": "http://registry.npmjs.org/topo/-/topo-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", "dev": true, "requires": { diff --git a/client/src/App.js b/client/src/App.js index 39d60ce90..fe3d4e87b 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -7,11 +7,12 @@ import MuiThemeProvider from '@material-ui/core/styles/MuiThemeProvider' import CssBaseline from '@material-ui/core/CssBaseline' import { withStyles } from '@material-ui/core/styles' import { theme, globalStyles } from './styles' +import './styles/styles.scss' import { client } from './graphql/apollo' import Auth from './auth' -import { Layout, Home, Charts, Callback } from './views' +import { Layout, Home, Charts, Callback, EmailSignupConfirm } from './views' import Users from '@advancedalgos/users-client' import Teams from '@advancedalgos/teams-client' @@ -38,6 +39,13 @@ export const MasterApp = (props) => ( return }} /> + { + console.log(props, props.match) + return + }} + /> } diff --git a/client/src/views/common/components/BannerTopBar.js b/client/src/views/common/components/BannerTopBar.js new file mode 100644 index 000000000..866cbfe2a --- /dev/null +++ b/client/src/views/common/components/BannerTopBar.js @@ -0,0 +1,26 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Typography from '@material-ui/core/Typography' + +const BannerTopBar = ({ + size, + backgroundUrl, + title, + text +}) => ( +
+
+ {title} + {text} +
+
+) + +BannerTopBar.propTypes = { + backgroundUrl: PropTypes.string, + size: PropTypes.string, + title: PropTypes.string, + text: PropTypes.string +} + +export default BannerTopBar diff --git a/client/src/views/common/index.js b/client/src/views/common/index.js new file mode 100644 index 000000000..9af9dc8f7 --- /dev/null +++ b/client/src/views/common/index.js @@ -0,0 +1,3 @@ +import BannerTopBar from './components/BannerTopBar' + +export { BannerTopBar } diff --git a/client/src/views/email-verification/index.js b/client/src/views/email-verification/index.js new file mode 100644 index 000000000..c4ca17709 --- /dev/null +++ b/client/src/views/email-verification/index.js @@ -0,0 +1,11 @@ +import React from 'react' + +import { BannerTopBar } from '../common' + +const EmailSignupConfirm = () => { + return ( + + ) +} + +export default EmailSignupConfirm diff --git a/client/src/views/index.js b/client/src/views/index.js index c86a62d96..1d70a9d6c 100644 --- a/client/src/views/index.js +++ b/client/src/views/index.js @@ -2,5 +2,6 @@ import Home from './home' import Charts from './charts' import Callback from './callback' import Layout from './layout' +import EmailSignupConfirm from './email-verification' -export { Layout, Home, Charts, Callback } +export { Layout, Home, Charts, Callback, EmailSignupConfirm } From 7bea3c511bbb5944764b989cbe6be94a8f0d1373 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Fri, 9 Nov 2018 11:43:38 -0800 Subject: [PATCH 02/14] Refactor BannerTopBar to common > components --- client/src/views/BannerTopBar/index.js | 18 ------------------ client/src/views/callback/index.js | 9 +++++++-- client/src/views/charts/index.js | 2 +- client/src/views/home/index.js | 2 +- 4 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 client/src/views/BannerTopBar/index.js diff --git a/client/src/views/BannerTopBar/index.js b/client/src/views/BannerTopBar/index.js deleted file mode 100644 index 255e9888d..000000000 --- a/client/src/views/BannerTopBar/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import Typography from '@material-ui/core/Typography' - -const BannerTopBar = ({ - size, - backgroundUrl, - title, - text -}) => ( -
-
- {title} - {text} -
-
-) - -export default BannerTopBar diff --git a/client/src/views/callback/index.js b/client/src/views/callback/index.js index 2dbf4c27f..11a90d15c 100644 --- a/client/src/views/callback/index.js +++ b/client/src/views/callback/index.js @@ -1,7 +1,12 @@ import React from 'react' -import { MessageCard } from '@advancedalgos/web-components' +import BannerTopBar from '../common' -const Callback = () => +const Callback = () => export default Callback diff --git a/client/src/views/charts/index.js b/client/src/views/charts/index.js index 9d9d7b308..d4fed8b1c 100644 --- a/client/src/views/charts/index.js +++ b/client/src/views/charts/index.js @@ -2,7 +2,7 @@ import React, { Component } from 'react' import { withStyles } from '@material-ui/core/styles' import { connect } from 'react-redux' -import BannerTopBar from '../BannerTopBar' +import BannerTopBar from '../common' const styles = theme => ({ '@global': { diff --git a/client/src/views/home/index.js b/client/src/views/home/index.js index e4d01a623..6b19f4e80 100644 --- a/client/src/views/home/index.js +++ b/client/src/views/home/index.js @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import BannerTopBar from '../BannerTopBar' +import BannerTopBar from '../common' import { Typography } from '@material-ui/core' class Home extends Component { From a50579ffb69011bd819d5a683f4fef3e98dccae2 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Fri, 9 Nov 2018 11:45:07 -0800 Subject: [PATCH 03/14] BannerTopBar as named export --- client/src/views/callback/index.js | 2 +- client/src/views/charts/index.js | 2 +- client/src/views/home/index.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/views/callback/index.js b/client/src/views/callback/index.js index 11a90d15c..01ae059fa 100644 --- a/client/src/views/callback/index.js +++ b/client/src/views/callback/index.js @@ -1,6 +1,6 @@ import React from 'react' -import BannerTopBar from '../common' +import { BannerTopBar } from '../common' const Callback = () => ({ '@global': { diff --git a/client/src/views/home/index.js b/client/src/views/home/index.js index 6b19f4e80..c38b24f5a 100644 --- a/client/src/views/home/index.js +++ b/client/src/views/home/index.js @@ -1,5 +1,5 @@ import React, { Component } from 'react' -import BannerTopBar from '../common' +import { BannerTopBar } from '../common' import { Typography } from '@material-ui/core' class Home extends Component { From 55514651b6e97d88bd3326050d8afae963360880 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Fri, 9 Nov 2018 12:15:29 -0800 Subject: [PATCH 04/14] Allow BannerTopBar to recieve string or array for title + text --- client/src/views/common/components/BannerTopBar.js | 4 ++-- client/src/views/email-verification/index.js | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client/src/views/common/components/BannerTopBar.js b/client/src/views/common/components/BannerTopBar.js index 866cbfe2a..3c6b3505e 100644 --- a/client/src/views/common/components/BannerTopBar.js +++ b/client/src/views/common/components/BannerTopBar.js @@ -19,8 +19,8 @@ const BannerTopBar = ({ BannerTopBar.propTypes = { backgroundUrl: PropTypes.string, size: PropTypes.string, - title: PropTypes.string, - text: PropTypes.string + title: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), + text: PropTypes.oneOfType([PropTypes.string, PropTypes.array]) } export default BannerTopBar diff --git a/client/src/views/email-verification/index.js b/client/src/views/email-verification/index.js index c4ca17709..889a88613 100644 --- a/client/src/views/email-verification/index.js +++ b/client/src/views/email-verification/index.js @@ -2,10 +2,11 @@ import React from 'react' import { BannerTopBar } from '../common' -const EmailSignupConfirm = () => { - return ( - - ) -} +export const EmailSignupConfirm = () => , 'Thank you for opting-in to recieve updates about the Advanced Algos project!']} + backgroundUrl='https://aacorporatesitedevelop.azurewebsites.net/img/photos/superalgos-platform.jpg' +/> export default EmailSignupConfirm From b870d0d491ba25883f626f1bfa46c42bdb831330 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Fri, 9 Nov 2018 12:17:05 -0800 Subject: [PATCH 05/14] Add key to email-verification text
--- client/src/views/email-verification/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/views/email-verification/index.js b/client/src/views/email-verification/index.js index 889a88613..07994f5ba 100644 --- a/client/src/views/email-verification/index.js +++ b/client/src/views/email-verification/index.js @@ -5,7 +5,7 @@ import { BannerTopBar } from '../common' export const EmailSignupConfirm = () => , 'Thank you for opting-in to recieve updates about the Advanced Algos project!']} + text={['Processing newsletter sign-up...',
, 'Thank you for opting-in to recieve updates about the Advanced Algos project!']} backgroundUrl='https://aacorporatesitedevelop.azurewebsites.net/img/photos/superalgos-platform.jpg' /> From 3e8a8e2cb190511f5a68a35c6f6740c85d339b7a Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 17:01:22 -0800 Subject: [PATCH 06/14] add email verification graphql --- client/package-lock.json | 7 +- client/package.json | 1 + client/src/App.js | 4 +- .../graphql/NewsletterSignupVerify.js | 10 +++ client/src/views/email-verification/index.js | 78 +++++++++++++++++-- 5 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 client/src/views/email-verification/graphql/NewsletterSignupVerify.js diff --git a/client/package-lock.json b/client/package-lock.json index 3ac9f99d0..7080a7b91 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -4779,8 +4779,7 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { "version": "1.0.1", @@ -16420,7 +16419,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz", "integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==", - "dev": true, "requires": { "decode-uri-component": "^0.2.0", "strict-uri-encode": "^2.0.0" @@ -20077,8 +20075,7 @@ "strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" }, "string-length": { "version": "2.0.0", diff --git a/client/package.json b/client/package.json index ba2b863e8..bffac01d4 100644 --- a/client/package.json +++ b/client/package.json @@ -90,6 +90,7 @@ "npm": "^6.4.1", "optimize-css-assets-webpack-plugin": "^5.0.1", "prop-types": "^15.6.2", + "query-string": "^6.2.0", "react": "^16.6.1", "react-apollo": "^2.2.4", "react-dom": "^16.6.1", diff --git a/client/src/App.js b/client/src/App.js index fe3d4e87b..58d5f4ec7 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -42,8 +42,8 @@ export const MasterApp = (props) => ( { - console.log(props, props.match) - return + console.log(props.location) + return }} /> , 'Thank you for opting-in to recieve updates about the Advanced Algos project!']} - backgroundUrl='https://aacorporatesitedevelop.azurewebsites.net/img/photos/superalgos-platform.jpg' -/> +import NEWSLETTER_SIGNUP_VERIFY from './graphql/NewsletterSignupVerify' + +export const EmailSignupConfirm = ({ tokenParam }) => { + let token + let BannerTitle = '' + let BannerText = '' + if (tokenParam !== '' && tokenParam !== null) { + const values = queryString.parse(tokenParam) + token = values.token + } else { + BannerText = [ + 'Newsletter Signup Error: Invalid Token', +
, + 'Please try signing up again! We apologize for the inconvenience,', +
, + 'but we highly value your seurity and privacy.' + ] + return ( + + ) + } + console.log(token) + return ( + + {(NewsletterSignupVerify, { loading, error, data }) => { + console.log(loading, error, data) + if (error) { + BannerText = ['Newsletter Signup Error: ',
, JSON.stringify(error)] + } + if (loading && !error) { + BannerText = ['Processing newsletter sign-up...',
, 'Thank you for opting-in to recieve updates about the Advanced Algos project!'] + } + if (data !== undefined && data !== null) { + console.log(data) + return ( + + ) + } else { + return ( + + ) + } + } + } +
+ ) +} + +EmailSignupConfirm.propTypes = { + tokenParam: PropTypes.string +} export default EmailSignupConfirm From ffa97b4b8cc04f52106ce384de101aac31dd6c9a Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 17:07:02 -0800 Subject: [PATCH 07/14] Remove default query from playground --- server/src/index.js | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/server/src/index.js b/server/src/index.js index 0201a1056..6e57897c1 100644 --- a/server/src/index.js +++ b/server/src/index.js @@ -90,16 +90,6 @@ async function run () { resolvers }) - const defaultQuery = `{ - teams_Teams{ - edges{ - node{ - name - } - } - } -} -` const app = express() app.use('/graphql', @@ -168,13 +158,7 @@ async function run () { settings: { 'editor.theme': 'dark', 'editor.cursorShape': 'line' - }, - tabs: [ - { - endpoint: process.env.GRAPHQL_API_URL, - query: defaultQuery - } - ] + } } }) From d5c5969f8c1a86d07ce0d454cb054c7d803b519d Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 18:44:54 -0800 Subject: [PATCH 08/14] Convert signup form to component --- .../components/SignupForm.js | 127 ++++++++++++++++++ .../components/SignupVerifyResponse.js | 68 ++++++++++ .../email-verification/components/styles.js | 65 +++++++++ .../graphql/NewsletterSignup.js | 10 ++ client/src/views/email-verification/index.js | 37 ++--- 5 files changed, 279 insertions(+), 28 deletions(-) create mode 100644 client/src/views/email-verification/components/SignupForm.js create mode 100644 client/src/views/email-verification/components/SignupVerifyResponse.js create mode 100644 client/src/views/email-verification/components/styles.js create mode 100644 client/src/views/email-verification/graphql/NewsletterSignup.js diff --git a/client/src/views/email-verification/components/SignupForm.js b/client/src/views/email-verification/components/SignupForm.js new file mode 100644 index 000000000..ab2903565 --- /dev/null +++ b/client/src/views/email-verification/components/SignupForm.js @@ -0,0 +1,127 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { withStyles } from '@material-ui/core/styles' +import withWidth from '@material-ui/core/withWidth' +import { Mutation } from 'react-apollo' + +import Typography from '@material-ui/core/Typography' +import Grid from '@material-ui/core/Grid' +import Button from '@material-ui/core/Button' +import InputBase from '@material-ui/core/InputBase' + +import styles from './styles' + +import NEWSLETTER_SIGNUP from '../graphql/NewsletterSignup' + +import { isEmpty } from '../../../utils/js-helpers' + +export class SignupForm extends Component { + constructor (props) { + super(props) + + this.handleChange = this.handleChange.bind(this) + this.handleSubmit = this.handleSubmit.bind(this) + this.validate = this.validate.bind(this) + + this.state = { + email: '', + emailError: '' + } + } + + render () { + const { classes, width } = this.props + return ( + + {(NewsletterSignup, { loading, error, data }) => { + let successMessage = false + if (data.NewsletterSignup === 'SUCESS') { + successMessage = true + } + return ( + + Stay in touch! + Opt-in our mailing list to stay up to date with the Advanced Algos Project. +
+ + Thank you for your interest! We'll keep you informed + + + + + +
+
+ ) + }} +
+ ) + } + + validate (data) { + const errors = {} + switch (data.id) { + case 'email': + if (data.value === '') { + this.setState({ emailError: 'Please enter an email address' }) + } else { + this.setState({ emailError: '' }) + } + break + default: + } + return errors + } + + handleChange (e) { + let id = e.target.id + let value = e.target.value + let error = this.validate({ id, value }) + switch (id) { + case 'email': + if (!isEmpty(error)) this.setState({ emailError: error }) + this.setState({ emaail: value }) + break + default: + } + } + + async handleSubmit (e, NewsletterSignup, email) { + e.preventDefault() + const signupResponse = await NewsletterSignup({ variables: { email } }) + console.log('NewsletterSignup: ', signupResponse) + this.setState({ email: '' }) + } +} + +SignupForm.propTypes = { + classes: PropTypes.object, + width: PropTypes.string +} + +const SignupFormWithStyles = withStyles(styles)(SignupForm) + +export default withWidth()(SignupFormWithStyles) diff --git a/client/src/views/email-verification/components/SignupVerifyResponse.js b/client/src/views/email-verification/components/SignupVerifyResponse.js new file mode 100644 index 000000000..b7eef1e6b --- /dev/null +++ b/client/src/views/email-verification/components/SignupVerifyResponse.js @@ -0,0 +1,68 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import { BannerTopBar } from '../../common' +import SignupForm from './SignupForm' + +export class SignupVerifyResponse extends React.Component { + componentDidMount () { + const { mutate } = this.props + mutate() + }; + + render () { + const { loading, error, data } = this.props + let BannerTitle = '' + let BannerText = '' + let displayForm = false + console.log('SignupVerifyResponse:', loading, error, data) + if (error) { + if (error.message === 'GraphQL error: Error: Token Expired. Please resubmit email address.') { + BannerText = [ + 'Newsletter Signup Error: Verification Token Expired', +
, + 'Please try signing up again! We apologize for the inconvenience,', +
, + 'but we highly value your seurity and privacy.' + ] + } else { + BannerText = ['Newsletter Signup Error: ',
, error.message] + } + } + if (loading && !error) { + BannerText = ['Processing newsletter sign-up...',
, 'Thank you for opting-in to recieve updates about the Advanced Algos project!'] + } + if (data !== undefined && data !== null) { + console.log(data) + return ( + + + {displayForm && } + + ) + } else { + return ( + + ) + } + } +} + +SignupVerifyResponse.propTypes = { + mutate: PropTypes.string, + loading: PropTypes.bool, + error: PropTypes.object, + data: PropTypes.object +} + +export default SignupVerifyResponse diff --git a/client/src/views/email-verification/components/styles.js b/client/src/views/email-verification/components/styles.js new file mode 100644 index 000000000..5c70b4544 --- /dev/null +++ b/client/src/views/email-verification/components/styles.js @@ -0,0 +1,65 @@ +import lightGreen from '@material-ui/core/colors/lightGreen' + +const styles = theme => ({ + textLight: { + color: theme.palette.primary.light + }, + textWhite: { + color: theme.palette.common.white + }, + textSuccess: { + color: lightGreen[400] + }, + copyright: { + paddingTop: theme.spacing.unit * 3 + }, + linkLight: { + color: theme.palette.secondary.main, + textDecoration: 'none' + }, + signupRight: { + marginTop: theme.spacing.unit * 2, + [theme.breakpoints.down('xs')]: { + textAlign: 'center' + } + }, + signupContainer: { + marginBottom: theme.spacing.unit * 2, + [theme.breakpoints.down('xs')]: { + textAlign: 'center' + } + }, + signupInput: { + borderRadius: 4, + backgroundColor: theme.palette.common.white, + border: '1px solid #ced4da', + fontSize: 16, + padding: '10px 12px', + transition: theme.transitions.create(['border-color', 'box-shadow']), + marginRight: theme.spacing.unit * 1 + }, + signupInputSubmit: { + boxShadow: 'none', + textTransform: 'none', + fontSize: 16, + lineHeight: '1.1875em', + color: theme.palette.common.white, + padding: '10px 12px', + backgroundColor: '#5bc0de', + borderColor: '#46b8da', + '&:hover': { + backgroundColor: '#31b0d5', + borderColor: '#269abc' + }, + '&:active': { + boxShadow: 'none', + backgroundColor: '#0062cc', + borderColor: '#005cbf' + }, + '&:focus': { + boxShadow: '0 0 0 0.2rem rgba(0,123,255,.5)' + } + } +}) + +export default styles diff --git a/client/src/views/email-verification/graphql/NewsletterSignup.js b/client/src/views/email-verification/graphql/NewsletterSignup.js new file mode 100644 index 000000000..314b47bf3 --- /dev/null +++ b/client/src/views/email-verification/graphql/NewsletterSignup.js @@ -0,0 +1,10 @@ +/* eslint-disable no-unused-vars */ +import gql from 'graphql-tag' + +const NEWSLETTER_SIGNUP = gql` + mutation NewsletterSignup($email: String!) { + master_NewsletterSignup(email: $email) + } +` + +export default NEWSLETTER_SIGNUP diff --git a/client/src/views/email-verification/index.js b/client/src/views/email-verification/index.js index 9c4df6a77..8e38064c6 100644 --- a/client/src/views/email-verification/index.js +++ b/client/src/views/email-verification/index.js @@ -4,12 +4,12 @@ import queryString from 'query-string' import { Mutation } from 'react-apollo' import { BannerTopBar } from '../common' +import SignupVerifyResponse from './components/SignupVerifyResponse' import NEWSLETTER_SIGNUP_VERIFY from './graphql/NewsletterSignupVerify' export const EmailSignupConfirm = ({ tokenParam }) => { let token - let BannerTitle = '' let BannerText = '' if (tokenParam !== '' && tokenParam !== null) { const values = queryString.parse(tokenParam) @@ -38,33 +38,14 @@ export const EmailSignupConfirm = ({ tokenParam }) => { variables={{ token: token }} > {(NewsletterSignupVerify, { loading, error, data }) => { - console.log(loading, error, data) - if (error) { - BannerText = ['Newsletter Signup Error: ',
, JSON.stringify(error)] - } - if (loading && !error) { - BannerText = ['Processing newsletter sign-up...',
, 'Thank you for opting-in to recieve updates about the Advanced Algos project!'] - } - if (data !== undefined && data !== null) { - console.log(data) - return ( - - ) - } else { - return ( - - ) - } + return ( + + ) } } From 00ff3f26640a3c6cbab787b7e191b743a810199e Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 22:35:18 -0800 Subject: [PATCH 09/14] Add children to BannerTopBar component --- .../views/common/components/BannerTopBar.js | 5 +- .../components/SignupForm.js | 49 ++++++++++++------- .../components/SignupVerifyResponse.js | 14 ++++-- server/src/resolvers/mutation/sendgrid.js | 6 ++- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/client/src/views/common/components/BannerTopBar.js b/client/src/views/common/components/BannerTopBar.js index 3c6b3505e..823877f72 100644 --- a/client/src/views/common/components/BannerTopBar.js +++ b/client/src/views/common/components/BannerTopBar.js @@ -6,17 +6,20 @@ const BannerTopBar = ({ size, backgroundUrl, title, - text + text, + children }) => (
{title} {text} + {children}
) BannerTopBar.propTypes = { + children: PropTypes.node, backgroundUrl: PropTypes.string, size: PropTypes.string, title: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), diff --git a/client/src/views/email-verification/components/SignupForm.js b/client/src/views/email-verification/components/SignupForm.js index ab2903565..4a8b7b862 100644 --- a/client/src/views/email-verification/components/SignupForm.js +++ b/client/src/views/email-verification/components/SignupForm.js @@ -25,35 +25,41 @@ export class SignupForm extends Component { this.state = { email: '', - emailError: '' + emailError: '', + success: false } } render () { - const { classes, width } = this.props + const { + classes, + width, + alignCenter, + displayTitle, + displayIntro + } = this.props return ( {(NewsletterSignup, { loading, error, data }) => { - let successMessage = false - if (data.NewsletterSignup === 'SUCESS') { - successMessage = true - } return ( - - Stay in touch! - Opt-in our mailing list to stay up to date with the Advanced Algos Project. + + {displayTitle && Stay in touch!} + {displayIntro && Opt-in our mailing list to stay up to date with the Advanced Algos Project.}
- Thank you for your interest! We'll keep you informed + Thank you for signing up! Please check your email and click on the confirmation link to complete the signup process. - + - - -
+ Meet us on Social Networks: From 255ccb53f1f665178c42c99135b693e1baa28cc2 Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 23:01:36 -0800 Subject: [PATCH 11/14] server: Update send verify url --- server/src/resolvers/mutation/sendgrid.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/src/resolvers/mutation/sendgrid.js b/server/src/resolvers/mutation/sendgrid.js index 39974194e..8e199d7a1 100644 --- a/server/src/resolvers/mutation/sendgrid.js +++ b/server/src/resolvers/mutation/sendgrid.js @@ -18,11 +18,7 @@ export default { logger.info('master_NewsletterSignup params email:') logger.info(email) const token = jwt.sign({ email: email }, API_KEY, { expiresIn: '1d' }) - let origin = 'https://advancedalgos.net' const params = '/email-verification?token=' - if (dev){ - origin = 'http://localhost:3100' - } const headers = { 'Content-Type': 'application/json', @@ -162,10 +158,6 @@ export default { return subscribe }, async master_Contact(parent, { email, subject, message, recaptcha }, ctx, info) { - let origin = 'https://advancedalgos.net' - if (dev){ - origin = 'http://localhost:4000' - } const headers = { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin' : origin, From 3b76bfabdb22a85a7c1f675d8f986e643c0fa7ce Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 23:11:21 -0800 Subject: [PATCH 12/14] update sign-up form responses --- .../components/SignupForm.js | 2 +- .../components/SignupVerifyResponse.js | 36 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/client/src/views/email-verification/components/SignupForm.js b/client/src/views/email-verification/components/SignupForm.js index 4a8b7b862..408fd5c3a 100644 --- a/client/src/views/email-verification/components/SignupForm.js +++ b/client/src/views/email-verification/components/SignupForm.js @@ -44,7 +44,7 @@ export class SignupForm extends Component { > {(NewsletterSignup, { loading, error, data }) => { return ( - + {displayTitle && Stay in touch!} {displayIntro && Opt-in our mailing list to stay up to date with the Advanced Algos Project.}
diff --git a/client/src/views/email-verification/components/SignupVerifyResponse.js b/client/src/views/email-verification/components/SignupVerifyResponse.js index 5fa3db408..a31cbe11b 100644 --- a/client/src/views/email-verification/components/SignupVerifyResponse.js +++ b/client/src/views/email-verification/components/SignupVerifyResponse.js @@ -31,24 +31,34 @@ export class SignupVerifyResponse extends React.Component { } else { BannerText = ['Newsletter Signup Error: ',
, error.message] } + return ( + + ) } if (loading && !error) { BannerText = ['Processing newsletter sign-up...',
, 'Thank you for opting-in to recieve updates about the Advanced Algos project!'] } if (data !== undefined && data !== null) { console.log(data) - return ( - - - {displayForm && } - - - ) + if (data.master_NewsletterSignupVerify === 'SUCCESS') { + return ( + + + {displayForm && } + + + ) + } } else { return ( Date: Mon, 12 Nov 2018 23:32:46 -0800 Subject: [PATCH 13/14] Add teams landing to nav --- client/src/views/layout/header/imports.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/views/layout/header/imports.js b/client/src/views/layout/header/imports.js index badac9507..fb9855a27 100644 --- a/client/src/views/layout/header/imports.js +++ b/client/src/views/layout/header/imports.js @@ -27,7 +27,7 @@ const teamsMenus = { title: 'Teams', to: '/teams', submenus: [ - { title: 'All teams', to: '/teams', icon: Search }, + { title: 'Explore teams', to: '/teams/explore', icon: Search }, { title: 'Your teams', to: '/teams/manage-teams', icon: Group, authenticated: true }, { title: 'Team members', to: '/teams/team-members', icon: People, authenticated: true }, { title: 'Financial beings', to: '/teams/financial-beings', icon: Adb, authenticated: true }, From a9909237d3bf323f45c1ee12964dda474c259e6a Mon Sep 17 00:00:00 2001 From: Barry Low Date: Mon, 12 Nov 2018 23:39:48 -0800 Subject: [PATCH 14/14] client: Teams 0.0.27 --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index bffac01d4..8c1268c56 100644 --- a/client/package.json +++ b/client/package.json @@ -23,7 +23,7 @@ "devDependencies": { "@advancedalgos/events-client": "^0.0.4", "@advancedalgos/key-vault-client": "^0.0.21", - "@advancedalgos/teams-client": "^0.0.26", + "@advancedalgos/teams-client": "^0.0.27", "@advancedalgos/users-client": "^0.0.19", "@advancedalgos/web-components": "0.0.13", "@babel/core": "^7.1.2",