import React, {useEffect, useRef, useState} from 'react'; import { Keyboard, KeyboardAvoidingView, Platform, StyleSheet, TextInput, View, } from 'react-native'; import {MentionInput} from 'react-native-controlled-mentions'; import {TouchableOpacity} from 'react-native-gesture-handler'; import {useDispatch, useSelector} from 'react-redux'; import UpArrowIcon from '../../assets/icons/up_arrow.svg'; import {TAGG_LIGHT_BLUE} from '../../constants'; import {postComment} from '../../services'; import {updateReplyPosted} from '../../store/actions'; import {RootState} from '../../store/rootreducer'; import {CommentType} from '../../types'; import {SCREEN_HEIGHT, SCREEN_WIDTH} from '../../utils'; import {Avatar} from '../common'; import {mentionPartTypes} from '../../utils/comments'; /** * This file provides the add comment view for a user. * Displays the logged in user's profile picture to the left and then provides space to add a comment. * Comment is posted when enter is pressed as requested by product team. */ export interface AddCommentProps { setNewCommentsAvailable: Function; // we either have a comment object if we're replying to a comment, // or a momentId if we're just commenting a moment. commentInReplyTo: CommentType | undefined; momentId: string | undefined; isReplying: boolean; placeholderText: string; } const AddComment: React.FC = ({ setNewCommentsAvailable, commentInReplyTo, momentId, placeholderText, isReplying, }) => { const [comment, setComment] = useState(''); const [keyboardVisible, setKeyboardVisible] = useState(false); const {avatar} = useSelector((state: RootState) => state.user); const dispatch = useDispatch(); const ref = useRef(null); const objectId: string = isReplying ? commentInReplyTo!.comment_id : momentId!; const addComment = async () => { const trimmed = comment.trim(); if (trimmed === '') { return; } const postedComment = await postComment(trimmed, objectId, isReplying); if (postedComment) { setComment(''); //Set new reply posted object //This helps us show the latest reply on top //Data set is kind of stale but it works if (isReplying) { dispatch( updateReplyPosted({ comment_id: postedComment.comment_id, parent_comment: {comment_id: objectId}, }), ); } setNewCommentsAvailable(true); } }; useEffect(() => { if (isReplying && commentInReplyTo) { const commenter = commentInReplyTo.commenter; setComment(`@[${commenter.username}](${commenter.id}) `); } }, [isReplying, commentInReplyTo]); useEffect(() => { const showKeyboard = () => setKeyboardVisible(true); Keyboard.addListener('keyboardWillShow', showKeyboard); return () => Keyboard.removeListener('keyboardWillShow', showKeyboard); }, []); useEffect(() => { const hideKeyboard = () => setKeyboardVisible(false); Keyboard.addListener('keyboardWillHide', hideKeyboard); return () => Keyboard.removeListener('keyboardWillHide', hideKeyboard); }, []); //If a comment is in Focus, bring the keyboard up so user is able to type in a reply useEffect(() => { if (isReplying) { ref.current?.focus(); } }, [isReplying]); return ( ); }; const styles = StyleSheet.create({ container: { backgroundColor: '#f7f7f7', alignItems: 'center', width: SCREEN_WIDTH, }, textContainer: { width: '95%', flexDirection: 'row', backgroundColor: '#e8e8e8', alignItems: 'center', justifyContent: 'space-between', margin: '3%', borderRadius: 25, }, text: { flex: 1, padding: '1%', marginHorizontal: '1%', maxHeight: 100, }, avatar: { height: 35, width: 35, borderRadius: 30, marginRight: 10, marginLeft: '3%', marginVertical: '2%', alignSelf: 'flex-end', }, submitButton: { height: 35, width: 35, backgroundColor: TAGG_LIGHT_BLUE, borderRadius: 999, justifyContent: 'center', alignItems: 'center', marginRight: '3%', marginVertical: '2%', alignSelf: 'flex-end', }, whiteBackround: { backgroundColor: '#fff', }, }); export default AddComment;