187 lines
7.3 KiB
Plaintext
187 lines
7.3 KiB
Plaintext
---
|
|
import Layout from "../layouts/Layout.astro";
|
|
import { getBrandsByLangSlug, getLocaleField, getPagesByLangSlug, getProductCategoriesByLangSlug, getSite, getSlugByLangSlug, getSiteConfig, getSiteHomePage, getPagesByIds, getMarketplacesByLangSlug, getProductsByLangSlug, getSellersByLangSlug, getRedirectsByPreviousSlug } from "../data/api-client";
|
|
import { genericPageForBrand, genericPageForMarketplace, genericPageForProduct, genericPageForProductCategory, genericPageForSeller } from "../lib/page-from-models";
|
|
import { SupportedLocales } from "../data/internals/LocalizedT";
|
|
import { SCHEMAS } from "../data/models/schemas";
|
|
import type { Brand } from "../data/models/multis/Brand";
|
|
import type { Page } from "../data/models/multis/Page";
|
|
import type { ProductCategory } from "../data/models/multis/ProductCategory";
|
|
import type { Site } from "../data/models/singles/Site";
|
|
import type { Slug } from "../data/models/multis/Slug";
|
|
import type { SiteConfig } from "../data/models/singles/SiteConfig";
|
|
import { pick as pickLanguage } from "../lib/accept-language-parser";
|
|
import { localeUrlTestPatterns, overrideLocaleFromUrl, localeFromLang } from "../lib/locales";
|
|
import Banner from "../components/Banner.astro";
|
|
import ComponentRouter from "../components/ComponentRouter.astro";
|
|
import { renderMarkdown } from "../lib/rendering";
|
|
import Disclaimers from "../components/Disclaimers.astro";
|
|
import { client, TIMEOUT_IN_SECONDS } from "../data/core/client";
|
|
|
|
const { routeLookup, resource, id } = Astro.params;
|
|
|
|
const isSiteHomepage = (url?: string) => !url || url === '/';
|
|
const isLocaleHomepage = (url: string) => {
|
|
for (let t = 0; t < localeUrlTestPatterns.length; t++) {
|
|
if (url === localeUrlTestPatterns[t] || url === `${localeUrlTestPatterns[t]}/`) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
const locale = overrideLocaleFromUrl(routeLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en'));
|
|
|
|
const siteConfigDto = await getSiteConfig();
|
|
const siteConfig = siteConfigDto.items[0].data!;
|
|
|
|
const siteDto = await getSite();
|
|
const site = siteDto.items[0].data!;
|
|
const siteEditToken = siteDto.items[0].editToken;
|
|
|
|
let isHomePage: boolean = false;
|
|
let homePageDto = await getSiteHomePage(site);
|
|
let homePage: Page = homePageDto.items[0].data!;
|
|
let homePageId = homePageDto.items[0].id;
|
|
let pageDto;
|
|
let page: Page;
|
|
let brandDto;
|
|
let productCategory;
|
|
let brand: Brand|undefined;
|
|
let pageEditToken: string;
|
|
|
|
if (isSiteHomepage(routeLookup)) {
|
|
Astro.response.headers.set('Vary', 'Accept-Language');
|
|
return Astro.redirect(`${locale}/`, 303);
|
|
}
|
|
|
|
Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8');
|
|
|
|
const redirect404NotFound = () => { return Astro.rewrite(`${locale}/404/`); }
|
|
|
|
if (isLocaleHomepage(routeLookup!)) {
|
|
isHomePage = true;
|
|
pageDto = homePageDto;
|
|
page = homePage;
|
|
pageEditToken = homePageDto.items[0].editToken!;
|
|
}
|
|
else {
|
|
const slugDto = await getSlugByLangSlug(locale, routeLookup!);
|
|
if (slugDto && slugDto.items && slugDto.items.length > 0) {
|
|
let objectId = (slugDto.items[0].data as unknown as any as Slug).reference.iv[0]
|
|
switch (slugDto.items[0].data?.referenceSchema.iv) {
|
|
case SCHEMAS.BRANDS:
|
|
return Astro.rewrite(`/view/brands/${locale}/${objectId}`);
|
|
case SCHEMAS.MARKETPLACES:
|
|
return Astro.rewrite(`/view/marketplaces/${locale}/${objectId}`);
|
|
case SCHEMAS.PAGES:
|
|
return Astro.rewrite(`/view/pages/${locale}/${objectId}`);
|
|
case SCHEMAS.PRODUCT_CATEGORIES:
|
|
return Astro.rewrite(`/view/product-categories/${locale}/${objectId}`);
|
|
case SCHEMAS.PRODUCTS:
|
|
return Astro.rewrite(`/view/products/${locale}/${objectId}`);
|
|
case SCHEMAS.SELLERS:
|
|
return Astro.rewrite(`/view/sellers/${locale}/${objectId}`);
|
|
}
|
|
}
|
|
console.log("routeLookup:", routeLookup!);
|
|
const redirectDto = await getRedirectsByPreviousSlug(routeLookup!);
|
|
console.log("redirectDto:", redirectDto);
|
|
if (redirectDto && redirectDto.items && redirectDto.items.length > 0) {
|
|
console.log("getting redirectReferencesDto for", SCHEMAS.REDIRECTS, redirectDto.items[0].id);
|
|
//next line crashes:
|
|
let redirectReferencesDto = await client.contents.getReferences({ schema: SCHEMAS.REDIRECTS, id: redirectDto.items[0].id });
|
|
console.log("redirectReferencesDto:", redirectReferencesDto);
|
|
// client.contents.getConten
|
|
// switch (redirectDto.items[0].data?.referenceSchema.iv) {
|
|
// case SCHEMAS.BRANDS:
|
|
// return Astro.rewrite(`/view/brands/${locale}/${objectId}`);
|
|
// case SCHEMAS.MARKETPLACES:
|
|
// return Astro.rewrite(`/view/marketplaces/${locale}/${objectId}`);
|
|
// case SCHEMAS.PAGES:
|
|
// return Astro.rewrite(`/view/pages/${locale}/${objectId}`);
|
|
// case SCHEMAS.PRODUCT_CATEGORIES:
|
|
// return Astro.rewrite(`/view/product-categories/${locale}/${objectId}`);
|
|
// case SCHEMAS.PRODUCTS:
|
|
// return Astro.rewrite(`/view/products/${locale}/${objectId}`);
|
|
// case SCHEMAS.SELLERS:
|
|
// return Astro.rewrite(`/view/sellers/${locale}/${objectId}`);
|
|
// }
|
|
// Astro.response.headers.set('Vary', 'Accept-Language');
|
|
// return Astro.redirect(,303)
|
|
}
|
|
return redirect404NotFound();
|
|
}
|
|
|
|
if (!page) {
|
|
//this code can never be reached, but if it can be reached then the compiler
|
|
//will let me know all return branches for setting page weren't handled
|
|
//so leave it here:
|
|
return redirect404NotFound();
|
|
}
|
|
|
|
const title = getLocaleField(locale, page?.title)||'';
|
|
const metaDescription = getLocaleField(locale, page?.seo)?.metaDescription || '';
|
|
const siteName = getLocaleField(locale, site.siteName);
|
|
const pageContent = getLocaleField(locale, page?.content)!;
|
|
const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development';
|
|
const renderContext = {
|
|
...Astro.params,
|
|
title,
|
|
metaDescription,
|
|
siteName,
|
|
pageComponents: pageContent,
|
|
page,
|
|
site,
|
|
isHomePage,
|
|
isLocaleHomepage: isLocaleHomepage(routeLookup!),
|
|
shouldEmbedSquidexSDK,
|
|
}
|
|
---
|
|
<Layout locale={locale} title={title} site={site} siteConfig={siteConfig} siteEditToken={siteDto.items[0].editToken!} page={page} shouldEmbedSquidexSDK={shouldEmbedSquidexSDK}>
|
|
<slot slot="head">
|
|
{ metaDescription && <meta name="description" content={metaDescription} /> }
|
|
{
|
|
Object.entries(SupportedLocales).map((supportedLanguage) => {
|
|
return (
|
|
<link
|
|
rel="alternate"
|
|
href={`/${supportedLanguage[0]}/${isHomePage ? '' : page?.slug[supportedLanguage[0]]}`}
|
|
hreflang={supportedLanguage[0].substring(0, locale.indexOf('-'))}
|
|
type="text/html"
|
|
title={page?.title[supportedLanguage[0]]}
|
|
/>
|
|
);
|
|
})
|
|
}
|
|
<style>
|
|
main {
|
|
margin: auto;
|
|
min-width: 800px;
|
|
max-width: calc(100% - 2rem);
|
|
color: white;
|
|
font-size: 16pt;
|
|
line-height: 1.6;
|
|
}
|
|
a, a:link, a:visited { text-decoration: none; color: #fff }
|
|
a:hover { text-decoration: underline; color: #fff }
|
|
</style>
|
|
<slot name="head" />
|
|
</slot>
|
|
<main>
|
|
<Banner editToken={siteDto.items[0].editToken} homePageLink={`/${locale}/`} siteName={site.siteName[locale]} />
|
|
<ComponentRouter
|
|
componentRouter={getLocaleField(locale, page.content)||[]}
|
|
homePage={homePage}
|
|
isHomePage={isHomePage}
|
|
locale={locale}
|
|
page={page}
|
|
pageEditToken={pageEditToken}
|
|
brand={brand||undefined}
|
|
site={site}
|
|
siteEditToken={siteEditToken!}
|
|
/>
|
|
</main>
|
|
<slot name="disclaimers" slot="disclaimers">
|
|
<Disclaimers locale={locale} />
|
|
</slot>
|
|
</Layout> |