webapp/src/components/Topic/Full.tsx

60 lines
1.8 KiB
TypeScript
Raw Normal View History

2023-11-28 13:18:25 +00:00
import type { 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'
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'
import { useSession } from '../../context/session'
2023-11-28 13:18:25 +00:00
import { FollowingEntity } from '../../graphql/schema/core.gen'
import { Button } from '../_shared/Button'
2022-09-09 11:53:35 +00:00
import styles from './Full.module.scss'
2022-09-09 11:53:35 +00:00
type Props = {
topic: Topic
}
export const FullTopic = (props: Props) => {
2024-01-31 12:34:15 +00:00
const { t } = useLocalize()
const { subscriptions, setFollowing } = 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(() => {
const subs = subscriptions
if (subs?.topics.length !== 0) {
const items = subs.topics || []
setFollowed(items.some((x: Topic) => x?.slug === props.topic?.slug))
}
})
const handleFollowClick = (_ev) => {
const really = !followed()
setFollowed(really)
requireAuthentication(() => {
setFollowing(FollowingEntity.Topic, props.topic.slug, really)
}, '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>
<p innerHTML={props.topic?.body} />
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')}
/>
2023-12-27 22:50:42 +00:00
<a class={styles.write} href={`/create/?topicId=${props.topic?.id}`}>
{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}>
<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>
)
}