2022-09-09 11:53:35 +00:00
|
|
|
|
import { capitalize, plural } from '../../utils'
|
2022-10-14 18:33:06 +00:00
|
|
|
|
import style from './Card.module.scss'
|
2022-10-31 16:40:55 +00:00
|
|
|
|
import { createMemo, Show } from 'solid-js'
|
2022-09-09 11:53:35 +00:00
|
|
|
|
import type { Topic } from '../../graphql/types.gen'
|
2022-09-13 09:59:04 +00:00
|
|
|
|
import { FollowingEntity } from '../../graphql/types.gen'
|
2022-09-09 11:53:35 +00:00
|
|
|
|
import { t } from '../../utils/intl'
|
2022-09-23 23:42:19 +00:00
|
|
|
|
import { locale } from '../../stores/ui'
|
2022-09-30 14:22:33 +00:00
|
|
|
|
import { useAuthStore } from '../../stores/auth'
|
2022-09-13 09:59:04 +00:00
|
|
|
|
import { follow, unfollow } from '../../stores/zine/common'
|
2022-09-30 14:22:33 +00:00
|
|
|
|
import { getLogger } from '../../utils/logger'
|
|
|
|
|
|
|
|
|
|
const log = getLogger('TopicCard')
|
2022-09-09 11:53:35 +00:00
|
|
|
|
|
|
|
|
|
interface TopicProps {
|
|
|
|
|
topic: Topic
|
|
|
|
|
compact?: boolean
|
|
|
|
|
subscribed?: boolean
|
|
|
|
|
shortDescription?: boolean
|
|
|
|
|
subscribeButtonBottom?: boolean
|
2022-10-14 18:33:06 +00:00
|
|
|
|
additionalClass?: string
|
|
|
|
|
isTopicInRow?: boolean
|
|
|
|
|
iconButton?: boolean
|
2022-09-09 11:53:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const TopicCard = (props: TopicProps) => {
|
2022-09-30 14:22:33 +00:00
|
|
|
|
const { session } = useAuthStore()
|
|
|
|
|
|
2022-09-13 09:59:04 +00:00
|
|
|
|
const subscribed = createMemo(() => {
|
2022-10-04 12:16:07 +00:00
|
|
|
|
if (!session()?.user?.slug || !session()?.news?.topics) {
|
2022-09-30 14:22:33 +00:00
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-04 12:16:07 +00:00
|
|
|
|
return session()?.news.topics.includes(props.topic.slug)
|
2022-09-13 09:59:04 +00:00
|
|
|
|
})
|
2022-09-09 11:53:35 +00:00
|
|
|
|
|
|
|
|
|
// FIXME use store actions
|
2022-09-13 09:59:04 +00:00
|
|
|
|
const subscribe = async (really = true) => {
|
|
|
|
|
if (really) {
|
2022-09-30 14:22:33 +00:00
|
|
|
|
follow({ what: FollowingEntity.Topic, slug: props.topic.slug })
|
2022-09-13 09:59:04 +00:00
|
|
|
|
} else {
|
2022-09-30 14:22:33 +00:00
|
|
|
|
unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug })
|
2022-09-13 09:59:04 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-09-09 11:53:35 +00:00
|
|
|
|
return (
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<div
|
|
|
|
|
class={style.topic}
|
|
|
|
|
classList={{
|
|
|
|
|
row: !props.compact && !props.subscribeButtonBottom,
|
|
|
|
|
[style.topicInRow]: props.isTopicInRow
|
|
|
|
|
}}
|
|
|
|
|
>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
<div classList={{ 'col-md-7': !props.compact && !props.subscribeButtonBottom }}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<Show when={props.topic.title}>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<div class={style.topicTitle}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<a href={`/topic/${props.topic.slug}`}>{capitalize(props.topic.title || '')}</a>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<Show when={props.topic.pic}>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<div class={style.topicAvatar}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<a href={props.topic.slug}>
|
|
|
|
|
<img src={props.topic.pic} alt={props.topic.title} />
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</a>
|
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
|
|
|
|
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<Show when={!props.compact && props.topic?.body}>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<div
|
|
|
|
|
class={style.topicDescription}
|
|
|
|
|
classList={{ 'topic-description--short': props.shortDescription }}
|
|
|
|
|
>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
{props.topic.body}
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
|
|
|
|
|
2022-09-30 14:22:33 +00:00
|
|
|
|
<Show when={props.topic?.stat}>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<div class={style.topicDetails}>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
<Show when={!props.compact}>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<span class={style.topicDetailsTtem} classList={{ compact: props.compact }}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
{props.topic.stat?.shouts +
|
2022-09-09 11:53:35 +00:00
|
|
|
|
' ' +
|
|
|
|
|
t('post') +
|
2022-09-30 14:22:33 +00:00
|
|
|
|
plural(
|
|
|
|
|
props.topic.stat?.shouts || 0,
|
|
|
|
|
locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's']
|
|
|
|
|
)}
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</span>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<span class={style.topicDetailsTtem} classList={{ compact: props.compact }}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
{props.topic.stat?.authors +
|
2022-09-09 11:53:35 +00:00
|
|
|
|
' ' +
|
|
|
|
|
t('author') +
|
2022-09-30 14:22:33 +00:00
|
|
|
|
plural(
|
|
|
|
|
props.topic.stat?.authors || 0,
|
|
|
|
|
locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's']
|
|
|
|
|
)}
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</span>
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<span class={style.topicDetailsItem} classList={{ compact: props.compact }}>
|
2022-09-30 14:22:33 +00:00
|
|
|
|
{props.topic.stat?.followers +
|
2022-09-20 08:26:12 +00:00
|
|
|
|
' ' +
|
|
|
|
|
t('follower') +
|
|
|
|
|
plural(
|
2022-09-30 14:22:33 +00:00
|
|
|
|
props.topic.stat?.followers || 0,
|
2022-09-20 08:26:12 +00:00
|
|
|
|
locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's']
|
|
|
|
|
)}
|
|
|
|
|
</span>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
{/*FIXME*/}
|
|
|
|
|
{/*<Show when={false && !props.subscribeButtonBottom}>*/}
|
|
|
|
|
{/* <span class='topic-details__item'>*/}
|
|
|
|
|
{/* {topic().stat?.viewed +*/}
|
|
|
|
|
{/* ' ' +*/}
|
|
|
|
|
{/* t('view') +*/}
|
|
|
|
|
{/* plural(*/}
|
|
|
|
|
{/* topic().stat?.viewed || 0,*/}
|
|
|
|
|
{/* locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's']*/}
|
|
|
|
|
{/* )}*/}
|
|
|
|
|
{/* </span>*/}
|
|
|
|
|
{/*</Show>*/}
|
|
|
|
|
</Show>
|
|
|
|
|
|
|
|
|
|
{/*
|
|
|
|
|
<span class='topic-details__item'>
|
|
|
|
|
{subscribers().toString() + ' ' + t('follower') + plural(
|
|
|
|
|
subscribers(),
|
|
|
|
|
locale() === 'ru' ? ['ов', '', 'а'] : ['s', '', 's']
|
|
|
|
|
)}
|
|
|
|
|
</span>
|
|
|
|
|
*/}
|
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
|
|
|
|
<div classList={{ 'col-md-3': !props.compact && !props.subscribeButtonBottom }}>
|
2022-09-13 09:59:04 +00:00
|
|
|
|
<Show
|
|
|
|
|
when={subscribed()}
|
|
|
|
|
fallback={
|
|
|
|
|
<button onClick={() => subscribe(true)} class="button--light">
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<Show when={props.iconButton}>{/*<Icon name={}/>*/}</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={!props.iconButton}>+ {t('Follow')}</Show>
|
2022-09-13 09:59:04 +00:00
|
|
|
|
</button>
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<button onClick={() => subscribe(false)} class="button--light">
|
2022-10-14 18:33:06 +00:00
|
|
|
|
<Show when={props.iconButton}>{/*<Icon name={}/>*/}</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={!props.iconButton}>- {t('Unfollow')}</Show>
|
2022-09-13 09:59:04 +00:00
|
|
|
|
</button>
|
|
|
|
|
</Show>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|