webapp/src/components/Topic/TopicBadge/TopicBadge.tsx

108 lines
3.3 KiB
TypeScript
Raw Normal View History

import { clsx } from 'clsx'
import { createMemo, createSignal, Show } from 'solid-js'
import { useLocalize } from '../../../context/localize'
import { useSession } from '../../../context/session'
2023-11-28 13:18:25 +00:00
import { FollowingEntity, Topic } from '../../../graphql/schema/core.gen'
import { follow, unfollow } from '../../../stores/zine/common'
import { getImageUrl } from '../../../utils/getImageUrl'
import { Button } from '../../_shared/Button'
import { CheckButton } from '../../_shared/CheckButton'
import styles from './TopicBadge.module.scss'
2023-12-08 11:49:50 +00:00
import { capitalize } from '../../../utils/capitalize'
type Props = {
topic: Topic
minimizeSubscribeButton?: boolean
}
export const TopicBadge = (props: Props) => {
const [isSubscribing, setIsSubscribing] = createSignal(false)
2023-12-08 11:49:50 +00:00
const { t, lang } = useLocalize()
const {
isAuthenticated,
subscriptions,
actions: { loadSubscriptions },
} = useSession()
const subscribed = createMemo(() =>
subscriptions().topics.some((topic) => topic.slug === props.topic.slug),
)
const subscribe = async (really = true) => {
setIsSubscribing(true)
await (really
? follow({ what: FollowingEntity.Topic, slug: props.topic.slug })
: unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug }))
await loadSubscriptions()
setIsSubscribing(false)
}
return (
<div class={styles.TopicBadge}>
<a
href={`/topic/${props.topic.slug}`}
class={clsx(styles.picture, { [styles.withImage]: props.topic.pic })}
style={
props.topic.pic && {
'background-image': `url('${getImageUrl(props.topic.pic, { width: 40, height: 40 })}')`,
}
}
/>
<a href={`/topic/${props.topic.slug}`} class={styles.info}>
2023-12-08 11:49:50 +00:00
<span class={styles.title}>
{lang() == 'en' ? capitalize(props.topic.slug.replace(/-/, ' ')) : props.topic.title}
</span>
<Show
when={props.topic.body}
fallback={
<div class={styles.description}>
{t('PublicationsWithCount', { count: props.topic.stat.shouts ?? 0 })}
</div>
}
>
<div class={clsx('text-truncate', styles.description)}>{props.topic.body}</div>
</Show>
</a>
<Show when={isAuthenticated()}>
<div class={styles.actions}>
<Show
when={!props.minimizeSubscribeButton}
fallback={
<CheckButton
text={t('Follow')}
checked={subscribed()}
onClick={() => subscribe(!subscribed)}
/>
}
>
<Show
when={subscribed()}
fallback={
<Button
variant="primary"
size="S"
2023-11-02 22:02:11 +00:00
value={isSubscribing() ? t('subscribing...') : t('Subscribe')}
onClick={() => subscribe(true)}
2023-10-09 21:22:06 +00:00
class={styles.subscribeButton}
/>
}
>
<Button
onClick={() => subscribe(false)}
2023-10-09 21:22:06 +00:00
variant="bordered"
size="S"
2023-10-16 09:54:14 +00:00
value={t('Following')}
2023-10-09 21:22:06 +00:00
class={styles.subscribeButton}
/>
</Show>
</Show>
</div>
</Show>
</div>
)
}