From 0c59086a6b96ff3ca28a56fb4c06a3afb43504ff Mon Sep 17 00:00:00 2001 From: MichalC <103170279+wSBMichalee@users.noreply.github.com> Date: Sat, 27 Jun 2026 18:09:22 +0200 Subject: [PATCH] feat: implement compare functionality, checkout flow, and add 30 blog posts --- app/(formalne)/dostawa/page.tsx | 4 +- app/(formalne)/gwarancja/page.tsx | 2 +- app/(formalne)/polityka-prywatnosci/page.tsx | 4 +- app/(formalne)/regulamin/page.tsx | 2 +- app/(formalne)/reklamacje/page.tsx | 4 +- app/blog/[slug]/page.tsx | 4 +- app/blog/page.tsx | 2 +- app/globals.css | 4 +- app/kalkulator/page.tsx | 2 +- app/klimatyzacja/[miasto]/page.tsx | 235 + app/klimatyzacja/page.tsx | 33 +- app/kontakt/page.tsx | 4 +- app/koszyk/page.tsx | 114 +- app/layout.tsx | 8 +- app/loading.tsx | 7 + app/not-found.tsx | 17 + app/o-nas/page.tsx | 4 +- app/page.tsx | 2 +- app/pompy-ciepla/page.tsx | 2 +- app/porownaj/page.tsx | 104 + app/realizacje/page.tsx | 2 +- app/sitemap.ts | 18 +- app/sklep/[slug]/page.tsx | 223 +- app/sklep/page.tsx | 47 +- app/uslugi-domowe/hydraulika/page.tsx | 92 - app/uslugi-domowe/page.tsx | 86 - app/uslugi-domowe/remonty/page.tsx | 94 - app/uslugi-domowe/serwis-agd/page.tsx | 90 - app/zamowienie/actions.ts | 79 + app/zamowienie/page.tsx | 146 +- components/common/SectionHeading.tsx | 2 +- components/forms/ContactForm.tsx | 3 +- components/layout/Footer.tsx | 25 +- components/layout/GlobalSearch.tsx | 4 +- components/layout/Header.tsx | 73 +- components/layout/MobileMenu.tsx | 30 +- components/layout/NavDropdown.tsx | 2 +- components/sections/BeforeAfterSlider.tsx | 121 - components/sections/HeroSection.tsx | 6 +- components/sections/ProcessSteps.tsx | 18 +- components/sections/ProjectsGrid.tsx | 2 - components/sections/Testimonials.tsx | 2 +- components/sections/WhyUs.tsx | 8 +- components/shop/CartItems.tsx | 29 +- components/shop/CartSummary.tsx | 18 +- components/shop/CompareBar.tsx | 64 + components/shop/ProductCard.tsx | 194 +- components/shop/ProductInfo.tsx | 276 - components/shop/ProductsGrid.tsx | 644 +- components/shop/Tabs.tsx | 118 - components/ui/CookieBanner.tsx | 2 +- content/cities.ts | 313 + content/faq.ts | 31 +- content/posts.ts | 711 +- content/process.ts | 23 +- content/products.ts | 7288 +++++++++++++++++- content/projects.ts | 26 +- content/services.ts | 20 +- content/testimonials.ts | 8 +- lib/cart-store.ts | 90 +- lib/compare-store.ts | 35 + public/images/products/placeholder.jpg | 0 types/types.ts | 19 +- 63 files changed, 9766 insertions(+), 1874 deletions(-) create mode 100644 app/klimatyzacja/[miasto]/page.tsx create mode 100644 app/loading.tsx create mode 100644 app/not-found.tsx create mode 100644 app/porownaj/page.tsx delete mode 100644 app/uslugi-domowe/hydraulika/page.tsx delete mode 100644 app/uslugi-domowe/page.tsx delete mode 100644 app/uslugi-domowe/remonty/page.tsx delete mode 100644 app/uslugi-domowe/serwis-agd/page.tsx create mode 100644 app/zamowienie/actions.ts delete mode 100644 components/sections/BeforeAfterSlider.tsx create mode 100644 components/shop/CompareBar.tsx delete mode 100644 components/shop/ProductInfo.tsx delete mode 100644 components/shop/Tabs.tsx create mode 100644 content/cities.ts create mode 100644 lib/compare-store.ts create mode 100644 public/images/products/placeholder.jpg diff --git a/app/(formalne)/dostawa/page.tsx b/app/(formalne)/dostawa/page.tsx index d56b24d..04785e7 100644 --- a/app/(formalne)/dostawa/page.tsx +++ b/app/(formalne)/dostawa/page.tsx @@ -1,8 +1,8 @@ import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Dostawa i Płatności | AirProject', - description: 'Koszty, formy i szacowane czasy dostawy urządzeń w sklepie AirProject.', + title: 'Dostawa i Płatności | ThermCool', + description: 'Koszty, formy i szacowane czasy dostawy urządzeń w sklepie ThermCool.', alternates: { canonical: '/dostawa', } diff --git a/app/(formalne)/gwarancja/page.tsx b/app/(formalne)/gwarancja/page.tsx index 4810fa4..9654d05 100644 --- a/app/(formalne)/gwarancja/page.tsx +++ b/app/(formalne)/gwarancja/page.tsx @@ -3,7 +3,7 @@ import Link from 'next/link'; import { ShieldCheck } from 'lucide-react'; export const metadata: Metadata = { - title: 'Gwarancja na Klimatyzatory i Montaż | AirProject', + title: 'Gwarancja na Klimatyzatory i Montaż | ThermCool', description: 'Szczegółowe informacje dotyczące warunków gwarancji na instalowane urządzenia oraz usługi montażowe.', alternates: { canonical: '/gwarancja', diff --git a/app/(formalne)/polityka-prywatnosci/page.tsx b/app/(formalne)/polityka-prywatnosci/page.tsx index 339d6a6..0f921b1 100644 --- a/app/(formalne)/polityka-prywatnosci/page.tsx +++ b/app/(formalne)/polityka-prywatnosci/page.tsx @@ -2,8 +2,8 @@ import { Metadata } from 'next'; import { companyDetails } from '@/content/company'; export const metadata: Metadata = { - title: 'Polityka Prywatności i Cookies | AirProject', - description: 'Zasady przetwarzania danych osobowych oraz wykorzystania plików cookies w serwisie AirProject.', + title: 'Polityka Prywatności | ThermCool', + description: 'Zasady przetwarzania danych osobowych oraz wykorzystania plików cookies w serwisie ThermCool.', alternates: { canonical: '/polityka-prywatnosci', } diff --git a/app/(formalne)/regulamin/page.tsx b/app/(formalne)/regulamin/page.tsx index 9ccfce4..cdd444e 100644 --- a/app/(formalne)/regulamin/page.tsx +++ b/app/(formalne)/regulamin/page.tsx @@ -1,7 +1,7 @@ import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Regulamin Sklepu i Usług | AirProject', + title: 'Regulamin Sklepu i Usług | ThermCool', description: 'Regulamin świadczenia usług, zasady korzystania ze sklepu, prawa i obowiązki klienta.', alternates: { canonical: '/regulamin', diff --git a/app/(formalne)/reklamacje/page.tsx b/app/(formalne)/reklamacje/page.tsx index 26a99cf..c7888b8 100644 --- a/app/(formalne)/reklamacje/page.tsx +++ b/app/(formalne)/reklamacje/page.tsx @@ -2,8 +2,8 @@ import { Metadata } from 'next'; import Link from 'next/link'; export const metadata: Metadata = { - title: 'Reklamacje i Zwroty | AirProject', - description: 'Zasady i procedury składania reklamacji oraz zwrotów produktów i usług w sklepie AirProject.', + title: 'Reklamacje i Zwroty | ThermCool', + description: 'Zasady i procedury składania reklamacji oraz zwrotów produktów i usług w sklepie ThermCool.', alternates: { canonical: '/reklamacje', } diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index acfd91a..19b6aae 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -33,7 +33,7 @@ export async function generateMetadata({ params }: BlogPostPageProps): Promise; +} + +export async function generateStaticParams() { + return getAllCitySlugs().map((c) => ({ miasto: c.slug })); +} + +export async function generateMetadata({ params }: Props): Promise { + const { miasto } = await params; + const city = getCityBySlug(miasto); + if (!city) return { title: 'Nie znaleziono' }; + return { + title: city.seoTitle, + description: city.seoDescription, + alternates: { canonical: `/klimatyzacja/${city.slug}` }, + openGraph: { + title: city.seoTitle, + description: city.seoDescription, + }, + }; +} + +export default async function MiastoPage({ params }: Props) { + const { miasto } = await params; + const city = getCityBySlug(miasto); + if (!city) notFound(); + + const otherCities = dolnySlaskCities.filter((c) => c.slug !== city.slug); + + const jsonLd = { + "@context": "https://schema.org", + "@type": "LocalBusiness", + "name": companyDetails.name, + "telephone": companyDetails.phone, + "email": companyDetails.email, + "url": `${process.env.NEXT_PUBLIC_BASE_URL || 'https://thermcool.pl'}/klimatyzacja/${city.slug}`, + "address": { + "@type": "PostalAddress", + "streetAddress": companyDetails.address.street, + "addressLocality": companyDetails.address.city, + "postalCode": companyDetails.address.zipCode, + "addressCountry": "PL", + }, + "areaServed": { "@type": "City", "name": city.name }, + "priceRange": "$$", + }; + + return ( +
+