import { IUser, IUserInTeam, TReadonlyRecord, TeamActions, UserActions, Team } from '@rondo.dev/common' import { Button, Control, Heading, Help, Input, Panel, PanelBlock, PanelHeading } from 'bloomer' import React from 'react' import { FaCheck, FaTimes, FaUser } from 'react-icons/fa' const EMPTY_ARRAY: ReadonlyArray = [] export interface ITeamUsersProps { // fetchMyTeams: () => void, fetchUsersInTeam: TeamActions['findUsers'] findUserByEmail: UserActions['findUserByEmail'] onAddUser: TeamActions['addUser'] onRemoveUser: TeamActions['removeUser'] team: Team userKeysByTeamId: TReadonlyRecord> usersByKey: TReadonlyRecord } export interface ITeamUserProps { onRemoveUser: ( params: {userId: number, teamId: number, roleId: number}) => void user: IUserInTeam } export interface IAddUserProps { onAddUser: TeamActions['addUser'] onSearchUser: UserActions['findUserByEmail'] teamId: number } export interface IAddUserState { error: string email: string user?: IUser } export class TeamUser extends React.PureComponent { handleRemoveUser = async () => { const {onRemoveUser, user} = this.props await onRemoveUser({...user, roleId: 1}) } render() { const {user} = this.props // TODO style return (
{user.displayName}
) } } export class AddUser extends React.PureComponent { constructor(props: IAddUserProps) { super(props) this.state = { error: '', email: '', user: undefined, } } handleChangeEmail = (event: React.ChangeEvent) => { const email = event.target.value this.setState({email}) } handleAddUser = async (event: React.FormEvent) => { event.preventDefault() const {teamId} = this.props const {email} = this.state const user = await this.props.onSearchUser(email).payload if (!user) { // TODO handle this better via 404 status code this.setState({error: 'No user found'}) return } await this.props.onAddUser({ teamId, userId: user.id, roleId: 1, }) this.setState({error: '', email: '', user: undefined}) } render() { const {error} = this.state return (
Add User {error && ( {error} )}
) } } export class TeamUserList extends React.PureComponent { async componentDidMount() { await this.fetchUsersInTeam(this.props.team.id) } async componentWillReceiveProps(nextProps: ITeamUsersProps) { const {team} = nextProps if (team.id !== this.props.team.id) { this.fetchUsersInTeam(team.id) } } async fetchUsersInTeam(teamId: number) { if (teamId) { await this.props.fetchUsersInTeam(teamId) } } render() { const userKeysByTeamId = this.props.userKeysByTeamId[this.props.team.id] || EMPTY_ARRAY return ( Users in Team {userKeysByTeamId.map(key => { const user = this.props.usersByKey[key] return ( ) })} ) } }