//@flow import React from "react"; import { connect } from "react-redux"; import { Page } from "../../components/layout"; import { Route } from "react-router"; import { Details } from "./../components/table"; import EditUser from "./EditUser"; import type { User } from "../types/User"; import type { History } from "history"; import { fetchUser, deleteUser, getUserByName, isFetchUserPending, getFetchUserFailure, isDeleteUserPending, getDeleteUserFailure } from "../modules/users"; import Loading from "../../components/Loading"; import { Navigation, Section, NavLink } from "../../components/navigation"; import { DeleteUserNavLink, EditUserNavLink } from "./../components/navLinks"; import ErrorPage from "../../components/ErrorPage"; import { translate } from "react-i18next"; type Props = { name: string, user: User, loading: boolean, error: Error, // dispatcher functions deleteUser: (user: User, callback?: () => void) => void, fetchUser: string => void, // context objects t: string => string, match: any, history: History }; class SingleUser extends React.Component { componentDidMount() { this.props.fetchUser(this.props.name); } userDeleted = () => { this.props.history.push("/users"); }; deleteUser = (user: User) => { this.props.deleteUser(user, this.userDeleted); }; stripEndingSlash = (url: string) => { if (url.endsWith("/")) { return url.substring(0, url.length - 2); } return url; }; matchedUrl = () => { return this.stripEndingSlash(this.props.match.url); }; render() { const { t, loading, error, user } = this.props; if (error) { return ( ); } if (!user || loading) { return ; } const url = this.matchedUrl(); return (
} /> } />
); } } const mapStateToProps = (state, ownProps) => { const name = ownProps.match.params.name; const user = getUserByName(state, name); const loading = isFetchUserPending(state, name) || isDeleteUserPending(state, name); const error = getFetchUserFailure(state, name) || getDeleteUserFailure(state, name); return { name, user, loading, error }; }; const mapDispatchToProps = dispatch => { return { fetchUser: (name: string) => { dispatch(fetchUser(name)); }, deleteUser: (user: User, callback?: () => void) => { dispatch(deleteUser(user, callback)); } }; }; export default connect( mapStateToProps, mapDispatchToProps )(translate("users")(SingleUser));