diff --git a/src/components/App.tsx b/src/components/App.tsx index 6cbfdb64..9fe54ab2 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -84,8 +84,11 @@ const pagesMap: Record> = { fourOuFour: FourOuFourPage, } -export const App = (props: PageProps) => { +type Props = PageProps & { is404: boolean } + +export const App = (props: Props) => { const { page, searchParams } = useRouter() + let is404 = props.is404 createEffect(() => { if (!searchParams().modal) { @@ -101,7 +104,8 @@ export const App = (props: PageProps) => { const pageComponent = createMemo(() => { const result = pagesMap[page()?.route || 'home'] - if (!result || page()?.path === '/404') { + if (is404 || !result || page()?.path === '/404') { + is404 = false return FourOuFourPage } diff --git a/src/pages/article.page.server.ts b/src/pages/article.page.server.ts index b23803ff..16bfd545 100644 --- a/src/pages/article.page.server.ts +++ b/src/pages/article.page.server.ts @@ -10,7 +10,7 @@ export const onBeforeRender = async (pageContext: PageContext) => { const article = await apiClient.getShoutBySlug(slug) if (!article) { - throw render(404, '/404') + throw render(404) } const pageProps: PageProps = { article, seo: { title: article.title } } diff --git a/src/pages/author.page.server.ts b/src/pages/author.page.server.ts index 512243d7..4f057595 100644 --- a/src/pages/author.page.server.ts +++ b/src/pages/author.page.server.ts @@ -1,17 +1,24 @@ import type { PageProps } from './types' import type { PageContext } from '../renderer/types' +import { render } from 'vike/abort' + import { PRERENDERED_ARTICLES_COUNT } from '../components/Views/Author' import { apiClient } from '../utils/apiClient' export const onBeforeRender = async (pageContext: PageContext) => { const { slug } = pageContext.routeParams + const author = await apiClient.getAuthor({ slug }) + + if (!author) { + throw render(404) + } + const authorShouts = await apiClient.getShouts({ filters: { author: slug, visibility: 'community' }, limit: PRERENDERED_ARTICLES_COUNT, }) - const author = await apiClient.getAuthor({ slug }) const pageProps: PageProps = { author, authorShouts, seo: { title: author.name } } diff --git a/src/pages/topic.page.server.ts b/src/pages/topic.page.server.ts index 3f48dfdb..30cb8bae 100644 --- a/src/pages/topic.page.server.ts +++ b/src/pages/topic.page.server.ts @@ -1,6 +1,8 @@ import type { PageProps } from './types' import type { PageContext } from '../renderer/types' +import { render } from 'vike/abort' + import { apiClient } from '../utils/apiClient' export const onBeforeRender = async (pageContext: PageContext) => { @@ -8,6 +10,10 @@ export const onBeforeRender = async (pageContext: PageContext) => { const topic = await apiClient.getTopic({ slug }) + if (!topic) { + throw render(404) + } + const pageProps: PageProps = { topic, seo: { title: topic.title } } return { diff --git a/src/renderer/_default.page.client.tsx b/src/renderer/_default.page.client.tsx index 338f3ccd..108ccbad 100644 --- a/src/renderer/_default.page.client.tsx +++ b/src/renderer/_default.page.client.tsx @@ -17,13 +17,9 @@ let layoutReady = false export const render = async (pageContext: PageContextBuiltInClientWithClientRouting & PageContext) => { const { lng, pageProps, is404 } = pageContext - if (is404) { - initRouter('/404') - } else { - const { pathname, search } = window.location - const searchParams = Object.fromEntries(new URLSearchParams(search)) - initRouter(pathname, searchParams) - } + const { pathname, search } = window.location + const searchParams = Object.fromEntries(new URLSearchParams(search)) + initRouter(pathname, searchParams) if (SENTRY_DSN) { Sentry.init({ @@ -53,7 +49,7 @@ export const render = async (pageContext: PageContextBuiltInClientWithClientRout const content = document.querySelector('#root') if (!layoutReady) { - hydrate(() => , content) + hydrate(() => , content) layoutReady = true } } diff --git a/src/renderer/_default.page.server.tsx b/src/renderer/_default.page.server.tsx index 8abbfc2c..3de8329b 100644 --- a/src/renderer/_default.page.server.tsx +++ b/src/renderer/_default.page.server.tsx @@ -48,15 +48,11 @@ export const render = async (pageContext: PageContext) => { await i18next.changeLanguage(lng) } - if (pageContext.is404) { - initRouter('/404') - } else { - initRouter(pageContext.urlParsed.pathname, pageContext.urlParsed.search) - } + initRouter(pageContext.urlParsed.pathname, pageContext.urlParsed.search) pageContext.lng = lng - const rootContent = renderToString(() => ) + const rootContent = renderToString(() => ) return escapeInject`