import { capitalize, formatDate } from '../../utils' import './Full.scss' import { Icon } from '../_shared/Icon' import { AuthorCard } from '../Author/Card' import { createEffect, createMemo, createSignal, For, Match, onMount, Show, Switch } from 'solid-js' import type { Author, Reaction, Shout } from '../../graphql/types.gen' import { ReactionKind } from '../../graphql/types.gen' import MD from './MD' import { SharePopup } from './SharePopup' import { getDescription } from '../../utils/meta' import stylesHeader from '../Nav/Header.module.scss' import styles from '../../styles/Article.module.scss' import { RatingControl } from './RatingControl' import { clsx } from 'clsx' import { CommentsTree } from './CommentsTree' import { useSession } from '../../context/session' import VideoPlayer from './VideoPlayer' import Slider from '../_shared/Slider' import { getPagePath } from '@nanostores/router' import { router } from '../../stores/router' import { useReactions } from '../../context/reactions' import { loadShout } from '../../stores/zine/articles' import { Title } from '@solidjs/meta' import { useLocalize } from '../../context/localize' import { checkReaction } from '../../utils/checkReaction' interface ArticleProps { article: Shout } interface MediaItem { url?: string pic?: string title?: string body?: string } const MediaView = (props: { media: MediaItem; kind: Shout['layout'] }) => { const { t } = useLocalize() return ( <> {t('Cannot show this media type')}}>
{props.media.title}

) } export const FullArticle = (props: ArticleProps) => { const { t } = useLocalize() const { userSlug, session } = useSession() const [isReactionsLoaded, setIsReactionsLoaded] = createSignal(false) const formattedDate = createMemo(() => formatDate(new Date(props.article.createdAt))) const mainTopic = createMemo( () => props.article.topics?.find((topic) => topic?.slug === props.article.mainTopic) || props.article.topics[0] ) onMount(() => { const windowHash = window.location.hash if (windowHash?.length > 0) { const comments = document.querySelector(windowHash) if (comments) { window.scrollTo({ top: comments.getBoundingClientRect().top, behavior: 'smooth' }) } } }) onMount(async () => { await loadReactionsBy({ by: { shout: props.article.slug } }) setIsReactionsLoaded(true) }) const canEdit = () => props.article.authors?.some((a) => a.slug === session()?.user?.slug) const bookmark = (ev) => { // TODO: implement bookmark clicked ev.preventDefault() } const body = createMemo(() => props.article.body) const media = createMemo(() => { const mi = JSON.parse(props.article.media || '[]') console.debug(mi) return mi }) const { reactionEntities, actions: { loadReactionsBy, createReaction, deleteReaction } } = useReactions() const updateReactions = () => { loadReactionsBy({ by: { shout: props.article.slug } }) } const isUpvoted = createMemo(() => checkReaction(Object.values(reactionEntities), ReactionKind.Like, userSlug(), props.article.id) ) const isDownvoted = createMemo(() => checkReaction(Object.values(reactionEntities), ReactionKind.Dislike, userSlug(), props.article.id) ) const handleRatingChange = async (isUpvote: boolean) => { const reactionKind = isUpvote ? ReactionKind.Like : ReactionKind.Dislike const isReacted = (isUpvote && isUpvoted()) || (!isUpvote && isDownvoted()) if (isReacted) { const reactionToDelete = Object.values(reactionEntities).find( (r) => r.kind === reactionKind && r.createdBy.slug === userSlug() && r.shout.id === props.article.id && !r.replyTo ) await deleteReaction(reactionToDelete.id) } else { await createReaction({ kind: reactionKind, shout: props.article.id }) } loadShout(props.article.slug) updateReactions() } createEffect(() => { console.log('reactions', reactionEntities) }) return ( <> {props.article.title}

{props.article.title}

{capitalize(props.article.subtitle, false)}

{(a: Author, index) => ( <> 0}>, {a.name} )}
{(m: MediaItem) => (
)}
}>
{(m: MediaItem) => (
{m.title}
)}
handleRatingChange(true)} onDownvote={() => handleRatingChange(false)} isUpvoted={isUpvoted()} isDownvoted={isDownvoted()} />
{props.article.stat?.viewed}
{props.article.stat?.commented || ''}
} />
{formattedDate()}
{(topic) => ( )}
1}>

{t('Authors')}

{(a) => (
)}
) }