import { Show, createMemo, createSignal, onMount, For } from 'solid-js' import { Comment } from './Comment' import styles from '../../styles/Article.module.scss' import { clsx } from 'clsx' import { Author, Reaction, ReactionKind } from '../../graphql/types.gen' import { useSession } from '../../context/session' import CommentEditor from '../_shared/CommentEditor' import { Button } from '../_shared/Button' import { useReactions } from '../../context/reactions' import { byCreated } from '../../utils/sortby' import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated' import { useLocalize } from '../../context/localize' import Cookie from 'js-cookie' type CommentsOrder = 'createdAt' | 'rating' | 'newOnly' const sortCommentsByRating = (a: Reaction, b: Reaction): -1 | 0 | 1 => { if (a.replyTo && b.replyTo) { return 0 } const x = (a?.stat && a.stat.rating) || 0 const y = (b?.stat && b.stat.rating) || 0 if (x > y) { return 1 } if (x < y) { return -1 } return 0 } type Props = { commentAuthors: Author[] shoutSlug: string shoutId: number } export const CommentsTree = (props: Props) => { const [commentsOrder, setCommentsOrder] = createSignal('createdAt') const { reactionEntities, actions: { createReaction } } = useReactions() const { t } = useLocalize() const [newReactionsCount, setNewReactionsCount] = createSignal(0) const [newReactions, setNewReactions] = createSignal([]) const comments = createMemo(() => Object.values(reactionEntities).filter((reaction) => reaction.kind === 'COMMENT') ) const sortedComments = createMemo(() => { let newSortedComments = [...comments()] newSortedComments = newSortedComments.sort(byCreated) if (commentsOrder() === 'newOnly') { return newReactions().reverse() } if (commentsOrder() === 'rating') { newSortedComments = newSortedComments.sort(sortCommentsByRating) } newSortedComments.reverse() return newSortedComments }) const updateNewReactionsCount = () => { const dateFromCookie = new Date(Cookie.get(`${props.shoutSlug}`)).valueOf() const setCookie = () => Cookie.set(`${props.shoutSlug}`, `${Date.now()}`) if (!dateFromCookie) { setCookie() } else if (Date.now() > dateFromCookie) { const newComments = comments().filter((c) => { if (c.replyTo) { return } const commentDate = new Date(c.createdAt).valueOf() return commentDate > dateFromCookie }) setNewReactions(newComments) setNewReactionsCount(newComments.length) setCookie() } } const { session } = useSession() onMount(async () => { updateNewReactionsCount() }) const [submitted, setSubmitted] = createSignal(false) const handleSubmitComment = async (value) => { try { await createReaction({ kind: ReactionKind.Comment, body: value, shout: props.shoutId }) setSubmitted(true) } catch (error) { console.error('[handleCreate reaction]:', error) } } return ( <>

{t('Comments')} {comments().length.toString() || ''} 0}>  +{newReactionsCount()}

    0}>
    !r.replyTo)}> {(reaction) => ( a.slug === session()?.user.slug))} comment={reaction} /> )}
{t('To write a comment, you must')}  {t('sign up')}  {t('or')}  {t('sign in')} } > handleSubmitComment(value)} /> ) }