├── .eslintrc ├── public ├── favicon.ico ├── assets │ ├── logo.png │ ├── user.png │ ├── ralph.jpg │ └── categoryImages │ │ ├── film.jpg │ │ ├── math.jpg │ │ ├── physics.jpg │ │ ├── chemistry.jpg │ │ ├── engineering.jpg │ │ └── literature.jpg ├── favicon-goober.ico ├── favicon-react.ico ├── manifest.json └── index.html ├── docs ├── source │ ├── testwebapp-dev-todo.rst │ ├── help.rst │ ├── index.rst │ ├── testwebapp-quickstart.rst │ ├── testwebapp-fork-acceptance.rst │ ├── testwebapp-fork-todo.rst │ ├── help-build-docs.rst │ ├── testwebapp-fork-ralph.rst │ └── conf.py ├── Makefile └── make.bat ├── src ├── features │ ├── auth │ │ ├── authConstants.jsx │ │ ├── SocialLogin │ │ │ └── SocialLogin.jsx │ │ ├── authReducer.jsx │ │ ├── Login │ │ │ └── LoginForm.jsx │ │ ├── Register │ │ │ └── RegisterForm.jsx │ │ └── authActions.jsx │ ├── modals │ │ ├── modalConstants.jsx │ │ ├── modalActions.jsx │ │ ├── modalReducer.jsx │ │ ├── TestModal.jsx │ │ ├── ModalManager.jsx │ │ ├── LoginModal.jsx │ │ └── RegisterModal.jsx │ ├── async │ │ ├── asyncConstants.jsx │ │ ├── asyncActions.jsx │ │ └── asyncReducer.jsx │ ├── request │ │ ├── requestConstants.jsx │ │ ├── RequestDetail │ │ │ ├── RequestDetailChat.jsx │ │ │ └── RequestDetailPage.jsx │ │ ├── requestReducer.jsx │ │ ├── RequestForm │ │ │ └── RequestForm.jsx │ │ └── requestActions.jsx │ ├── session │ │ ├── sessionConstants.jsx │ │ ├── SessionActivity │ │ │ └── SessionActivity.jsx │ │ ├── SessionList │ │ │ ├── SessionListAttendee.jsx │ │ │ ├── SessionList.jsx │ │ │ └── SessionListItem.jsx │ │ ├── RalphDetail │ │ │ ├── SessionDetailMap.jsx │ │ │ ├── SessionDetailChatForm.jsx │ │ │ ├── SessionDetailSidebar.jsx │ │ │ ├── SessionDetailHeader.jsx │ │ │ ├── SessionDetailInfo.jsx │ │ │ ├── SessionDetailPage.jsx │ │ │ └── SessionDetailChat.jsx │ │ ├── SessionDetail │ │ │ ├── SessionDetailMap.jsx │ │ │ ├── SessionDetailChatForm.jsx │ │ │ ├── SessionDetailSidebar.jsx │ │ │ ├── SessionDetailHeader.jsx │ │ │ ├── SessionDetailInfo.jsx │ │ │ ├── SessionDetailPage.jsx │ │ │ └── SessionDetailChat.jsx │ │ ├── sessionReducer.jsx │ │ ├── SessionDashboard │ │ │ └── SessionDashboard.jsx │ │ ├── sessionActions.jsx │ │ └── RalphForm │ │ │ └── SessionForm.jsx │ ├── subject │ │ ├── subjectConstants.jsx │ │ ├── SubjectDetail │ │ │ └── SubjectDetailPage.jsx │ │ ├── SubjectList │ │ │ ├── SubjectListProvider.jsx │ │ │ ├── SubjectList.jsx │ │ │ └── SubjectListItem.jsx │ │ ├── subjectReducer.jsx │ │ ├── subjectActions.jsx │ │ ├── SubjectForm │ │ │ └── SubjectForm.jsx │ │ └── SubjectDashboard │ │ │ └── SubjectDashboard.jsx │ ├── user │ │ ├── PeopleDashboard │ │ │ └── PeopleDashboard.jsx │ │ ├── userQueries.jsx │ │ ├── UserDetailed │ │ │ ├── UserDetailedSidebar.jsx │ │ │ ├── UserDetailedPhotos.jsx │ │ │ ├── UserDetailedHeader.jsx │ │ │ ├── UserDetailedDescription.jsx │ │ │ ├── UserDetailedSessions.jsx │ │ │ └── UserDetailedPage.jsx │ │ └── Settings │ │ │ ├── SettingsNav.jsx │ │ │ ├── SettingsDashboard.jsx │ │ │ ├── BasicPage.jsx │ │ │ ├── AccountPage.jsx │ │ │ ├── AboutPage.jsx │ │ │ └── PhotosPage.jsx │ ├── callRalph │ │ ├── testConstants.jsx │ │ ├── testActions.jsx │ │ ├── testReducer.js │ │ └── TestComponent.jsx │ ├── testarea │ │ ├── testConstants.jsx │ │ ├── testActions.jsx │ │ ├── testReducer.js │ │ └── TestComponent.jsx │ ├── nav │ │ ├── Menus │ │ │ ├── SignedOutMenu.jsx │ │ │ └── SignedInMenu.jsx │ │ └── NavBar │ │ │ └── NavBar.jsx │ └── home │ │ └── HomePage.jsx ├── app │ ├── layout │ │ ├── NoSessions.jsx │ │ ├── NotFound.jsx │ │ ├── LoadingComponent.jsx │ │ └── App.jsx │ ├── common │ │ ├── util │ │ │ ├── reducerUtil.js │ │ │ ├── ScrollToTop.jsx │ │ │ └── helpers.js │ │ └── form │ │ │ ├── RadioInput.jsx │ │ │ ├── TextInput.jsx │ │ │ ├── TextArea.jsx │ │ │ ├── SelectInput.jsx │ │ │ ├── DateInput.jsx │ │ │ └── PlaceInput.jsx │ ├── data │ │ ├── mockApi.js │ │ └── sampleData.js │ ├── config │ │ └── firebase.js │ ├── reducers │ │ └── rootReducer.js │ └── store │ │ └── configureStore.js ├── index.js ├── index.css └── registerServiceWorker.js ├── README.md ├── app-keys-env-example ├── app-keys.env ├── functions ├── index.js ├── package.json └── .eslintrc.json ├── .vscode └── launch.json ├── .gitignore ├── firebase.json └── package.json /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "react-app" 3 | } -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/favicon.ico -------------------------------------------------------------------------------- /public/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/logo.png -------------------------------------------------------------------------------- /public/assets/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/user.png -------------------------------------------------------------------------------- /public/assets/ralph.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/ralph.jpg -------------------------------------------------------------------------------- /public/favicon-goober.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/favicon-goober.ico -------------------------------------------------------------------------------- /public/favicon-react.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/favicon-react.ico -------------------------------------------------------------------------------- /docs/source/testwebapp-dev-todo.rst: -------------------------------------------------------------------------------- 1 | testwebapp dev todo 2 | =================== 3 | 4 | #. TODO: TBD 5 | #. TODO: TBD -------------------------------------------------------------------------------- /public/assets/categoryImages/film.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/film.jpg -------------------------------------------------------------------------------- /public/assets/categoryImages/math.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/math.jpg -------------------------------------------------------------------------------- /src/features/auth/authConstants.jsx: -------------------------------------------------------------------------------- 1 | export const LOGIN_USER = "LOGIN_USER"; 2 | export const SIGN_OUT_USER = "SIGN_OUT_USER"; -------------------------------------------------------------------------------- /src/features/modals/modalConstants.jsx: -------------------------------------------------------------------------------- 1 | export const MODAL_OPEN = "MODAL_OPEN"; 2 | export const MODAL_CLOSE = "MODAL_CLOSE"; -------------------------------------------------------------------------------- /public/assets/categoryImages/physics.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/physics.jpg -------------------------------------------------------------------------------- /public/assets/categoryImages/chemistry.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/chemistry.jpg -------------------------------------------------------------------------------- /public/assets/categoryImages/engineering.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/engineering.jpg -------------------------------------------------------------------------------- /public/assets/categoryImages/literature.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2Cld/testwebapp/master/public/assets/categoryImages/literature.jpg -------------------------------------------------------------------------------- /src/app/layout/NoSessions.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default () => { 4 | return ( 5 |
6 |

No Sessions Scheduled.

7 |
8 | ) 9 | } -------------------------------------------------------------------------------- /src/app/layout/NotFound.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default () => { 4 | return ( 5 |
6 |

Error 404 page not found

7 |
8 | ) 9 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # testwebapp 2 | 3 | Goober Testwebapp ReactJS application. 4 | 5 | ## Getting Started 6 | 7 | This project was bootstrapped with [Create React App](https://github.com/facebookincubator/create-react-app). -------------------------------------------------------------------------------- /src/features/async/asyncConstants.jsx: -------------------------------------------------------------------------------- 1 | export const ASYNC_ACTION_START = "ASYNC_ACTION_START"; 2 | export const ASYNC_ACTION_FINISH = "ASYNC_ACTION_FINISH"; 3 | export const ASYNC_ACTION_ERROR = "ASYNC_ACTION_ERROR"; -------------------------------------------------------------------------------- /app-keys-env-example: -------------------------------------------------------------------------------- 1 | GOOBERU_API_KEY="yourAPIkey" 2 | GOOBERU_SENDERID="yourSENDERID" 3 | GOOBERU_MAPS_KEY="yourMAPSApiKey" 4 | GOOBERU_MAPS_URL="https://maps.googleapis.com/maps/api/js?key=YourMAPSApiKey&libraries=places" 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/features/request/requestConstants.jsx: -------------------------------------------------------------------------------- 1 | export const CREATE_REQUEST = "CREATE_REQUEST"; 2 | export const UPDATE_REQUEST = "UPDATE_REQUEST"; 3 | export const DELETE_REQUEST = "DELETE_REQUEST"; 4 | export const FETCH_REQUESTS = "FETCH_REQUESTS"; -------------------------------------------------------------------------------- /src/features/session/sessionConstants.jsx: -------------------------------------------------------------------------------- 1 | export const CREATE_SESSION = "CREATE_SESSION"; 2 | export const UPDATE_SESSION = "UPDATE_SESSION"; 3 | export const DELETE_SESSION = "DELETE_SESSION"; 4 | export const FETCH_SESSIONS = "FETCH_SESSIONS"; -------------------------------------------------------------------------------- /src/features/subject/subjectConstants.jsx: -------------------------------------------------------------------------------- 1 | export const CREATE_SUBJECT = "CREATE_SUBJECT"; 2 | export const UPDATE_SUBJECT = "UPDATE_SUBJECT"; 3 | export const DELETE_SUBJECT = "DELETE_SUBJECT"; 4 | export const FETCH_SUBJECTS = "FETCH_SUBJECTS"; -------------------------------------------------------------------------------- /src/app/common/util/reducerUtil.js: -------------------------------------------------------------------------------- 1 | export const createReducer = (initialState, fnMap) => { 2 | return (state = initialState, { type, payload }) => { 3 | const handler = fnMap[type]; 4 | 5 | return handler ? handler(state, payload) : state; 6 | }; 7 | }; 8 | -------------------------------------------------------------------------------- /src/features/user/PeopleDashboard/PeopleDashboard.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PeopleDashboard = () => { 4 | return ( 5 |
6 |

PeopleDashboard

7 |
8 | ) 9 | }; 10 | 11 | export default PeopleDashboard; 12 | -------------------------------------------------------------------------------- /src/features/callRalph/testConstants.jsx: -------------------------------------------------------------------------------- 1 | export const INCREMENT_COUNTER = "INCREMENT_COUNTER"; 2 | export const DECREMENT_COUNTER = "DECREMENT_COUNTER"; 3 | export const COUNTER_ACTION_START = "COUNTER_ACTION_START"; 4 | export const COUNTER_ACTION_DONE = "COUNTER_ACTION_DONE"; -------------------------------------------------------------------------------- /src/features/testarea/testConstants.jsx: -------------------------------------------------------------------------------- 1 | export const INCREMENT_COUNTER = "INCREMENT_COUNTER"; 2 | export const DECREMENT_COUNTER = "DECREMENT_COUNTER"; 3 | export const COUNTER_ACTION_START = "COUNTER_ACTION_START"; 4 | export const COUNTER_ACTION_DONE = "COUNTER_ACTION_DONE"; -------------------------------------------------------------------------------- /src/features/subject/SubjectDetail/SubjectDetailPage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SubjectDetailPage = () => { 4 | return ( 5 |
6 |

SubjectDetailPage

7 |
8 | ) 9 | }; 10 | 11 | export default SubjectDetailPage; 12 | -------------------------------------------------------------------------------- /app-keys.env: -------------------------------------------------------------------------------- 1 | 2 | 3 | GOOBERU_API_KEY="AIzaSyBxGiU3Cm0r-TYaoNzzrTWtZNVB4MzZzQI" 4 | GOOBERU_SENDERID="931119937625" 5 | GOOBERU_MAPS_KEY="AIzaSyDQpU2xxESgXFfCZZV5DgKOLdvFndaGbh8" 6 | GOOBERU_MAPS_URL="https://maps.googleapis.com/maps/api/js?key=AIzaSyDQpU2xxESgXFfCZZV5DgKOLdvFndaGbh8&libraries=places" 7 | 8 | -------------------------------------------------------------------------------- /src/app/data/mockApi.js: -------------------------------------------------------------------------------- 1 | import sampleData from './sampleData'; 2 | 3 | const delay = (ms) => { 4 | return new Promise(resolve => setTimeout(resolve, ms)) 5 | }; 6 | 7 | export const fetchSampleData = () => { 8 | return delay(1000).then(() => { 9 | return Promise.resolve(sampleData) 10 | }) 11 | }; -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | 3 | // // Create and Deploy Your First Cloud Functions 4 | // // https://firebase.google.com/docs/functions/write-firebase-functions 5 | // 6 | // exports.helloWorld = functions.https.onRequest((request, response) => { 7 | // response.send("Hello from Firebase!"); 8 | // }); 9 | -------------------------------------------------------------------------------- /src/app/layout/LoadingComponent.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Dimmer, Loader } from 'semantic-ui-react'; 3 | 4 | const LoadingComponent = ({inverted}) => { 5 | return ( 6 | 7 | 8 | 9 | ) 10 | }; 11 | 12 | export default LoadingComponent -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "GooberU", 3 | "name": "Goober App TestWebApp", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /src/features/modals/modalActions.jsx: -------------------------------------------------------------------------------- 1 | import { MODAL_CLOSE, MODAL_OPEN } from './modalConstants'; 2 | 3 | export const openModal = (modalType, modalProps) => { 4 | return { 5 | type: MODAL_OPEN, 6 | payload: { 7 | modalType, 8 | modalProps 9 | } 10 | } 11 | }; 12 | 13 | export const closeModal = () => { 14 | return { 15 | type: MODAL_CLOSE 16 | } 17 | }; -------------------------------------------------------------------------------- /src/app/common/form/RadioInput.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Form } from 'semantic-ui-react' 3 | 4 | const RadioInput = ({input, width, type, label}) => { 5 | return ( 6 | 7 |
8 | {' '} 9 | 10 |
11 |
12 | ) 13 | } 14 | 15 | export default RadioInput 16 | -------------------------------------------------------------------------------- /src/features/session/SessionActivity/SessionActivity.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Header, Segment } from 'semantic-ui-react'; 3 | 4 | const SessionActivity = () => { 5 | return ( 6 |
7 |
8 | 9 |

Recent activity

10 |
11 |
12 | ) 13 | }; 14 | 15 | export default SessionActivity -------------------------------------------------------------------------------- /src/app/common/util/ScrollToTop.jsx: -------------------------------------------------------------------------------- 1 | import { Component } from "react"; 2 | import { withRouter } from "react-router-dom"; 3 | 4 | class ScrollToTop extends Component { 5 | componentDidUpdate(prevProps) { 6 | if (this.props.location !== prevProps.location) { 7 | window.scrollTo(0, 0); 8 | } 9 | } 10 | 11 | render() { 12 | return this.props.children; 13 | } 14 | } 15 | 16 | export default withRouter(ScrollToTop); 17 | -------------------------------------------------------------------------------- /docs/source/help.rst: -------------------------------------------------------------------------------- 1 | Help 2 | ==== 3 | 4 | Ping cat_at_bast23_dot_me 5 | 6 | Various help various tool chain setups. 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | 11 | help-build-docs 12 | 13 | 14 | Things 15 | ------ 16 | 17 | idempotent - denoting an element of a set that is unchanged in value when multiplied or otherwise operated on by itself. 18 | immutable - unchanging over time or unable to be changed. 19 | ephemeral - lasting for a very short time. -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | ================== 2 | gooberu-testwebapp 3 | ================== 4 | 5 | Guide 6 | ^^^^^ 7 | 8 | .. toctree:: 9 | :maxdepth: 2 10 | 11 | testwebapp-quickstart 12 | testwebapp-dev-todo 13 | testwebapp-dev-detail 14 | testwebapp-fork-todo 15 | testwebapp-fork-ralph 16 | testwebapp-fork-acceptance 17 | help 18 | 19 | test 20 | 21 | Indices and tables 22 | ================== 23 | 24 | * :ref:`genindex` 25 | * :ref:`search` -------------------------------------------------------------------------------- /src/features/subject/SubjectList/SubjectListProvider.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { List, Image } from 'semantic-ui-react'; 3 | 4 | class SubjectListProvider extends Component { 5 | render() { 6 | const {attendee} = this.props; 7 | return ( 8 | 9 | 10 | 11 | ) 12 | } 13 | }; 14 | 15 | export default SubjectListProvider; 16 | -------------------------------------------------------------------------------- /src/features/auth/SocialLogin/SocialLogin.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Button, Icon } from 'semantic-ui-react'; 3 | 4 | const SocialLogin = ({socialLogin}) => { 5 | return ( 6 |
7 | 11 |
12 | ); 13 | }; 14 | 15 | export default SocialLogin; 16 | -------------------------------------------------------------------------------- /src/features/async/asyncActions.jsx: -------------------------------------------------------------------------------- 1 | import { ASYNC_ACTION_ERROR, ASYNC_ACTION_FINISH, ASYNC_ACTION_START } from './asyncConstants'; 2 | 3 | export const asyncActionStart = () => { 4 | return { 5 | type: ASYNC_ACTION_START 6 | } 7 | }; 8 | 9 | export const asyncActionFinish = () => { 10 | return { 11 | type: ASYNC_ACTION_FINISH 12 | } 13 | }; 14 | 15 | export const asyncActionError = () => { 16 | return { 17 | type: ASYNC_ACTION_ERROR 18 | } 19 | }; -------------------------------------------------------------------------------- /src/app/common/form/TextInput.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Form, Label } from 'semantic-ui-react' 3 | 4 | const TextInput = ({input, width, type, placeholder, meta: {touched, error}}) => { 5 | return ( 6 | 7 | 8 | {touched && error && } 9 | 10 | ) 11 | } 12 | 13 | export default TextInput 14 | -------------------------------------------------------------------------------- /src/app/common/form/TextArea.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Form, Label } from 'semantic-ui-react' 3 | 4 | const TextArea = ({input, rows, width, type, placeholder, meta: {touched, error}}) => { 5 | return ( 6 | 7 | 8 | {touched && error && } 9 | 10 | ) 11 | } 12 | 13 | export default TextArea 14 | -------------------------------------------------------------------------------- /src/features/nav/Menus/SignedOutMenu.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Menu, Button } from 'semantic-ui-react'; 3 | 4 | const SignedOutMenu = ({signIn, register}) => { 5 | return ( 6 | 7 |