diff --git a/epoch_backend/persistence/epoch/epoch_post_persistence.py b/epoch_backend/persistence/epoch/epoch_post_persistence.py index 9241064..3f687cb 100644 --- a/epoch_backend/persistence/epoch/epoch_post_persistence.py +++ b/epoch_backend/persistence/epoch/epoch_post_persistence.py @@ -111,12 +111,11 @@ def get_all_user_posts(self, user_id: int): def get_all_hashtag_posts(self, hashtag: str): connection = get_db_connection() cursor = connection.cursor() - hashtag_pattern = f"%{hashtag}%" - cursor.execute("SELECT * FROM posts WHERE caption LIKE %s", (hashtag_pattern,)) + hashtag_pattern = f"% {hashtag} %" + cursor.execute("SELECT * FROM posts WHERE CONCAT(' ', caption, ' ') LIKE %s", (hashtag_pattern,)) posts = cursor.fetchall() posts_media = get_posts_media(posts) posts_users_info = get_posts_users_info(posts) - all_posts = [] for i in range(len(posts)): diff --git a/epoch_frontend/src/modules/Post.js b/epoch_frontend/src/modules/Post.js index ce708bf..43be498 100644 --- a/epoch_frontend/src/modules/Post.js +++ b/epoch_frontend/src/modules/Post.js @@ -13,6 +13,7 @@ import ArrowCircleDownSharpIcon from '@mui/icons-material/ArrowCircleDownSharp'; import {favoritePost, removeFavoritePost, votePost, removeVotePost} from "../services/post"; import ForumOutlinedIcon from '@mui/icons-material/ForumOutlined'; import PopupUserList from "./PopupUserList"; +import {animated, useSpring} from "react-spring"; export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isInFavorites}) { @@ -52,7 +53,18 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI const [voteByUsernameList, setVoteByUsernameList] = useState((post && post.votes_by_usernames) ? post.votes_by_usernames : []); const [showFavoritedByList, setShowFavoritedByList] = useState(false); const [showVoteByList, setShowVoteByList] = useState(false); - + const [showDeletePostPopup, setShowDeletePostPopup] = useState(false); + const [deletePostError, setDeletePostError] = useState(false); + const [deletePostErrorPrompt, setDeletePostErrorPrompt] = useState(''); + const {transform: inTransformDelete} = useSpring({ + transform: `translateY(${showDeletePostPopup ? 0 : 100}vh)`, + config: {duration: 300}, + }); + + const {transform: outTransformDelete} = useSpring({ + transform: `translateY(${showDeletePostPopup ? 0 : -100}vh)`, + config: {duration: 300}, + }); useEffect(() => { let postTime = new Date(post.created_at) @@ -86,7 +98,6 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI setEditing(false); } }, [showPostPopup]); - const handleProfilePhotoClick = (imageUrl) => { setOverlayImageUrl(imageUrl); setShowOverlay(true); @@ -190,24 +201,27 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI } const onDeletePost = (postId, userId) => { - setError(true); - setErrorMessage('Deleting post...'); + + setDeletePostError(true); + setDeletePostErrorPrompt('Deleting post...'); + deletePost(postId, userId) .then(() => { - setError(false); - setErrorMessage(''); + setDeletePostError(false); + setDeletePostErrorPrompt(''); + setShowDeletePostPopup(false); setPostAdmin(false); - setError(false); - setErrorMessage(''); setDeleted(true); setRefreshFeed(true); }) .catch((error) => { - setError(true); - setErrorMessage(error); + setShowDeletePostPopup(true); + setDeletePostError(true); + setDeletePostErrorPrompt(error); + setTimeout(() => { - setError(false); - setErrorMessage(''); + setDeletePostError(false); + setDeletePostErrorPrompt(''); }, 5000); }); } @@ -225,8 +239,6 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI setShowPostPopup(true); } - - const getReleaseFormat = () => { let date = new Date(post.release); date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); @@ -248,11 +260,11 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI const diff = date - now; const diffInSeconds = Math.floor(diff / 1000); if (diffInSeconds < 60) { - return "In " + Math.floor(diffInSeconds) + " seconds"; + return "In " + Math.floor(diffInSeconds) + (Math.floor(diffInSeconds) > 1 ? " seconds" : " second"); } if (diffInSeconds < 3600) { - return "In " + Math.floor(diffInSeconds / 60) + " minutes"; + return "In " + Math.floor(diffInSeconds / 60) + (Math.floor(diffInSeconds / 60) > 1 ? " minutes" : " minute"); } if (diffInSeconds < 86400) { @@ -267,7 +279,7 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI } if (diffInSeconds < 3600) { - return Math.floor(diffInSeconds / 60) + " minutes ago"; + return Math.floor(diffInSeconds / 60) + (Math.floor(diffInSeconds / 60) > 1 ? " minutes ago" : " minute ago"); } if (diffInSeconds < 86400) { @@ -518,7 +530,6 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI }, [post.votes, postViewer]); - useEffect(() => { if (favorited) { @@ -553,6 +564,7 @@ export default function Post({post, postViewer, refreshFeed, setRefreshFeed, isI } }, [vote, voteByUsernameList, postViewer, post, voteResult]); + return (
- {(showFullCaption && post.caption) ? renderCaptionWithHashtags(post.caption) : (
- <>
- {renderCaptionWithHashtags(truncatedCaption)}
-
+
+ {(showFullCaption && post.caption) ? renderCaptionWithHashtags(post.caption) : (
+ <>
+ {renderCaptionWithHashtags(truncatedCaption)}
+
See more
- >
- )}
- {(showFullCaption && post.caption && post.caption.length >= captionCharLimit) && (
- <>
- {' '}
-
+ >
+ )}
+ {(showFullCaption && post.caption && post.caption.length >= captionCharLimit) && (
+ <>
+ {' '}
+
See less
- >
- )}
-
{deletePostErrorPrompt}
} + +