├── .gitignore ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── example.env ├── gatsby-config.js ├── package.json ├── src ├── components │ ├── footer.js │ ├── header.js │ ├── layout.css │ ├── layout.js │ ├── session │ │ ├── AuthUserContext.js │ │ ├── withAuthentication.js │ │ └── withAuthorization.js │ ├── shared │ │ ├── EventCard.js │ │ ├── ReactDallasLogoSection.js │ │ └── icons │ │ │ ├── facebook.svg.js │ │ │ ├── linkedin.svg.js │ │ │ ├── slack.svg.js │ │ │ └── twitter.svg.js │ ├── signup-form.js │ └── signup-link.js ├── favicon.png ├── firebase │ ├── auth.js │ ├── db.js │ ├── firebase.js │ └── index.js ├── images │ ├── bottle-rocket-foyer.png │ ├── bottle-rocket-logo.png │ ├── firebase-logo.svg.js │ ├── react-dallas-logo.png │ ├── react-logo.svg.js │ └── reactjs-dallas-icon.svg.js ├── pages │ ├── 404.js │ ├── backers │ │ ├── backers.md │ │ └── index.js │ ├── current-event.js │ ├── dashboard.js │ ├── events │ │ ├── event-list.js │ │ └── index.js │ ├── index.js │ └── signup.js └── utils │ ├── constants │ ├── events.js │ └── index.js │ ├── getPageContext.js │ └── withRoot.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Project dependencies 2 | .cache 3 | node_modules 4 | yarn-error.log 5 | 6 | # Build directory 7 | /public 8 | .DS_Store 9 | 10 | # IDE specific 11 | .idea/ 12 | .vscode/ 13 | *.sw* 14 | 15 | # Environment variables 16 | .env 17 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /package.json 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "semi": true, 4 | "singleQuote": true, 5 | "tabs": false, 6 | "tabWidth": 2, 7 | "trailingComma": "es5" 8 | } 9 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | All participants in the **ReactJS Dallas** projects are required to comply with the following Code of Conduct. Administrators (see below for definition of administrators) will enforce this code throughout the **ReactJS Dallas**. 2 | 3 | # The Short Version 4 | 5 | Be respectful of other people; respectfully ask people to stop if you are bothered; respect privacy; understand we're mostly not-for-profit; and if you can’t resolve an issue then contact the Administrators. If you are being a problem, it will be apparent and you may be asked to leave the ReactJS Dallas organization. 6 | 7 | # The Long Version 8 | 9 | ## Respect 10 | 11 | The **ReactJS Dallas** is an intentionally positive community that recognizes and celebrates the creativity and collaboration of independent members and the diversity of skills, talents, experiences, cultures, and opinions that they bring to our community. 12 | 13 | The **ReactJS Dallas** is an inclusive environment, based on treating all individuals respectfully, regardless of gender or gender identity (including transgender status), sexual orientation, age, disability, nationality, ethnicity, religion (or lack thereof), or career path. 14 | 15 | We value respectful behavior above individual opinions. 16 | 17 | Respectful behavior includes but is not limited to: 18 | 19 | - Be considerate, kind, constructive, and helpful. 20 | - Avoid demeaning, discriminatory, harassing, hateful, or physically threatening behavior, speech, and imagery. 21 | - If you’re not sure, ask someone instead of assuming. No, really. Just ask the administrators. We’d rather hear from you than hear about something you said or did after the fact, and we are here to help. 22 | - Don’t be a bystander. Role model respectful behaviour, but also help to address disrespect when you see it. 23 | 24 | Disrespectful behavior outside this community may be considered a violation of this code of conduct at the discretion of the Administrators. 25 | 26 | ## Privacy 27 | 28 | This community is not a public space. However, no one has signed an non-disclosure agreement (“NDA”) to participate, and you should not presume anything you say here will remain private, so act accordingly. Protect IP and legally-protected information. 29 | 30 | If you want to publicly disclose anything discussed here, use the [Chatham House Rule](https://www.chathamhouse.org/about/chatham-house-rule) as the guideline (“participants are free to use the information received, but neither the identity nor the affiliation of the speaker(s), nor that of any other participant, may be revealed”). 31 | 32 | For attribution of specific content found on this repository, we ask that you ask the originator of the content for permission. If you don’t receive consent in a reasonable period of time, we ask that you credit the **“ReactJS Dallas User Group.”** 33 | 34 | ## Not For Profit 35 | 36 | This community is mostly not a place for commercial activity such as recruiting or marketing except in channels dedicated to that purpose which are: 37 | 38 | - #jobs channel in our Slack team 39 | 40 | If you join this community to just sell things and not contribute and learn, the community will quickly notice. If you are wondering where you can post commercial things, ask in #raect-slack-rules in the Slack team, not in the GitHub repository. 41 | 42 | ## Resolve Peacefully 43 | 44 | We believe peer-to-peer discussions, feedback, and corrections can help build a stronger, safer, and more welcoming community. 45 | 46 | If you see someone violating any part of this Code of Conduct, we urge you to respectfully dissuade them from such behavior. Expect that others in the community wish to help keep the community respectful, and welcome your input in doing so. 47 | 48 | If you experience disrespectful behavior toward yourself or anyone else and feel in any way unable or unwilling to respond or resolve it respectfully (for any reason), please immediately bring it to the attention of an Administrator. We want to hear from you about anything that you feel is disrespectful, threatening, or just something that could make someone feel distressed in any way. We will listen and work to resolve the matter. 49 | 50 | ## Apologize for Mistakes 51 | 52 | Should you catch yourself behaving disrespectfully, or be confronted as such, listen intently, own up to your words and actions, and apologize accordingly. No one is perfect, and even well-intentioned people make mistakes. What matters is how you handle them and that you avoid repeating them in the future. 53 | 54 | ## Consequences 55 | 56 | If you are unable to resolve a situation peacefully, please refer to our [Incident Process](https://github.com/reactjs-dallas/documents-and-resources/blob/master/incident-process.md) and choose a course of action that suits the situation. 57 | 58 | If the Administrators determine that a human is violating any part of this Code of Conduct, the Administrators may take any action they deem appropriate within this Github organization, up to and including expulsion and exclusion from the ReactJS Dallas organization and/or Slack team. 59 | 60 | As Administrators, we will seek to resolve conflicts peacefully and in a manner that is positive for the community. We can’t foresee every situation, and thus if in the Administrator's judgment the best thing to do is to ask a disrespectful individual to leave, we will do so. 61 | 62 | ## Administrators 63 | 64 | The administrators of ReactJS Dallas as of August 14th, 2018: 65 | 66 | @m2mathew ([Mike Mathew](mailto:m2mathew@me.com)) 67 | 68 | ## Thanks 69 | 70 | Thank you to every ReactJS Dallas community member for helping to make our home the respectful and inclusive community that it is. 71 | 72 | Very special thanks to the [Rands Leadership Slack](https://github.com/randsleadershipslack/documents-and-resources/blob/master/code-of-conduct.md) for the original model and idea for this Code of Conduct document. 73 | 74 | The true origins of the Code of Conduct are more likely here: [Chicago Camps](http://chicagocamps.org/code-of-conduct/), YxYY ([Yes and Yes Yes](http://www.yesandyesyes.com/)), and Hillary Hartley. We consider them as examples to look up to and emulate. We also thank the YxYY community member [Tantek Çelik](http://tantek.com/) and the other organizers of [IndieWebCamp](http://indiewebcamp.com/) for creating and sharing the [Code of Conduct](http://indiewebcamp.com/code-of-conduct) on which this one is based. 75 | 76 | If you question the need for a Code of Conduct, please see [this](http://indiewebcamp.com/code-of-conduct-why). 77 | 78 | V1.0 of this Code of Conduct was published on August 14th, 2018. 79 | 80 | This Code of Conduct is released under the [CC0 public domain license](https://creativecommons.org/publicdomain/zero/1.0/). 81 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to ReactJS Dallas Site 2 | 3 | Thanks for being awesome! We want contributing to the ReactJS Dallas website to be a great experience for anyone who wants to help. Contributions go far beyond pull requests and commits; we are thrilled to receive a variety of other contributions including the following: 4 | 5 | - Submitting updates to documentation that helps others build and contribute 6 | - Submitting spelling or grammar fixes 7 | - Adding test coverage 8 | - Reporting bugs or issues 9 | - Teaching others how to contribute to our project! 10 | 11 | ## Code of Conduct 12 | 13 | ReactJS Dallas is a safe place for anyone who wants to help build and develop any of our projects. We expect everyone participating in the ReactJS Dallas community to follow our [Code of Conduct](/CODE_OF_CONDUCT.md). Take a moment to read it. We have a long history of great experiences built on trust and learning all about React in a fun environment. Let's keep it going! 14 | 15 | ## Your first Pull Request 16 | 17 | Working on your first Pull Request? You can learn how from this free video series: 18 | 19 | How to Contribute to an Open Source Project on GitHub 20 | 21 | If you decide to fix an issue, please be sure to check the comment thread in case somebody is already working on a fix. If nobody is working on it at the moment, please leave a comment stating that you have started to work on it so other people don’t accidentally duplicate your effort. 22 | 23 | If somebody claims an issue but doesn’t follow up for more than a week, it’s fine to take it over but you should still leave a comment. 24 | 25 | ## Not sure how to start contributing? 26 | 27 | You can reach out to [Mike Mathew (@drumsensei) on Twitter](https://twitter.com/drumsensei) or submit an issue so someone on the team can give guidance. 28 | 29 | ## The usual contributing steps are: 30 | 31 | 1. Fork the repository. 32 | 2. Clone the fork to your local machine and add upstream remote: 33 | 34 | ``` 35 | git clone --depth=1 https://github.com//reactjs-dallas-site.git 36 | cd reactjs-dallas-site 37 | git remote add upstream https://github.com/reactjs-dallas/reactjs-dallas-site.git 38 | ``` 39 | 40 | 3. Synchronize your local master branch with the upstream one: 41 | 42 | ``` 43 | git checkout master 44 | git pull upstream master 45 | ``` 46 | 47 | 4. Create a new firebase project 48 | 49 | - In the "Project Overview" click on "Add app". API key and other variables will be available in the next steps. 50 | - If you already have an app added, then click the button in the image below. From there click '' to find API key and other variables. 51 | ![firebase get env values](https://res.cloudinary.com/drumsensei/image/upload/v1580149791/firebase-get-env-values.png) 52 | 53 | 5. Create a `.env` file in the root directory with variables that match the [`example.env`](https://github.com/reactjs-dallas/reactjs-dallas-site/blob/master/example.env) 54 | 55 | - Add your own values from the new firebase project from step 4 56 | - If you cannot locate the database url variable in your Firebase project settings, use sitename.firebaseio.com i.e. `https://reactjs-dallas-site.firebaseio.com` 57 | 58 | 6. Install dependencies: 59 | 60 | ``` 61 | yarn install 62 | ``` 63 | 64 | 7. Create a topic branch: 65 | 66 | ``` 67 | git checkout -b my-topic-branch 68 | ``` 69 | 70 | 8. Run the project in dev mode: 71 | 72 | ``` 73 | gatsby develop 74 | ``` 75 | 76 | 9. Make changes, commit, and push to your fork: 77 | 78 | ``` 79 | git push -u 80 | ``` 81 | 82 | The core team is monitoring for Pull Requests. We will review your Pull Request and either merge it, request changes to it, or close it with an explanation. 83 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 reactjs-dallas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactJS Dallas on the web 2 | 3 | Home of the ReactJS Dallas User Group, founded in February 2016. 4 | 5 | ## How to Contribute 🤝 6 | 7 | Whether you're helping us fix bugs, improve the docs, or spread the word, we'd love to have you as part of the ReactJS Dallas community! 😍 8 | 9 | Check out the [contributor docs](/CONTRIBUTING.md) for setup steps to get the site running on your local machine. 10 | 11 | **[Read the Contributing Guide](/CONTRIBUTING.md)** 12 | 13 | ### Code of Conduct 14 | 15 | ReactJS Dallas is a safe place for anyone who wants to help build and develop any of our projects. We expect everyone participating in the ReactJS Dallas community to follow our [Code of Conduct](/CODE_OF_CONDUCT.md). Take a moment to read it. We have a long history of great experiences built on trust and learning all about React in a fun environment. Let's keep it going! 16 | 17 | **[Read the Code of Conduct](/CODE_OF_CONDUCT.md)** 18 | 19 | ## Live Site 20 | https://www.reactjsdallas.com/ 21 | 22 | ## Bootstrapped with... 23 | 24 | The default Gatsby starter. 25 | 26 | ## License 27 | 28 | This project is licensed under the terms of the 29 | [MIT license](/LICENSE). 30 | -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | GATSBY_FIREBASE_API_KEY=your_firebase_api_key 2 | GATSBY_FIREBASE_AUTH_DOMAIN=your_firebase_auth_domain 3 | GATSBY_FIREBASE_DATABASE_URL=your_firebase_database_url 4 | GATSBY_FIREBASE_MESSAGING_SENDER_ID=your_firebase_messaging_sender_id 5 | GATSBY_FIREBASE_PROJECT_ID=your_firebase_project_id 6 | GATSBY_FIREBASE_STORAGE_BUCKET=your_firebase_storage_bucket 7 | GATSBY_FIREBASE_APP_ID=your_firebase_app_id 8 | -------------------------------------------------------------------------------- /gatsby-config.js: -------------------------------------------------------------------------------- 1 | // Give gatsby access to env keys 2 | require('dotenv').config({ 3 | path: '.env', 4 | }); 5 | 6 | module.exports = { 7 | siteMetadata: { 8 | title: 'ReactJS Dallas', 9 | }, 10 | plugins: [ 11 | { 12 | resolve: 'gatsby-plugin-material-ui', 13 | options: { 14 | }, 15 | }, 16 | { 17 | resolve: 'gatsby-source-filesystem', 18 | options: { 19 | name: 'src', 20 | path: `${__dirname}/src/`, 21 | }, 22 | }, 23 | 'gatsby-plugin-favicon', 24 | 'gatsby-transformer-remark', 25 | 'gatsby-plugin-react-helmet', 26 | 'gatsby-plugin-glamor', 27 | 'gatsby-plugin-remove-serviceworker', 28 | ], 29 | }; 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactjs-dallas-site", 3 | "description": "Internet website for the ReactJS Dallas User Group", 4 | "version": "1.17.0", 5 | "author": "Mike Mathew ", 6 | "engines": { 7 | "node": "10.x", 8 | "npm": "6.x" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/reactjs-dallas/reactjs-dallas-site" 13 | }, 14 | "dependencies": { 15 | "@babel/polyfill": "^7.12.1", 16 | "@material-ui/core": "^4.12.4", 17 | "@material-ui/icons": "^4.11.3", 18 | "@material-ui/styles": "^4.11.5", 19 | "core-js": "^3.26.0", 20 | "dotenv": "^8.2.0", 21 | "firebase": "^7.7.0", 22 | "gatsby": "^2.19.7", 23 | "gatsby-cli": "^2.8.27", 24 | "gatsby-plugin-favicon": "^3.1.6", 25 | "gatsby-plugin-glamor": "^2.1.19", 26 | "gatsby-plugin-material-ui": "^2.1.6", 27 | "gatsby-plugin-react-helmet": "^3.1.21", 28 | "gatsby-plugin-remove-serviceworker": "^1.0.0", 29 | "gatsby-source-filesystem": "^2.1.46", 30 | "gatsby-transformer-remark": "^2.6.48", 31 | "glamor": "^2.20.40", 32 | "prop-types": "^15.8.1", 33 | "react": "^16.12.0", 34 | "react-dom": "^16.12.0", 35 | "react-helmet": "^5.2.1" 36 | }, 37 | "keywords": [ 38 | "gatsby" 39 | ], 40 | "license": "MIT", 41 | "scripts": { 42 | "build": "gatsby build", 43 | "clean:purge": "gatsby clean && rm -rf node_modules && yarn cache clean && yarn install --force", 44 | "dev": "gatsby develop", 45 | "format": "prettier --write '**/*.js'", 46 | "test": "echo \"Error: no test specified\" && exit 1" 47 | }, 48 | "devDependencies": { 49 | "prettier": "^1.17.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/components/footer.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import Box from '@material-ui/core/Box'; 3 | import Button from '@material-ui/core/Button'; 4 | import PropTypes from 'prop-types'; 5 | import React from 'react'; 6 | import { withStyles } from '@material-ui/core/styles'; 7 | 8 | // Internal Dependencies 9 | import LinkedInSvg from './shared/icons/linkedin.svg'; 10 | import FacebookSvg from './shared/icons/facebook.svg'; 11 | import SlackSvg from './shared/icons/slack.svg'; 12 | import TwitterSvg from './shared/icons/twitter.svg'; 13 | 14 | 15 | // Local Variables 16 | const propTypes = { 17 | classes: PropTypes.shape({ 18 | copyright: PropTypes.string.isRequired, 19 | footer: PropTypes.string.isRequired, 20 | footerContent: PropTypes.string.isRequired, 21 | icon: PropTypes.string.isRequired, 22 | iconContainer: PropTypes.string.isRequired, 23 | link: PropTypes.string.isRequired, 24 | }).isRequired, 25 | }; 26 | const date = new Date(); 27 | const year = date.getFullYear(); 28 | 29 | const styles = theme => ({ 30 | copyright: { 31 | color: theme.palette.grey[300], 32 | fontSize: 15, 33 | }, 34 | footer: { 35 | background: '#20232A', 36 | display: 'flex', 37 | flexDirection: 'column', 38 | justifyContent: 'center', 39 | alignItems: 'center', 40 | padding: '1rem', 41 | }, 42 | footerContent: { 43 | display: 'flex', 44 | fontFamily: 'Roboto', 45 | justifyContent: 'center', 46 | margin: '0 auto', 47 | maxWidth: 960, 48 | padding: '0.5rem', 49 | }, 50 | icon: { 51 | height: 32, 52 | width: 32, 53 | }, 54 | iconContainer: { 55 | margin: '0 16px', 56 | }, 57 | link: { 58 | color: 'white', 59 | textDecoration: 'none', 60 | }, 61 | }); 62 | 63 | // Component Definition 64 | const Footer = ({ 65 | classes, 66 | siteTitle, 67 | }) => ( 68 |
69 |
70 |
71 | 77 | 78 | 79 |
80 |
81 | 87 | 88 | 89 |
90 |
91 | 97 | 98 | 99 |
100 |
101 | 107 | 108 | 109 |
110 |
111 | 112 |
113 | © {year} ReactJS Dallas User Group. All Rights Reserved. 114 |
115 | 116 | 117 | 123 | 124 |
125 | ); 126 | 127 | Footer.propTypes = propTypes; 128 | 129 | export default withStyles(styles)(Footer); 130 | -------------------------------------------------------------------------------- /src/components/header.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React from 'react'; 4 | import { Link } from 'gatsby'; 5 | import { withStyles } from '@material-ui/core/styles'; 6 | 7 | // Internal Dependencies 8 | import ReactLogoSvg from '../images/react-logo.svg'; 9 | 10 | // Local Variables 11 | const propTypes = { 12 | classes: PropTypes.shape({ 13 | link: PropTypes.string.isRequired, 14 | logo: PropTypes.string.isRequired, 15 | nav: PropTypes.string.isRequired, 16 | root: PropTypes.string.isRequired, 17 | }).isRequired, 18 | }; 19 | 20 | const styles = { 21 | link: { 22 | color: 'white', 23 | textDecoration: 'none', 24 | }, 25 | logo: { 26 | height: 24, 27 | marginRight: 8, 28 | transform: 'translateY(6px)', 29 | width: 24, 30 | }, 31 | nav: { 32 | alignItems: 'baseline', 33 | display: 'flex', 34 | fontFamily: 'Roboto', 35 | justifyContent: 'space-around', 36 | margin: '0 auto', 37 | maxWidth: 960, 38 | padding: '1rem', 39 | }, 40 | root: { 41 | background: '#20232A', 42 | }, 43 | }; 44 | 45 | // Component Definition 46 | const Header = ({ classes, siteTitle }) => ( 47 |
48 |
49 |
50 | 54 | {siteTitle} 55 | 56 |
57 |
58 | 62 | Events 63 | 64 |
65 |
66 | 70 | Backers 71 | 72 |
73 |
74 |
75 | ); 76 | 77 | Header.propTypes = propTypes; 78 | 79 | export default withStyles(styles)(Header); 80 | -------------------------------------------------------------------------------- /src/components/layout.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: Roboto, sans-serif; 3 | -ms-text-size-adjust: 100%; 4 | -webkit-text-size-adjust: 100%; 5 | } 6 | body { 7 | margin: 0; 8 | } 9 | article, 10 | aside, 11 | details, 12 | figcaption, 13 | figure, 14 | footer, 15 | header, 16 | main, 17 | menu, 18 | nav, 19 | section, 20 | summary { 21 | display: block; 22 | } 23 | audio, 24 | canvas, 25 | progress, 26 | video { 27 | display: inline-block; 28 | } 29 | audio:not([controls]) { 30 | display: none; 31 | height: 0; 32 | } 33 | progress { 34 | vertical-align: baseline; 35 | } 36 | [hidden], 37 | template { 38 | display: none; 39 | } 40 | a { 41 | background-color: transparent; 42 | -webkit-text-decoration-skip: objects; 43 | } 44 | a:active, 45 | a:hover { 46 | outline-width: 0; 47 | } 48 | abbr[title] { 49 | border-bottom: none; 50 | text-decoration: underline; 51 | text-decoration: underline dotted; 52 | } 53 | b, 54 | strong { 55 | font-weight: inherit; 56 | font-weight: bolder; 57 | } 58 | dfn { 59 | font-style: italic; 60 | } 61 | h1 { 62 | font-size: 2em; 63 | margin: 0.67em 0; 64 | } 65 | mark { 66 | background-color: #ff0; 67 | color: #000; 68 | } 69 | small { 70 | font-size: 80%; 71 | } 72 | sub, 73 | sup { 74 | font-size: 75%; 75 | line-height: 0; 76 | position: relative; 77 | vertical-align: baseline; 78 | } 79 | sub { 80 | bottom: -0.25em; 81 | } 82 | sup { 83 | top: -0.5em; 84 | } 85 | img { 86 | border-style: none; 87 | } 88 | svg:not(:root) { 89 | overflow: hidden; 90 | } 91 | code, 92 | kbd, 93 | pre, 94 | samp { 95 | font-family: monospace, monospace; 96 | font-size: 1em; 97 | } 98 | figure { 99 | margin: 1em 40px; 100 | } 101 | hr { 102 | box-sizing: content-box; 103 | height: 0; 104 | overflow: visible; 105 | } 106 | button, 107 | input, 108 | optgroup, 109 | select, 110 | textarea { 111 | font: inherit; 112 | margin: 0; 113 | } 114 | optgroup { 115 | font-weight: 700; 116 | } 117 | button, 118 | input { 119 | overflow: visible; 120 | } 121 | button, 122 | select { 123 | text-transform: none; 124 | } 125 | [type='reset'], 126 | [type='submit'], 127 | button, 128 | html [type='button'] { 129 | -webkit-appearance: button; 130 | } 131 | [type='button']::-moz-focus-inner, 132 | [type='reset']::-moz-focus-inner, 133 | [type='submit']::-moz-focus-inner, 134 | button::-moz-focus-inner { 135 | border-style: none; 136 | padding: 0; 137 | } 138 | [type='button']:-moz-focusring, 139 | [type='reset']:-moz-focusring, 140 | [type='submit']:-moz-focusring, 141 | button:-moz-focusring { 142 | outline: 1px dotted ButtonText; 143 | } 144 | fieldset { 145 | border: 1px solid silver; 146 | margin: 0 2px; 147 | padding: 0.35em 0.625em 0.75em; 148 | } 149 | legend { 150 | box-sizing: border-box; 151 | color: inherit; 152 | display: table; 153 | max-width: 100%; 154 | padding: 0; 155 | white-space: normal; 156 | } 157 | textarea { 158 | overflow: auto; 159 | } 160 | [type='checkbox'], 161 | [type='radio'] { 162 | box-sizing: border-box; 163 | padding: 0; 164 | } 165 | [type='number']::-webkit-inner-spin-button, 166 | [type='number']::-webkit-outer-spin-button { 167 | height: auto; 168 | } 169 | [type='search'] { 170 | -webkit-appearance: textfield; 171 | outline-offset: -2px; 172 | } 173 | [type='search']::-webkit-search-cancel-button, 174 | [type='search']::-webkit-search-decoration { 175 | -webkit-appearance: none; 176 | } 177 | ::-webkit-input-placeholder { 178 | color: inherit; 179 | opacity: 0.4; 180 | } 181 | ::-webkit-file-upload-button { 182 | -webkit-appearance: button; 183 | font: inherit; 184 | } 185 | html { 186 | font: 112.5%/1.45em georgia, serif; 187 | box-sizing: border-box; 188 | overflow-y: scroll; 189 | } 190 | * { 191 | box-sizing: inherit; 192 | } 193 | *:before { 194 | box-sizing: inherit; 195 | } 196 | *:after { 197 | box-sizing: inherit; 198 | } 199 | body { 200 | color: hsla(0, 0%, 0%, 0.8); 201 | font-family: Roboto, sans-serif; 202 | font-weight: normal; 203 | word-wrap: break-word; 204 | font-kerning: normal; 205 | -moz-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; 206 | -ms-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; 207 | -webkit-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; 208 | font-feature-settings: 'kern', 'liga', 'clig', 'calt'; 209 | } 210 | img { 211 | max-width: 100%; 212 | margin-left: 0; 213 | margin-right: 0; 214 | margin-top: 0; 215 | padding-bottom: 0; 216 | padding-left: 0; 217 | padding-right: 0; 218 | padding-top: 0; 219 | margin-bottom: 1.45rem; 220 | } 221 | h1 { 222 | margin-left: 0; 223 | margin-right: 0; 224 | margin-top: 0; 225 | padding-bottom: 0; 226 | padding-left: 0; 227 | padding-right: 0; 228 | padding-top: 0; 229 | margin-bottom: 1.45rem; 230 | color: inherit; 231 | /* font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 232 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; */ 233 | font-weight: bold; 234 | text-rendering: optimizeLegibility; 235 | font-size: 2.25rem; 236 | line-height: 1.1; 237 | } 238 | h2 { 239 | margin-left: 0; 240 | margin-right: 0; 241 | margin-top: 0; 242 | padding-bottom: 0; 243 | padding-left: 0; 244 | padding-right: 0; 245 | padding-top: 0; 246 | margin-bottom: 1.45rem; 247 | color: inherit; 248 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 249 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 250 | font-weight: bold; 251 | text-rendering: optimizeLegibility; 252 | font-size: 1.62671rem; 253 | line-height: 1.1; 254 | } 255 | h3 { 256 | margin-left: 0; 257 | margin-right: 0; 258 | margin-top: 0; 259 | padding-bottom: 0; 260 | padding-left: 0; 261 | padding-right: 0; 262 | padding-top: 0; 263 | margin-bottom: 1.45rem; 264 | color: inherit; 265 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 266 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 267 | font-weight: bold; 268 | text-rendering: optimizeLegibility; 269 | font-size: 1.38316rem; 270 | line-height: 1.1; 271 | } 272 | h4 { 273 | margin-left: 0; 274 | margin-right: 0; 275 | margin-top: 0; 276 | padding-bottom: 0; 277 | padding-left: 0; 278 | padding-right: 0; 279 | padding-top: 0; 280 | margin-bottom: 1.45rem; 281 | color: inherit; 282 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 283 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 284 | font-weight: bold; 285 | text-rendering: optimizeLegibility; 286 | font-size: 1rem; 287 | line-height: 1.1; 288 | } 289 | h5 { 290 | margin-left: 0; 291 | margin-right: 0; 292 | margin-top: 0; 293 | padding-bottom: 0; 294 | padding-left: 0; 295 | padding-right: 0; 296 | padding-top: 0; 297 | margin-bottom: 1.45rem; 298 | color: inherit; 299 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 300 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 301 | font-weight: bold; 302 | text-rendering: optimizeLegibility; 303 | font-size: 0.85028rem; 304 | line-height: 1.1; 305 | } 306 | h6 { 307 | margin-left: 0; 308 | margin-right: 0; 309 | margin-top: 0; 310 | padding-bottom: 0; 311 | padding-left: 0; 312 | padding-right: 0; 313 | padding-top: 0; 314 | margin-bottom: 1.45rem; 315 | color: inherit; 316 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 317 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 318 | font-weight: bold; 319 | text-rendering: optimizeLegibility; 320 | font-size: 0.78405rem; 321 | line-height: 1.1; 322 | } 323 | hgroup { 324 | margin-left: 0; 325 | margin-right: 0; 326 | margin-top: 0; 327 | padding-bottom: 0; 328 | padding-left: 0; 329 | padding-right: 0; 330 | padding-top: 0; 331 | margin-bottom: 1.45rem; 332 | } 333 | ul { 334 | margin-left: 1.45rem; 335 | margin-right: 0; 336 | margin-top: 0; 337 | padding-bottom: 0; 338 | padding-left: 0; 339 | padding-right: 0; 340 | padding-top: 0; 341 | margin-bottom: 1.45rem; 342 | list-style-position: outside; 343 | list-style-image: none; 344 | } 345 | ol { 346 | margin-left: 1.45rem; 347 | margin-right: 0; 348 | margin-top: 0; 349 | padding-bottom: 0; 350 | padding-left: 0; 351 | padding-right: 0; 352 | padding-top: 0; 353 | margin-bottom: 1.45rem; 354 | list-style-position: outside; 355 | list-style-image: none; 356 | } 357 | dl { 358 | margin-left: 0; 359 | margin-right: 0; 360 | margin-top: 0; 361 | padding-bottom: 0; 362 | padding-left: 0; 363 | padding-right: 0; 364 | padding-top: 0; 365 | margin-bottom: 1.45rem; 366 | } 367 | dd { 368 | margin-left: 0; 369 | margin-right: 0; 370 | margin-top: 0; 371 | padding-bottom: 0; 372 | padding-left: 0; 373 | padding-right: 0; 374 | padding-top: 0; 375 | margin-bottom: 1.45rem; 376 | } 377 | p { 378 | margin-left: 0; 379 | margin-right: 0; 380 | margin-top: 0; 381 | padding-bottom: 0; 382 | padding-left: 0; 383 | padding-right: 0; 384 | padding-top: 0; 385 | margin-bottom: 1.45rem; 386 | } 387 | figure { 388 | margin-left: 0; 389 | margin-right: 0; 390 | margin-top: 0; 391 | padding-bottom: 0; 392 | padding-left: 0; 393 | padding-right: 0; 394 | padding-top: 0; 395 | margin-bottom: 1.45rem; 396 | } 397 | pre { 398 | margin-left: 0; 399 | margin-right: 0; 400 | margin-top: 0; 401 | padding-bottom: 0; 402 | padding-left: 0; 403 | padding-right: 0; 404 | padding-top: 0; 405 | margin-bottom: 1.45rem; 406 | font-size: 0.85rem; 407 | line-height: 1.42; 408 | background: hsla(0, 0%, 0%, 0.04); 409 | border-radius: 3px; 410 | overflow: auto; 411 | word-wrap: normal; 412 | padding: 1.45rem; 413 | } 414 | table { 415 | margin-left: 0; 416 | margin-right: 0; 417 | margin-top: 0; 418 | padding-bottom: 0; 419 | padding-left: 0; 420 | padding-right: 0; 421 | padding-top: 0; 422 | margin-bottom: 1.45rem; 423 | font-size: 1rem; 424 | line-height: 1.45rem; 425 | border-collapse: collapse; 426 | width: 100%; 427 | } 428 | fieldset { 429 | margin-left: 0; 430 | margin-right: 0; 431 | margin-top: 0; 432 | padding-bottom: 0; 433 | padding-left: 0; 434 | padding-right: 0; 435 | padding-top: 0; 436 | margin-bottom: 1.45rem; 437 | } 438 | blockquote { 439 | margin-left: 1.45rem; 440 | margin-right: 1.45rem; 441 | margin-top: 0; 442 | padding-bottom: 0; 443 | padding-left: 0; 444 | padding-right: 0; 445 | padding-top: 0; 446 | margin-bottom: 1.45rem; 447 | } 448 | form { 449 | margin-left: 0; 450 | margin-right: 0; 451 | margin-top: 0; 452 | padding-bottom: 0; 453 | padding-left: 0; 454 | padding-right: 0; 455 | padding-top: 0; 456 | margin-bottom: 1.45rem; 457 | } 458 | noscript { 459 | margin-left: 0; 460 | margin-right: 0; 461 | margin-top: 0; 462 | padding-bottom: 0; 463 | padding-left: 0; 464 | padding-right: 0; 465 | padding-top: 0; 466 | margin-bottom: 1.45rem; 467 | } 468 | iframe { 469 | margin-left: 0; 470 | margin-right: 0; 471 | margin-top: 0; 472 | padding-bottom: 0; 473 | padding-left: 0; 474 | padding-right: 0; 475 | padding-top: 0; 476 | margin-bottom: 1.45rem; 477 | } 478 | hr { 479 | margin-left: 0; 480 | margin-right: 0; 481 | margin-top: 0; 482 | padding-bottom: 0; 483 | padding-left: 0; 484 | padding-right: 0; 485 | padding-top: 0; 486 | margin-bottom: calc(1.45rem - 1px); 487 | background: hsla(0, 0%, 0%, 0.2); 488 | border: none; 489 | height: 1px; 490 | } 491 | address { 492 | margin-left: 0; 493 | margin-right: 0; 494 | margin-top: 0; 495 | padding-bottom: 0; 496 | padding-left: 0; 497 | padding-right: 0; 498 | padding-top: 0; 499 | margin-bottom: 1.45rem; 500 | } 501 | b { 502 | font-weight: bold; 503 | } 504 | strong { 505 | font-weight: bold; 506 | } 507 | dt { 508 | font-weight: bold; 509 | } 510 | th { 511 | font-weight: bold; 512 | } 513 | li { 514 | margin-bottom: calc(1.45rem / 2); 515 | } 516 | ol li { 517 | padding-left: 0; 518 | } 519 | ul li { 520 | padding-left: 0; 521 | } 522 | li > ol { 523 | margin-left: 1.45rem; 524 | margin-bottom: calc(1.45rem / 2); 525 | margin-top: calc(1.45rem / 2); 526 | } 527 | li > ul { 528 | margin-left: 1.45rem; 529 | margin-bottom: calc(1.45rem / 2); 530 | margin-top: calc(1.45rem / 2); 531 | } 532 | blockquote *:last-child { 533 | margin-bottom: 0; 534 | } 535 | li *:last-child { 536 | margin-bottom: 0; 537 | } 538 | p *:last-child { 539 | margin-bottom: 0; 540 | } 541 | li > p { 542 | margin-bottom: calc(1.45rem / 2); 543 | } 544 | code { 545 | font-size: 0.85rem; 546 | line-height: 1.45rem; 547 | } 548 | kbd { 549 | font-size: 0.85rem; 550 | line-height: 1.45rem; 551 | } 552 | samp { 553 | font-size: 0.85rem; 554 | line-height: 1.45rem; 555 | } 556 | abbr { 557 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 558 | cursor: help; 559 | } 560 | acronym { 561 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 562 | cursor: help; 563 | } 564 | abbr[title] { 565 | border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); 566 | cursor: help; 567 | text-decoration: none; 568 | } 569 | thead { 570 | text-align: left; 571 | } 572 | td, 573 | th { 574 | text-align: left; 575 | border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); 576 | font-feature-settings: 'tnum'; 577 | -moz-font-feature-settings: 'tnum'; 578 | -ms-font-feature-settings: 'tnum'; 579 | -webkit-font-feature-settings: 'tnum'; 580 | padding-left: 0.96667rem; 581 | padding-right: 0.96667rem; 582 | padding-top: 0.725rem; 583 | padding-bottom: calc(0.725rem - 1px); 584 | } 585 | th:first-child, 586 | td:first-child { 587 | padding-left: 0; 588 | } 589 | th:last-child, 590 | td:last-child { 591 | padding-right: 0; 592 | } 593 | tt, 594 | code { 595 | background-color: hsla(0, 0%, 0%, 0.04); 596 | border-radius: 3px; 597 | font-family: 'SFMono-Regular', Consolas, 'Roboto Mono', 'Droid Sans Mono', 598 | 'Liberation Mono', Menlo, Courier, monospace; 599 | padding: 0; 600 | padding-top: 0.2em; 601 | padding-bottom: 0.2em; 602 | } 603 | input { 604 | margin-bottom: 12px; 605 | } 606 | pre code { 607 | background: none; 608 | line-height: 1.42; 609 | } 610 | code:before, 611 | code:after, 612 | tt:before, 613 | tt:after { 614 | letter-spacing: -0.2em; 615 | content: ' '; 616 | } 617 | pre code:before, 618 | pre code:after, 619 | pre tt:before, 620 | pre tt:after { 621 | content: ''; 622 | } 623 | @media only screen and (max-width: 480px) { 624 | html { 625 | font-size: 100%; 626 | } 627 | } 628 | -------------------------------------------------------------------------------- /src/components/layout.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import Helmet from 'react-helmet'; 3 | import PropTypes from 'prop-types'; 4 | import React from 'react'; 5 | import { StaticQuery, graphql } from 'gatsby'; 6 | import { withStyles } from '@material-ui/core/styles'; 7 | 8 | // Internal Dependencies 9 | import Footer from './footer'; 10 | import Header from './header'; 11 | import withAuthentication from './session/withAuthentication'; 12 | import './layout.css'; 13 | 14 | // Local Variables 15 | const propTypes = { 16 | classes: PropTypes.shape({ 17 | childrenContainer: PropTypes.string.isRequired, 18 | main: PropTypes.string.isRequired, 19 | }).isRequired, 20 | hideFooter: PropTypes.bool, 21 | hideNav: PropTypes.bool, 22 | }; 23 | 24 | const styles = { 25 | childrenContainer: { 26 | margin: '0 auto', 27 | padding: 0, 28 | }, 29 | main: { 30 | backgroundColor: 'black', 31 | minHeight: '100vh' 32 | }, 33 | }; 34 | 35 | // Component Definition 36 | const Layout = ({ 37 | children, 38 | classes, 39 | hideFooter = false, 40 | hideNav = false, 41 | }) => ( 42 | ( 55 | <> 56 | 70 | 71 | 75 | 76 |
77 | {hideNav ? null :
} 78 |
80 | {children} 81 |
82 | {hideFooter ? null :
} 83 |
84 | 85 | ) 86 | } 87 | /> 88 | ); 89 | 90 | Layout.propTypes = propTypes; 91 | 92 | export default withStyles(styles)(withAuthentication(Layout)); 93 | -------------------------------------------------------------------------------- /src/components/session/AuthUserContext.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const AuthUserContext = React.createContext(null); 4 | 5 | export default AuthUserContext; 6 | -------------------------------------------------------------------------------- /src/components/session/withAuthentication.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // Internal Dependencies 5 | import AuthUserContext from './AuthUserContext'; 6 | import { firebase } from '../../firebase'; 7 | 8 | // Component Definition 9 | const withAuthentication = Component => 10 | class WithAuthentication extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | 14 | this.state = { 15 | authUser: null, 16 | }; 17 | } 18 | 19 | componentDidMount() { 20 | if (typeof window !== 'undefined') { 21 | firebase.auth.onAuthStateChanged(authUser => { 22 | authUser 23 | ? this.setState(() => ({ authUser })) 24 | : this.setState(() => ({ authUser: null })); 25 | }); 26 | } 27 | } 28 | 29 | render() { 30 | const { authUser } = this.state; 31 | 32 | return ( 33 | 34 | 35 | 36 | ); 37 | } 38 | }; 39 | 40 | export default withAuthentication; 41 | -------------------------------------------------------------------------------- /src/components/session/withAuthorization.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | import { navigate } from 'gatsby'; 4 | 5 | // Internal Dependencies 6 | import AuthUserContext from './AuthUserContext'; 7 | import { firebase } from '../../firebase'; 8 | 9 | // Component Definition 10 | const withAuthorization = condition => Component => { 11 | class WithAuthorization extends React.Component { 12 | componentDidMount() { 13 | if (typeof window !== 'undefined') { 14 | firebase.auth.onAuthStateChanged(authUser => { 15 | if (!condition(authUser)) { 16 | navigate('/'); 17 | } 18 | }); 19 | } 20 | } 21 | 22 | render() { 23 | return ( 24 | 25 | {authUser => (authUser ? : null)} 26 | 27 | ); 28 | } 29 | } 30 | 31 | return WithAuthorization; 32 | }; 33 | 34 | export default withAuthorization; 35 | -------------------------------------------------------------------------------- /src/components/shared/EventCard.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import Button from '@material-ui/core/Button'; 3 | import Card from '@material-ui/core/Card'; 4 | import CardContent from '@material-ui/core/CardContent'; 5 | import CardMedia from '@material-ui/core/CardMedia'; 6 | import PropTypes from 'prop-types'; 7 | import React from 'react'; 8 | import { withStyles } from '@material-ui/core/styles'; 9 | 10 | // Local Variables 11 | const propTypes = { 12 | classes: PropTypes.shape({ 13 | button: PropTypes.string.isRequired, 14 | card: PropTypes.string.isRequired, 15 | media: PropTypes.string.isRequired, 16 | mediaContainer: PropTypes.string.isRequired, 17 | }).isRequired, 18 | date: PropTypes.string.isRequired, 19 | fullWidthImage: PropTypes.bool, 20 | imageBackgroundColor: PropTypes.string, 21 | imageLink: PropTypes.string.isRequired, 22 | meetupLink: PropTypes.string.isRequired, 23 | speaker1: PropTypes.string.isRequired, 24 | speaker2: PropTypes.string, 25 | speaker3: PropTypes.string, 26 | speaker4: PropTypes.string, 27 | speaker5: PropTypes.string, 28 | speaker6: PropTypes.string, 29 | venue: PropTypes.string.isRequired, 30 | }; 31 | 32 | const defaultProps = { 33 | fullWidthImage: false, 34 | imageBackgroundColor: null, 35 | speaker2: null, 36 | speaker3: null, 37 | }; 38 | 39 | const styles = theme => ({ 40 | button: { 41 | marginTop: 16, 42 | }, 43 | card: { 44 | margin: '12px 0', 45 | maxWidth: 600, 46 | width: '100%', 47 | }, 48 | media: { 49 | height: '50%', 50 | padding: '0 24px', 51 | width: '50%', 52 | }, 53 | mediaContainer: { 54 | background: '#f1f1f1', 55 | display: 'flex', 56 | justifyContent: 'center', 57 | padding: '0 auto', 58 | maxWidth: 600, 59 | paddingTop: 24, 60 | width: '100%', 61 | }, 62 | }); 63 | 64 | // Component Definition 65 | const EventCard = ({ 66 | classes, 67 | date, 68 | fullWidthImage, 69 | imageBackgroundColor, 70 | imageLink, 71 | meetupLink, 72 | speaker1, 73 | speaker2, 74 | speaker3, 75 | speaker4, 76 | speaker5, 77 | speaker6, 78 | venue, 79 | }) => { 80 | return ( 81 | 82 |
88 | 95 |
96 | 97 |

{date}

98 |

ReactJS @ {venue}

99 |
{speaker1}
100 | {speaker2 &&
{speaker2}
} 101 | {speaker3 &&
{speaker3}
} 102 | {speaker4 &&
{speaker4}
} 103 | {speaker5 &&
{speaker5}
} 104 | {speaker6 &&
{speaker6}
} 105 | 106 | 114 |
115 |
116 | ); 117 | }; 118 | 119 | EventCard.propTypes = propTypes; 120 | EventCard.defaultProps = defaultProps; 121 | 122 | export default withStyles(styles)(EventCard); 123 | -------------------------------------------------------------------------------- /src/components/shared/ReactDallasLogoSection.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React from 'react'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | 6 | // Internal Dependencies 7 | import DallasLogoSvg from '../../images/reactjs-dallas-icon.svg'; 8 | 9 | // Local Variables 10 | const propTypes = { 11 | classes: PropTypes.shape({ 12 | logo: PropTypes.string.isRequired, 13 | root: PropTypes.string.isRequired, 14 | }).isRequired, 15 | }; 16 | 17 | const styles = { 18 | logo: { 19 | width: 128, 20 | height: 128, 21 | }, 22 | root: { 23 | background: '#B9B9B9', 24 | display: 'flex', 25 | justifyContent: 'center', 26 | padding: 64, 27 | }, 28 | }; 29 | 30 | // Component Definition 31 | const ReactDallasLogoSection = ({ classes }) => ( 32 |
33 | 34 |
35 | ); 36 | 37 | ReactDallasLogoSection.propTypes = propTypes; 38 | 39 | export default withStyles(styles)(ReactDallasLogoSection); 40 | -------------------------------------------------------------------------------- /src/components/shared/icons/facebook.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const FacebookSvg = props => ( 9 | 10 | facebook-logo 11 | 12 | 13 | ); 14 | 15 | export default FacebookSvg; 16 | -------------------------------------------------------------------------------- /src/components/shared/icons/linkedin.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const LinkedInSvg = props => ( 9 | 10 | LinkedIn-logo 11 | 12 | 13 | ); 14 | 15 | export default LinkedInSvg; -------------------------------------------------------------------------------- /src/components/shared/icons/slack.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const SlackSvg = props => ( 9 | 10 | slack-logo 11 | 12 | 13 | ); 14 | 15 | export default SlackSvg; 16 | -------------------------------------------------------------------------------- /src/components/shared/icons/twitter.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const SlackSvg = props => ( 9 | 10 | twitter-logo 11 | 12 | 13 | ); 14 | 15 | export default SlackSvg; 16 | -------------------------------------------------------------------------------- /src/components/signup-form.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React, { Component } from 'react'; 4 | import { navigate } from 'gatsby'; 5 | import { withStyles } from '@material-ui/core/styles'; 6 | 7 | // Internal Dependencies 8 | import { auth, db } from '../firebase'; 9 | 10 | // Local Variables 11 | const propTypes = { 12 | classes: PropTypes.shape({ 13 | root: PropTypes.string.isRequired, 14 | }).isRequired, 15 | }; 16 | 17 | const styles = { 18 | root: { 19 | display: 'flex', 20 | flexDirection: 'column', 21 | alignItems: 'center', 22 | maxWidth: 350, 23 | }, 24 | }; 25 | 26 | const INITIAL_STATE = { 27 | username: '', 28 | email: '', 29 | passwordOne: '', 30 | passwordTwo: '', 31 | error: null, 32 | }; 33 | 34 | // Local Functions 35 | const byPropKey = (propertyName, value) => () => ({ 36 | [propertyName]: value, 37 | }); 38 | 39 | // Component Definition 40 | class SignUpForm extends Component { 41 | // UNNECESSARY CONSTRUCTOR 42 | state = { ...INITIAL_STATE }; 43 | 44 | onSubmit = (event) => { 45 | const { 46 | username, 47 | email, 48 | passwordOne, 49 | } = this.state; 50 | 51 | auth.doCreateUserWithEmailAndPassword(email, passwordOne) 52 | .then(authUser => { 53 | 54 | // Create a user in your own accessible Firebase Database too 55 | db.doCreateUser(authUser.user.uid, username, email) 56 | .then(() => { 57 | this.setState({ ...INITIAL_STATE }); 58 | }) 59 | .catch(error => { 60 | this.setState(byPropKey('error', error)); 61 | }); 62 | 63 | this.setState({ ...INITIAL_STATE }); 64 | navigate('/dashboard'); 65 | }) 66 | .catch(error => { 67 | this.setState(byPropKey('error', error)); 68 | }); 69 | 70 | event.preventDefault(); 71 | } 72 | 73 | render() { 74 | const { 75 | classes, 76 | } = this.props; 77 | 78 | const { 79 | username, 80 | email, 81 | passwordOne, 82 | passwordTwo, 83 | error, 84 | } = this.state; 85 | 86 | const isInvalid = 87 | passwordOne !== passwordTwo || 88 | passwordOne === '' || 89 | !/^\w+@\w+\.\w+$/.test(email) === '' || 90 | username === ''; 91 | 92 | return ( 93 |
97 | this.setState(byPropKey('username', event.target.value))} 99 | placeholder="Full Name" 100 | type="text" 101 | value={username} 102 | /> 103 | this.setState(byPropKey('email', event.target.value))} 105 | placeholder="Email Address" 106 | type="text" 107 | value={email} 108 | /> 109 | this.setState(byPropKey('passwordOne', event.target.value))} 111 | placeholder="Password" 112 | type="password" 113 | value={passwordOne} 114 | /> 115 | this.setState(byPropKey('passwordTwo', event.target.value))} 117 | placeholder="Confirm Password" 118 | type="password" 119 | value={passwordTwo} 120 | /> 121 | 124 | 125 | { error &&

{error.message}

} 126 |
127 | ); 128 | } 129 | } 130 | 131 | SignUpForm.propTypes = propTypes; 132 | 133 | export default withStyles(styles)(SignUpForm); 134 | -------------------------------------------------------------------------------- /src/components/signup-link.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React, { Component } from 'react'; 3 | import { Link } from 'gatsby'; 4 | 5 | // Component Definition 6 | const SignUpLink = () => ( 7 |

8 | Don't have an account? 9 | {' '} 10 | Sign Up 11 |

12 | ); 13 | 14 | export default SignUpLink; 15 | -------------------------------------------------------------------------------- /src/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reactjs-dallas/reactjs-dallas-site/3624230ee5d0320fb8326345aa7700d878ec0acb/src/favicon.png -------------------------------------------------------------------------------- /src/firebase/auth.js: -------------------------------------------------------------------------------- 1 | import { auth } from './firebase'; 2 | 3 | // Sign Up 4 | export const doCreateUserWithEmailAndPassword = (email, password) => 5 | auth.createUserWithEmailAndPassword(email, password); 6 | 7 | // Sign In 8 | export const doSignInWithEmailAndPassword = (email, password) => 9 | auth.signInWithEmailAndPassword(email, password); 10 | 11 | // Sign out 12 | export const doSignOut = () => auth.signOut(); 13 | 14 | // Password Reset 15 | export const doPasswordReset = email => auth.sendPasswordResetEmail(email); 16 | 17 | // Password Change 18 | export const doPasswordUpdate = password => 19 | auth.currentUser.updatePassword(password); 20 | -------------------------------------------------------------------------------- /src/firebase/db.js: -------------------------------------------------------------------------------- 1 | import { db } from './firebase'; 2 | 3 | // User API 4 | 5 | export const doCreateUser = (id, username, email) => 6 | db.ref(`users/${id}`).set({ 7 | username, 8 | email, 9 | }); 10 | 11 | export const onceGetUsers = () => db.ref('users').once('value'); 12 | 13 | // Other db APIs ... 14 | -------------------------------------------------------------------------------- /src/firebase/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import 'firebase/database'; 3 | import 'firebase/auth'; 4 | 5 | // const prodConfig = { 6 | // apiKey: YOUR_API_KEY, 7 | // authDomain: YOUR_AUTH_DOMAIN, 8 | // databaseURL: YOUR_DATABASE_URL, 9 | // projectId: YOUR_PROJECT_ID, 10 | // storageBucket: '', 11 | // messagingSenderId: YOUR_MESSAGING_SENDER_ID, 12 | // }; 13 | 14 | const devConfig = { 15 | apiKey: process.env.GATSBY_FIREBASE_API_KEY, 16 | authDomain: process.env.GATSBY_FIREBASE_AUTH_DOMAIN, 17 | databaseURL: process.env.GATSBY_FIREBASE_DATABASE_URL, 18 | projectId: process.env.GATSBY_FIREBASE_PROJECT_ID, 19 | storageBucket: process.env.GATSBY_FIREBASE_STORAGE_BUCKET, 20 | messagingSenderId: process.env.GATSBY_FIREBASE_MESSAGING_SENDER_ID, 21 | }; 22 | 23 | // const config = process.env.NODE_ENV === 'production' ? prodConfig : devConfig; 24 | 25 | if (!firebase.apps.length) { 26 | firebase.initializeApp(devConfig); 27 | } 28 | 29 | let db, auth; 30 | 31 | if (typeof window !== 'undefined') { 32 | // Gatsby build will fail otherwise 33 | db = firebase.database(); 34 | auth = firebase.auth(); 35 | } 36 | 37 | export { db, auth }; 38 | -------------------------------------------------------------------------------- /src/firebase/index.js: -------------------------------------------------------------------------------- 1 | import * as auth from './auth'; 2 | import * as db from './db'; 3 | import * as firebase from './firebase'; 4 | 5 | export { auth, db, firebase }; 6 | -------------------------------------------------------------------------------- /src/images/bottle-rocket-foyer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reactjs-dallas/reactjs-dallas-site/3624230ee5d0320fb8326345aa7700d878ec0acb/src/images/bottle-rocket-foyer.png -------------------------------------------------------------------------------- /src/images/bottle-rocket-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reactjs-dallas/reactjs-dallas-site/3624230ee5d0320fb8326345aa7700d878ec0acb/src/images/bottle-rocket-logo.png -------------------------------------------------------------------------------- /src/images/firebase-logo.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const FirebaseLogoSvg = props => ( 9 | 10 | Firebase Logo 11 | 15 | 19 | 23 | 27 | 31 | 35 | 39 | 43 | 47 | 51 | 55 | 59 | 63 | 67 | 71 | 75 | 79 | 80 | ); 81 | 82 | export default FirebaseLogoSvg; 83 | -------------------------------------------------------------------------------- /src/images/react-dallas-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reactjs-dallas/reactjs-dallas-site/3624230ee5d0320fb8326345aa7700d878ec0acb/src/images/react-dallas-logo.png -------------------------------------------------------------------------------- /src/images/react-logo.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const ReactLogoSvg = props => ( 9 | 10 | React Logo 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | 20 | export default ReactLogoSvg; 21 | -------------------------------------------------------------------------------- /src/images/reactjs-dallas-icon.svg.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // MUI Dependencies 5 | import SvgIcon from '@material-ui/core/SvgIcon'; 6 | 7 | // Component Definition 8 | const ReactDallasSvg = props => ( 9 | 41 | ); 42 | 43 | export default ReactDallasSvg; 44 | -------------------------------------------------------------------------------- /src/pages/404.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // Internal Dependencies 5 | import Layout from '../components/layout'; 6 | 7 | // Component Definition 8 | const NotFoundPage = () => ( 9 | 10 |
11 |

NOT FOUND

12 |

You just hit a route that doesn't exist...the sadness.

13 |
14 |
15 | ); 16 | 17 | export default NotFoundPage; 18 | -------------------------------------------------------------------------------- /src/pages/backers/backers.md: -------------------------------------------------------------------------------- 1 | ## Sponsors & Backers 2 | 3 |

Support the ReactJS Dallas User Group through donations.

4 | 5 | All work done for ReactJS Dallas is open-source and volunteer. All code is MIT-licensed. The support of these awesome sponsors and backers helps us continue our mission of connecting the Dallas/Fort Worth developer community. If you'd like to join them, please consider: 6 | 7 | - [Become a backer or sponsor on OpenCollective](https://opencollective.com/reactjs-dallas). 8 | 9 | -------- 10 | 11 | ### Gold Sponsors 12 | 13 | Gold Sponsors are those who have pledged $500/month and more to the ReactJS Dallas User Group. 14 | 15 | via [OpenCollective](https://opencollective.com/reactjs-dallas) 16 | 17 |

18 | Gold Sponsors 19 |

20 | 21 | -------- 22 | 23 | ### Silver Sponsors 24 | 25 | Silver Sponsors are those who have pledged $250/month to $499/month to the ReactJS Dallas User Group. 26 | 27 | via [OpenCollective](https://opencollective.com/reactjs-dallas) 28 | 29 |

30 | Silver Sponsors 31 |

32 | 33 | -------- 34 | 35 | ### Bronze Sponsors 36 | 37 | Bronze Sponsors are those who have pledged $100/month to $249/month to the ReactJS Dallas User Group. 38 | 39 | via [OpenCollective](https://opencollective.com/reactjs-dallas) 40 | 41 |

42 | Bronze Sponsors 43 |

44 | 45 | -------- 46 | 47 | ### Backers 48 | 49 | Backers are those who have pledged $2/month to $99/month to the ReactJS Dallas User Group. 50 | 51 | via [OpenCollective](https://opencollective.com/reactjs-dallas) 52 | 53 |

54 | Backers 55 |

56 | 57 | -------- 58 | 59 | ### One-Time Sponsors 60 | 61 | One-Time Sponsors are those who have pledged a single donation to the ReactJS Dallas User Group. 62 | 63 | via [OpenCollective](https://opencollective.com/reactjs-dallas) 64 | 65 |

66 | Backers 67 |

68 | 69 | -------- 70 | 71 | ## Why? 72 | 73 | If you have attended our events and want to show your appreciation. If you love React, Dallas, software development, or any combination of the those. If you want to sponsor a single event to get in front of our group to speak. 74 | -------------------------------------------------------------------------------- /src/pages/backers/index.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React from 'react'; 4 | import { graphql } from 'gatsby'; 5 | import { withStyles } from '@material-ui/core/styles'; 6 | 7 | // Internal Dependencies 8 | import Layout from '../../components/layout'; 9 | import ReactDallasLogoSection from '../../components/shared/ReactDallasLogoSection'; 10 | 11 | // Local Variables 12 | const propTypes = { 13 | classes: PropTypes.shape({ 14 | content: PropTypes.string.isRequired, 15 | heroContainer: PropTypes.string.isRequired, 16 | heroText: PropTypes.string.isRequired, 17 | heroTitle: PropTypes.string.isRequired, 18 | root: PropTypes.string.isRequired, 19 | }).isRequired, 20 | }; 21 | 22 | const styles = theme => ({ 23 | content: { 24 | color: theme.palette.common.white, 25 | textAlign: 'left', 26 | padding: '3.5rem', 27 | }, 28 | heroContainer: { 29 | background: '#282C34', 30 | padding: '2rem', 31 | }, 32 | heroText: { 33 | color: theme.palette.common.white, 34 | fontWeight: 100, 35 | }, 36 | heroTitle: { 37 | color: '#61dafb', 38 | }, 39 | root: { 40 | textAlign: 'center', 41 | }, 42 | }); 43 | 44 | // Component Definition 45 | const Backers = ({ classes, data }) => { 46 | return ( 47 | 48 |
49 |
50 |
51 |

Sponsors & Backers

52 |
Where DFW supports
53 |
54 |
55 | 56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 | ); 64 | }; 65 | 66 | Backers.propTypes = propTypes; 67 | 68 | export default withStyles(styles)(Backers); 69 | 70 | export const query = graphql` 71 | query { 72 | allMarkdownRemark { 73 | edges { 74 | node { 75 | html 76 | } 77 | } 78 | } 79 | } 80 | ` 81 | -------------------------------------------------------------------------------- /src/pages/current-event.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // Internal Dependencies 5 | import Layout from '../components/layout'; 6 | 7 | // Component Definition 8 | const CurrentEvent = () => ( 9 | 10 |
11 | meetup-speaker 17 |
18 |
19 | ); 20 | 21 | export default CurrentEvent; 22 | -------------------------------------------------------------------------------- /src/pages/dashboard.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React, { Component } from 'react'; 3 | 4 | // Internal Dependencies 5 | import Layout from '../components/layout'; 6 | import withAuthorization from '../components/session/withAuthorization'; 7 | import { db } from '../firebase'; 8 | 9 | // Local Variables 10 | const rootStyles = { 11 | textAlign: 'center', 12 | }; 13 | 14 | const heroContainerStyles = { 15 | background: '#282C34', 16 | padding: '2rem', 17 | }; 18 | 19 | const heroTitleStyles = { 20 | color: '#61dafb', 21 | }; 22 | 23 | const heroTextStyles = { 24 | color: 'white', 25 | fontWeight: 100, 26 | }; 27 | 28 | const contentStyles = { 29 | display: 'flex', 30 | flexDirection: 'column', 31 | justifyContent: 'center', 32 | padding: '3.5rem 0', 33 | }; 34 | 35 | // Local Functions 36 | const fromObjectToList = object => 37 | object 38 | ? Object.keys(object).map(key => ({ ...object[key], index: key })) 39 | : []; 40 | 41 | const authCondition = authUser => !!authUser; 42 | 43 | // Component Definition 44 | class Dashboard extends Component { 45 | constructor(props) { 46 | super(props); 47 | 48 | this.state = { 49 | users: [], 50 | }; 51 | } 52 | 53 | componentDidMount() { 54 | if (typeof window !== 'undefined') { 55 | db.onceGetUsers().then(snapshot => 56 | this.setState(() => ({ users: fromObjectToList(snapshot.val()) })) 57 | ); 58 | } 59 | } 60 | 61 | render() { 62 | const { users } = this.state; 63 | 64 | return ( 65 | 66 | 67 | 68 | ); 69 | } 70 | } 71 | 72 | const UserList = ({ users }) => ( 73 |
74 |

List of App User IDs (Saved on Sign Up in Firebase Database)

75 |
76 | {users.map(user => ( 77 |
{user.index}
78 | ))} 79 |
80 | ); 81 | 82 | const DashboardContent = withAuthorization(authCondition)(props => { 83 | return ( 84 |
85 |
86 |
87 |

Dashboard

88 |
Where DFW ninjas roam freely
89 |
90 |
91 | 92 |
93 |

User List

94 | {!!props.users.length && } 95 |
96 |
97 | ); 98 | }); 99 | 100 | export default Dashboard; 101 | -------------------------------------------------------------------------------- /src/pages/events/event-list.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // Internal Dependencies 5 | import EventCard from '../../components/shared/EventCard'; 6 | import { eventData } from '../../utils/constants/events'; 7 | 8 | // Component Definition 9 | const EventList = () => { 10 | const upcomingEvents = eventData.map(event => ( 11 | 26 | )); 27 | 28 | return upcomingEvents; 29 | }; 30 | 31 | export default EventList; 32 | -------------------------------------------------------------------------------- /src/pages/events/index.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React, { Component } from 'react'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | 6 | // Internal Dependencies 7 | import Layout from '../../components/layout'; 8 | import EventList from './event-list'; 9 | import ReactDallasLogoSection from '../../components/shared/ReactDallasLogoSection'; 10 | 11 | // Local Variables 12 | const styles = theme => ({ 13 | content: { 14 | alignItems: 'center', 15 | color: theme.palette.common.white, 16 | display: 'flex', 17 | flexDirection: 'column', 18 | justifyContent: 'center', 19 | padding: '3.5rem', 20 | }, 21 | heroContainer: { 22 | background: '#282C34', 23 | padding: '2rem', 24 | }, 25 | heroText: { 26 | color: theme.palette.common.white, 27 | fontWeight: 100, 28 | }, 29 | heroTitle: { 30 | color: '#61dafb', 31 | }, 32 | root: { 33 | textAlign: 'center', 34 | }, 35 | }); 36 | 37 | // Component Definition 38 | class Events extends Component { 39 | static propTypes = { 40 | classes: PropTypes.shape({ 41 | content: PropTypes.string.isRequired, 42 | heroContainer: PropTypes.string.isRequired, 43 | heroText: PropTypes.string.isRequired, 44 | heroTitle: PropTypes.string.isRequired, 45 | root: PropTypes.string.isRequired, 46 | }).isRequired, 47 | }; 48 | 49 | render() { 50 | const { 51 | classes, 52 | } = this.props; 53 | 54 | return ( 55 | 56 |
57 |
58 |
59 |

Events

60 |
Where DFW meets
61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 | 69 |
70 |
71 | ); 72 | } 73 | } 74 | 75 | export default withStyles(styles)(Events); 76 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import PropTypes from 'prop-types'; 3 | import React from 'react'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | 6 | // Internal Dependencies 7 | import Layout from '../components/layout'; 8 | import ReactDallasLogoSection from '../components/shared/ReactDallasLogoSection'; 9 | 10 | // Local Variables 11 | const propTypes = { 12 | classes: PropTypes.shape({ 13 | content: PropTypes.string.isRequired, 14 | heroContainer: PropTypes.string.isRequired, 15 | heroText: PropTypes.string.isRequired, 16 | heroTitle: PropTypes.string.isRequired, 17 | root: PropTypes.string.isRequired, 18 | }).isRequired, 19 | }; 20 | 21 | const styles = theme => ({ 22 | content: { 23 | color: theme.palette.common.white, 24 | display: 'flex', 25 | flexDirection: 'column', 26 | flexGrow: 1, 27 | fontSize: '1.5rem', 28 | justifyContent: 'center', 29 | minHeight: '20em', 30 | padding: '3.5rem 0', 31 | }, 32 | heroContainer: { 33 | background: '#282C34', 34 | display: 'flex', 35 | justifyContent: 'center', 36 | padding: '2rem', 37 | }, 38 | heroText: { 39 | color: theme.palette.common.white, 40 | fontSize: '1.5rem', 41 | fontWeight: 100, 42 | }, 43 | heroTitle: { 44 | color: '#61dafb', 45 | fontSize: '3rem', 46 | }, 47 | root: { 48 | display: 'flex', 49 | flexDirection: 'column', 50 | textAlign: 'center', 51 | }, 52 | }); 53 | 54 | // Component Definition 55 | const IndexPage = ({ 56 | classes, 57 | }) => { 58 | return ( 59 | 60 |
61 |
62 |
63 |

ReactJS Dallas

64 |
Where DFW learns
65 |
66 |
67 | 68 |
69 |

Welcome to the DFW React Community!

70 |

Now go build something great

71 |

And show someone else how to do it, too!

72 | {/* Go to sign up */} 73 |
74 | 75 | 76 | 77 |
78 |
79 | ); 80 | }; 81 | 82 | IndexPage.propTypes = propTypes; 83 | 84 | export default withStyles(styles)(IndexPage); 85 | -------------------------------------------------------------------------------- /src/pages/signup.js: -------------------------------------------------------------------------------- 1 | // External Dependencies 2 | import React from 'react'; 3 | 4 | // Internal Dependencies 5 | import Layout from '../components/layout'; 6 | import SignUpForm from '../components/signup-form'; 7 | 8 | // Local Variables 9 | const rootStyles = { 10 | textAlign: 'center' 11 | }; 12 | 13 | const heroContainerStyles = { 14 | background: '#282C34', 15 | padding: '2rem', 16 | }; 17 | 18 | const heroTitleStyles = { 19 | color: '#61dafb', 20 | }; 21 | 22 | const heroTextStyles = { 23 | color: 'white', 24 | fontWeight: 100, 25 | }; 26 | 27 | const contentStyles = { 28 | display: 'flex', 29 | flexDirection: 'column', 30 | justifyContent: 'center', 31 | padding: '3.5rem 0', 32 | alignItems: 'center', 33 | }; 34 | 35 | // Component Definition 36 | const SignUpPage = () => ( 37 | 38 |
39 |
40 |
41 |

ReactJS Dallas

42 |
Where DFW eats pizza
43 |
44 |
45 | 46 |
47 |

Sign up for a new Firebase login.

48 | 49 |
50 | 51 |
52 |
53 | ); 54 | 55 | export default SignUpPage; 56 | -------------------------------------------------------------------------------- /src/utils/constants/events.js: -------------------------------------------------------------------------------- 1 | export const eventData = [ 2 | { 3 | imageBackgroundColor: null, 4 | date: 'November 2024', 5 | fullWidthImage: true, 6 | imageLink: 7 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1731446450/2024-11-12--mike-mathew_ovdorh.png', 8 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071591/', 9 | speaker1: 'Mike Mathew — Get Started with React Native and Expo', 10 | venue: 'Text-Em-All', 11 | }, 12 | { 13 | imageBackgroundColor: null, 14 | date: 'October 2024', 15 | fullWidthImage: false, 16 | imageLink: 17 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1723567977/text-em-all-web-logo_v8ween.svg', 18 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071591/', 19 | speaker1: 'Vishnu Ramineni — Building Desktop Applications Using Electron and ReactJS', 20 | venue: 'Text-Em-All', 21 | }, 22 | { 23 | imageBackgroundColor: null, 24 | date: 'September 2024', 25 | fullWidthImage: false, 26 | imageLink: 27 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1723567977/text-em-all-web-logo_v8ween.svg', 28 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071591/', 29 | speaker1: 'Lucy McGuigan — That's So Fetch!: Loading and Caching Data with RTK Query', 30 | venue: 'Text-Em-All', 31 | }, 32 | { 33 | imageBackgroundColor: null, 34 | date: 'August 2024', 35 | fullWidthImage: true, 36 | imageLink: 37 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1723566253/2024-08-13--reactjs_dallas--vishnu_ramineni_udts8g.png', 38 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071591/', 39 | speaker1: 'Vishnu Ramineni — NextJS Error Handling and Error Reporting', 40 | venue: 'Text-Em-All', 41 | }, 42 | { 43 | imageBackgroundColor: null, 44 | date: 'July 2024', 45 | fullWidthImage: false, 46 | imageLink: 47 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1723567977/text-em-all-web-logo_v8ween.svg', 48 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071590/', 49 | speaker1: 'Networking with food and drink', 50 | venue: 'Text-Em-All', 51 | }, 52 | { 53 | imageBackgroundColor: null, 54 | date: 'June 2024', 55 | fullWidthImage: true, 56 | imageLink: 57 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1718142085/2024-06-11--reactjs-dallas-career-workshop_jrjhku.png', 58 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071588/', 59 | speaker1: 'ReactJS Dallas Career Workshop', 60 | venue: 'Text-Em-All', 61 | }, 62 | { 63 | imageBackgroundColor: null, 64 | date: 'May 2024', 65 | fullWidthImage: true, 66 | imageLink: 67 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1715716576/2024-05-14--patrick_hulce_dxcfcz.png', 68 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071587/', 69 | speaker1: 'Patrick Hulce — AI at Netflix: Building Your First Computer Vision App', 70 | venue: 'Text-Em-All', 71 | }, 72 | { 73 | imageBackgroundColor: null, 74 | date: 'April 2024', 75 | fullWidthImage: true, 76 | imageLink: 77 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1712689786/2024-04-09--reactjs_dallas_with_mike_mathew_group_project_thkkla.png', 78 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071586/', 79 | speaker1: 'Group Project: Update the ReactJS Dallas Website', 80 | venue: 'Text-Em-All', 81 | }, 82 | { 83 | imageBackgroundColor: null, 84 | date: 'March 2024', 85 | fullWidthImage: true, 86 | imageLink: 87 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1710254183/2024-03-12--reactjs_with_mark_mulligan_qxgybv.png', 88 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071585/', 89 | speaker1: 'Mark Mulligan — Tailwind CSS', 90 | venue: 'Text-Em-All', 91 | }, 92 | { 93 | imageBackgroundColor: null, 94 | date: 'February 2024', 95 | fullWidthImage: true, 96 | imageLink: 97 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1707847506/2024-02-13--feb_2024_reactjs_dallas_bnoyi6.png', 98 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/298071583/', 99 | speaker1: 'Vishnu Ramineni — Performance Optimization of Next.js App', 100 | speaker2: 'Mike Mathew — Use MUI-X Data Grid to Super-Charge Your Data Tables', 101 | venue: 'Text-Em-All', 102 | }, 103 | { 104 | imageBackgroundColor: null, 105 | date: 'January 2024', 106 | fullWidthImage: true, 107 | imageLink: 108 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1704836098/2024-01-09--reactjs_dallas_with_mike_mathew_nmafhj.png', 109 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/297672251/', 110 | speaker1: 'Mike Mathew — Learn How to Work Better With Your Team', 111 | venue: 'Text-Em-All', 112 | }, 113 | { 114 | imageBackgroundColor: null, 115 | date: 'December 2023', 116 | fullWidthImage: true, 117 | imageLink: 118 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1704835719/2023-12-13--react_js_with_tim_waite_ppdadd.png', 119 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/297287649/', 120 | speaker1: 'Tim Waite — Beyond Context: Atomic State Management (Recoil.js)', 121 | venue: 'Text-Em-All', 122 | }, 123 | { 124 | imageBackgroundColor: null, 125 | date: 'November 2023', 126 | fullWidthImage: true, 127 | imageLink: 128 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1699978752/2023-11-14--react_js_dallas_mike_mathew_cdpmpm.png', 129 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/296071117/', 130 | speaker1: 'Mike Mathew — First Steps with React: Building Your First Application', 131 | venue: 'Text-Em-All', 132 | }, 133 | { 134 | imageBackgroundColor: null, 135 | date: 'October 2023', 136 | fullWidthImage: true, 137 | imageLink: 138 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1696973693/2023-10-10--ReactJS-Dallas-with-Rigre-Garciandia_dnuido.png', 139 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/296071117/', 140 | speaker1: 'Rigre Garciandia — Technical Writing Workshop', 141 | venue: 'Text-Em-All', 142 | }, 143 | { 144 | imageBackgroundColor: null, 145 | date: 'September 2023', 146 | fullWidthImage: true, 147 | imageLink: 148 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1694556369/2023-09-12--reactjs_dallas_with_patrick_hulce_ohfmm2.png', 149 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/295334682/', 150 | speaker1: 'Patrick Hulce — Technical Writing Workshop', 151 | venue: 'Text-Em-All', 152 | }, 153 | { 154 | imageBackgroundColor: null, 155 | date: 'August 2023', 156 | fullWidthImage: true, 157 | imageLink: 158 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1691517314/2023-08-08--reactjs_dallas_with_james_vogel_ygztis.png', 159 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/293449080/', 160 | speaker1: 'James Vogel — Better Data Plumbing with TanStack Query', 161 | venue: 'Text-Em-All', 162 | }, 163 | { 164 | imageBackgroundColor: null, 165 | date: 'July 2023', 166 | fullWidthImage: true, 167 | imageLink: 168 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1689104985/2023-07-11--ReactJS-Dallas-with-Joe-Warren_wgtspo.png', 169 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/293426756/', 170 | speaker1: 'Joe Warren — The Art of Coding with Generative AI', 171 | venue: 'Text-Em-All', 172 | }, 173 | { 174 | imageBackgroundColor: null, 175 | date: 'June 2023', 176 | fullWidthImage: true, 177 | imageLink: 178 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1684604117/2023-06-13--reactjs_dallas_with_mark_mulligan_zugz4l.png', 179 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/292302392/', 180 | speaker1: 'Mark Mulligan — Modern React Development', 181 | venue: 'Text-Em-All', 182 | }, 183 | { 184 | imageBackgroundColor: null, 185 | date: 'May 2023', 186 | fullWidthImage: true, 187 | imageLink: 188 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1683653191/2023-05-09--reactjs_dallas_with_jacob_shomali.html_t3zikx.png', 189 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/292302392/', 190 | speaker1: 'Jacob Shomali — Angular vs React', 191 | venue: 'Text-Em-All', 192 | }, 193 | { 194 | imageBackgroundColor: null, 195 | date: 'April 2023', 196 | fullWidthImage: true, 197 | imageLink: 198 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1681242853/2023-04-11--reactjs_dallas_with_mike_mathew_ic3xiv.png', 199 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/291856247/', 200 | speaker1: 'Mike Mathew — Get Started with React Native', 201 | venue: 'Text-Em-All', 202 | }, 203 | { 204 | imageBackgroundColor: null, 205 | date: 'March 2023', 206 | fullWidthImage: true, 207 | imageLink: 208 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1678825043/2023-03-14--reactjs_dallas_with_mike_mathew_mma4ks.png', 209 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/291581013/', 210 | speaker1: 'Mike Mathew — Build and Deploy a Blog Site', 211 | venue: 'Text-Em-All', 212 | }, 213 | { 214 | imageBackgroundColor: null, 215 | date: 'February 2023', 216 | fullWidthImage: true, 217 | imageLink: 218 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1676332839/2023-02-13--reactjs_dallas_with_jacob_orshalick_oj8sxq.png', 219 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/287192568/', 220 | speaker1: 221 | 'Jacob Orshalick — Build your own portfolio site with Next.js and React', 222 | venue: 'Text-Em-All', 223 | }, 224 | { 225 | imageBackgroundColor: null, 226 | date: 'November 2022', 227 | fullWidthImage: true, 228 | imageLink: 229 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1667950462/2022-11-08--react_meetup_preview_mpdlif.png', 230 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/287192568/', 231 | speaker1: 'Mike Mathew — Programming Buzz Words Explained', 232 | venue: 'Text-Em-All', 233 | }, 234 | { 235 | imageBackgroundColor: null, 236 | date: 'October 2022', 237 | fullWidthImage: true, 238 | imageLink: 239 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1665520953/2022-10-11--react_meetup_preview_svey2s.png', 240 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/286566708/', 241 | speaker1: 242 | 'Austin Akers - Tips For Building A Strong Junior Developer Portfolio', 243 | venue: 'Text-Em-All', 244 | }, 245 | { 246 | imageBackgroundColor: null, 247 | date: 'September 2022', 248 | fullWidthImage: true, 249 | imageLink: 250 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1663108736/2022-09-13--react_meetup_xjirma.png', 251 | meetupLink: 252 | 'https://www.meetup.com/reactjsdallas/events/vpgwssydcmbrb/', 253 | speaker1: 'Ram Beltran - My First Failed Startup: Lessons Learned', 254 | speaker2: 'Mike Mathew - Overview of the MUI-X DataGrid', 255 | venue: 'Text-Em-All', 256 | }, 257 | { 258 | imageBackgroundColor: null, 259 | date: 'August 2022', 260 | fullWidthImage: true, 261 | imageLink: 262 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1660078702/2022-08-09_-_ReactJS_Dallas_featuring_Mike_Mathew_llj2iu.png', 263 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/286566689/', 264 | speaker1: 'Mike Mathew - JavaScript for Beginners', 265 | venue: 'Text-Em-All', 266 | }, 267 | { 268 | imageBackgroundColor: null, 269 | date: 'July 2022', 270 | fullWidthImage: true, 271 | imageLink: 272 | 'https://res.cloudinary.com/reactjs-dallas/image/upload/v1660078459/2022-07-12_-_ReactJS_Dallas_featuring_Humberto_Lopez_r6bcfl.png', 273 | meetupLink: 'https://www.meetup.com/reactjsdallas/events/286566677/', 274 | speaker1: 'Humberto Lopez - Debugging in React and JavaScript', 275 | venue: 'Text-Em-All', 276 | }, 277 | { 278 | imageBackgroundColor: null, 279 | date: 'May 11, 2021', 280 | imageLink: 281 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 282 | meetupLink: 283 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrycchbpb/', 284 | speaker1: 'Adrianne Mallett - Writing Tests First', 285 | venue: 'yourDevice', 286 | }, 287 | { 288 | imageBackgroundColor: null, 289 | date: 'April 13, 2021', 290 | imageLink: 291 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 292 | meetupLink: 'https://www.meetup.com/ReactJSDallas/events/276279684/', 293 | speaker1: 294 | "Tim Waite - How to choose the right JS framework - And why it's probably React", 295 | venue: 'yourDevice', 296 | }, 297 | { 298 | imageBackgroundColor: null, 299 | date: 'March 2021', 300 | imageLink: 301 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 302 | meetupLink: 303 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmryccfbmb/', 304 | speaker1: 305 | 'Justin Noel - Flareact - Next.js Alternative for Cloudflare', 306 | venue: 'yourDevice', 307 | }, 308 | { 309 | imageBackgroundColor: null, 310 | date: 'February 2021', 311 | imageLink: 312 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 313 | meetupLink: 314 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmryccdbmb/', 315 | speaker1: 'Joe Warren - Laugh at my Pain Vol 1: Testing in React', 316 | venue: 'yourDevice', 317 | }, 318 | { 319 | imageBackgroundColor: null, 320 | date: 'January 2021', 321 | imageLink: 322 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 323 | meetupLink: 324 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrycccbqb/', 325 | speaker1: 326 | 'Michael Chan - Imposter Serenity: Tactics For Standing Out When You Feel ', 327 | venue: 'yourDevice', 328 | }, 329 | { 330 | imageBackgroundColor: null, 331 | date: 'December 2020', 332 | imageLink: 333 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 334 | meetupLink: 335 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcqblb/', 336 | speaker1: 337 | 'Anthony Campolo - Developing Fullstack Jamstack Applications with RedwoodJS', 338 | venue: 'yourDevice', 339 | }, 340 | { 341 | imageBackgroundColor: null, 342 | date: 'November 2020', 343 | imageLink: 344 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 345 | meetupLink: 346 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcpbnb/', 347 | speaker1: 'Mike Mathew - Open Source Group Project', 348 | venue: 'yourDevice', 349 | }, 350 | { 351 | imageBackgroundColor: null, 352 | date: 'October 2020', 353 | imageLink: 354 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 355 | meetupLink: 356 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcnbrb/', 357 | speaker1: 'Ben Myers - Hijacking Screenreaders with CSS', 358 | venue: 'yourDevice', 359 | }, 360 | { 361 | imageBackgroundColor: null, 362 | date: 'September 2020', 363 | imageLink: 364 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 365 | meetupLink: 366 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcmblb/', 367 | speaker1: 'Tim Waite - How the Hook?', 368 | speaker2: 369 | 'Joseph Campuzano - Recoil and React → State management by the react team!', 370 | venue: 'yourDevice', 371 | }, 372 | { 373 | imageBackgroundColor: null, 374 | date: 'August 2020', 375 | imageLink: 376 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 377 | meetupLink: 378 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybclbpb/', 379 | speaker1: 'Ryan Boone - Accessible React', 380 | speaker2: 'Yang Zhang - Building React UIs Visually', 381 | venue: 'yourDevice', 382 | }, 383 | { 384 | imageBackgroundColor: null, 385 | date: 'July 2020', 386 | imageLink: 387 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 388 | meetupLink: 389 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybckbsb/', 390 | speaker1: 391 | 'John Ackerman - The benefits of ReactJS and how it fits perfectly with Agile', 392 | venue: 'yourDevice', 393 | }, 394 | { 395 | imageBackgroundColor: null, 396 | date: 'June 2020', 397 | imageLink: 398 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 399 | meetupLink: 400 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcjbmb/', 401 | speaker1: 402 | 'Joe Warren - Preparing for a React Interview… During a Pandemic 😱', 403 | venue: 'yourDevice', 404 | }, 405 | { 406 | imageBackgroundColor: null, 407 | date: 'May 2020', 408 | imageLink: 409 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 410 | meetupLink: 'https://www.meetup.com/ReactJSDallas/events/270590517/', 411 | speaker1: "Patrick Hulce - Lighthouse CI: Keepin' It 100", 412 | venue: 'yourDevice', 413 | }, 414 | { 415 | imageBackgroundColor: null, 416 | date: 'April 2020', 417 | imageLink: 418 | 'https://images.unsplash.com/photo-1588702547923-7093a6c3ba33?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80', 419 | meetupLink: 'https://www.meetup.com/ReactJSDallas/events/270028353/', 420 | speaker1: 421 | 'Leslie Cohn-Wein - The Evolution of Flight: Phased rollout strategies for Jamstack projects', 422 | venue: 'yourDevice', 423 | }, 424 | { 425 | imageBackgroundColor: null, 426 | date: 'March 2020', 427 | imageLink: 428 | 'https://www.balglobal.com/wp-content/uploads/bal_logo-9-3-2018-retina.png', 429 | meetupLink: 430 | 'https://www.meetup.com/ReactJSDallas/events/mrkxmrybcfbnb/', 431 | speaker1: 'Rudy Furtado - UI First Development', 432 | speaker2: 433 | 'Enoch Tsai - Berry Appleman & Leiden Product and Tech Stack', 434 | venue: 'Berry Appleman & Leiden', 435 | }, 436 | { 437 | imageBackgroundColor: null, 438 | date: 'February 2020', 439 | imageLink: 440 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560257597/dialexa-logo_vgc57n.png', 441 | meetupLink: 442 | 'https://www.meetup.com/ReactJSDallas/events/qpxxkrybcdbpb/', 443 | speaker1: 444 | 'Lucy McGuigan - Stack, and Switch, and Tab, Oh My! - Finding Your Way with React Navigation', 445 | speaker2: 'Scott Haley - RxJS in React', 446 | speaker3: 'Doug Lasater - VR on the Web with React', 447 | venue: 'Dialexa', 448 | }, 449 | { 450 | imageBackgroundColor: null, 451 | date: 'January 2020', 452 | imageLink: 453 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256496/match_heart_blue_hpkoui.png', 454 | meetupLink: 455 | 'https://www.meetup.com/ReactJSDallas/events/qpxxkrybccbsb/', 456 | speaker1: 457 | 'David Espinoza - Using Create React App to build out your entire app', 458 | speaker2: 'Mackenzie Clark - Writing and Testing Custom Hooks', 459 | speaker3: 'Yichao Zhu - Tweaking React App Performance', 460 | venue: 'Match', 461 | }, 462 | { 463 | imageBackgroundColor: null, 464 | date: 'December 2019', 465 | imageLink: 466 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560257597/dialexa-logo_vgc57n.png', 467 | meetupLink: 468 | 'https://www.meetup.com/ReactJSDallas/events/qpxxkryzqbnb/', 469 | speaker1: 'Tim Waite - Web Components in React', 470 | speaker2: 'Sebastian Klingler - Polymorphism in TypeScript', 471 | speaker3: 'Doug Lasater - Styled Theming (Dark Mode) in React', 472 | venue: 'Dialexa', 473 | }, 474 | { 475 | imageBackgroundColor: null, 476 | date: 'November 2019', 477 | imageLink: 478 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560255997/cea-name-side_xzh2ti.png', 479 | meetupLink: 480 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzpbqb/', 481 | speaker1: 482 | 'Joe Warren - Debugging Like a Boss with the New React DevTools', 483 | speaker2: 484 | 'Ben Myers - How Accessibility Fits into a Compliance Picture', 485 | venue: 'Call-Em-All', 486 | }, 487 | { 488 | imageBackgroundColor: null, 489 | date: 'October 2019', 490 | imageLink: 491 | 'https://wieck-swa-production.s3.amazonaws.com/photos/372f5abb7c68f0bca406f561e53098d8484774ed/preview-768x432.jpg', 492 | meetupLink: 493 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyznblb/', 494 | speaker1: 'Brian Jackson - Welcome/Introduction', 495 | speaker2: 'Howard Patty - Overview of Southwest.com', 496 | speaker3: 'Allen Parslow - Micro-SPA', 497 | speaker4: 'Jerel Kuravackal - React & Dynamic Content', 498 | speaker5: 'Jennifer Howes - Responsive or Adaptive Notes', 499 | speaker6: 'Louis Reed - Accessibility', 500 | venue: 'Southwest Airlines', 501 | }, 502 | { 503 | imageBackgroundColor: null, 504 | date: 'September 2019', 505 | imageLink: 506 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560255997/cea-name-side_xzh2ti.png', 507 | meetupLink: 508 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzmbnb/', 509 | speaker1: 510 | 'Justin Noel - An Introduction to Ionic Framework with React', 511 | speaker2: 512 | 'Austin Chappell - TypeScript: Dummy-proofing Your React Application', 513 | venue: 'Call-Em-All', 514 | }, 515 | { 516 | imageBackgroundColor: null, 517 | date: 'August 2019', 518 | imageLink: 519 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256496/match_heart_blue_hpkoui.png', 520 | meetupLink: 521 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzlbrb/', 522 | speaker1: 'Joey Kreft - Styling in React', 523 | speaker2: 'David Espinoza - Getting Started with GraphQL', 524 | speaker3: 'Jon Caine - Match Tech Stack Overview', 525 | venue: 'Match', 526 | }, 527 | { 528 | imageBackgroundColor: null, 529 | date: 'July 2019', 530 | imageLink: 531 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256211/intuit-logo_cupxcj.jpg', 532 | meetupLink: 533 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzkbmb/', 534 | speaker1: 535 | 'Travis Baker - Playing Hooky with React: Effectively Use Primitive, Custom, & 3rd Party React Hooks', 536 | speaker2: 537 | 'Jaime Liz - Generators: How Do They Work & Why Should I Care', 538 | venue: 'Intuit', 539 | }, 540 | { 541 | imageBackgroundColor: null, 542 | date: 'June 2019', 543 | imageLink: 544 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560255997/cea-name-side_xzh2ti.png', 545 | meetupLink: 546 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzjbpb/', 547 | speaker1: 'Mike Mathew - Test your components', 548 | venue: 'Call-Em-All', 549 | }, 550 | { 551 | imageBackgroundColor: '#0a0a0a', 552 | date: 'May 2019', 553 | imageLink: 554 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256252/devmtn_white_logo_xcdg6i.png', 555 | meetupLink: 556 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzhbsb/', 557 | speaker1: 'Mike Mathew - React 101', 558 | venue: 'DevMountain', 559 | }, 560 | { 561 | imageBackgroundColor: null, 562 | date: 'April 2019', 563 | imageLink: 564 | 'https://www.lifeblue.com/resources/motif/images/lb-full-logo.svg', 565 | meetupLink: 566 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzgbmb/', 567 | speaker1: 568 | 'Patrick Hulce - Chrome Internals: How do all these tools work anyway?', 569 | speaker2: 570 | 'Leslie Cohn-Wein - Spreading the JAM: Getting started with the JAMstack using Gatsby and Netlify Forms', 571 | venue: 'Lifeblue', 572 | }, 573 | { 574 | imageBackgroundColor: null, 575 | date: 'March 2019', 576 | imageLink: 577 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256496/match_heart_blue_hpkoui.png', 578 | meetupLink: 579 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzfbqb/', 580 | speaker1: 'Austin Chappell - Testing with Jest/Enzyme', 581 | speaker2: 582 | 'Joey Kreft -Separation of Concerns in Component Architecture', 583 | venue: 'Match', 584 | }, 585 | { 586 | imageBackgroundColor: null, 587 | date: 'February 2019', 588 | imageLink: 589 | 'https://www.roberthalf.com/sites/default/files/Logo_MRv1.png', 590 | meetupLink: 591 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzdbqb/', 592 | speaker1: 593 | 'Patrick Hulce - Progressive Web Apps & You: Braving the Offline Web', 594 | speaker2: 'Mike Mathew - Material-UI Tips and Tricks', 595 | venue: 'Robert Half', 596 | }, 597 | { 598 | imageBackgroundColor: '#0a0a0a', 599 | date: 'January 2019', 600 | imageLink: 601 | 'https://www.belomediagroup.com/wp-content/uploads/2017/06/TheDallasMorningNews_white-768x210.png', 602 | meetupLink: 603 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyzcblb/', 604 | speaker1: 'Mike Orren - Why React is big news for local news', 605 | venue: 'The Dallas Morning News', 606 | }, 607 | { 608 | imageBackgroundColor: null, 609 | date: 'December 2018', 610 | imageLink: 611 | 'https://www.bottlerocketstudios.com/wp-content/uploads/2019/06/Bottle-Rocket-Site-Logo.png', 612 | meetupLink: 613 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyxqbpb/', 614 | speaker1: 'Morgan Dedmon — WASM: What is that?', 615 | speaker2: 'Salvador Aceves — Redux Sagas in Practice', 616 | venue: 'Bottle Rocket', 617 | }, 618 | { 619 | imageBackgroundColor: null, 620 | date: 'November 2018', 621 | imageLink: 622 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256496/match_heart_blue_hpkoui.png', 623 | meetupLink: 624 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyxpbrb/', 625 | speaker1: 'Aaron Blackshear — BrainJS: An Intro to Neural Networks', 626 | speaker2: 'David Espinoza — Learn a bit about React Hooks!', 627 | speaker3: 628 | 'Patrick Hulce — Staying Off the Rocks: Chrome DevTools + Lighthouse', 629 | venue: 'Match', 630 | }, 631 | { 632 | imageBackgroundColor: null, 633 | date: 'October 2018', 634 | imageLink: 635 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560255997/cea-name-side_xzh2ti.png', 636 | meetupLink: 637 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyxnbmb/', 638 | speaker1: 639 | 'Mike Mathew — Facilitate contributing to the ReactJS Dallas website', 640 | speaker2: 'Hack night!', 641 | venue: 'Call-Em-All', 642 | }, 643 | { 644 | imageBackgroundColor: '#191514', 645 | date: 'September 2018', 646 | imageLink: 647 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560257597/dialexa-logo_vgc57n.png', 648 | meetupLink: 649 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyxmbpb/', 650 | speaker1: 'Ehis Ojielu — React Suspense', 651 | speaker2: 'Mike Mathew - Gatsby Gotchas', 652 | venue: 'Dialexa', 653 | }, 654 | { 655 | imageBackgroundColor: null, 656 | date: 'August 2018', 657 | imageLink: 658 | 'https://res.cloudinary.com/drumsensei/image/upload/v1560256496/match_heart_blue_hpkoui.png', 659 | meetupLink: 660 | 'https://www.meetup.com/ReactJSDallas/events/pbbdwnyxlbsb/', 661 | speaker1: 'Lightning Talks from the Match team', 662 | speaker2: 'Joey Kreft - On the Grid', 663 | venue: 'Match', 664 | }, 665 | ]; 666 | -------------------------------------------------------------------------------- /src/utils/constants/index.js: -------------------------------------------------------------------------------- 1 | export { default as events } from './events'; 2 | -------------------------------------------------------------------------------- /src/utils/getPageContext.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-underscore-dangle */ 2 | 3 | import { SheetsRegistry } from 'jss'; 4 | import { createMuiTheme, createGenerateClassName } from '@material-ui/core/styles'; 5 | import indigo from '@material-ui/core/colors/indigo'; 6 | import purple from '@material-ui/core/colors/purple'; 7 | 8 | const defaultTheme = createMuiTheme(); 9 | 10 | // A theme with custom primary and secondary color. 11 | // It's optional. 12 | const theme = createMuiTheme({ 13 | ...defaultTheme, 14 | palette: { 15 | ...defaultTheme.palette, 16 | primary: { 17 | light: indigo[300], 18 | main: indigo[500], 19 | dark: indigo[700], 20 | }, 21 | secondary: { 22 | light: purple[300], 23 | main: purple[500], 24 | dark: purple[700], 25 | }, 26 | }, 27 | typography: { 28 | useNextVariants: true, 29 | }, 30 | }); 31 | 32 | function createPageContext() { 33 | return { 34 | theme, 35 | // This is needed in order to deduplicate the injection of CSS in the page. 36 | sheetsManager: new Map(), 37 | // This is needed in order to inject the critical CSS. 38 | sheetsRegistry: new SheetsRegistry(), 39 | // The standard class name generator. 40 | generateClassName: createGenerateClassName(), 41 | }; 42 | } 43 | 44 | export default function getPageContext() { 45 | // Make sure to create a new context for every server-side request so that data 46 | // isn't shared between connections (which would be bad). 47 | if (!process.browser) { 48 | return createPageContext(); 49 | } 50 | 51 | // Reuse context on the client-side. 52 | if (!global.__INIT_MATERIAL_UI__) { 53 | global.__INIT_MATERIAL_UI__ = createPageContext(); 54 | } 55 | 56 | return global.__INIT_MATERIAL_UI__; 57 | } 58 | -------------------------------------------------------------------------------- /src/utils/withRoot.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { MuiThemeProvider } from '@material-ui/core/styles'; 3 | import CssBaseline from '@material-ui/core/CssBaseline'; 4 | import JssProvider from 'react-jss/lib/JssProvider'; 5 | import getPageContext from './getPageContext'; 6 | 7 | function withRoot(Component) { 8 | class WithRoot extends React.Component { 9 | constructor(props) { 10 | super(props); 11 | this.muiPageContext = getPageContext(); 12 | } 13 | 14 | componentDidMount() { 15 | let jssStyles; 16 | 17 | if (typeof document !== 'undefined') { 18 | // Remove the server-side injected CSS. 19 | jssStyles = document.querySelector('#jss-server-side'); 20 | } 21 | if (jssStyles && jssStyles.parentNode) { 22 | jssStyles.parentNode.removeChild(jssStyles); 23 | } 24 | } 25 | 26 | render() { 27 | return ( 28 | 29 | {/* MuiThemeProvider makes the theme available down the React 30 | tree thanks to React context. */} 31 | 35 | {/* CssBaseline kickstarts an elegant, consistent, and simple baseline to build upon. */} 36 | 37 | 38 | 39 | 40 | ); 41 | } 42 | } 43 | 44 | return WithRoot; 45 | } 46 | 47 | export default withRoot; 48 | --------------------------------------------------------------------------------