Files
mifi-links/src/routes/+layout.server.ts
2026-02-06 19:09:48 -03:00

75 lines
2.7 KiB
TypeScript

import contentData from '$lib/data/links.json';
import { VARIANT_HOSTS, GA_MEASUREMENT_IDS, THEME_COLORS } from '$lib/config';
import type { Site, ContentData, ProcessedLink } from '$lib/data/types';
import type { LayoutServerLoad } from './$types';
import { ContentVariant, HeroLayout } from '$lib/data/constants';
import { getProcessedLinks } from '$lib/utils/getProcessedLinks';
export type LayoutServerDataOut = {
site: Site;
contactLinks?: ProcessedLink[];
links: {
sections: {
id: string;
title: string;
order: number;
links: ProcessedLink[];
}[];
};
variant: string;
gaMeasurementId: string;
/** theme-color meta values for current variant */
themeColorLight: string;
themeColorDark: string;
};
export const load: LayoutServerLoad<LayoutServerDataOut> = (): LayoutServerDataOut => {
const variant =
process.env.CONTENT_VARIANT === ContentVariant.BIO
? ContentVariant.BIO
: ContentVariant.DEV;
const sourceHost = VARIANT_HOSTS[variant];
const siteUrl = 'https://' + sourceHost;
const data = contentData as ContentData;
const contactLinks = getProcessedLinks(data.contactLinks, variant);
const sections = data.sections
.map((section) => {
const links: ProcessedLink[] = getProcessedLinks(section.links, variant);
return {
id: section.id,
title: section.title,
links,
order: section.order[variant] ?? null,
};
})
.filter(
(s) => s.links.length > 0 && s.order !== null,
) as LayoutServerDataOut['links']['sections'];
const siteDef = data.siteByVariant[variant];
const site: LayoutServerDataOut['site'] = {
title: siteDef?.title ?? (variant === ContentVariant.DEV ? 'mifi.dev' : 'mifi.bio'),
metaDescription: siteDef?.metaDescription ?? '',
url: siteUrl,
heroLayout: siteDef?.heroLayout ?? HeroLayout.SIDE_BY_SIDE,
profileImage: siteDef?.profileImage,
pronunciation: siteDef?.pronunciation,
pronouns: siteDef?.pronouns,
location: siteDef?.location,
person: siteDef?.person,
linksHeading: siteDef?.linksHeading,
showContact: siteDef?.showContact,
contactLinks: siteDef?.contactLinks,
qrCodeImage: siteDef?.qrCodeImage ?? undefined,
};
const themeColors = THEME_COLORS[variant];
return {
site,
contactLinks,
links: { sections },
variant,
gaMeasurementId: GA_MEASUREMENT_IDS[variant],
themeColorLight: themeColors.light,
themeColorDark: themeColors.dark,
};
};