tasks-mockup/src/App.js

367 lines
8.5 KiB
JavaScript

import React from 'react'
import axios from 'axios'
import {
createArticle,
updateArticle,
deleteArticle,
selectArticle,
} from './controllers/articles'
import { addTag, selectTag, removeTag } from './controllers/tags'
import {
createTask,
updateTask,
deleteTask,
selectTask,
completeTask,
} from './controllers/tasks'
import {
createProject,
//updateProject,
deleteProject,
selectProject,
} from './controllers/projects'
import { updateProfile } from './controllers/profile'
import {
About,
Articles,
Article,
UpdateArticle,
Tasks,
UpdateTask,
Profile,
Projects,
Project,
Navbar,
} from './components'
const API = process.env.REACT_APP_API || 'http://localhost:1337'
console.log('Using API at ' + API)
const defaultState = {
loading: true,
user: { name: 'Scott' },
tasks: [],
projects: [],
component: 'projects',
search: '',
newArticle: '',
newTask: '',
newProject: '',
project: {},
newTag: '',
}
class App extends React.Component {
constructor() {
super()
this.state = defaultState
this.navigate = this.navigate.bind(this)
this.handleChange = this.handleChange.bind(this)
this.handleSubmit = this.handleSubmit.bind(this)
this.createArticle = createArticle.bind(this)
this.updateArticle = updateArticle.bind(this)
this.deleteArticle = deleteArticle.bind(this)
this.addTag = addTag.bind(this)
this.removeTag = removeTag.bind(this)
this.createTask = createTask.bind(this)
this.updateTask = updateTask.bind(this)
this.deleteTask = deleteTask.bind(this)
this.completeTask = completeTask.bind(this)
this.createProject = createProject.bind(this)
this.deleteProject = deleteProject.bind(this)
this.updateProfile = updateProfile.bind(this)
this.selectArticle = selectArticle.bind(this)
this.selectTag = selectTag.bind(this)
this.selectTask = selectTask.bind(this)
this.selectProject = selectProject.bind(this)
}
async fetchArticles() {
try {
const { data } = await axios.get(API + '/api/articles')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchTasks() {
try {
const { data } = await axios.get(API + '/api/tasks')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchProjects() {
try {
const { data } = await axios.get(API + '/api/projects')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchComments() {
try {
const { data } = await axios.get(API + '/api/comments')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchTags() {
try {
const { data } = await axios.get(API + '/api/tags')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchVotes() {
try {
const { data } = await axios.get(API + '/api/votes')
return data
} catch (error) {
console.log(error)
this.setState({ error })
}
}
async fetchData() {
const articles = await this.fetchArticles()
const tags = await this.fetchTags()
const tasks = await this.fetchTasks()
const projects = await this.fetchProjects()
const comments = await this.fetchComments()
const votes = await this.fetchVotes()
await this.setState({
loading: false,
articles,
tags,
tasks,
projects,
comments,
votes,
})
}
componentDidMount() {
this.fetchData()
}
navigate(component) {
this.setState({ component })
}
handleChange(e) {
this.setState({ [e.target.name]: e.target.value })
}
handleSubmit(e) {
e.preventDefault()
this.setState({ search: '' })
}
renderLoading() {
return <div>Loading...</div>
}
renderError() {
if (!this.state.error) {
return <div>There was an error.</div>
} else if (this.state.error.message === 'Network Error') {
alert(`Failed to reach backend at\n${this.state.error.config.url}.`)
} else {
return (
<div>
There was an error: {this.state.error.message}
<ul>
{Object.keys(this.state.error.config).map(key => (
<li>
{key}: {JSON.stringify(this.state.error.config[key])}
</li>
))}
</ul>
</div>
)
}
}
renderProfile() {
return (
<Profile
handleChange={this.handleChange}
selectProject={this.selectProject}
updateProfile={this.updateProfile}
{...this.state}
/>
)
}
renderArticles() {
return (
<Articles
navigate={this.navigate}
handleChange={this.handleChange}
createArticle={this.createArticle}
selectArticle={this.selectArticle}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
{...this.state}
/>
)
}
renderArticle() {
return (
<Article
navigate={this.navigate}
addTag={this.addTag}
removeTag={this.removeTag}
deleteArticle={this.deleteArticle}
selectTag={this.selectTag}
handleChange={this.handleChange}
{...this.state}
/>
)
}
renderUpdateArticle() {
return (
<UpdateArticle
handleChange={this.handleChange}
updateArticle={this.updateArticle}
navigate={this.navigate}
selectTag={this.selectTag}
{...this.state}
/>
)
}
renderProjects() {
return (
<Projects
navigate={this.navigate}
handleChange={this.handleChange}
createProject={this.createProject}
selectProject={this.selectProject}
deleteProject={this.deleteProject}
{...this.state}
/>
)
}
renderProject() {
return (
<Project
handleChange={this.handleChange}
createProject={this.createProject}
selectProject={this.selectProject}
selectTask={this.selectTask}
deleteProject={this.deleteProject}
createTask={this.createTask}
completeTask={this.completeTask}
deleteTask={this.deleteTask}
navigate={this.navigate}
{...this.state}
/>
)
}
renderAbout() {
return <About {...this.state} />
}
renderTasks(filtered, completed) {
return (
<Tasks
handleChange={this.handleChange}
handleSubmit={this.handleSubmit}
createTask={this.createTask}
completeTask={this.completeTask}
deleteTask={this.deleteTask}
filtered={filtered}
completed={completed}
selectTask={this.selectTask}
selectProject={this.selectProject}
{...this.state}
/>
)
}
renderUpdateTask() {
return (
<UpdateTask
handleChange={this.handleChange}
updateTask={this.updateTask}
navigate={this.navigate}
{...this.state}
/>
)
}
render() {
//console.log(this.state)
// TODO refactor task filtering
const completed =
(this.state.tasks &&
this.state.tasks.filter(task => task.completed === true)) ||
[]
const filtered =
(this.state.tasks &&
this.state.tasks.filter(
task =>
task.completed !== true &&
this.state.search === task.desc.slice(0, this.state.search.length),
)) ||
[]
const renderComponent = () =>
this.state.loading
? this.renderLoading()
: this.state.error
? this.renderError()
: this.state.component === 'articles'
? this.renderArticles()
: this.state.component === 'article'
? this.renderArticle()
: this.state.component === 'update-article'
? this.renderUpdateArticle()
: this.state.component === 'tasks'
? this.renderTasks(filtered, completed)
: this.state.component === 'task'
? this.renderUpdateTask()
: this.state.component === 'about'
? this.renderAbout()
: this.state.component === 'profile'
? this.renderProfile()
: this.state.component === 'projects'
? this.renderProjects()
: this.state.component === 'project'
? this.renderProject()
: this.renderError()
return (
<div>
<Navbar
handleChange={this.handleChange}
navigate={this.navigate}
{...this.state}
/>
{renderComponent()}
</div>
)
}
}
export default App