1. formatTime - хелпер, я не буду таратить время на анализ качества его реализации, скажу лишь, что в компоненте ему не место. Перенесите в папку lib, utils или как там она у вас называется, импортируйте где нужен и используйте.
2. Закроем, пока глаза на пункт 1. formatTime у вас написан стрелочной функцией, но он никуда не передается и в нем не используется ключевое слово this - определять его стрелочной функцией было бессмысленно. Изучите вопрос и постарайтесь понять зачем их используют.
spoilerпривязка контекста
То же с getChatsUser - функция никуда не передается.
3. Никогда не используйте тернарки если, альтернативный кейс null. Замените на:
render() {
/* ... */
const hasUnreadMessages = unread_amount > 0;
return (
<div>
{hasUnreadMessages && (
<div className="unread-message-container">{unread_amount}</div>
)}
</div>
);
}
4. Зачем передаете в mapStateToProps все состояние редьюсера? Передавайте только необходимые компоненту данные:
export const userDataSelector = state => state.chatReducer.userData;
const mapStateToProps = state => ({
userData: userDataSelector(state),
});
Селекторы очень полезная вещь. В реальных приложениях они часто помногу раз переиспользуются и в случае изменения структуры store, вам придется изменить только селекторы, вместо изменения реализаций mapStateToProps по всему приложению. Так же, они, зачастую, короче.
Почитайте про библиотеку reselect.
5. Вместо:
const query = Object.assign({}, params, { per_page });
лаконичней и проще для анализа:
const query = { ...params, per_page };
6. Правильное обновление состояния на основе предыдущего:
this.setState(prevState => ({
per_page: prevState.per_page + 5,
}));
7. Использование
trailing comma - очень хорошая практика, советую ей не пренебрегать.
8. Более оптимизированным вариантом для списков, будет вместо определения стрелочных функции в элементах каждый render:
<div onClick={() => setUserForChat(userData)}>
использовать data-атрибуты:
<div data-id={userData.id} onClick={setUserForChat}>
Реализацию setUserForChat придется изменить:
setUserForChat = e => {
const { id } = e.target.dataset;
// some code with using id
}