import React, { useState } from 'react'; import { Text, Pressable, FlatList, StyleSheet, View, Share, Alert, Linking } from 'react-native'; import Hyperlink from 'react-native-hyperlink' import { Button, Card, Chip } from 'react-native-paper'; import API from './../API.js'; import UserName from './UserName.js'; import Media from './Media.js'; import Comment from "./Comment"; import NewComment from './NewComment.js'; import Moment from 'moment'; import { useSnapshot } from 'valtio'; import GlobalState from '../contexts/GlobalState.js'; import i18n from "../i18nMessages.js"; import ProfilePhotoCircle from './ProfilePhotoCircle.js'; import { posthog } from './../PostHog.js'; import { useNavigation } from '@react-navigation/native'; import ParsedText from 'react-native-parsed-text'; let Post = (props) => { const gState = useSnapshot(GlobalState); const viewer = gState.me; let [showCommentsB, changeshowCommentsB] = useState(props.showComments || false); let [post, changePost] = useState(props.post); let [likes, changeLikes] = useState(Object.keys(post.reactions).length); let [bookmarked, changeBookmarked] = useState(post.bookmarks && post.bookmarks.includes(viewer._id)); let toProfileText = post.toProfile && post.toProfile !== post.profileid ? : undefined; let cleanContent = post.content.replace(/@[A-z]+:.+\w/g, '').trim(); const navigation = useNavigation(); //cleanContent = convertLinks(cleanContent); const newComentAdded = (commentData) => { let newPostObj = { ...post }; newPostObj.comments.push(commentData); changePost(newPostObj); }; const newPostReaction = () => { let newPostObj = { ...post }; if (!newPostObj.reactions[viewer._id]) { changeLikes(likes + 1); newPostObj.reactions[viewer._id] = { type: "like" }; API.newPostReaction(post._id); posthog.capture( 'post_clicked', { post_id: post._id, } ); } else { changeLikes(likes - 1); delete newPostObj.reactions[viewer._id]; API.removePostReaction(viewer._id); } changePost(newPostObj); } const newPostBookmark = () => { if (!post.bookmarks || !post.bookmarks.includes(viewer._id)) { changeBookmarked(true); if (!post.bookmarks) post.bookmarks = []; post.bookmarks.push(viewer._id); API.newPostBookmark(post._id); } else { changeBookmarked(false); post.bookmarks = post.bookmarks.filter(id => id != viewer._id); API.removePostBookmark(post._id) } } const renderComment = ({ item }) => ( ); const handleTagPress = (tag) => { // Alert.alert("tag pressed", `You pressed the tag: ${tag}`); // You can navigate to another screen or perform any other action here //remove hastag from tag tag = tag.replace("#", ""); navigation.navigate("Tags", { tag: tag }); }; const handleLinkPress = (url) => { Linking.canOpenURL(url) .then((supported) => { if (supported) { Linking.openURL(url); } else { Alert.alert('Error', 'Unable to open the link.'); } }) .catch((err) => console.error('An error occurred', err)); }; const handleLinkLongPress = (url) => { Share.share({ url: url }); }; return ( {!post.nonOrganicType ? {toProfileText} { if (cleanContent.length > 10) { Share.share({ message: cleanContent }); } }}> {cleanContent} : {i18n.t("message.news")} {cleanContent} } {" " + Moment(post.createdAt).fromNow()} {showCommentsB && } { showCommentsB && item.createdAt} /> } ); } export default React.memo(Post); const styles = StyleSheet.create({ userName: { fontSize: 14, fontWeight: 'bold', marginBottom: 5, fontSize: 17, }, card: { margin: 0, backgroundColor: "#FAFAFA", borderRadius: 0, marginBottom: 2, padding: 0 }, comment: { margin: 8, marginTop: 0, padding: 8 }, text: { fontSize: 16, padding: 3, paddingLeft: 40 }, tag: { color: '#77B5FE', textDecorationLine: 'underline', }, link: { color: '#77B5FE', textDecorationLine: 'underline', }, });