diff --git a/src/actions/news.js b/src/actions/news.js index 90445677d03444e12a69067ff853aceae75682e2..cc564fa280fa61e6ae3aa2749dd5df8401b2a25e 100644 --- a/src/actions/news.js +++ b/src/actions/news.js @@ -1,5 +1,6 @@ import { axios } from './auth'; -import { GET_NEWS, WRITE_NEWS, ADD_NEWS, DELETE_NEWS, CLEAR_WRITE } from './types'; +import { GET_NEWS, WRITE_NEWS, ADD_NEWS, DELETE_NEWS, + CLEAR_WRITE, SELECT_NEWS, EDIT_NEWS } from './types'; export const getNews = () => ( async (dispatch) => { @@ -38,6 +39,30 @@ export const postNews = ({ title, author, text }) => ( } ); +export const editNews = ({ id, title, editedBy, text }) => ( + async (dispatch) => { + try { + const response = await axios.patch(`/api/v1/news/${id}/`, { + author: editedBy, + title, + text, + }); + if (response.data.id) { + alert('Sikeres mentĂŠs!'); + dispatch({ + type: EDIT_NEWS, + payload: response.data, + + }); + } else { + alert('MentĂŠs nem sikerĂźlt!'); + } + } catch (e) { + console.log(e); + } + } +); + export const deleteNews = news => ( async (dispatch) => { try { @@ -67,3 +92,9 @@ export const clearWrite = () => ( dispatch({ type: CLEAR_WRITE }); } ); + +export const setSelectedNews = item => ( + (dispatch) => { + dispatch({ type: SELECT_NEWS, payload: item }); + } +); diff --git a/src/actions/types.js b/src/actions/types.js index 51fd06f8f252b9e2302c28a1d801c6d511d738bd..177bbd756bb8212baabdd05a82dd959c67c65514 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -8,3 +8,5 @@ export const WRITE_NEWS = 'write_news'; export const CLEAR_WRITE = 'clear_write'; export const ADD_NEWS = 'add_news'; export const DELETE_NEWS = 'delete_news'; +export const EDIT_NEWS = 'edit_news'; +export const SELECT_NEWS = 'select_news'; diff --git a/src/components/forms/EditNewsForm.js b/src/components/forms/EditNewsForm.js new file mode 100644 index 0000000000000000000000000000000000000000..36d5f2953ab7cad0cdc8eaad0f18a975623fea06 --- /dev/null +++ b/src/components/forms/EditNewsForm.js @@ -0,0 +1,60 @@ +import React, { Component } from 'react'; +import { Modal, Button, Form, Input, TextArea, Icon } from 'semantic-ui-react'; +import { connect } from 'react-redux'; + +import { writeNews, editNews, clearWrite } from '../../actions/news'; + +class EditNewsForm extends Component { + render() { + const { id, title, text } = this.props.selectedNews; + const editedBy = this.props.user.id; + return ( + <Modal onOpen={this.props.onClick} trigger={<Button size='mini' >Edit</Button>}> + <Modal.Header>SzerkesztĂŠs:</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.editNews({ + id, title, text, editedBy, + }); + this.props.clearWrite(); + }} + > + <Icon name='checkmark' /> Edit + </Button> + </Modal.Actions> + </Modal> + ); + } +} + +const mapStateToProps = ({ user, selectedNews }) => ({ user, selectedNews }); + +export default connect(mapStateToProps, { + editNews, writeNews, clearWrite, +})(EditNewsForm); diff --git a/src/components/pages/News.js b/src/components/pages/News.js index 4a2a414981ad0a7e7355364443725ed4564dcc97..13145c6c01622cc7ae5e6d60b74aa8e22bcf3d4d 100644 --- a/src/components/pages/News.js +++ b/src/components/pages/News.js @@ -2,8 +2,9 @@ import React, { Component } from 'react'; import { Container, Header, Segment, Divider, List, Button } from 'semantic-ui-react'; import { connect } from 'react-redux'; import AddNewsForm from '../forms/AddNewsForm'; +import EditNewsForm from '../forms/EditNewsForm'; -import { getNews, deleteNews } from '../../actions/news'; +import { getNews, deleteNews, setSelectedNews } from '../../actions/news'; class News extends Component { componentWillMount() { @@ -16,6 +17,7 @@ class News extends Component { { index > 0 ? <Divider /> : ''} <Header as='h3' style={{ fontSize: '2em' }}>{item.title}</Header> <p style={{ fontSize: '1.33em' }}>{item.text}</p> + <EditNewsForm onClick={() => this.props.setSelectedNews(item)} /> <Button color='red' size='mini' @@ -80,4 +82,4 @@ class News extends Component { const mapStateToProps = ({ news }) => ({ news }); -export default connect(mapStateToProps, { getNews, deleteNews })(News); +export default connect(mapStateToProps, { getNews, deleteNews, setSelectedNews })(News); diff --git a/src/reducers/EditNewsReducer.js b/src/reducers/EditNewsReducer.js new file mode 100644 index 0000000000000000000000000000000000000000..5a0ead1a0221a31f377978a594d131dc9b0849fc --- /dev/null +++ b/src/reducers/EditNewsReducer.js @@ -0,0 +1,16 @@ +import { WRITE_NEWS, CLEAR_WRITE, SELECT_NEWS } from '../actions/types'; + +const INITIAL_STATE = { }; + +export default (state = INITIAL_STATE, action) => { + switch (action.type) { + case SELECT_NEWS: + return 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 4b8c8547aeeb3b318557000dc55fc879a0155e76..68a263deafa4dec0fd5a14020d44e65bb6b7581b 100644 --- a/src/reducers/NewsReducer.js +++ b/src/reducers/NewsReducer.js @@ -1,4 +1,4 @@ -import { GET_NEWS, ADD_NEWS, DELETE_NEWS } from '../actions/types'; +import { GET_NEWS, ADD_NEWS, DELETE_NEWS, EDIT_NEWS } from '../actions/types'; const INITIAL_STATE = []; @@ -8,6 +8,10 @@ export default (state = INITIAL_STATE, action) => { return action.payload; case ADD_NEWS: return [action.payload, ...state]; + case EDIT_NEWS: + const array = state.filter(item => item.id === action.payload.id); + state.splice(state.indexOf(array.pop()), 1, action.payload); + return [...state]; case DELETE_NEWS: state.splice(state.indexOf(action.payload), 1); return [...state]; diff --git a/src/reducers/index.js b/src/reducers/index.js index 8ffee6c93e483b41482af367ac7217ea28f35f6b..370c0afc2a7d0b08ef7dae9b4ea79c79fe2c6694 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -2,11 +2,13 @@ import { combineReducers } from 'redux'; import UserReducer from './UserReducer'; import NewsReducer from './NewsReducer'; import AddNewsReducer from './AddNewsReducer'; +import EditNewsReducer from './EditNewsReducer'; const rootReducer = combineReducers({ user: UserReducer, news: NewsReducer, newNews: AddNewsReducer, + selectedNews: EditNewsReducer, }); export default rootReducer;