From 59823dc04b577e68ab9cf2590516f5c673aa75c4 Mon Sep 17 00:00:00 2001 From: rasm-its Date: Wed, 26 Aug 2026 14:14:19 +0200 Subject: [PATCH] feat: update ipal-kit, integrate Media/SiteSettings and configure PL/DE languages --- .gitignore | 2 + package.json | 2 +- pnpm-lock.yaml | 11 +- public/images/favicon-poi.svg | 27 ++++ public/images/logo-poi.svg | 33 ++++ public/images/logo-white-poi.svg | 33 ++++ .../(frontend)/[locale]/[[...slug]]/page.tsx | 28 +++- src/app/(frontend)/[locale]/layout.tsx | 48 +++++- src/blocks/Hero/Component.tsx | 22 +-- src/blocks/ProcessSteps/Component.tsx | 6 +- src/blocks/TechEquipment/Component.tsx | 6 +- src/components/Footer.tsx | 10 +- src/components/Header.tsx | 20 ++- src/components/Logo.tsx | 35 +++- src/i18n.config.ts | 3 +- src/lib/payload.ts | 4 +- src/seed/index.ts | 150 +++++++++++++----- 17 files changed, 363 insertions(+), 77 deletions(-) create mode 100644 public/images/favicon-poi.svg create mode 100644 public/images/logo-poi.svg create mode 100644 public/images/logo-white-poi.svg diff --git a/.gitignore b/.gitignore index 690729b..b0fd4b2 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ dev.db* # media uploads in local dev if any /public/media +/media + diff --git a/package.json b/package.json index 295f9f2..27213d5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "license": "ISC", "packageManager": "pnpm@10.34.3", "dependencies": { - "@intecion/ipal-kit": "^1.0.17", + "@intecion/ipal-kit": "^1.0.18", "@payloadcms/db-postgres": "^3.88.0", "@payloadcms/db-sqlite": "^3.88.0", "@payloadcms/next": "^3.88.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7451fe2..617671b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,8 +19,8 @@ importers: .: dependencies: '@intecion/ipal-kit': - specifier: ^1.0.17 - version: 1.0.17(e4f897fbda4e3a120e33294a7b805575) + specifier: ^1.0.18 + version: 1.0.18(e4f897fbda4e3a120e33294a7b805575) '@payloadcms/db-postgres': specifier: 3.88.0 version: 3.88.0(@libsql/client@0.14.0)(payload@3.88.0(graphql@16.14.2)(typescript@7.0.2)) @@ -946,9 +946,8 @@ packages: cpu: [x64] os: [win32] - '@intecion/ipal-kit@1.0.17': - resolution: {integrity: sha512-huzjbq4ntCFiTk4eYnGHmMADdKN5rzwBfYqmjuHE+tcxGqqrT8ffvzR3f2O0GiqMvJyMHd6Jw0qbu9a7J2tyzQ==, tarball: https://git.intecion.net/api/packages/IntecionSoftware/npm/%40intecion%2Fipal-kit/-/1.0.17/ipal-kit-1.0.17.tgz} - engines: {node: ^18.20.2 || >=20.9.0, pnpm: ^9 || ^10 || ^11} + '@intecion/ipal-kit@1.0.18': + resolution: {integrity: sha512-NTQEoWFuGcDBRPlnk1iEeVa75BvNkLmtXChLQE9B3epZ0vcrbTrFQgbXjkhgyc5LFFahZTQ/fEYLPOB/9ZDiuA==, tarball: https://git.intecion.net/api/packages/IntecionSoftware/npm/%40intecion%2Fipal-kit/-/1.0.18/ipal-kit-1.0.18.tgz} peerDependencies: '@payloadcms/next': 3.88.0 '@payloadcms/plugin-form-builder': 3.88.0 @@ -3635,7 +3634,7 @@ snapshots: '@img/sharp-win32-x64@0.35.3': optional: true - '@intecion/ipal-kit@1.0.17(e4f897fbda4e3a120e33294a7b805575)': + '@intecion/ipal-kit@1.0.18(e4f897fbda4e3a120e33294a7b805575)': dependencies: '@payloadcms/next': 3.88.0(@types/react@19.2.18)(graphql@16.14.2)(monaco-editor@0.56.0)(next@16.3.3(@types/node@26.3.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@7.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@payloadcms/plugin-form-builder': 3.88.0(@types/react@19.2.18)(monaco-editor@0.56.0)(next@16.3.3(@types/node@26.3.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@7.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) diff --git a/public/images/favicon-poi.svg b/public/images/favicon-poi.svg new file mode 100644 index 0000000..1ebcbff --- /dev/null +++ b/public/images/favicon-poi.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/logo-poi.svg b/public/images/logo-poi.svg new file mode 100644 index 0000000..b4ee499 --- /dev/null +++ b/public/images/logo-poi.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + POI + + + CLEAN HOUSE + diff --git a/public/images/logo-white-poi.svg b/public/images/logo-white-poi.svg new file mode 100644 index 0000000..90f234f --- /dev/null +++ b/public/images/logo-white-poi.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + POI + + + CLEAN HOUSE + diff --git a/src/app/(frontend)/[locale]/[[...slug]]/page.tsx b/src/app/(frontend)/[locale]/[[...slug]]/page.tsx index a5bc1e5..453ef47 100644 --- a/src/app/(frontend)/[locale]/[[...slug]]/page.tsx +++ b/src/app/(frontend)/[locale]/[[...slug]]/page.tsx @@ -5,6 +5,8 @@ import { createPageMetadata } from '@intecion/ipal-kit' import { i18nConfig } from '@/i18n.config' import { blockRegistry } from '@/blocks/registry' import { getCachedPayload, resolveRoute } from '@/lib/content' +import { getSettings } from '@/lib/payload' +import type { Media } from '@/payload-types' interface PageProps { params: Promise<{ @@ -23,7 +25,31 @@ const pageMetadata = createPageMetadata({ export async function generateMetadata({ params }: PageProps): Promise { const { locale, slug } = await params - return pageMetadata({ payload: await getCachedPayload(), locale, slug: slug ?? [] }) + const payload = await getCachedPayload() + const pageMeta = await pageMetadata({ payload, locale, slug: slug ?? [] }) + + if (!pageMeta.openGraph?.images || pageMeta.openGraph.images.length === 0) { + const settings = await getSettings(locale) + const shareImage = + (typeof settings?.defaultShareImage === 'object' && settings?.defaultShareImage && 'url' in settings.defaultShareImage + ? (settings.defaultShareImage as Media) + : null) || + (typeof settings?.logo === 'object' && settings?.logo && 'url' in settings.logo + ? (settings.logo as Media) + : null) + + if (shareImage?.url) { + return { + ...pageMeta, + openGraph: { + ...pageMeta.openGraph, + images: [{ url: shareImage.url }], + }, + } + } + } + + return pageMeta } export default async function Page({ params, searchParams }: PageProps) { diff --git a/src/app/(frontend)/[locale]/layout.tsx b/src/app/(frontend)/[locale]/layout.tsx index 67802cc..b0e0228 100644 --- a/src/app/(frontend)/[locale]/layout.tsx +++ b/src/app/(frontend)/[locale]/layout.tsx @@ -1,5 +1,6 @@ import { notFound } from 'next/navigation' import type { ReactNode } from 'react' +import type { Metadata } from 'next' import { getConsentTexts, getAnalyticsConfig, @@ -18,13 +19,51 @@ import { Footer, type FooterNavItem } from '@/components/Footer' import { CustomCookieBanner } from '@/components/CustomCookieBanner' import '../styles.css' -import type { Company, Navigation, Page } from '@/payload-types' +import type { Company, Media, Navigation, Page } from '@/payload-types' interface LayoutProps { children: ReactNode params: Promise<{ locale: string }> } +export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { + const { locale } = await params + const settings = await getSettings(locale) + const favicon = + typeof settings?.favicon === 'object' && settings?.favicon && 'url' in settings.favicon + ? (settings.favicon as Media) + : null + const faviconUrl = favicon?.url || undefined + + const shareImage = + (typeof settings?.defaultShareImage === 'object' && settings?.defaultShareImage && 'url' in settings.defaultShareImage + ? (settings.defaultShareImage as Media) + : null) || + (typeof settings?.logo === 'object' && settings?.logo && 'url' in settings.logo + ? (settings.logo as Media) + : null) + const shareImageUrl = shareImage?.url || undefined + + return { + ...(faviconUrl + ? { + icons: { + icon: faviconUrl, + shortcut: faviconUrl, + apple: faviconUrl, + }, + } + : {}), + ...(shareImageUrl + ? { + openGraph: { + images: [{ url: shareImageUrl }], + }, + } + : {}), + } +} + function resolveNavItemHref(item: { page?: Page | number | string | null; url?: string | null }): string { if (item.url) return item.url if (item.page && typeof item.page === 'object' && 'slug' in item.page && item.page.slug) { @@ -40,6 +79,10 @@ export default async function LocaleLayout({ children, params }: LayoutProps) { const payload = await getCachedPayload() const settings = await getSettings(locale) + const logo = + typeof settings?.logo === 'object' && settings?.logo && 'url' in settings.logo + ? (settings.logo as Media) + : null const privacyPage = (settings as { privacyPolicy?: unknown })?.privacyPolicy const cookiePage = (settings as { cookiePolicy?: unknown })?.cookiePolicy const homePage = (settings as { homepage?: unknown })?.homepage @@ -154,6 +197,8 @@ export default async function LocaleLayout({ children, params }: LayoutProps) { currentLocale={locale} contactHref={contactHref} contactLabel={contactLabel} + logo={logo} + locales={i18nConfig.locales} />
{children}