mirror of
https://github.com/rjNemo/devbook_ts
synced 2026-06-06 02:36:39 +00:00
refactor: Posts folder
This commit is contained in:
parent
abf0ba5b0c
commit
1512e1a20f
3 changed files with 79 additions and 48 deletions
22
src/pages/Posts/Form.tsx
Normal file
22
src/pages/Posts/Form.tsx
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import React, {FC} from 'react';
|
||||
|
||||
interface IProps {
|
||||
text: string;
|
||||
handleSubmit: (event: React.FormEvent<HTMLFormElement>) => void;
|
||||
handleChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
|
||||
}
|
||||
|
||||
const PostsForm: FC<IProps> = ({text, handleSubmit, handleChange}) => (
|
||||
<form className="form my-1" onSubmit={handleSubmit}>
|
||||
<textarea
|
||||
cols={30}
|
||||
rows={5}
|
||||
placeholder="Create a post"
|
||||
value={text}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
<input type="submit" value="Submit" className="btn btn-dark my-1" />
|
||||
</form>
|
||||
);
|
||||
|
||||
export default PostsForm;
|
||||
41
src/pages/Posts/Item.tsx
Normal file
41
src/pages/Posts/Item.tsx
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import React, {FC} from 'react';
|
||||
// Routing
|
||||
import {Link} from 'react-router-dom';
|
||||
import Routes from '../../constants/routes';
|
||||
// Styling
|
||||
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
|
||||
import {faThumbsUp} from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
import Post from '../../models/Post';
|
||||
|
||||
interface IProps {
|
||||
post: Post;
|
||||
addLike: (
|
||||
postID: string,
|
||||
) => (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
||||
}
|
||||
|
||||
const PostsItem: FC<IProps> = ({post, addLike}) => (
|
||||
<div className="post bg-white p-1 my-1">
|
||||
<div>
|
||||
<Link to={`${Routes.PROFILE}/${post.userID}`}>
|
||||
<img src={post.avatarUrl} alt={post.name} className="round-img" />
|
||||
<h4>{post.name}</h4>
|
||||
</Link>
|
||||
</div>
|
||||
<div>
|
||||
<p className="my-1">{post.text}</p>
|
||||
<button className="btn btn-light" onClick={addLike(post.id)}>
|
||||
<FontAwesomeIcon icon={faThumbsUp} /> {post.likes?.length}
|
||||
</button>
|
||||
{/* <button className="btn btn-light" onClick={removeLike}>
|
||||
<FontAwesomeIcon icon={faThumbsDown} />
|
||||
</button> */}
|
||||
<Link to={`${Routes.POST}/${post.id}`} className="btn btn-primary">
|
||||
Discussion
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
export default React.memo(PostsItem);
|
||||
|
|
@ -3,18 +3,16 @@ import React, {FC, useState} from 'react';
|
|||
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';
|
||||
// Routing
|
||||
import {Link} from 'react-router-dom';
|
||||
import Routes from '../constants/routes';
|
||||
import {RootState} from '../../store';
|
||||
import {selectProfile} from '../../store/firebase';
|
||||
// Style
|
||||
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
|
||||
import {faThumbsUp} from '@fortawesome/free-solid-svg-icons';
|
||||
import Header from '../components/Header';
|
||||
import Header from '../../components/Header';
|
||||
// Typing
|
||||
import Post from '../models/Post';
|
||||
import Collections from '../constants/collections';
|
||||
import Post from '../../models/Post';
|
||||
import Collections from '../../constants/collections';
|
||||
|
||||
import PostsForm from './Form';
|
||||
import PostsItem from './Item';
|
||||
|
||||
interface IProps extends WithFirestoreProps {
|
||||
posts: Post[];
|
||||
|
|
@ -69,45 +67,15 @@ const Posts: FC<IProps> = ({posts, firestore, firebase}) => {
|
|||
<h3>Say Something</h3>
|
||||
</div>
|
||||
|
||||
<form className="form my-1" onSubmit={handleSubmit}>
|
||||
<textarea
|
||||
cols={30}
|
||||
rows={5}
|
||||
placeholder="Create a post"
|
||||
value={text}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
<input type="submit" value="Submit" className="btn btn-dark my-1" />
|
||||
</form>
|
||||
<PostsForm
|
||||
text={text}
|
||||
handleChange={handleChange}
|
||||
handleSubmit={handleSubmit}
|
||||
/>
|
||||
|
||||
<div className="posts">
|
||||
{posts?.map((post: Post) => (
|
||||
<div className="post bg-white p-1 my-1" key={post.id}>
|
||||
<div>
|
||||
<Link to={`${Routes.PROFILE}/${post.userID}`}>
|
||||
<img
|
||||
src={post.avatarUrl}
|
||||
alt={post.name}
|
||||
className="round-img"
|
||||
/>
|
||||
<h4>{post.name}</h4>
|
||||
</Link>
|
||||
</div>
|
||||
<div>
|
||||
<p className="my-1">{post.text}</p>
|
||||
<button className="btn btn-light" onClick={addLike(post.id)}>
|
||||
<FontAwesomeIcon icon={faThumbsUp} /> {post.likes?.length}
|
||||
</button>
|
||||
{/* <button className="btn btn-light" onClick={removeLike}>
|
||||
<FontAwesomeIcon icon={faThumbsDown} />
|
||||
</button> */}
|
||||
<Link
|
||||
to={`${Routes.POST}/${post.id}`}
|
||||
className="btn btn-primary"
|
||||
>
|
||||
Discussion
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<PostsItem post={post} addLike={addLike} key={post.id} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -116,7 +84,7 @@ const Posts: FC<IProps> = ({posts, firestore, firebase}) => {
|
|||
};
|
||||
|
||||
export default compose<FC>(
|
||||
firestoreConnect(() => ['posts']), // or { collection: 'users' }
|
||||
firestoreConnect(() => [Collections.POSTS]), // or { collection: 'users' }
|
||||
connect((state: RootState) => ({
|
||||
posts: state.firestore.ordered.posts,
|
||||
})),
|
||||
Loading…
Reference in a new issue