2024-07-13 09:36:23 +00:00
|
|
|
import { RouteSectionProps, createAsync } from '@solidjs/router'
|
2024-07-12 12:10:22 +00:00
|
|
|
import { ErrorBoundary, Suspense, createEffect, createMemo } from 'solid-js'
|
|
|
|
import { AuthorView } from '~/components/Views/Author'
|
|
|
|
import { FourOuFourView } from '~/components/Views/FourOuFour'
|
|
|
|
import { Loading } from '~/components/_shared/Loading'
|
|
|
|
import { PageLayout } from '~/components/_shared/PageLayout'
|
|
|
|
import { useAuthors } from '~/context/authors'
|
|
|
|
import { useLocalize } from '~/context/localize'
|
|
|
|
import { ReactionsProvider } from '~/context/reactions'
|
|
|
|
import { loadAuthors, loadShouts, loadTopics } from '~/graphql/api/public'
|
|
|
|
import {
|
|
|
|
Author,
|
|
|
|
LoadShoutsOptions,
|
|
|
|
QueryLoad_Authors_ByArgs,
|
|
|
|
Shout,
|
|
|
|
Topic
|
|
|
|
} from '~/graphql/schema/core.gen'
|
|
|
|
import { getImageUrl } from '~/lib/getImageUrl'
|
2024-07-13 09:06:49 +00:00
|
|
|
import { SHOUTS_PER_PAGE } from '../../(main)'
|
2024-07-12 12:10:22 +00:00
|
|
|
|
|
|
|
const fetchAuthorShouts = async (slug: string, offset?: number) => {
|
|
|
|
const opts: LoadShoutsOptions = { filters: { author: slug }, limit: SHOUTS_PER_PAGE, offset }
|
|
|
|
const shoutsLoader = loadShouts(opts)
|
|
|
|
return await shoutsLoader()
|
|
|
|
}
|
|
|
|
|
|
|
|
const fetchAllTopics = async () => {
|
|
|
|
const topicsFetcher = loadTopics()
|
|
|
|
return await topicsFetcher()
|
|
|
|
}
|
|
|
|
|
|
|
|
const fetchAuthor = async (slug: string) => {
|
2024-07-13 07:01:41 +00:00
|
|
|
const authorFetcher = loadAuthors({ by: { slug }, limit: 1, offset: 0 } as QueryLoad_Authors_ByArgs)
|
2024-07-12 12:10:22 +00:00
|
|
|
const aaa = await authorFetcher()
|
|
|
|
return aaa?.[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
export const route = {
|
|
|
|
load: async ({ params, location: { query } }: RouteSectionProps<{ articles: Shout[] }>) => {
|
|
|
|
const offset: number = Number.parseInt(query.offset, 10)
|
|
|
|
const result = await fetchAuthorShouts(params.slug, offset)
|
|
|
|
return {
|
|
|
|
author: await fetchAuthor(params.slug),
|
|
|
|
shouts: result || [],
|
|
|
|
topics: await fetchAllTopics()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-13 09:06:49 +00:00
|
|
|
export type AuthorPageProps = { articles?: Shout[]; author?: Author; topics?: Topic[] }
|
|
|
|
|
2024-07-13 09:45:10 +00:00
|
|
|
export default function AuthorPage(props: RouteSectionProps<AuthorPageProps>) {
|
2024-07-12 12:10:22 +00:00
|
|
|
const { addAuthor } = useAuthors()
|
|
|
|
const articles = createAsync(
|
2024-07-13 09:36:23 +00:00
|
|
|
async () => props.data.articles || (await fetchAuthorShouts(props.params.slug)) || []
|
2024-07-12 12:10:22 +00:00
|
|
|
)
|
|
|
|
const author = createAsync(async () => {
|
2024-07-13 09:36:23 +00:00
|
|
|
const a = props.data.author || (await fetchAuthor(props.params.slug))
|
2024-07-13 09:06:49 +00:00
|
|
|
a && addAuthor(a)
|
2024-07-12 12:10:22 +00:00
|
|
|
return a
|
|
|
|
})
|
|
|
|
const topics = createAsync(async () => props.data.topics || (await fetchAllTopics()))
|
|
|
|
const { t } = useLocalize()
|
|
|
|
const title = createMemo(() => `${author()?.name || ''}`)
|
|
|
|
|
|
|
|
createEffect(() => {
|
|
|
|
if (author()) {
|
|
|
|
console.debug('[routes] author/[slug] author loaded fx')
|
|
|
|
window?.gtag?.('event', 'page_view', {
|
|
|
|
page_title: author()?.name || '',
|
|
|
|
page_location: window?.location.href || '',
|
|
|
|
page_path: window?.location.pathname || ''
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
const cover = createMemo(() =>
|
|
|
|
author()?.pic
|
|
|
|
? getImageUrl(author()?.pic || '', { width: 1200 })
|
|
|
|
: getImageUrl('production/image/logo_image.png')
|
|
|
|
)
|
2024-07-13 07:01:41 +00:00
|
|
|
|
2024-07-13 09:36:23 +00:00
|
|
|
const selectedTab = createMemo(() =>
|
|
|
|
props.params.tab in ['followers', 'shouts'] ? props.params.tab : 'name'
|
|
|
|
)
|
2024-07-12 12:10:22 +00:00
|
|
|
return (
|
|
|
|
<ErrorBoundary fallback={(_err) => <FourOuFourView />}>
|
|
|
|
<Suspense fallback={<Loading />}>
|
|
|
|
<PageLayout
|
|
|
|
title={`${t('Discours')} :: ${title()}`}
|
|
|
|
headerTitle={author()?.name || ''}
|
|
|
|
slug={author()?.slug}
|
|
|
|
desc={author()?.about || author()?.bio || ''}
|
|
|
|
cover={cover()}
|
|
|
|
>
|
|
|
|
<ReactionsProvider>
|
|
|
|
<AuthorView
|
|
|
|
author={author() as Author}
|
2024-07-13 07:01:41 +00:00
|
|
|
selectedTab={selectedTab()}
|
2024-07-13 09:36:23 +00:00
|
|
|
authorSlug={props.params.slug}
|
2024-07-12 12:10:22 +00:00
|
|
|
shouts={articles() as Shout[]}
|
|
|
|
topics={topics()}
|
|
|
|
/>
|
|
|
|
</ReactionsProvider>
|
|
|
|
</PageLayout>
|
|
|
|
</Suspense>
|
|
|
|
</ErrorBoundary>
|
|
|
|
)
|
|
|
|
}
|