import { Show, createMemo, createSignal, onMount, For } from 'solid-js' import { Comment } from './Comment' import styles from './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' 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 { session } = useSession() const { t } = useLocalize() const [commentsOrder, setCommentsOrder] = createSignal('createdAt') const [newReactions, setNewReactions] = createSignal([]) const [submitted, setSubmitted] = createSignal(false) const { reactionEntities, actions: { createReaction } } = useReactions() 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 dateFromLocalStorage = new Date(localStorage.getItem(`${props.shoutSlug}`)) const currentDate = new Date() const setCookie = () => localStorage.setItem(`${props.shoutSlug}`, `${currentDate}`) onMount(() => { if (!dateFromLocalStorage) { setCookie() } else if (currentDate > dateFromLocalStorage) { const newComments = comments().filter((c) => { if (c.replyTo || c.createdBy.slug === session()?.user.slug) { return } const created = new Date(c.createdAt) return created > dateFromLocalStorage }) setNewReactions(newComments) setCookie() } }) 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}>  +{newReactions().length}

0}>
    0}>
{t('To write a comment, you must')}{' '} {t('sign up')} {' '} {t('or')}  {t('sign in')} } > handleSubmitComment(value)} /> ) }