import { Show, createMemo, createSignal, Switch, onMount, For, Match, createEffect } from 'solid-js' import type { Author, Shout, Topic } from '../../../graphql/types.gen' import { Row1 } from '../../Feed/Row1' import { Row2 } from '../../Feed/Row2' import { Row3 } from '../../Feed/Row3' import { useAuthorsStore } from '../../../stores/zine/authors' import { loadShouts, useArticlesStore } from '../../../stores/zine/articles' import { useRouter } from '../../../stores/router' import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll' import { splitToPages } from '../../../utils/splitToPages' import styles from './Author.module.scss' import stylesArticle from '../../Article/Article.module.scss' import { clsx } from 'clsx' import { AuthorCard } from '../../Author/AuthorCard' import { apiClient } from '../../../utils/apiClient' import { Comment } from '../../Article/Comment' import { useLocalize } from '../../../context/localize' import { AuthorRatingControl } from '../../Author/AuthorRatingControl' import { hideModal } from '../../../stores/ui' type Props = { shouts: Shout[] author: Author authorSlug: string } export type AuthorPageSearchParams = { by: '' | 'viewed' | 'rating' | 'commented' | 'recent' | 'about' | 'popular' } export const PRERENDERED_ARTICLES_COUNT = 12 const LOAD_MORE_PAGE_SIZE = 9 export const AuthorView = (props: Props) => { const { t } = useLocalize() const { sortedArticles } = useArticlesStore({ shouts: props.shouts }) const { searchParams, changeSearchParam } = useRouter() const { authorEntities } = useAuthorsStore({ authors: [props.author] }) const author = createMemo(() => authorEntities()[props.authorSlug]) const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) const [isBioExpanded, setIsBioExpanded] = createSignal(false) const [followers, setFollowers] = createSignal([]) const [subscriptions, setSubscriptions] = createSignal>([]) const [bioWrapper, setBioWrapper] = createSignal() const [showExpandBioControl, setShowExpandBioControl] = createSignal(false) const bioContainerRef: { current: HTMLDivElement } = { current: null } const fetchSubscriptions = async (): Promise<{ authors: Author[]; topics: Topic[] }> => { try { const [getAuthors, getTopics] = await Promise.all([ apiClient.getAuthorFollowingUsers({ slug: props.authorSlug }), apiClient.getAuthorFollowingTopics({ slug: props.authorSlug }) ]) const authors = getAuthors const topics = getTopics return { authors, topics } } catch (error) { console.error('[fetchSubscriptions] :', error) throw error } } const checkBioHeight = () => { if (bioContainerRef.current) { setShowExpandBioControl(bioContainerRef.current.offsetHeight > bioWrapper().offsetHeight) } } onMount(async () => { hideModal() try { const userSubscribers = await apiClient.getAuthorFollowers({ slug: props.authorSlug }) setFollowers(userSubscribers) } catch (error) { console.error('[getAuthorFollowers]', error) } checkBioHeight() if (!searchParams().by) { changeSearchParam('by', 'rating') } if (sortedArticles().length === PRERENDERED_ARTICLES_COUNT) { await loadMore() } const { authors, topics } = await fetchSubscriptions() setSubscriptions([...authors, ...topics]) }) const loadMore = async () => { saveScrollPosition() const { hasMore } = await loadShouts({ filters: { author: props.authorSlug }, limit: LOAD_MORE_PAGE_SIZE, offset: sortedArticles().length }) setIsLoadMoreButtonVisible(hasMore) restoreScrollPosition() } // TODO: use title // const title = createMemo(() => { // const m = searchParams().by // if (m === 'viewed') return t('Top viewed') // if (m === 'rating') return t('Top rated') // if (m === 'commented') return t('Top discussed') // return t('Top recent') // }) const pages = createMemo(() => splitToPages(sortedArticles(), PRERENDERED_ARTICLES_COUNT, LOAD_MORE_PAGE_SIZE) ) const [commented, setCommented] = createSignal([]) createEffect(async () => { if (searchParams().by === 'commented') { try { const data = await apiClient.getReactionsBy({ by: { comment: true, createdBy: props.authorSlug } }) setCommented(data) } catch (error) { console.error('[getReactionsBy comment]', error) } } }) return (
{t('Karma')}
(bioContainerRef.current = el)} innerHTML={author().about} />
    {(comment) => }
3}> {(page) => ( <> )}

) }