webapp/src/components/Topic/Full.tsx

64 lines
1.9 KiB
TypeScript
Raw Normal View History

2022-09-09 11:53:35 +00:00
import type { Topic } from '../../graphql/types.gen'
2023-02-17 09:21:02 +00:00
2022-11-07 21:07:42 +00:00
import { clsx } from 'clsx'
import { createMemo, Show } from 'solid-js'
2023-02-17 09:21:02 +00:00
import { useLocalize } from '../../context/localize'
import { useSession } from '../../context/session'
import { FollowingEntity } from '../../graphql/types.gen'
import { follow, unfollow } from '../../stores/zine/common'
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) => {
const {
subscriptions,
actions: { requireAuthentication, loadSubscriptions },
} = useSession()
2023-02-17 09:21:02 +00:00
const { t } = useLocalize()
const subscribed = createMemo(() =>
subscriptions().topics.some((topic) => topic.slug === props.topic?.slug),
)
const handleSubscribe = (really: boolean) => {
requireAuthentication(async () => {
await (really
? follow({ what: FollowingEntity.Topic, slug: props.topic.slug })
: unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug }))
loadSubscriptions()
}, '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-02-17 09:21:02 +00:00
<h1>#{props.topic.title}</h1>
<p>{props.topic.body}</p>
<div class={clsx(styles.topicActions)}>
<Show when={!subscribed()}>
<Button variant="primary" onClick={() => handleSubscribe(true)} value={t('Follow the topic')} />
2023-02-17 09:21:02 +00:00
</Show>
<Show when={subscribed()}>
<Button
variant="primary"
onClick={() => handleSubscribe(false)}
value={t('Unfollow the topic')}
/>
2023-02-17 09:21:02 +00:00
</Show>
<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>
<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>
)
}