devbook_ts/src/pages/Posts/index.tsx
Ruidy 8cf1f1f577
🏗 Folder Structure and General Refactoring (#15)
* refactor: AddEducation folder

* refactor: AddExperience folder

* refactor: separate Dashboard Buttons, Experience section

* refactor: add Dashboard Education section

* refactor: Developers  folder

* refactor: EditProfile folder

* refactor: use React.memo

* refactor: Post folder

* refactor: Posts folder

* refactor: Profile folder

* refactor: delete useless store/auth folder
2020-06-02 22:49:13 +02:00

91 lines
2.5 KiB
TypeScript

import React, {FC, useState} from 'react';
// Redux
import {compose} from '@reduxjs/toolkit';
import {connect, useSelector} from 'react-redux';
import {firestoreConnect, WithFirestoreProps} from 'react-redux-firebase';
import {RootState} from '../../store';
import {selectProfile} from '../../store/firebase';
// Style
import Header from '../../components/Header';
// Typing
import Post from '../../models/Post';
import Collections from '../../constants/collections';
import PostsForm from './Form';
import PostsItem from './Item';
interface IProps extends WithFirestoreProps {
posts: Post[];
}
/**
* A Dev's Posts list
*/
const Posts: FC<IProps> = ({posts, firestore, firebase}) => {
const [text, setText] = useState('');
const {avatarUrl, displayName} = useSelector(selectProfile);
const id = firebase.auth().currentUser?.uid;
const newPost = {
userID: id,
name: displayName,
text,
avatarUrl,
likes: [] as string[],
comments: [],
};
const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) =>
setText(e.target.value);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
firestore
.add(Collections.POSTS, newPost)
.then(() => setText(''))
.catch(err => console.error(err));
};
// const removeLike = (e: React.MouseEvent<HTMLButtonElement>) =>
// new Error('Not implemented yet.');
const addLike = (postID: string) => (
e: React.MouseEvent<HTMLButtonElement>,
) => {
e.preventDefault();
const post = posts.find(p => p.id === postID);
if (post && id && !post.likes.includes(id)) {
firestore
.update(`${Collections.POSTS}/${post.id}`, {likes: [...post.likes, id]})
.catch(err => console.error(err));
}
};
return (
<section className="container">
<Header title="Posts" lead="Welcome to the community" />
<div className="post-form">
<div className="post-form-header bg-primary">
<h3>Say Something</h3>
</div>
<PostsForm
text={text}
handleChange={handleChange}
handleSubmit={handleSubmit}
/>
<div className="posts">
{posts?.map((post: Post) => (
<PostsItem post={post} addLike={addLike} key={post.id} />
))}
</div>
</div>
</section>
);
};
export default compose<FC>(
firestoreConnect(() => [Collections.POSTS]), // or { collection: 'users' }
connect((state: RootState) => ({
posts: state.firestore.ordered.posts,
})),
)(Posts);