import type { Author } from '../../../graphql/types.gen' import { openPage, redirectPage } from '@nanostores/router' import { clsx } from 'clsx' import { createEffect, createMemo, createSignal, For, Show } from 'solid-js' import { useLocalize } from '../../../context/localize' import { useSession } from '../../../context/session' import { FollowingEntity, Topic } from '../../../graphql/types.gen' import { SubscriptionFilter } from '../../../pages/types' import { router, useRouter } from '../../../stores/router' import { follow, unfollow } from '../../../stores/zine/common' import { isAuthor } from '../../../utils/isAuthor' import { translit } from '../../../utils/ru2en' import { Button } from '../../_shared/Button' import { ShowOnlyOnClient } from '../../_shared/ShowOnlyOnClient' import { getShareUrl, SharePopup } from '../../Article/SharePopup' import { Modal } from '../../Nav/Modal' import { TopicBadge } from '../../Topic/TopicBadge' import { AuthorBadge } from '../AuthorBadge' import { Userpic } from '../Userpic' import styles from './AuthorCard.module.scss' import stylesButton from '../../_shared/Button/Button.module.scss' type Props = { author: Author followers?: Author[] following?: Array } export const AuthorCard = (props: Props) => { const { t, lang } = useLocalize() const { session, subscriptions, isSessionLoaded, actions: { loadSubscriptions, requireAuthentication }, } = useSession() const [isSubscribing, setIsSubscribing] = createSignal(false) const [following, setFollowing] = createSignal>(props.following) const [subscriptionFilter, setSubscriptionFilter] = createSignal('all') const subscribed = createMemo(() => subscriptions().authors.some((author) => author.slug === props.author.slug), ) const subscribe = async (really = true) => { setIsSubscribing(true) await (really ? follow({ what: FollowingEntity.Author, slug: props.author.slug }) : unfollow({ what: FollowingEntity.Author, slug: props.author.slug })) await loadSubscriptions() setIsSubscribing(false) } const isProfileOwner = createMemo(() => session()?.user?.slug === props.author.slug) const name = createMemo(() => { if (lang() !== 'ru') { if (props.author.name === 'Дискурс') { return 'Discours' } return translit(props.author.name) } return props.author.name }) // TODO: reimplement AuthorCard const { changeSearchParam } = useRouter() const initChat = () => { requireAuthentication(() => { openPage(router, `inbox`) changeSearchParam({ initChat: props.author.id.toString(), }) }, 'discussions') } const handleSubscribe = () => { requireAuthentication(() => { subscribe(!subscribed()) }, 'subscribe') } createEffect(() => { if (props.following) { if (subscriptionFilter() === 'users') { setFollowing(props.following.filter((s) => 'name' in s)) } else if (subscriptionFilter() === 'topics') { setFollowing(props.following.filter((s) => 'title' in s)) } else { setFollowing(props.following) } } }) const followButtonText = createMemo(() => { if (isSubscribing()) { return t('subscribing...') } if (subscribed()) { return ( <> {t('Following')} {t('Unfollow')} ) } return t('Follow') }) return (
} >
<>

{t('Followers')}

{(follower: Author) => }
<>

{t('Subscriptions')}

  • {props.following.length}
  • {props.following.filter((s) => 'name' in s).length}
  • {props.following.filter((s) => 'title' in s).length}

{(subscription) => isAuthor(subscription) ? ( ) : ( ) }
) }