03_lesson: use postStatus to fetch content and display correspondingly
This commit is contained in:
parent
2339529dfd
commit
e8dedad084
19
02_lesson_starter/src/features/posts/PostsExcerpt.js
Normal file
19
02_lesson_starter/src/features/posts/PostsExcerpt.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import ReactionButtons from './ReactionButtons';
|
||||||
|
import PostAuthor from './PostAuthor';
|
||||||
|
import TimeAgo from './TimeAgo';
|
||||||
|
|
||||||
|
const PostsExcerpt = ({ post }) => {
|
||||||
|
return (
|
||||||
|
<article>
|
||||||
|
<h3>{post.title}</h3>
|
||||||
|
<p>{post.body.substring(0, 100)}</p>
|
||||||
|
<p className="postCredit">
|
||||||
|
<PostAuthor userId={post.userId} />
|
||||||
|
<TimeAgo timestamp={post.date} />
|
||||||
|
</p>
|
||||||
|
<ReactionButtons post={post} />
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PostsExcerpt;
|
@ -5,43 +5,40 @@ import {
|
|||||||
getPostsStatus,
|
getPostsStatus,
|
||||||
selectAllPosts,
|
selectAllPosts,
|
||||||
} from './postsSlice';
|
} from './postsSlice';
|
||||||
import PostAuthor from './PostAuthor';
|
import PostsExcerpt from './PostsExcerpt';
|
||||||
import TimeAgo from './TimeAgo';
|
import { useEffect } from 'react';
|
||||||
import ReactionButtons from './ReactionButton';
|
|
||||||
|
|
||||||
const PostsList = () => {
|
const PostsList = () => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
const posts = useSelector(selectAllPosts);
|
const posts = useSelector(selectAllPosts);
|
||||||
const postsStatus = useSelector(getPostsStatus);
|
const postStatus = useSelector(getPostsStatus);
|
||||||
const postsError = useSelector(getPostsError);
|
const error = useSelector(getPostsError);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (postsStatus === 'idle') {
|
if (postStatus === 'idle') {
|
||||||
dispatch(fetchPosts());
|
dispatch(fetchPosts());
|
||||||
}
|
}
|
||||||
}, [postsStatus, dispatch]);
|
}, [postStatus, dispatch]);
|
||||||
|
|
||||||
const orderedPosts = posts
|
let content;
|
||||||
.slice()
|
if (postStatus === 'loading') {
|
||||||
.sort((a, b) => b.date.localeCompare(a.date));
|
content = <p>"Loading...</p>;
|
||||||
|
} else if (postStatus === 'succeeded') {
|
||||||
const renderedPosts = orderedPosts.map((post) => (
|
const orderedPosts = posts
|
||||||
<article key={post.id}>
|
.slice()
|
||||||
<h3>{post.title}</h3>
|
.sort((a, b) => b.date.localeCompare(a.date));
|
||||||
<p>{post.content.substring(0, 100)}</p>
|
content = orderedPosts.map((post) => (
|
||||||
<p className="postCredit">
|
<PostsExcerpt key={post.id} post={post} />
|
||||||
<PostAuthor userId={post.userId} />
|
));
|
||||||
<TimeAgo timestamp={post.date} />
|
} else if (postStatus === 'failed') {
|
||||||
</p>
|
content = <p>{error}</p>;
|
||||||
<ReactionButtons post={post} />
|
}
|
||||||
</article>
|
|
||||||
));
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section>
|
<section>
|
||||||
<h2>Posts</h2>
|
<h2>Posts</h2>
|
||||||
{renderedPosts}
|
{content}
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user