diff --git a/src/actions/news.js b/src/actions/news.js index d9192b0cb8519f89d3f9d028491b1f2790657040..5d8c48b3437a84f284486ca154364adcd0e4d853 100644 --- a/src/actions/news.js +++ b/src/actions/news.js @@ -1,5 +1,5 @@ import { axios } from './auth' -import { GET_NEWS, CLEAR_WRITE, WRITE_NEWS } from './types' +import { GET_NEWS, WRITE_NEWS, ADD_NEWS, DELETE_NEWS, CLEAR_WRITE } from './types' export const getNews = () => ( async (dispatch) => { @@ -25,6 +25,10 @@ export const postNews = ({title, author, text}) =>( }) if (response.data.id) { alert('Sikeres mentĂŠs!'); + dispatch({ + type: ADD_NEWS, + payload: response.data, + }); } else { alert('MentĂŠs nem sikerĂźlt!'); } @@ -34,8 +38,32 @@ export const postNews = ({title, author, text}) =>( } ); +export const deleteNews = (news) =>( + async(dispatch) =>{ + try{ + const response = await axios.delete(`/api/v1/news/${news.id}/`); + if (!response.data.id) { + alert('Sikeres tĂśrlĂŠs!'); + dispatch({ + type: DELETE_NEWS, + payload: news, + }); + } else { + alert('A tĂśrlĂŠs nem sikerĂźlt!'); + } + }catch(e){ + console.log(e); + } + }); + export const writeNews = ({target : {name, value}}) => ( (dispatch) => { dispatch({ type: WRITE_NEWS, payload: value, target: name }); } ); + +export const clearWrite = () => ( + (dispatch) => { + dispatch({ type: CLEAR_WRITE }); + } +); diff --git a/src/actions/types.js b/src/actions/types.js index c959455d2ec499a99f0f7c5f2ed1f65f0c9b8741..54bb78206fe6b5376b212d7121530f76b397d9d8 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -5,3 +5,6 @@ export const PROFILE_CHANGE = 'profile_change'; export const GROUP_CHANGE = 'group_change'; export const WRITE_NEWS = 'write_news'; +export const CLEAR_WRITE = 'clear_write'; +export const ADD_NEWS = 'add_news'; +export const DELETE_NEWS = 'delete_news' diff --git a/src/components/forms/AddNewsForm.js b/src/components/forms/AddNewsForm.js new file mode 100644 index 0000000000000000000000000000000000000000..1c28befbcad0edf0ea4df7b60f5028f0f1136ae3 --- /dev/null +++ b/src/components/forms/AddNewsForm.js @@ -0,0 +1,51 @@ +import React, { Component } from 'react'; +import { Modal, Button, Form, Input, TextArea, Icon } from 'semantic-ui-react'; +import { connect } from 'react-redux'; + +import { postNews, writeNews, clearWrite } from '../../actions/news.js' + +class AddNewsForm extends Component { + + render(){ + const { title, text } = this.props.newNews; + const author = this.props.user.id; + return ( + <Modal trigger={<Button >Add news</Button>}> + <Modal.Header>Ăj hĂr:</Modal.Header> + <Modal.Content> + <Form> + <Form.Field + control={Input} + label='Title' + name='title' + onChange={e => this.props.writeNews(e)} + value={title} + placeholder='Title' /> + <Form.Field + control={TextArea} + label='Text' + name='text' + onChange={e => this.props.writeNews(e)} + value={text} + placeholder='Tell us what you want...' /> + </Form> + </Modal.Content> + <Modal.Actions> + <Button inverted color='red' > + <Icon name='remove' /> Cancel + </Button> + <Button + inverted color='green' + onClick={() => {this.props.postNews({title, text, author}); + this.props.clearWrite()}}> + <Icon name='checkmark' /> Add + </Button> + </Modal.Actions> + </Modal> + ); + } +} + +const mapStateToProps = ({ newNews, user }) => ({ newNews, user }); + +export default connect(mapStateToProps, { postNews, writeNews, clearWrite })(AddNewsForm); diff --git a/src/components/pages/News.js b/src/components/pages/News.js index 730c1436453650da952160e855916e1e9348e9df..6cea13795f3a5d9b4f84b52f82bfe85ef4726f9f 100644 --- a/src/components/pages/News.js +++ b/src/components/pages/News.js @@ -1,10 +1,10 @@ import React, { Component } from 'react'; -import { Container, Header, Segment, Divider, - List, Modal, Button, Image, Form, Input, TextArea, Checkbox, Icon } from 'semantic-ui-react'; +import { Container, Header, Segment, Divider, List, Modal, + Button, Image, Form, Input, TextArea, Checkbox, Icon } from 'semantic-ui-react'; import { connect } from 'react-redux'; +import AddNewsForm from '../forms/AddNewsForm' -import { getNews, } from '../../actions'; -import { postNews, writeNews } from '../../actions/news.js' +import { getNews, deleteNews } from '../../actions/news' class News extends Component { @@ -12,46 +12,6 @@ class News extends Component { this.props.getNews(); } - - render_add_news(){ - const { title, text } = this.props.newNews; - const author = this.props.user.id; - return ( - <Modal trigger={<Button >Add news</Button>}> - <Modal.Header>Ăj hĂr:</Modal.Header> - <Modal.Content> - <Form> - <Form.Field - control={Input} - label='Title' - name='title' - onChange={e => this.props.writeNews(e)} - value={title} - placeholder='Title' /> - <Form.Field - control={TextArea} - label='Text' - name='text' - onChange={e => this.props.writeNews(e)} - value={text} - placeholder='Tell us what you want...' /> - </Form> - </Modal.Content> - <Modal.Actions> - <Button inverted color='red' > - <Icon name='remove' /> Cancel - </Button> - <Button - inverted color='green' - onClick={() => this.props.postNews({title, text, author})}> - <Icon name='checkmark' /> Add - </Button> - </Modal.Actions> - </Modal> - -); - } - render_news() { const news = this.props.news; @@ -60,6 +20,10 @@ class News extends Component { { index > 0 ? <Divider /> : ''} <Header as='h3' style={{ fontSize: '2em' }}>{item.title}</Header> <p style={{ fontSize: '1.33em' }}>{item.text}</p> + <Button + color='red' + size='mini' + onClick={() => this.props.deleteNews(item)} >Delete</Button> </div> )); @@ -104,7 +68,7 @@ class News extends Component { */} <Segment floated={'left'} style={{ padding: '3em 3em' }} vertical> - {this.render_add_news()} + <AddNewsForm /> <Container text textAlign = {'center'}> {this.render_news()} </Container> @@ -120,6 +84,6 @@ class News extends Component { } -const mapStateToProps = ({ news, newNews, user }) => ({ news, newNews, user }); +const mapStateToProps = ({ news }) => ({ news }); -export default connect(mapStateToProps, { getNews, postNews, writeNews, })(News); +export default connect(mapStateToProps, { getNews, deleteNews })(News); diff --git a/src/reducers/AddNewsReducer.js b/src/reducers/AddNewsReducer.js index 3c05bdbea4da1ae4cb6f6ec5292e2f9dcdddfb4d..0010ea8894a793b3cca8c6cb04cb579075ab2481 100644 --- a/src/reducers/AddNewsReducer.js +++ b/src/reducers/AddNewsReducer.js @@ -4,8 +4,10 @@ const INITIAL_STATE = { title: '', text: ''}; export default (state = INITIAL_STATE, action) => { switch (action.type) { - case WRITE_NEWS: - return {...state, [action.target]: action.payload} + case WRITE_NEWS: + return {...state, [action.target]: action.payload} + case CLEAR_WRITE: + return INITIAL_STATE; default: return state; } diff --git a/src/reducers/NewsReducer.js b/src/reducers/NewsReducer.js index 071d2d1ab741716ab0bbd86fbe082768bffe3b14..db1d57c4f38f273e2c526a66ffc1e599bfa45679 100644 --- a/src/reducers/NewsReducer.js +++ b/src/reducers/NewsReducer.js @@ -1,4 +1,4 @@ -import { GET_NEWS } from '../actions/types'; +import { GET_NEWS, ADD_NEWS, DELETE_NEWS } from '../actions/types'; const INITIAL_STATE = []; @@ -6,6 +6,13 @@ export default (state = INITIAL_STATE, action) => { switch (action.type) { case GET_NEWS: return action.payload; + case ADD_NEWS: + return [action.payload, ...state]; + case DELETE_NEWS: + let index = state.indexOf(action.payload); + let array = [...state]; + array.splice(index, 1); + return [...array]; default: return state; }