import { Meta, Title } from '@solidjs/meta' import { useLocation } from '@solidjs/router' import { clsx } from 'clsx' import type { JSX } from 'solid-js' import { Show, createEffect, createMemo, createSignal } from 'solid-js' import { useLocalize } from '~/context/localize' import { Shout } from '~/graphql/schema/core.gen' import enKeywords from '~/intl/locales/en/keywords.json' import ruKeywords from '~/intl/locales/ru/keywords.json' import { getImageUrl, getOpenGraphImageUrl } from '~/lib/getImageUrl' import { descFromBody } from '~/utils/meta' import { FooterView } from '../Discours/Footer' import { Header } from '../Nav/Header' import styles from './PageLayout.module.scss' type PageLayoutProps = { title: string desc?: string headerTitle?: string slug?: string article?: Shout cover?: string children: JSX.Element isHeaderFixed?: boolean hideFooter?: boolean class?: string withPadding?: boolean zeroBottomPadding?: boolean scrollToComments?: (value: boolean) => void key?: string } export const PageLayout = (props: PageLayoutProps) => { const isHeaderFixed = props.isHeaderFixed === undefined ? true : props.isHeaderFixed // FIXME: выглядит как костылек const loc = useLocation() const { t, lang } = useLocalize() const imageUrl = props.cover ? getImageUrl(props.cover) : 'production/image/logo_image.png' const ogImage = createMemo(() => // NOTE: preview generation logic works only for one article view props.article ? getOpenGraphImageUrl(imageUrl, { title: props.title, topic: props.article?.topics?.[0]?.title || '', author: props.article?.authors?.[0]?.name || '', width: 1200 }) : imageUrl ) const description = createMemo(() => (props.desc ? t(props.desc) : '')) const keypath = createMemo(() => (props.key || loc?.pathname.split('/')[0]) as keyof typeof ruKeywords) const keywords = createMemo( () => (props.article && descFromBody(props.article.body)) || (lang() === 'ru' ? ruKeywords[keypath()] : enKeywords[keypath()]) ) const [scrollToComments, setScrollToComments] = createSignal(false) createEffect(() => props.scrollToComments?.(scrollToComments())) return ( <> {props.article?.title || t(props.title)}
setScrollToComments(value)} />
{props.children}
) }