InsidersByte/honeymoon-gift-list

View on GitHub
public/containers/UsersPage/index.jsx

Summary

Maintainability
B
5 hrs
Test Coverage
/* @flow */

import React, { Component } from 'react';
import { connect } from 'react-redux';
import type { Connector } from 'react-redux';
import { loadUsers, createUser, deleteUser, openUserModal, closeUserModal } from '../../redux/users';
import { getLoggedInUser, getActiveUsers, getInvitedUsers, getIsModalOpen, getIsLoading, getIsSaving, getIsDeleting } from '../../redux';
import UserList from '../../components/UserList';
import UserDialog from '../../components/UserDialog';
import type { StateType, UserType, UsersType, AuthUser } from '../../types';

type UnsavedUserType = {
  email: string,
};

type PropsType = {
  loading: boolean,
  saving: boolean,
  deleting: boolean,
  userModalOpen: boolean,
  activeUsers: UsersType,
  invitedUsers: UsersType,
  loggedInUser: AuthUser,
  loadUsers: () => void,
  createUser: (user: UnsavedUserType) => void,
  deleteUser: (user: UserType) => void,
  openUserModal: () => void,
  closeUserModal: () => void,
};

type LocalStateType = {
  user: UnsavedUserType,
};

const initialUser = {
  email: '',
};

const mapStateToProps = (state: StateType) => ({
  userModalOpen: getIsModalOpen(state),
  loading: getIsLoading(state),
  saving: getIsSaving(state),
  deleting: getIsDeleting(state),
  loggedInUser: getLoggedInUser(state),
  activeUsers: getActiveUsers(state),
  invitedUsers: getInvitedUsers(state),
});

const mapDispatchToProps = { loadUsers, createUser, deleteUser, openUserModal, closeUserModal };

export class UsersPage extends Component<void, PropsType, LocalStateType> {
  state = { user: { ...initialUser } };

  componentDidMount() {
    this.props.loadUsers();
  }

  setUserState = ({ target }: SyntheticEvent) => {
    if (!(target instanceof HTMLInputElement)) {
      return;
    }

    const { name, value } = target;
    const user = { ...this.state.user, [name]: value };
    this.setState({ user });
  };

  save = (event: SyntheticEvent) => {
    event.preventDefault();
    this.props.createUser(this.state.user);
  };

  delete = (user: Object) => {
    if (!confirm('Are you sure you want to delete this user?')) {
      return;
    }

    this.props.deleteUser(user);
  };

  onAdd = () => {
    this.props.openUserModal();
    this.setState({ user: { ...initialUser } });
  };

  render() {
    const { activeUsers, invitedUsers, saving, loggedInUser, loading, userModalOpen: open, closeUserModal: onHide } = this.props;
    const { user } = this.state;

    return (
      <div>
        <UserList
          loading={loading}
          activeUsers={activeUsers}
          invitedUsers={invitedUsers}
          loggedInUser={loggedInUser}
          onAdd={this.onAdd}
          onDelete={this.delete}
        />

        <UserDialog user={user} open={open} saving={saving} onHide={onHide} onSubmit={this.save} onChange={this.setUserState} />
      </div>
    );
  }
}

const connector: Connector<PropsType, PropsType> = connect(mapStateToProps, mapDispatchToProps);

export default connector(UsersPage);