diff --git a/.gitignore b/.gitignore index d30f40ef4422ff27041df9dba83e4bd26849dc48..84806a24c5350454585cf6aaac51435f8e44ece8 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +/public/images diff --git a/package-lock.json b/package-lock.json index 83e05ecba575807a392a98369b0a2fd44d70da34..0bd99eeca7262b328f871dac57218d0a9218542a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,6 +327,15 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, + "axios": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", + "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=", + "requires": { + "follow-redirects": "1.4.1", + "is-buffer": "1.1.6" + } + }, "axobject-query": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", @@ -977,6 +986,28 @@ "babel-types": "6.26.0" } }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, "babel-preset-env": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", @@ -1475,6 +1506,11 @@ } } }, + "can-use-dom": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", + "integrity": "sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=" + }, "caniuse-api": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", @@ -1603,6 +1639,11 @@ "chalk": "1.1.3" } }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, "clean-css": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", @@ -1915,6 +1956,16 @@ "sha.js": "2.4.10" } }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -2542,6 +2593,11 @@ "tapable": "0.2.8" } }, + "enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ=" + }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -3418,6 +3474,24 @@ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -5601,6 +5675,11 @@ "pretty-format": "20.0.3" } }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" + }, "js-base64": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.2.tgz", @@ -5698,6 +5777,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", + "requires": { + "string-convert": "0.2.1" + } + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -6425,6 +6512,69 @@ "mimic-fn": "1.1.0" } }, + "opencollective": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "inquirer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx": "4.1.0", + "string-width": "2.1.1", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node-fetch": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, "opn": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", @@ -8396,6 +8546,20 @@ } } }, + "react-slick": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.17.1.tgz", + "integrity": "sha512-ffrbR8bSefalLCsaynPouS11cp+AO99aUxQiUYTKSJIY7fkqqSfYq/2bJMW3D1p6ejQdpzf9sQHIbgG9xbzNhg==", + "requires": { + "can-use-dom": "0.1.0", + "classnames": "2.2.5", + "create-react-class": "15.6.3", + "enquire.js": "2.1.6", + "json2mq": "0.2.0", + "object-assign": "4.1.1", + "opencollective": "1.0.3" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -8813,6 +8977,11 @@ "is-promise": "2.1.0" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -8894,6 +9063,26 @@ "node-forge": "0.6.33" } }, + "semantic-ui-css": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.2.12.tgz", + "integrity": "sha512-RrA3k6hya+kEMDmVLT38SBTDQD8FgdnFi16eMPuQ1N1xUOoBxKzr+HZASb7Zo3xlMvkYqEWvPIp58Wjl6Zcsfg==", + "requires": { + "jquery": "3.3.1" + } + }, + "semantic-ui-react": { + "version": "0.77.2", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.77.2.tgz", + "integrity": "sha512-VwxY6oGLrBO2xoJiAW/vn40GL4WGZYWxtbrHIKYE1xChTOFlDxyIULMdnuAHOTbrbOYbLQ0X7LpdvEEYmieiJw==", + "requires": { + "babel-runtime": "6.26.0", + "classnames": "2.2.5", + "fbjs": "0.8.16", + "lodash": "4.17.4", + "prop-types": "15.6.0" + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -9214,6 +9403,11 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" + }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", diff --git a/package.json b/package.json index a2ade58588c4430138ca9c806363d56745bddb88..b058ad52d0439fac1ea5b67a30e3f1c0cdb43bd2 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,22 @@ { "name": "kszkepzes-frontend", "version": "0.1.0", + "proxy": "http://127.0.0.1:8000/", "private": true, "dependencies": { + "axios": "^0.17.1", "prop-types": "^15.6.0", "react": "^16.2.0", "react-dom": "^16.2.0", "react-redux": "^5.0.6", "react-router-dom": "^4.2.2", "react-scripts": "1.1.0", + "react-slick": "^0.17.1", "redux": "^3.7.2", "redux-logger": "^3.0.6", - "redux-thunk": "^2.2.0" + "redux-thunk": "^2.2.0", + "semantic-ui-css": "^2.2.12", + "semantic-ui-react": "^0.77.2" }, "scripts": { "start": "react-scripts start", diff --git a/public/index.html b/public/index.html index 7bee027101ebc858da5cdcf909733043fcd64f86..49f2db511474971fe5558bdec1d5b6a565b7ccde 100644 --- a/public/index.html +++ b/public/index.html @@ -3,6 +3,8 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <link rel="stylesheet" type="text/css" charset="UTF-8" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css" /> + <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css" /> <meta name="theme-color" content="#000000"> <!-- manifest.json provides metadata used when your web app is added to the diff --git a/src/actions/auth.js b/src/actions/auth.js new file mode 100644 index 0000000000000000000000000000000000000000..30b176a967fa847546eed68669c80cb0ef88ce2b --- /dev/null +++ b/src/actions/auth.js @@ -0,0 +1,68 @@ +// TODO: Separate actions + +import ax from 'axios'; +import { GET_USERDATA, PROFILE_CHANGE, GROUP_CHANGE, LOGOUT, GET_NEWS } from './types'; + +const axios = ax.create({ + xsrfCookieName: 'csrftoken', + xsrfHeaderName: 'X-CSRFToken', +}); + +export const getUserData = () => ( + async (dispatch) => { + const user = await axios.get('/api/v1/profiles/me'); + const { + id, join_date: joinDate, nick, motivation, signed, groups, + } = user.data; + dispatch({ + type: GET_USERDATA, + payload: { + id, joinDate, nick, motivation, signed, groups, + }, + }); + } +); + +export const getNews = () => ( + async (dispatch) => { + const news = await axios.get('/api/v1/news'); + dispatch({ + type: GET_NEWS, + payload: news, + }); + } +); + +export const textChange = ({ target: { name, value } }) => ( + (dispatch) => { + dispatch({ type: PROFILE_CHANGE, payload: value, target: name }); + } +); + +export const groupChange = groups => ( + dispatch => (dispatch({ type: GROUP_CHANGE, payload: groups })) +); + +export const submitRegistration = ({ + nick, groups, signed, motivation, id, +}) => ( + async (dispatch) => { + const response = await axios.patch(`/api/v1/profiles/${id}/`, { + nick, groups, signed, motivation, + }); + if (response.data.id === id) { + alert('Sikeres mentĂŠs!'); + } else { + alert('MentĂŠs nem sikerĂźlt!'); + } + } +); + +export const logout = () => ( + async (dispatch) => { + const response = await axios.get('/api/v1/logout/'); + if (response) { + dispatch({ action: LOGOUT }); + } + } +); diff --git a/src/actions/index.js b/src/actions/index.js index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..269586ee8b8ae24b9a02f84ee4a663139f079a2d 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -0,0 +1 @@ +export * from './auth'; diff --git a/src/actions/types.js b/src/actions/types.js index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f6891993f91473e63639fbcf6456ea863cdec3be 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -0,0 +1,7 @@ +export const GET_USERDATA = 'get_userdata'; +export const GET_NEWS = 'get_news'; + +export const PROFILE_CHANGE = 'profile_change'; +export const GROUP_CHANGE = 'group_change'; + +export const LOGOUT = 'logout'; diff --git a/src/components/App.js b/src/components/App.js index 6c4296fde897a948d8a3aeb15d6900000ed65c7b..40766cef9e4dc5e369cd91108df671be9908dbed 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -1,11 +1,13 @@ import React from 'react'; import Header from './Header'; import Main from './Main'; +import Footer from './Footer'; const App = () => ( <div> <Header /> <Main /> + <Footer /> </div> ); diff --git a/src/components/Footer.js b/src/components/Footer.js new file mode 100644 index 0000000000000000000000000000000000000000..7613f4cda02e7f352e4422da557c06f9820f4ac8 --- /dev/null +++ b/src/components/Footer.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { Container, Segment } from 'semantic-ui-react'; + +const Footer = () => ( + <Segment inverted vertical textAlign='center'> + <Container> + <p textalign='center'>Created by DevTeam © 2017-2018.</p> + </Container> + </Segment> +); + +export default Footer; diff --git a/src/components/Header.js b/src/components/Header.js index 0ac6f1dc77e21e90a9f749187917e55c09e393c4..ebdd23e9d6c281f611a13ee8ad48b6326e7a570f 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -1,16 +1,111 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -const Header = () => ( - <header> - <nav> - <ul> - <li><Link to='/'>Home</Link></li> - <li><Link to='/roster'>Roster</Link></li> - <li><Link to='/schedule'>Schedule</Link></li> - </ul> - </nav> - </header> +import React, { Component } from 'react'; +import { NavLink, Link } from 'react-router-dom'; +import { + Menu, + Container, + Button, + Segment, + Visibility, + Image, +} from 'semantic-ui-react'; +import { connect } from 'react-redux'; +import { getUserData, logout } from '../actions'; +import KSZKlogo from './images/kszk_logo.svg'; + +const FixedMenu = ({ user }) => ( + <Menu fixed='top' size='large' pointing> + <Container> + <Menu.Item as={NavLink} to='/home'>FĹoldal</Menu.Item> + <Menu.Item as={NavLink} to='/news'>HĂrek</Menu.Item> + <Menu.Item as={NavLink} to='/circles'>KĂśreink</Menu.Item> + <Menu.Item as={NavLink} to='/trainers'>KĂŠpzĹk</Menu.Item> + <Menu.Item as={NavLink} to='/schedule'>Ătemterv</Menu.Item> + + <Menu.Menu position='right'> + <Menu.Item className='item'> + { + user.id ? + <Button.Group> + <Button primary as={Link} to='/profile'>Profilom</Button> + <Button onClick={() => this.props.logout()} icon='sign out' /> + </Button.Group> + : + <Button href='/api/v1/login/authsch/'>BejelentkezĂŠs</Button> + } + </Menu.Item> + </Menu.Menu> + </Container> + </Menu> ); -export default Header; +class Header extends Component { + constructor(props) { + super(props); + this.state = { + visible: false, + }; + } + componentWillMount() { + this.props.getUserData(); + } + + hideFixedMenu() { + this.setState({ visible: false }); + } + + showFixedMenu() { + this.setState({ visible: true }); + } + + render() { + const { visible } = this.state; + + return ( + <div> + {visible ? <FixedMenu user={this.props.user} /> : null} + <Visibility + onBottomPassed={() => this.showFixedMenu()} + onBottomVisible={() => this.hideFixedMenu()} + once={false} + > + <Segment inverted textAlign='center' vertical> + <Container> + <Menu inverted secondary size='large'> + <Menu.Item as={NavLink} to='/home'> + <Image + size='mini' + src={KSZKlogo} + style={{ marginRight: '1.5em' }} + /> + FĹoldal + </Menu.Item> + <Menu.Item as={NavLink} to='/news'>HĂrek</Menu.Item> + <Menu.Item as={NavLink} to='/circles'>KĂśreink</Menu.Item> + <Menu.Item as={NavLink} to='/trainers'>KĂŠpzĹk</Menu.Item> + <Menu.Item as={NavLink} to='/schedule'>Ătemterv</Menu.Item> + + <Menu.Item position='right'> + { + this.props.user.id ? + <Button.Group> + <Button inverted as={Link} to='/profile'>Profil</Button> + <Button onClick={() => this.props.logout()} icon='sign out' /> + </Button.Group> + : + <Button as='a' href='/api/v1/login/authsch/' inverted>BejelentkezĂŠs</Button> + } + </Menu.Item> + </Menu> + </Container> + </Segment> + </Visibility> + </div> + ); + } +} + +const mapStateToProps = ({ user }) => ({ + user, +}); + +export default connect(mapStateToProps, { getUserData, logout })(Header); diff --git a/src/components/Main.js b/src/components/Main.js index c265aecc9a0533913219651d41323745fbe92c58..cd91904eb824332ee0e9305c8f581540b1c9241a 100644 --- a/src/components/Main.js +++ b/src/components/Main.js @@ -1,19 +1,27 @@ import React from 'react'; -import { Switch, Route } from 'react-router-dom'; +import { Switch, Route, Redirect, withRouter } from 'react-router-dom'; + import Home from './pages/Home'; -import Roster from './pages/Roster'; +import Trainers from './pages/Trainers'; import Schedule from './pages/Schedule'; import NotFound from './pages/NotFound'; +import Profile from './pages/Profile'; +import Statistics from './pages/Statistics'; +import Circles from './pages/Circles'; +import News from './pages/News'; const Main = () => ( - <main> - <Switch> - <Route exact path='/' component={Home} /> - <Route path='/roster' component={Roster} /> - <Route path='/schedule' component={Schedule} /> - <Route component={NotFound} /> - </Switch> - </main> + <Switch> + <Redirect exact from='/' to='/home' /> + <Route exact path='/home' component={Home} /> + <Route path='/news' component={News} /> + <Route path='/trainers' component={Trainers} /> + <Route path='/schedule' component={Schedule} /> + <Route path='/profile' component={withRouter(Profile)} /> + <Route path='/statistics' component={Statistics} /> + <Route path='/circles' component={Circles} /> + <Route component={NotFound} /> + </Switch> ); export default Main; diff --git a/src/components/images/kszk_big_logo.png b/src/components/images/kszk_big_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..78a20883898115fdca8d4d1ad8b299de46ed882c Binary files /dev/null and b/src/components/images/kszk_big_logo.png differ diff --git a/src/components/images/kszk_logo.svg b/src/components/images/kszk_logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..1b1beb9ba5d7a5641cdff880cdad329a41948347 --- /dev/null +++ b/src/components/images/kszk_logo.svg @@ -0,0 +1,46 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" + "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<svg version="1.0" xmlns="http://www.w3.org/2000/svg" + width="464.000000pt" height="450.000000pt" viewBox="0 0 464.000000 450.000000" + preserveAspectRatio="xMidYMid meet"> + +<g transform="translate(0.000000,450.000000) scale(0.100000,-0.100000)" +fill="#FFFFFF" stroke="none"> +<path d="M2375 4473 c-880 -75 -1579 -448 -1987 -1058 -71 -107 -184 -335 +-228 -460 -47 -134 -86 -293 -111 -455 -20 -123 -23 -184 -24 -395 0 -265 8 +-349 51 -545 114 -511 396 -899 854 -1172 260 -155 575 -260 960 -321 182 -29 +682 -31 885 -4 334 45 587 126 839 268 152 86 416 250 416 259 0 13 -179 230 +-190 230 -5 0 -40 -20 -77 -44 -298 -192 -696 -338 -1076 -395 -392 -59 -654 +-49 -1003 39 -365 93 -671 257 -899 485 -251 251 -389 545 -441 938 -22 166 +-15 483 15 650 121 685 564 1193 1262 1451 297 109 574 160 874 158 273 -1 +491 -37 745 -124 430 -147 775 -432 915 -755 106 -244 131 -522 76 -843 -48 +-280 -152 -499 -320 -674 -67 -69 -201 -176 -221 -176 -9 0 -83 185 -105 263 +-9 32 -14 64 -12 71 3 8 82 82 176 165 186 166 301 297 301 344 0 23 -7 31 +-35 43 -39 16 -102 18 -137 5 -13 -5 -111 -77 -218 -159 -107 -83 -196 -150 +-197 -148 -7 6 71 299 113 429 26 78 91 253 145 388 55 136 99 254 99 263 0 +44 -148 74 -221 43 -35 -14 -38 -20 -88 -163 -83 -235 -472 -1401 -530 -1590 +-52 -169 -52 -171 -36 -210 37 -93 146 -99 214 -12 30 38 96 178 134 285 l33 +92 69 -142 c110 -226 183 -284 342 -275 81 4 200 57 299 132 83 62 217 204 +282 299 124 180 227 445 269 692 23 137 26 498 5 615 -84 470 -302 835 -662 +1110 -285 217 -667 359 -1074 399 -100 10 -385 12 -481 4z"/> +<path d="M1166 3282 l-38 -17 -95 -290 c-99 -305 -343 -1098 -412 -1345 -64 +-225 -70 -299 -30 -336 70 -63 180 49 275 284 l37 90 37 -56 c69 -106 175 +-196 274 -235 72 -28 176 -27 240 2 l49 21 26 -23 c88 -81 196 -129 292 -130 +54 -1 73 4 113 27 131 77 162 274 81 512 -48 139 -65 222 -65 315 0 90 15 139 +95 299 51 103 56 120 52 164 -7 81 -66 116 -194 116 -54 0 -67 -4 -93 -27 -27 +-25 -36 -50 -85 -238 -77 -298 -214 -652 -274 -708 -14 -14 -53 -43 -85 -66 +-78 -54 -118 -55 -168 -5 -59 59 -118 192 -118 267 0 7 65 70 144 140 234 207 +315 301 302 352 -7 29 -36 36 -97 25 -82 -16 -136 -49 -314 -195 -63 -53 -115 +-92 -115 -88 0 20 55 212 97 338 66 200 124 354 209 556 41 97 74 188 74 202 +0 55 -133 86 -214 49z m594 -1598 c11 -49 20 -109 20 -133 0 -43 0 -43 -22 +-27 -13 8 -42 28 -65 43 -23 16 -42 31 -43 34 0 12 81 181 86 177 2 -3 13 -45 +24 -94z"/> +<path d="M3015 2534 c-16 -2 -77 -9 -135 -15 -151 -16 -399 -72 -444 -101 -96 +-62 -77 -194 30 -214 25 -5 86 0 173 15 74 12 136 20 138 18 2 -3 -93 -93 +-211 -201 -253 -232 -388 -372 -436 -452 -42 -71 -48 -147 -14 -204 46 -79 +117 -99 288 -81 249 27 429 77 492 136 29 28 34 39 34 78 0 38 -5 49 -30 70 +-42 36 -125 51 -244 44 l-99 -6 64 56 c35 31 148 140 250 242 203 203 355 386 +365 437 13 69 -40 156 -104 174 -36 10 -57 10 -117 4z"/> +</g> +</svg> diff --git a/src/components/pages/Circles.js b/src/components/pages/Circles.js new file mode 100644 index 0000000000000000000000000000000000000000..96daca5f6e6af4975b68c9ec696a9ad2de3471a2 --- /dev/null +++ b/src/components/pages/Circles.js @@ -0,0 +1,26 @@ +import React, { Component } from 'react'; +import { Container, Header, Segment } from 'semantic-ui-react'; + +export default class Circles extends Component { + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='KĂśrĂśk - Hamarosan' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + </Container> + </Segment> + </div> + ); + } +} diff --git a/src/components/pages/Home.css b/src/components/pages/Home.css new file mode 100644 index 0000000000000000000000000000000000000000..05a7b5d8795907394e63418e9a72a1f0d92ef126 --- /dev/null +++ b/src/components/pages/Home.css @@ -0,0 +1,12 @@ +.car-image-kszk { + position: relative; +} + +.car-text-kszk { + position: absolute; + width: 100%; + top: 0px; + -webkit-text-fill-color: white; + -webkit-text-stroke-color: #888888; + -webkit-text-stroke-width: 0.75px; +} diff --git a/src/components/pages/Home.js b/src/components/pages/Home.js index be5d6327b57b1e2a21f87654a756b22bc9254f89..02f265b0eef3ad08543f47daa08d17f946c8e844 100644 --- a/src/components/pages/Home.js +++ b/src/components/pages/Home.js @@ -1,9 +1,196 @@ -import React from 'react'; +import React, { Component } from 'react'; +import { + Button, + Container, + Header, + Icon, + Segment, + Image, + Divider, +} from 'semantic-ui-react'; +import { connect } from 'react-redux'; +import Slider from 'react-slick'; +import { Link } from 'react-router-dom'; +import './Home.css'; +import KSZKbiglogo from '../images/kszk_big_logo.png'; -const Home = () => ( - <div> - <h1>Welcome to the Tornadoes Website!</h1> - </div> -); +const settings = { + dots: false, + autoplay: true, + arrows: false, + infinite: true, + speed: 2000, + autoplaySpeed: 4000, + slidesToShow: 1, + slidesToScroll: 1, + centerMode: true, +}; -export default Home; +const range = (count) => { + const newArray = []; + for (let i = 1; i < count; i += 1) { + newArray.push(i); + } + + return newArray; +}; + +class Home extends Component { + render() { + return ( + <div> + <div className='car-image-kszk'> + <Slider {...settings}> + { + range(23).map(image => ( + <div key={image}> + <img src={`images/${image}.JPG`} width='100%' alt='' /> + </div> + )) + } + </Slider> + <div className='car-text-kszk'> + <Segment textAlign='center' vertical> + <Header + as='h1' + content='ĂdvĂśzlĂźnk a' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + <Header + as='h1' + content='KollĂŠgiumi SzĂĄmĂtĂĄstechnikai KĂśr' + inverted + style={{ + fontSize: '4em', + fontWeight: 'bold', + marginBottom: '0.5em', + marginTop: '0.5em', + }} + /> + <Header + as='h1' + content='ĂŠrdeklĹdĹinek szĂĄnt weboldalĂĄn!' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + <Image + verticalAlign='middle' + size='small' + src={KSZKbiglogo} + style={{ marginTop: '4em' }} + /> + <Header + as='h1' + content='Mindenkit szeretettel vĂĄrunk a KSZKĂŠpzĂŠs-re!' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '1em', + }} + /> + <Container> + { + this.props.user.id ? + <Button + as={Link} + to='/profile' + primary + size='huge' + style={{ + fontSize: '2em', + marginTop: '1em', + marginBottom: '1em', + }} + > + JelentkezĂŠs + <Icon name='right arrow' /> + </Button> + : + <Button + href='/api/v1/login/authsch/' + primary + size='huge' + style={{ + fontSize: '2em', + marginTop: '1em', + marginBottom: '1em', + }} + > + BejelentkezĂŠs + <Icon name='right arrow' /> + </Button> + } + </Container> + </Segment> + </div> + </div> + <Segment style={{ padding: '8em 0em' }} vertical> + <Container text> + <Header as='h3' style={{ fontSize: '2em' }}> + Kik is vagyunk mi? + </Header> + <p style={{ fontSize: '1.33em' }}> + A KolleĚgiumi SzaĚmiĚtaĚstechnikai KoĚr az Egyetem legreĚgebben muĚkoĚdoĚ + eĚs legnagyobb aktiĚv, informatikaĚval foglalkozoĚ oĚnteveĚkeny + csoportosulaĚsa, tavaly uĚnnepeltuĚk 40. szuĚleteĚsnapunkat. A patinaĚs + neĚv moĚgoĚtt vidaĚm hangulatuĚ, alkotoĚ kedvuĚ csapat rejlik, mely a Kar + joĚ szakmai keĚpesseĚguĚ, szaĚmiĚtaĚstechnika iraĚnt kiemelten eĚrdekloĚdoĚ + tagjaiboĚl verbuvaĚloĚdott, eĚs boĚvuĚl eĚvente uĚj tehetseĚgekkel, lelkes + informatikusokkal, villamosmeĚrnoĚkoĚkkel. + </p> + <Button size='large' href='/circles'> + Ismerd meg a kĂśreinket! <Icon name='right arrow' /> + </Button> + <Divider as='h4' className='header' style={{ margin: '3em 0em' }} /> + <Header as='h3' style={{ fontSize: '2em' }}> + LehetĹsĂŠgek + </Header> + <p style={{ fontSize: '1.33em' }}> + A KSZK a lehetoĚseĚgek taĚrhaĚza, a hely ahol Te â leendoĚ meĚrnoĚk â + minden teruĚleten kiproĚbaĚlhatod, tovaĚbbkeĚpezheted magad. NaĚlunk + kibontakoztathatod kreativitaĚsod, tapasztalatot, meĚrnoĚki + szemleĚletet szerezhetsz, mikoĚzben az uĚn. soft skill-jeidet is + fejlesztheted. Ha szaĚmodra a szakma hivataĚs, ha szeretsz uĚj + dolgokat alkotni vagy csak joĚ taĚrsasaĚgra vaĚgysz, a legjobb helyre + keruĚlteĚl. A reszort koĚrei a szakma egy-egy meghataĚrozoĚ teruĚleteĚvel + foglalkoznak a fejleszteĚs eĚs uĚzemelteteĚs teruĚleteĚn. + </p> + <Divider as='h4' className='header' style={{ margin: '3em 0em' }} /> + <Header as='h3' style={{ fontSize: '2em' }}> + KeĚpzeĚsuĚnk + </Header> + <p style={{ fontSize: '1.33em' }}> + Kilenc alkalmas keĚpzeĚsuĚnk veĚgeĚn Te is igazi KSZK-ssaĚ vaĚlhatsz, + hiszen rengeteg szakmai tudaĚst igyekszuĚnk aĚtadni nektek. A + keĚpzeĚsalkalmak rendkiĚvuĚl joĚ hangulatban telnek, eĚs a szociaĚlis + iraĚnyultsaĚguĚ foglalkozaĚsok alatt egy nagyon joĚ csapat kovaĚcsoloĚdik + az eĚrdekloĚdoĚkboĚl. Az elsoĚ keĚpzeĚs idoĚpontja februaĚr 20. heĚtfoĚ + 19:30, ettoĚl kezdve minden heĚten talaĚlkozunk ugyanabban az + idoĚpontban. A keĚpzeĚs ideje alatt maĚrcius 10-12 koĚzoĚtt rendezuĚnk + taĚbort. Az alkalmakon eĚs a taĚborban koĚtelezoĚ a reĚszveĚtel. + </p> + </Container> + </Segment> + </div> + ); + } +} + +const mapStateToProps = ({ user }) => ({ + user, +}); + +export default connect(mapStateToProps, {})(Home); diff --git a/src/components/pages/News.js b/src/components/pages/News.js new file mode 100644 index 0000000000000000000000000000000000000000..98ec6369dab3b8bc9d335b10a2fdcc60e82a08ae --- /dev/null +++ b/src/components/pages/News.js @@ -0,0 +1,59 @@ +import React, { Component } from 'react'; +import { Container, Header, Segment, Divider } from 'semantic-ui-react'; +import { connect } from 'react-redux'; + +import { getNews } from '../../actions'; + +class News extends Component { + + componentWillMount() { + this.props.getNews(); + } + + render_news() { + const news = this.props.news; + console.log(news); + + return news.map( (item, index) => ( + <div key={index}> + { index > 0 ? <Divider /> : ''} + <Header as='h3' style={{ fontSize: '2em' }}>{item.title}</Header> + <p style={{ fontSize: '1.33em' }}>{item.text}</p> + </div> + )); + + } + + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='HĂrek' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + </Container> + </Segment> + + <Segment style={{ padding: '8em 0em' }} vertical> + <Container text> + {this.render_news()} + </Container> + </Segment> + </div> + ); + } +} + + +const mapStateToProps = ({ news }) => ({ news }); + +export default connect(mapStateToProps, { getNews })(News); diff --git a/src/components/pages/NotFound.js b/src/components/pages/NotFound.js index 78aba0dc316410f609b8b1901666bb596e9a18ec..be13943bd948edba928aa779ecbedd542b0e20aa 100644 --- a/src/components/pages/NotFound.js +++ b/src/components/pages/NotFound.js @@ -1,9 +1,39 @@ -import React from 'react'; +import React, { Component } from 'react'; +import { Button, Container, Header, Icon, Segment } from 'semantic-ui-react'; -const NotFound = () => ( - <div> - <p>404: Page not found</p> - </div> -); - -export default NotFound; +export default class NotFound extends Component { + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='404 - A keresett oldal nem talĂĄlhatĂł!' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + <Button + href='/' + primary + size='huge' + style={{ + fontSize: '2em', + marginTop: '1em', + marginBottom: '1em', + }} + > + Vissza a FĹoldalra + <Icon name='right arrow' /> + </Button> + </Container> + </Segment> + </div> + ); + } +} diff --git a/src/components/pages/Profile.js b/src/components/pages/Profile.js new file mode 100644 index 0000000000000000000000000000000000000000..17a77df316b2935c071e53b1b9177d97441a986e --- /dev/null +++ b/src/components/pages/Profile.js @@ -0,0 +1,100 @@ +import React, { Component } from 'react'; +import { Container, Segment, Form, Dropdown, Divider, Header } from 'semantic-ui-react'; +import { connect } from 'react-redux'; +import { textChange, submitRegistration, groupChange } from '../../actions'; + +const options = [ + { key: 'DT', text: 'DevTeam', value: 'DT' }, + { key: 'NET', text: 'NeTeam', value: 'NET' }, + { key: 'ST', text: 'SecurITeam', value: 'ST' }, + { key: 'SYS', text: 'SysAdmin', value: 'SYS' }, + { key: 'HAT', text: 'HallgatĂłi TudĂĄsbĂĄzis', value: 'HAT' }, +]; + +class Profile extends Component { + componentWillMount() { + if (!this.props.id) { + this.props.history.push('/home'); + } + } + + render() { + const { + nick, groups, motivation, signed, id, + } = this.props; + return ( + <Container + style={{ + marginBottom: '0.5em', + marginTop: '0.5em', + }} + > + <Divider horizontal> + <Header as='h2' content='Profil (JelentkezĂŠs)' /> + </Divider> + <Segment textAlign='center'> + <Form> + <Divider horizontal>BecenĂŠv</Divider> + <Form.Input + fluid + name='nick' + onChange={e => this.props.textChange(e)} + placeholder='BecenĂŠv' + value={nick} + /> + + <Divider horizontal>MotivĂĄciĂłs levĂŠl</Divider> + <Form.TextArea + rows={10} + name='motivation' + onChange={e => this.props.textChange(e)} + placeholder='MiĂŠrt szeretnĂŠk jelentkezni...' + value={motivation} + /> + + <Divider horizontal>Ărdekelt KĂśrĂśk</Divider> + <Dropdown + fluid + multiple + selection + placeholder='DevTeam, ...' + onChange={(_, v) => this.props.groupChange(v.value)} + options={options} + defaultValue={groups} + /> + <br /> + <Form.Checkbox + name='signed' + label='SzeretnĂŠk jelentkezni a KSZK-ba' + onChange={(_, v) => + this.props.textChange({ target: { name: v.name, value: v.checked } }) + } + checked={signed} + /> + <Form.Button + onClick={() => this.props.submitRegistration({ + nick, motivation, signed, groups, id, + })} + > + MentĂŠs + </Form.Button> + </Form> + </Segment> + </Container> + ); + } +} + +const mapStateToProps = ({ + user: { + nick, groups, motivation, signed, id, + }, +}) => ({ + nick, + groups, + motivation, + signed, + id, +}); + +export default connect(mapStateToProps, { textChange, submitRegistration, groupChange })(Profile); diff --git a/src/components/pages/Roster.js b/src/components/pages/Roster.js deleted file mode 100644 index 6a5793393f3266f292947b82bc6c844ddc503513..0000000000000000000000000000000000000000 --- a/src/components/pages/Roster.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import { Switch, Route } from 'react-router-dom'; -import FullRoster from './roster/FullRoster'; -import Player from './roster/Player'; - -const Roster = () => ( - <Switch> - <Route exact path='/roster' component={FullRoster} /> - <Route path='/roster/:number' component={Player} /> - </Switch> -); - - -export default Roster; diff --git a/src/components/pages/Schedule.js b/src/components/pages/Schedule.js index 4332ee0981d4ffd67a5c49abd9f5694c97a2c078..d6a6ac619ed242e3c78a0af5d41896f4c227df90 100644 --- a/src/components/pages/Schedule.js +++ b/src/components/pages/Schedule.js @@ -1,13 +1,26 @@ -import React from 'react'; +import React, { Component } from 'react'; +import { Container, Header, Segment } from 'semantic-ui-react'; -const Schedule = () => ( - <div> - <ul> - <li>6/5 @ Evergreens</li> - <li>6/8 vs Kickers</li> - <li>6/14 @ United</li> - </ul> - </div> -); - -export default Schedule; +export default class Schedule extends Component { + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='Ătemterv - Hamarosan' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + </Container> + </Segment> + </div> + ); + } +} diff --git a/src/components/pages/Statistics.js b/src/components/pages/Statistics.js new file mode 100644 index 0000000000000000000000000000000000000000..3c2baaf2395b0ef0385e2489547586c34430228d --- /dev/null +++ b/src/components/pages/Statistics.js @@ -0,0 +1,26 @@ +import React, { Component } from 'react'; +import { Container, Header, Segment } from 'semantic-ui-react'; + +export default class Statistics extends Component { + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='StatisztikĂĄk - Hamarosan' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + </Container> + </Segment> + </div> + ); + } +} diff --git a/src/components/pages/Trainers.js b/src/components/pages/Trainers.js new file mode 100644 index 0000000000000000000000000000000000000000..ef2ec5c21febd6ad6c8748125fe8ce04d3b6c3b1 --- /dev/null +++ b/src/components/pages/Trainers.js @@ -0,0 +1,26 @@ +import React, { Component } from 'react'; +import { Container, Header, Segment } from 'semantic-ui-react'; + +export default class Trainers extends Component { + render() { + return ( + <div> + <Segment inverted textAlign='center' vertical> + <Container> + <Header + as='h1' + content='KĂŠpzĹk - Hamarosan' + inverted + style={{ + fontSize: '3em', + fontWeight: 'normal', + marginBottom: 0, + marginTop: '0.5em', + }} + /> + </Container> + </Segment> + </div> + ); + } +} diff --git a/src/components/pages/roster/FullRoster.js b/src/components/pages/roster/FullRoster.js deleted file mode 100644 index e30a39b91fa682740eef85cdd2ec454b740ddbbe..0000000000000000000000000000000000000000 --- a/src/components/pages/roster/FullRoster.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -const FullRoster = () => ( - <div> - <ul> - <Link to={'/roster/0'}>0</Link> - </ul> - </div> -); - -export default FullRoster; diff --git a/src/components/pages/roster/Player.js b/src/components/pages/roster/Player.js deleted file mode 100644 index 55d49b7e556bddf23da79e9efc7b346c92faad2b..0000000000000000000000000000000000000000 --- a/src/components/pages/roster/Player.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -const Player = () => ( - <div> - Sorry - <Link to='/roster'>Back</Link> - </div> -); - -export default Player; diff --git a/src/index.css b/src/index.css deleted file mode 100644 index b4cc7250b98cb3f1a2dd5bec134296c6942344d9..0000000000000000000000000000000000000000 --- a/src/index.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} diff --git a/src/index.js b/src/index.js index 5c90af50cd317252ccbdced3f1a37f4e1e597396..350009f7b3099c017d45d5e4a5356234736a188f 100644 --- a/src/index.js +++ b/src/index.js @@ -2,9 +2,9 @@ import React from 'react'; import { render } from 'react-dom'; import { Provider } from 'react-redux'; import { BrowserRouter as Router } from 'react-router-dom'; +import 'semantic-ui-css/semantic.min.css'; import configureStore from './configureStore'; -import './index.css'; import App from './components/App'; import registerServiceWorker from './registerServiceWorker'; diff --git a/src/reducers/NewsReducer.js b/src/reducers/NewsReducer.js new file mode 100644 index 0000000000000000000000000000000000000000..a1f1497ded94643758880ed039b202ea417d0d64 --- /dev/null +++ b/src/reducers/NewsReducer.js @@ -0,0 +1,12 @@ +import { GET_NEWS } from '../actions/types'; + +const INITIAL_STATE = []; + +export default (state = INITIAL_STATE, action) => { + switch (action.type) { + case GET_NEWS: + return [ ...state, ...action.payload.data ]; + default: + return state; + } +}; diff --git a/src/reducers/TodoReducer.js b/src/reducers/TodoReducer.js deleted file mode 100644 index ec9ded5870943256b9de3a908c7ec9bcd9fde700..0000000000000000000000000000000000000000 --- a/src/reducers/TodoReducer.js +++ /dev/null @@ -1,16 +0,0 @@ -import { - ADD_TODO, -} from '../actions/types'; - -const INITIAL_STATE = { - todos: [{ data: 'hello' }], -}; - -export default (state = INITIAL_STATE, action) => { - switch (action.type) { - case ADD_TODO: - return { todos: [...state.todos, { data: action.payload }] }; - default: - return state; - } -}; diff --git a/src/reducers/UserReducer.js b/src/reducers/UserReducer.js new file mode 100644 index 0000000000000000000000000000000000000000..607f6dca0c0b9c4bfc67cdd7bf5d4b25c0e3ef0e --- /dev/null +++ b/src/reducers/UserReducer.js @@ -0,0 +1,24 @@ +import { + GET_USERDATA, + PROFILE_CHANGE, + GROUP_CHANGE, + LOGOUT, +} from '../actions/types'; + +const INITIAL_STATE = { +}; + +export default (state = INITIAL_STATE, action) => { + switch (action.type) { + case GET_USERDATA: + return { ...state, ...action.payload }; + case PROFILE_CHANGE: + return { ...state, [action.target]: action.payload }; + case GROUP_CHANGE: + return { ...state, groups: action.payload }; + case LOGOUT: + return INITIAL_STATE; + default: + return state; + } +}; diff --git a/src/reducers/index.js b/src/reducers/index.js index 030bd73a735f6d1674b1547089bc51d9ba0b55fa..8fa74b2a23a02498d8b8bc2761cb63e34c4d9e8c 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -1,8 +1,10 @@ import { combineReducers } from 'redux'; -import TodoReducer from './TodoReducer'; +import UserReducer from './UserReducer'; +import NewsReducer from './NewsReducer'; const rootReducer = combineReducers({ - todos: TodoReducer, + user: UserReducer, + news: NewsReducer, }); export default rootReducer; diff --git a/src/routes.js b/src/routes.js new file mode 100644 index 0000000000000000000000000000000000000000..b44e78ee7a2b82f87e445a26490b59fb8fcacfaf --- /dev/null +++ b/src/routes.js @@ -0,0 +1,35 @@ +import { withRouter } from 'react-router-dom'; + +export const publicRoutes = [ + { + path: '/login', + component: Login, + }, + { + path: '/register', + component: Register, + }, + { + path: '/home', + }, + { + path: '/news', + }, + { + path: '/', + }, + { + component: NotFound, + }, +]; + +export const privateRoutes = [ + { + path: '/home', + component: withRouter(Home), + }, + { + path: '/store/details', + component: withRouter(Detail), + }, +]