react-hooks-unit-tests/src/views/Team.jsx

128 lines
2.8 KiB
React
Raw Normal View History

2019-06-26 18:25:30 -04:00
// MARK: Definitions
import React, { useState, useEffect } from 'react'
import axios from 'axios'
2019-06-27 17:07:02 -04:00
import history from '../history.js'
2019-06-26 18:25:30 -04:00
import config from '../config.json'
import FilterForm from '../components/FilterForm.jsx'
2019-06-28 00:35:10 -04:00
import './Team.scss'
2019-06-26 18:25:30 -04:00
2019-06-27 17:07:02 -04:00
// teamProps, usersProps, userIdCallback
export default function Team(props) {
2019-06-26 18:25:30 -04:00
// MARK: State
let [loading, setLoading] = useState(true)
let [team, setTeam] = useState([])
2019-06-27 18:23:50 -04:00
let [members, setMembers] = useState([])
let [filteredMembers, setFilteredMembers] = useState([])
2019-06-26 18:25:30 -04:00
// MARK: Effect
// MARK: - Load user info from Tempo backend on initialization
useEffect(() => {
let fetchData = async() => {
setLoading(true)
try {
2019-06-27 17:07:02 -04:00
let result = await axios(config.api + '/team/' + props.teamProps.id)
2019-06-26 18:25:30 -04:00
if (result.data) {
setTeam(result.data)
2019-06-27 18:23:50 -04:00
result.data.members.map(memberId => {
let arr = props.usersProps.filter(el => el.id === memberId)
2019-06-28 00:35:10 -04:00
if (arr[0] !== undefined) {
let tupple = {
name: arr[0].name,
id: memberId
}
setMembers(t => [...t, tupple])
setFilteredMembers(t => [...t, tupple])
}
else {
history.push('/')
2019-06-27 18:23:50 -04:00
}
return null
})
2019-06-26 18:25:30 -04:00
}
2019-06-28 00:35:10 -04:00
else {
history.push('/')
}
2019-06-26 18:25:30 -04:00
setLoading(false)
}
catch(err) {
setLoading(false)
console.log('Fetch data error: ' + err)
}
}
fetchData()
2019-06-27 17:07:02 -04:00
}, [props])
2019-06-26 18:25:30 -04:00
2019-06-27 17:07:02 -04:00
// MARK: Helpers
let userData = (userId) => {
let arr = props.usersProps.filter(el => el.id === userId)
2019-06-28 00:35:10 -04:00
if (arr[0] !== undefined) {
return arr[0].name
}
else {
history.push('/')
}
2019-06-27 17:07:02 -04:00
}
2019-06-26 18:25:30 -04:00
2019-06-27 17:07:02 -04:00
let selectUser = (id) => {
props.userIdCallback(id)
history.push('/member')
}
2019-06-27 18:23:50 -04:00
let filterCallback = (e) => {
let filtered = members.filter(member => {
return member.name.toUpperCase().includes(e.target.value.toUpperCase())
})
setFilteredMembers(filtered)
}
2019-06-27 17:07:02 -04:00
let navBack = () => {
history.push('/')
}
2019-06-26 18:25:30 -04:00
// MARK: Return
return (
2019-06-28 00:35:10 -04:00
<div className='team'>
2019-06-27 18:23:50 -04:00
2019-06-27 17:07:02 -04:00
{props.teamProps !== undefined &&
2019-06-28 00:35:10 -04:00
<div className='header'>
2019-06-28 01:20:29 -04:00
<h1>Team {props.teamProps.name}</h1>
2019-06-28 00:35:10 -04:00
</div>
2019-06-26 18:25:30 -04:00
}
2019-06-28 01:20:29 -04:00
<div className='back'>
<button className='back-btn' onClick={navBack}>{`< Back to teams`}</button>
</div>
2019-06-27 18:23:50 -04:00
<FilterForm filterCallback = { filterCallback } />
2019-06-26 18:25:30 -04:00
{loading ? (<div>Loading...</div>) : (
team !== undefined &&
2019-06-27 17:07:02 -04:00
<div>
<h2>Team lead</h2>
2019-06-28 01:20:29 -04:00
<button className='selector-btn' onClick={() => selectUser(team.lead)}>
{userData(team.lead)}
</button>
2019-06-27 17:07:02 -04:00
<h2>Team members</h2>
2019-06-27 18:23:50 -04:00
2019-06-27 17:07:02 -04:00
<ul className='list'>
2019-06-27 18:23:50 -04:00
{filteredMembers.map((member, index) => (
2019-06-27 17:07:02 -04:00
<li className = 'list-item' key={index}>
2019-06-28 00:35:10 -04:00
<button className='selector-btn' onClick={() => selectUser(member.id)}>
2019-06-27 18:23:50 -04:00
{member.name}
2019-06-27 17:07:02 -04:00
</button>
</li>
))}
</ul>
</div>
2019-06-26 18:25:30 -04:00
)}
2019-06-27 18:23:50 -04:00
2019-06-26 18:25:30 -04:00
</div>
)
}