diff --git a/components/Comment.js b/components/Comment.js index 5b0fe4e..b24293f 100644 --- a/components/Comment.js +++ b/components/Comment.js @@ -4,6 +4,7 @@ import { FAB, Button, Card, Title, IconButton } from 'react-native-paper'; import API from './../API.js'; import UserName from './UserName.js'; import Media from './Media.js'; +import BibleEmbeddedView from './BibleEmbeddedView.js'; import { useSnapshot } from 'valtio'; import GlobalState from '../contexts/GlobalState.js'; import Moment from 'moment'; @@ -16,7 +17,7 @@ let Comment = ({ comment, postid }) => { const gState = useSnapshot(GlobalState); const viewer = gState.me; let [likes, changeLikes] = useState(Object.keys(comment.reactions).length); - let cleanContent = comment.content.replace(/@[A-z]+:.+\w/g, ''); + let cleanContent = String(comment.content || ''); const newCommentReaction = () => { if (!comment.reactions[viewer._id]) { comment.reactions[viewer._id] = { type: "like" }; @@ -54,6 +55,7 @@ let Comment = ({ comment, postid }) => { {cleanContent} + diff --git a/components/NewComment.js b/components/NewComment.js index 1200683..24b8843 100644 --- a/components/NewComment.js +++ b/components/NewComment.js @@ -1,49 +1,108 @@ -import React, { useState } from 'react'; -import { View, StyleSheet, Icon } from 'react-native'; -import { TextInput, Button } from 'react-native-paper'; +import React, { useEffect, useState } from 'react'; +import { View, StyleSheet, Pressable } from 'react-native'; +import { TextInput, Chip } from 'react-native-paper'; +import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import API from './../API.js'; -import { useNavigation } from '@react-navigation/native'; -import AwesomeIcon from 'react-native-vector-icons/FontAwesome'; import i18n from "../i18nMessages.js"; +import { useNavigation } from '@react-navigation/native'; +import { useSnapshot } from 'valtio'; +import GlobalState from '../contexts/GlobalState.js'; +import { createBibleToken } from '../utils/bibleReferences.js'; +const CircleIconAction = ({ icon, onPress, color = "#6b7280", disabled = false }) => ( + ({ + width: 36, + height: 36, + borderRadius: 18, + alignItems: "center", + justifyContent: "center", + backgroundColor: disabled ? "#f3f4f6" : (pressed ? "#e5e7eb" : "#f9fafb"), + marginHorizontal: 2, + transform: [{ scale: pressed ? 0.96 : 1 }], + })} + > + + +); let NewComment = ({ postid, newComentAdded }) => { - let [commentContent, setCommentContent] = useState(''); + const gState = useSnapshot(GlobalState); + const [commentContent, setCommentContent] = useState(''); + const [bibleReferences, setBibleReferences] = useState([]); const navigation = useNavigation(); + const biblePickerSelectionTs = gState?.biblePickerSelection?.ts; + const hasContent = commentContent.trim().length > 0; + + useEffect(() => { + const selection = gState?.biblePickerSelection; + if (!selection || selection.target !== "comment" || !selection.reference) return; + setBibleReferences((prev) => { + if (prev.includes(selection.reference)) return prev; + return prev.concat(selection.reference); + }); + GlobalState.biblePickerSelection = null; + }, [biblePickerSelectionTs, gState?.biblePickerSelection]); + + const handleSubmit = () => { + if (!hasContent && bibleReferences.length === 0) return; + const trimmedComment = commentContent.trim(); + const bibleTokens = bibleReferences.map((reference) => createBibleToken(reference)).filter(Boolean); + setCommentContent(''); + setBibleReferences([]); + API.newPostComment(postid, [trimmedComment, bibleTokens.join(" ")].join(" ").trim()).then((newPost) => { + if (newComentAdded) newComentAdded(newPost); + }); + }; return ( - - - - + + + navigation.navigate("BiblePicker", { target: "comment" })} + color="#6b7280" + /> + + + + + {bibleReferences.length ? ( + + {bibleReferences.map((reference) => ( + navigation.navigate("BibleChapter", { reference })} + onClose={() => { + setBibleReferences((prev) => prev.filter((item) => item !== reference)); + }} + > + {reference} + + ))} + + ) : null} ); } @@ -51,9 +110,44 @@ let NewComment = ({ postid, newComentAdded }) => { export default NewComment; const styles = StyleSheet.create({ - NewComment: { - margin: 10, + newComment: { + marginHorizontal: 10, + marginTop: 10, + marginBottom: 6, + }, + composerShell: { + borderWidth: 1, + borderColor: "#e5e7eb", + borderRadius: 28, + backgroundColor: "#ffffff", + paddingHorizontal: 4, + paddingVertical: 2, flexDirection: "row", - flex: 6 - } + alignItems: "flex-end", + shadowColor: "#111827", + shadowOpacity: 0.08, + shadowRadius: 10, + shadowOffset: { width: 0, height: 3 }, + elevation: 2, + }, + inputWrap: { + flex: 1, + paddingRight: 2, + }, + input: { + backgroundColor: "transparent", + maxHeight: 120, + }, + inputContent: { + paddingVertical: 10, + }, + referencesWrap: { + flexDirection: "row", + flexWrap: "wrap", + marginTop: 8, + }, + referenceChip: { + marginRight: 6, + marginBottom: 6, + }, });