import * as React from 'react'; import NewPostForm from './NewPostForm'; import Spinner from '../shared/Spinner'; import IBoard from '../../interfaces/IBoard'; interface Props { board: IBoard; isLoggedIn: boolean; authenticityToken: string; } interface State { showForm: boolean; error: string; success: string; isLoading: boolean; title: string; description: string; } class NewPost extends React.Component { constructor(props) { super(props); this.state = { showForm: false, error: '', success: '', isLoading: false, title: '', description: '', }; this.toggleForm = this.toggleForm.bind(this); this.onTitleChange = this.onTitleChange.bind(this); this.onDescriptionChange = this.onDescriptionChange.bind(this); this.submitForm = this.submitForm.bind(this); } toggleForm() { this.setState({ showForm: !this.state.showForm, error: '', success: '', isLoading: false, }); } onTitleChange(title) { this.setState({ title, error: '', }); } onDescriptionChange(description) { this.setState({ description, }); } async submitForm(e) { e.preventDefault(); this.setState({ error: '', success: '', isLoading: true, }); const boardId = this.props.board.id; const { authenticityToken } = this.props; const { title, description } = this.state; if (title === '') { this.setState({ error: 'You forgot to enter a title!', isLoading: false, }); return; } try { let res = await fetch('/posts', { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'X-CSRF-Token': authenticityToken, }, body: JSON.stringify({ post: { title, description, board_id: boardId, }, }), }); this.setState({isLoading: false}); if (res.status === 204) this.setState({success: 'Your post has been published!'}); else { let data = await res.json(); this.setState({error: data.message}); } } catch (e) { this.setState({ error: 'An unknown error occurred, try again.' }); } } render() { const { board, isLoggedIn } = this.props; const { showForm, error, success, isLoading, title, description } = this.state; return (
{board.name} {board.description} { isLoggedIn ? : Log in / Sign up } { showForm ? : null } { isLoading ? : null } { error ? {error} : null } { success ? {success} : null }
); } } export default NewPost;