:feature: New post view

Signed-off-by: Pau Costa <mico@micodev.es>
main
Pau Costa Ferrer 2024-02-11 17:36:20 +01:00
parent 40a978c546
commit 6142dd7000
3 changed files with 75 additions and 2 deletions

View File

@ -95,6 +95,17 @@ export const commentAPost =
dispatch(fetchAPost(postId)); dispatch(fetchAPost(postId));
dispatch(setStatus(Status.idle)); dispatch(setStatus(Status.idle));
}; };
export const createPost =
(title: string, content: string): AppThunk =>
async (dispatch: any) => {
const postApi = createApi(store);
dispatch(setStatus(Status.loading));
await postApi.createPost({ title, content });
dispatch(fetchGlobalPosts());
dispatch(setStatus(Status.idle));
};
export const { setFollowedPosts, setGlobalPosts, setStatus, setAPost } = export const { setFollowedPosts, setGlobalPosts, setStatus, setAPost } =
postSlice.actions; postSlice.actions;

View File

@ -1,3 +1,53 @@
import { Box, Button, TextField, Typography } from "@mui/material";
import { useAppDispatch } from "../app/store";
import React from "react";
import { createPost } from "../app/postSlice";
import { useNavigate } from "react-router-dom";
export default function NewPost() { export default function NewPost() {
return <>New Post</>; const dispatch = useAppDispatch();
const navigate = useNavigate();
const [newPostText, setNewPostText] = React.useState("");
const [newPostTitle, setNewPostTitle] = React.useState("");
const handleCreatePost = () => {
if (newPostText === "" || newPostTitle === "") return;
dispatch(createPost(newPostTitle, newPostText));
setNewPostText("");
setNewPostTitle("");
navigate("/global");
};
return (
<Box
sx={{
margin: "auto",
display: "flex",
flexDirection: "column",
}}
>
<Typography variant="h4" sx={{ marginBottom: 2 }}>
Share your thoughts!
</Typography>
<TextField
label="Title"
value={newPostTitle}
multiline
onChange={(e) => setNewPostTitle(e.target.value)}
sx={{ marginBottom: 2 }}
/>
<TextField
label="Post"
value={newPostText}
onChange={(e) => setNewPostText(e.target.value)}
multiline
rows={4}
sx={{ marginBottom: 2 }}
/>
<Button variant="contained" fullWidth onClick={handleCreatePost}>
Post
</Button>
</Box>
);
} }

View File

@ -30,7 +30,19 @@ export default function PostList(props: PostListProps) {
}, []); }, []);
useEffect(() => { useEffect(() => {
setPosts(props.type === "all" ? globalPosts : followedPosts); const postsToDisplay = props.type === "all" ? globalPosts : followedPosts;
let sortedPosts: Post[] = [];
if (postsToDisplay.length > 0) {
sortedPosts = [...postsToDisplay].sort((a: Post, b: Post) => {
return b.createdAt! > a.createdAt!
? 1
: b.createdAt! < a.createdAt!
? -1
: 0;
});
}
setPosts(sortedPosts);
}, [followedPosts, globalPosts, props.type]); }, [followedPosts, globalPosts, props.type]);
return ( return (