2024-05-18 16:45:36 +00:00
|
|
|
import type { Author, Topic } from '../../graphql/schema/core.gen'
|
2023-02-17 09:21:02 +00:00
|
|
|
|
2022-11-07 21:07:42 +00:00
|
|
|
import { clsx } from 'clsx'
|
2024-02-04 11:25:21 +00:00
|
|
|
import { Show, createEffect, createSignal } from 'solid-js'
|
2023-11-14 15:10:00 +00:00
|
|
|
|
2024-01-31 12:34:15 +00:00
|
|
|
import { useFollowing } from '../../context/following'
|
2023-02-17 09:21:02 +00:00
|
|
|
import { useLocalize } from '../../context/localize'
|
2023-11-14 15:10:00 +00:00
|
|
|
import { useSession } from '../../context/session'
|
2023-11-28 13:18:25 +00:00
|
|
|
import { FollowingEntity } from '../../graphql/schema/core.gen'
|
2023-11-01 16:10:19 +00:00
|
|
|
import { Button } from '../_shared/Button'
|
2022-09-09 11:53:35 +00:00
|
|
|
|
2024-06-06 09:04:01 +00:00
|
|
|
import { FollowingCounters } from '../_shared/FollowingCounters/FollowingCounters'
|
2024-05-10 14:14:06 +00:00
|
|
|
import { Icon } from '../_shared/Icon'
|
2023-11-14 15:10:00 +00:00
|
|
|
import styles from './Full.module.scss'
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
type Props = {
|
|
|
|
topic: Topic
|
2024-05-18 16:45:36 +00:00
|
|
|
followers?: Author[]
|
2024-05-18 17:16:45 +00:00
|
|
|
authors?: Author[]
|
2022-09-09 11:53:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export const FullTopic = (props: Props) => {
|
2024-01-31 12:34:15 +00:00
|
|
|
const { t } = useLocalize()
|
2024-05-20 11:16:54 +00:00
|
|
|
const { follows, changeFollowing } = useFollowing()
|
2024-02-04 17:40:15 +00:00
|
|
|
const { requireAuthentication } = useSession()
|
2024-01-31 12:34:15 +00:00
|
|
|
const [followed, setFollowed] = createSignal()
|
|
|
|
|
|
|
|
createEffect(() => {
|
2024-05-20 11:16:54 +00:00
|
|
|
if (follows?.topics.length !== 0) {
|
|
|
|
const items = follows.topics || []
|
2024-01-31 12:34:15 +00:00
|
|
|
setFollowed(items.some((x: Topic) => x?.slug === props.topic?.slug))
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
const handleFollowClick = (_ev) => {
|
|
|
|
const really = !followed()
|
|
|
|
setFollowed(really)
|
|
|
|
requireAuthentication(() => {
|
2024-05-20 11:16:54 +00:00
|
|
|
changeFollowing(FollowingEntity.Topic, props.topic.slug, really)
|
2023-06-14 17:19:30 +00:00
|
|
|
}, 'follow')
|
|
|
|
}
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
return (
|
2023-03-10 17:42:48 +00:00
|
|
|
<div class={clsx(styles.topicHeader, 'col-md-16 col-lg-12 offset-md-4 offset-lg-6')}>
|
2023-12-27 22:50:42 +00:00
|
|
|
<h1>#{props.topic?.title}</h1>
|
2024-05-10 14:14:06 +00:00
|
|
|
<p class={styles.topicDescription} innerHTML={props.topic?.body} />
|
|
|
|
|
|
|
|
<div class={styles.topicDetails}>
|
|
|
|
<Show when={props.topic?.stat}>
|
|
|
|
<div class={styles.topicDetailsItem}>
|
|
|
|
<Icon name="feed-all" class={styles.topicDetailsIcon} />
|
|
|
|
{t('PublicationsWithCount', {
|
|
|
|
count: props.topic?.stat.shouts ?? 0,
|
|
|
|
})}
|
|
|
|
</div>
|
|
|
|
</Show>
|
|
|
|
|
2024-06-06 05:44:59 +00:00
|
|
|
<FollowingCounters
|
2024-05-18 17:16:45 +00:00
|
|
|
followers={props.followers}
|
|
|
|
followersAmount={props.topic?.stat?.followers}
|
2024-06-06 09:04:01 +00:00
|
|
|
authors={props.authors}
|
|
|
|
authorsAmount={props.topic?.stat?.authors || props.authors?.length || 0}
|
2024-05-18 17:16:45 +00:00
|
|
|
/>
|
2024-05-10 14:14:06 +00:00
|
|
|
</div>
|
|
|
|
|
2023-02-17 09:21:02 +00:00
|
|
|
<div class={clsx(styles.topicActions)}>
|
2024-01-31 12:34:15 +00:00
|
|
|
<Button
|
|
|
|
variant="primary"
|
|
|
|
onClick={handleFollowClick}
|
|
|
|
value={followed() ? t('Unfollow the topic') : t('Follow the topic')}
|
2024-05-10 14:14:06 +00:00
|
|
|
class={styles.followControl}
|
2024-01-31 12:34:15 +00:00
|
|
|
/>
|
2024-05-10 14:14:06 +00:00
|
|
|
<a class={styles.writeControl} href={`/create/?topicId=${props.topic?.id}`}>
|
2023-11-01 16:10:19 +00:00
|
|
|
{t('Write about the topic')}
|
|
|
|
</a>
|
2023-02-17 09:21:02 +00:00
|
|
|
</div>
|
2023-12-27 22:50:42 +00:00
|
|
|
<Show when={props.topic?.pic}>
|
2024-05-18 16:45:36 +00:00
|
|
|
<img src={props.topic?.pic} alt={props.topic?.title} />
|
2022-11-07 21:07:42 +00:00
|
|
|
</Show>
|
2022-09-09 11:53:35 +00:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|