import React, { createElement, FC, Fragment, memo, useCallback, useMemo, useState } from 'react'; import { IComment, IFile } from '~/redux/types'; import { append, assocPath, path } from 'ramda'; import { formatCommentText, getPrettyDate, getURL } from '~/utils/dom'; import { Group } from '~/components/containers/Group'; import styles from './styles.module.scss'; import { UploadType } from '~/constants/uploads'; import reduce from 'ramda/es/reduce'; import { AudioPlayer } from '~/components/media/AudioPlayer'; import classnames from 'classnames'; import classNames from 'classnames'; import { PRESETS } from '~/constants/urls'; import { COMMENT_BLOCK_RENDERERS } from '~/constants/comment'; import { CommentMenu } from '../CommentMenu'; import { CommentForm } from '~/components/comment/CommentForm'; interface IProps { nodeId: number; comment: IComment; canEdit: boolean; saveComment: (data: IComment) => Promise; onDelete: (id: IComment['id'], isLocked: boolean) => void; onShowImageModal: (images: IFile[], index: number) => void; } const CommentContent: FC = memo( ({ comment, canEdit, nodeId, saveComment, onDelete, onShowImageModal }) => { const [isEditing, setIsEditing] = useState(false); const startEditing = useCallback(() => setIsEditing(true), [setIsEditing]); const stopEditing = useCallback(() => setIsEditing(false), [setIsEditing]); const groupped = useMemo>( () => reduce( (group, file) => file.type ? assocPath([file.type], append(file, group[file.type]), group) : group, {} as Record, comment.files ), [comment] ); const onLockClick = useCallback(() => { onDelete(comment.id, !comment.deleted_at); }, [comment, onDelete]); const menu = useMemo( () => canEdit && , [canEdit, startEditing, onLockClick] ); const blocks = useMemo( () => !!comment.text.trim() ? formatCommentText(path(['user', 'username'], comment), comment.text) : [], [comment] ); if (isEditing) { return ( ); } return (
{comment.text && ( {menu} {blocks.map( (block, key) => COMMENT_BLOCK_RENDERERS[block.type] && createElement(COMMENT_BLOCK_RENDERERS[block.type], { block, key }) )}
{getPrettyDate(comment.created_at)}
)} {groupped.image && groupped.image.length > 0 && (
{menu}
1, })} > {groupped.image.map((file, index) => (
onShowImageModal(groupped.image, index)}> {file.name}
))}
{getPrettyDate(comment.created_at)}
)} {groupped.audio && groupped.audio.length > 0 && ( {groupped.audio.map(file => (
{menu}
{getPrettyDate(comment.created_at)}
))}
)}
); } ); export { CommentContent };