diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ee4bfd --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries +.idea + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/admin-panel/src/App.js b/admin-panel/src/App.js index fd110f7..44e860d 100644 --- a/admin-panel/src/App.js +++ b/admin-panel/src/App.js @@ -1,23 +1,21 @@ -import React, { Component } from 'react' -import {Route} from 'react-router-dom' -import Auth from './components/routes/auth' -import Admin from './components/routes/Admin' -import ProtectedRoute from './components/common/ProtectedRoute' +import React, { Component } from "react"; +import { Route } from "react-router-dom"; +import Auth from "./components/routes/auth"; +import Admin from "./components/routes/Admin"; +import ProtectedRoute from "./components/common/ProtectedRoute"; class App extends Component { - static propTypes = { + static propTypes = {}; - }; - - render() { - return ( -
-

Hello world

- - -
- ) - } + render() { + return ( +
+

Hello world

+ + +
+ ); + } } -export default App \ No newline at end of file +export default App; diff --git a/admin-panel/src/Root.js b/admin-panel/src/Root.js index f69da88..7ebfadc 100644 --- a/admin-panel/src/Root.js +++ b/admin-panel/src/Root.js @@ -1,24 +1,22 @@ -import React, { Component } from 'react' -import {ConnectedRouter as Router} from 'react-router-redux' -import {Provider} from 'react-redux' -import App from './App' -import store from './redux' -import history from './history' +import React, { Component } from "react"; +import { ConnectedRouter as Router } from "react-router-redux"; +import { Provider } from "react-redux"; +import App from "./App"; +import store from "./redux"; +import history from "./history"; class Root extends Component { - static propTypes = { + static propTypes = {}; - }; - - render() { - return ( - - - - - - ) - } + render() { + return ( + + + + + + ); + } } -export default Root \ No newline at end of file +export default Root; diff --git a/admin-panel/src/components/auth/SignInForm.js b/admin-panel/src/components/auth/SignInForm.js index 3033ef6..344223a 100644 --- a/admin-panel/src/components/auth/SignInForm.js +++ b/admin-panel/src/components/auth/SignInForm.js @@ -1,30 +1,28 @@ -import React, { Component } from 'react' -import {reduxForm, Field} from 'redux-form' +import React, { Component } from "react"; +import { reduxForm, Field } from "redux-form"; class SignInForm extends Component { - static propTypes = { + static propTypes = {}; - }; - - render() { - return ( -
-

Sign In

-
-
- email: -
-
- password: -
- -
- -
- ) - } + render() { + return ( +
+

Sign In

+
+
+ email: +
+
+ password:{" "} + +
+ +
+
+ ); + } } export default reduxForm({ - form: 'auth' -})(SignInForm) \ No newline at end of file + form: "auth", +})(SignInForm); diff --git a/admin-panel/src/components/auth/SignUpForm.js b/admin-panel/src/components/auth/SignUpForm.js index d8e9a85..b2d0aa0 100644 --- a/admin-panel/src/components/auth/SignUpForm.js +++ b/admin-panel/src/components/auth/SignUpForm.js @@ -1,45 +1,44 @@ -import React, { Component } from 'react' -import {reduxForm, Field} from 'redux-form' -import validator from 'email-validator' -import ErrorField from '../common/ErrorField' +import React, { Component } from "react"; +import { reduxForm, Field } from "redux-form"; +import validator from "email-validator"; +import ErrorField from "../common/ErrorField"; class SignUpForm extends Component { - static propTypes = { - - }; - - render() { - return ( -
-

Sign In

-
-
- email: -
-
- password: -
- -
- -
- ) - } + static propTypes = {}; + + render() { + return ( +
+

Sign In

+
+
+ email: +
+
+ password:{" "} + +
+ +
+
+ ); + } } const validate = ({ email, password }) => { - const errors = {} + const errors = {}; - if (!email) errors.email = 'email is a required field' - if (email && !validator.validate(email)) errors.email = 'incorrect email format' + if (!email) errors.email = "email is a required field"; + if (email && !validator.validate(email)) + errors.email = "incorrect email format"; - if (!password) errors.password = 'password is a required field' - if (password && password.length < 8) errors.password = 'password is to short' + if (!password) errors.password = "password is a required field"; + if (password && password.length < 8) errors.password = "password is to short"; - return errors -} + return errors; +}; export default reduxForm({ - form: 'auth', - validate -})(SignUpForm) \ No newline at end of file + form: "auth", + validate, +})(SignUpForm); diff --git a/admin-panel/src/components/common/ErrorField.js b/admin-panel/src/components/common/ErrorField.js index e9b16d5..346b500 100644 --- a/admin-panel/src/components/common/ErrorField.js +++ b/admin-panel/src/components/common/ErrorField.js @@ -1,20 +1,19 @@ -import React, { Component } from 'react' +import React, { Component } from "react"; class ErrorField extends Component { - static propTypes = { + static propTypes = {}; - }; - - render() { - const {input, meta: { error, touched }, type} = this.props - const errorMessage = error && touched &&

{error}

- return ( -
- - {errorMessage} -
- ) - } + render() { + const { input, meta: { error, touched }, type } = this.props; + const errorMessage = error && + touched &&

{error}

; + return ( +
+ + {errorMessage} +
+ ); + } } -export default ErrorField \ No newline at end of file +export default ErrorField; diff --git a/admin-panel/src/components/common/ProtectedRoute.js b/admin-panel/src/components/common/ProtectedRoute.js index 1b12def..373ba05 100644 --- a/admin-panel/src/components/common/ProtectedRoute.js +++ b/admin-panel/src/components/common/ProtectedRoute.js @@ -1,24 +1,31 @@ -import React, { Component } from 'react' -import {Route} from 'react-router-dom' -import {connect} from 'react-redux' -import {userSelector} from '../../ducks/auth' +import React, { Component } from "react"; +import { Route } from "react-router-dom"; +import { connect } from "react-redux"; +import { userSelector } from "../../ducks/auth"; class ProtectedRoute extends Component { - static propTypes = { + static propTypes = {}; - }; + render() { + const { component, authorized, ...rest } = this.props; + return ; + } - render() { - const {component, authorized, ...rest} = this.props - return - } - - renderAuthorized = ({match}) => { -// const {authorized, ...rest} = this.props - return this.props.authorized ? :

UnAuthorized

- } + renderAuthorized = ({ match }) => { + // const {authorized, ...rest} = this.props + return this.props.authorized ? ( + + ) : ( +

UnAuthorized

+ ); + }; } -export default connect(state => ({ - authorized: userSelector(state) -}), null, null, {pure: false})(ProtectedRoute) \ No newline at end of file +export default connect( + state => ({ + authorized: userSelector(state), + }), + null, + null, + { pure: false }, +)(ProtectedRoute); diff --git a/admin-panel/src/components/people/AddPeopleForm.js b/admin-panel/src/components/people/AddPeopleForm.js new file mode 100644 index 0000000..af6f71d --- /dev/null +++ b/admin-panel/src/components/people/AddPeopleForm.js @@ -0,0 +1,51 @@ +import React, { Component } from "react"; +import { reduxForm, Field } from "redux-form"; +import validator from "email-validator"; +import ErrorField from "../common/ErrorField"; + +class AddPeopleForm extends Component { + render() { + return ( +
+

Add people from Page

+
+
+ first name: + +
+ +
+ last name: + +
+ +
+ email: +
+ + +
+
+ ); + } +} + + +const validate = ({ email, firstName, lastName }) => { + const errors = {}; + + if (!email) errors.email = "email is a required field"; + if (email && !validator.validate(email)) + errors.email = "incorrect email format"; + + if (!firstName) errors.firstName = "firstName is a required field"; + if (!lastName) errors.firstName = "firstName is a required field"; + + return errors; +}; + + +export default reduxForm({ + form: "people", + validate, +})(AddPeopleForm); diff --git a/admin-panel/src/components/routes/Admin.js b/admin-panel/src/components/routes/Admin.js index 952248e..254bbe2 100644 --- a/admin-panel/src/components/routes/Admin.js +++ b/admin-panel/src/components/routes/Admin.js @@ -1,17 +1,21 @@ -import React, { Component } from 'react' +import React, { Component } from "react"; +import AddPeopleForm from "../people/AddPeopleForm"; +import { addPeople } from "../../ducks/people"; +import { connect } from "react-redux"; class Admin extends Component { - static propTypes = { + static propTypes = {}; - }; + render() { + return ( +
+

Admin Page

+ +
+ ); + } - render() { - return ( -
-

Admin Page

-
- ) - } + sendPeople = (people ) => this.props.addPeople(people); } -export default Admin \ No newline at end of file +export default connect(null, { addPeople })(Admin); diff --git a/admin-panel/src/components/routes/auth/index.js b/admin-panel/src/components/routes/auth/index.js index 91c9bab..b6d3f11 100644 --- a/admin-panel/src/components/routes/auth/index.js +++ b/admin-panel/src/components/routes/auth/index.js @@ -1,32 +1,43 @@ -import React, { Component } from 'react' -import {Route, NavLink} from 'react-router-dom' -import {connect} from 'react-redux' -import {signIn, signUp} from '../../../ducks/auth' -import SignInForm from '../../auth/SignInForm' -import SignUpForm from '../../auth/SignUpForm' +import React, { Component } from "react"; +import { Route, NavLink } from "react-router-dom"; +import { connect } from "react-redux"; +import { signIn, signUp } from "../../../ducks/auth"; +import SignInForm from "../../auth/SignInForm"; +import SignUpForm from "../../auth/SignUpForm"; class Auth extends Component { - static propTypes = { + static propTypes = {}; - }; - - render() { - return ( -
-

Auth page

-
    -
  • Sign In
  • -
  • Sign Up
  • -
- } /> - } /> -
- ) - } - - onSignIn = ({ email, password }) => this.props.signIn(email, password) - onSignUp = ({ email, password }) => this.props.signUp(email, password) + render() { + return ( +
+

Auth page

+
    +
  • + + Sign In + +
  • +
  • + + Sign Up + +
  • +
+ } + /> + } + /> +
+ ); + } + onSignIn = ({ email, password }) => this.props.signIn(email, password); + onSignUp = ({ email, password }) => this.props.signUp(email, password); } -export default connect(null, { signIn, signUp })(Auth) \ No newline at end of file +export default connect(null, { signIn, signUp })(Auth); diff --git a/admin-panel/src/config.js b/admin-panel/src/config.js index 65bba00..c2d4248 100644 --- a/admin-panel/src/config.js +++ b/admin-panel/src/config.js @@ -1,14 +1,14 @@ -import firebase from 'firebase' +import firebase from "firebase"; -export const appName = 'advreact-04-12' +export const appName = "adv-react-lykovrs"; const config = { - apiKey: "AIzaSyCmDWlgYIhtEr1pWjgKYds3iXKWBl9wbjE", - authDomain: `${appName}.firebaseapp.com`, - databaseURL: `https://${appName}.firebaseio.com`, - projectId: appName, - storageBucket: "", - messagingSenderId: "95255462276" -} + apiKey: "AIzaSyBt2lilyVzkwxC5U0Jff1kGPgrR0stMww0", + authDomain: `${appName}.firebaseapp.com`, + databaseURL: `https://${appName}.firebaseio.com`, + projectId: appName, + storageBucket: "", + messagingSenderId: "347411917883", +}; -firebase.initializeApp(config) \ No newline at end of file +firebase.initializeApp(config); diff --git a/admin-panel/src/ducks/auth.js b/admin-panel/src/ducks/auth.js index f031871..7c75c5b 100644 --- a/admin-panel/src/ducks/auth.js +++ b/admin-panel/src/ducks/auth.js @@ -1,86 +1,93 @@ -import {appName} from '../config' -import {Record} from 'immutable' -import firebase from 'firebase' +import { appName } from "../config"; +import { Record } from "immutable"; +import firebase from "firebase"; /** * Constants * */ -export const moduleName = 'auth' -const prefix = `${appName}/${moduleName}` +export const moduleName = "auth"; +const prefix = `${appName}/${moduleName}`; -export const SIGN_IN_START = `${prefix}/SIGN_IN_START` -export const SIGN_IN_SUCCESS = `${prefix}/SIGN_IN_SUCCESS` -export const SIGN_UP_START = `${prefix}/SIGN_UP_START` -export const SIGN_UP_SUCCESS = `${prefix}/SIGN_UP_SUCCESS` +export const SIGN_IN_START = `${prefix}/SIGN_IN_START`; +export const SIGN_IN_SUCCESS = `${prefix}/SIGN_IN_SUCCESS`; +export const SIGN_UP_START = `${prefix}/SIGN_UP_START`; +export const SIGN_UP_SUCCESS = `${prefix}/SIGN_UP_SUCCESS`; /** * Reducer * */ export const ReducerRecord = Record({ - user: null, - loading: false, - error: null -}) + user: null, + loading: false, + error: null, +}); export default function reducer(state = new ReducerRecord(), action) { - const {type, payload} = action - - switch (type) { - case SIGN_IN_START: - case SIGN_UP_START: - return state.set('loading', true) + const { type, payload } = action; - case SIGN_IN_SUCCESS: - case SIGN_UP_SUCCESS: - return state - .set('loading', false) - .set('user', payload.user) - default: - return state - } + switch (type) { + case SIGN_IN_START: + case SIGN_UP_START: + return state.set("loading", true); + + case SIGN_IN_SUCCESS: + case SIGN_UP_SUCCESS: + return state.set("loading", false).set("user", payload.user); + default: + return state; + } } /** * Selectors * */ -export const userSelector = state => state[moduleName].user +export const userSelector = state => state[moduleName].user; /** * Action Creators * */ export function signIn(email, password) { - return (dispatch) => { - dispatch({ - type: SIGN_IN_START - }) + return dispatch => { + dispatch({ + type: SIGN_IN_START, + }); - firebase.auth().signInWithEmailAndPassword(email, password) - .then(user => dispatch({ - type: SIGN_IN_SUCCESS, - payload: { user } - })) - } + firebase + .auth() + .signInWithEmailAndPassword(email, password) + .then(user => + dispatch({ + type: SIGN_IN_SUCCESS, + payload: { user }, + }), + ); + }; } export function signUp(email, password) { - return (dispatch) => { - dispatch({ - type: SIGN_UP_START - }) + return dispatch => { + dispatch({ + type: SIGN_UP_START, + }); - firebase.auth().createUserWithEmailAndPassword(email, password) - .then(user => dispatch({ - type: SIGN_UP_SUCCESS, - payload: { user } - })) - } + firebase + .auth() + .createUserWithEmailAndPassword(email, password) + .then(user => + dispatch({ + type: SIGN_UP_SUCCESS, + payload: { user }, + }), + ); + }; } firebase.auth().onAuthStateChanged(user => { - if (user) window.store.dispatch({ - type: SIGN_IN_SUCCESS, - payload: { user } - }) -}) \ No newline at end of file + if (user) + window.store.dispatch({ + type: SIGN_IN_SUCCESS, + payload: { user }, + }); +}); diff --git a/admin-panel/src/ducks/people.js b/admin-panel/src/ducks/people.js new file mode 100644 index 0000000..8942586 --- /dev/null +++ b/admin-panel/src/ducks/people.js @@ -0,0 +1,72 @@ +import { appName } from "../config"; +import { Record } from "immutable"; +import firebase from "firebase"; + +/** + * Constants + * */ +export const moduleName = "people"; +const prefix = `${appName}/${moduleName}`; + +export const ADD_PEOPLE_START = `${prefix}/ADD_PEOPLE_START`; +export const ADD_PEOPLE_SUCCESS = `${prefix}/ADD_PEOPLE_SUCCESS`; + +/** + * Reducer + * */ +export const ReducerRecord = Record({ + user: null, + loading: false, + error: null, +}); + +export default function reducer(state = new ReducerRecord(), action) { + const { type, payload } = action; + + switch (type) { + case ADD_PEOPLE_START: + return state.set("loading", true); + + case ADD_PEOPLE_SUCCESS: + return state.set("loading", false).set("user", payload.user); + default: + return state; + } +} + +/** + * Selectors + * */ + + +/** + * Action Creators + * */ + +export function addPeople(people) { + return dispatch => { + dispatch({ + type: ADD_PEOPLE_START, + }); + + var newPostKey = firebase + .database() + .ref() + .child("people") + .push().key; + + var updates = {}; + updates["/people/" + newPostKey] = people; + + firebase + .database() + .ref() + .update(updates) + .then(() => + dispatch({ + type: ADD_PEOPLE_SUCCESS + }), + ); + }; +} + diff --git a/admin-panel/src/history.js b/admin-panel/src/history.js index 6e795fc..92844b6 100644 --- a/admin-panel/src/history.js +++ b/admin-panel/src/history.js @@ -1,5 +1,5 @@ -import createHistory from 'history/createBrowserHistory' +import createHistory from "history/createBrowserHistory"; -const history = createHistory() +const history = createHistory(); -export default history \ No newline at end of file +export default history; diff --git a/admin-panel/src/index.js b/admin-panel/src/index.js index ad60938..c8628b2 100644 --- a/admin-panel/src/index.js +++ b/admin-panel/src/index.js @@ -1,6 +1,6 @@ -import React from 'react' -import ReactDOM from 'react-dom' -import './config' -import Root from './Root' +import React from "react"; +import ReactDOM from "react-dom"; +import "./config"; +import Root from "./Root"; -ReactDOM.render(, document.getElementById('root')) +ReactDOM.render(, document.getElementById("root")); diff --git a/admin-panel/src/redux/index.js b/admin-panel/src/redux/index.js index 1a37261..100ce7a 100644 --- a/admin-panel/src/redux/index.js +++ b/admin-panel/src/redux/index.js @@ -1,13 +1,16 @@ -import {createStore, applyMiddleware} from 'redux' -import logger from 'redux-logger' -import {routerMiddleware} from 'react-router-redux' -import thunk from 'redux-thunk' -import reducer from './reducer' -import history from '../history' +import { createStore, applyMiddleware } from "redux"; +import logger from "redux-logger"; +import { routerMiddleware } from "react-router-redux"; +import thunk from "redux-thunk"; +import reducer from "./reducer"; +import history from "../history"; -const store = createStore(reducer, applyMiddleware(thunk, routerMiddleware(history), logger)) +const store = createStore( + reducer, + applyMiddleware(thunk, routerMiddleware(history), logger), +); //dev only -window.store = store +window.store = store; -export default store \ No newline at end of file +export default store; diff --git a/admin-panel/src/redux/reducer.js b/admin-panel/src/redux/reducer.js index 34143fe..152c458 100644 --- a/admin-panel/src/redux/reducer.js +++ b/admin-panel/src/redux/reducer.js @@ -1,9 +1,10 @@ -import {combineReducers} from 'redux' -import {routerReducer as router} from 'react-router-redux' -import {reducer as form} from 'redux-form' -import authReducer, {moduleName as authModule} from '../ducks/auth' +import { combineReducers } from "redux"; +import { routerReducer as router } from "react-router-redux"; +import { reducer as form } from "redux-form"; +import authReducer, { moduleName as authModule } from "../ducks/auth"; export default combineReducers({ - router, form, - [authModule]: authReducer -}) \ No newline at end of file + router, + form, + [authModule]: authReducer, +});