diff --git a/app/[locale]/[...slug]/page.tsx b/app/[locale]/[...slug]/page.tsx index 1928673a9..374d1e64d 100644 --- a/app/[locale]/[...slug]/page.tsx +++ b/app/[locale]/[...slug]/page.tsx @@ -6,6 +6,8 @@ import CategoryPage from './pages/category-page'; import ProductPage from './pages/product-page'; import SinglePage from './pages/single-page'; +export const runtime = 'edge'; + export const revalidate = 43200; // 12 hours in seconds export async function generateMetadata({ @@ -44,11 +46,25 @@ export default async function Page({ params }: PageParams) { const { query = '', queryParams, docType } = getQueryFromSlug(slug, locale); + let pageData; + + if (docType === 'page') { + pageData = await clientFetch(query, queryParams); + } else if (docType === 'product') { + pageData = await clientFetch(query, queryParams); + } else if (docType === 'category') { + pageData = await clientFetch(query, queryParams); + } else { + return; + } + + if (!pageData) return notFound(); + return ( <> - {docType === 'page' && } - {docType === 'product' && } - {docType === 'category' && } + {docType === 'page' && } + {docType === 'product' && } + {docType === 'category' && } ); } diff --git a/app/[locale]/[...slug]/pages/category-page.tsx b/app/[locale]/[...slug]/pages/category-page.tsx index 7546ee7ec..be6b61c57 100644 --- a/app/[locale]/[...slug]/pages/category-page.tsx +++ b/app/[locale]/[...slug]/pages/category-page.tsx @@ -1,21 +1,13 @@ import Search from '@/components/search/search'; import SearchResult from '@/components/search/search-result'; import Text from '@/components/ui/text/text'; -import { clientFetch } from '@/lib/sanity/sanity.client'; -import { notFound } from 'next/navigation'; interface CategoryPageParams { - query: string; - queryParams: { - slug: string; - locale: string; - }; + data: object | any; } -export default async function CategoryPage({ query, queryParams }: CategoryPageParams) { - const category = await clientFetch(query, queryParams); - - if (!category) return notFound(); +export default async function CategoryPage({ data }: CategoryPageParams) { + const category = data; const { title } = category; diff --git a/app/[locale]/[...slug]/pages/product-page.tsx b/app/[locale]/[...slug]/pages/product-page.tsx index e98f4e21a..d9bb08dd8 100644 --- a/app/[locale]/[...slug]/pages/product-page.tsx +++ b/app/[locale]/[...slug]/pages/product-page.tsx @@ -1,19 +1,10 @@ import ProductView from '@/components/product/product-view'; -import { clientFetch } from '@/lib/sanity/sanity.client'; -import { notFound } from 'next/navigation'; - interface ProductPageParams { - query: string; - queryParams: { - slug: string; - locale: string; - }; + data: object | any; } -export default async function ProductPage({ query, queryParams }: ProductPageParams) { - const product = await clientFetch(query, queryParams); - - if (!product) return notFound(); +export default async function ProductPage({ data }: ProductPageParams) { + const product = data; const productJsonLd = { '@context': 'https://schema.org', diff --git a/app/[locale]/[...slug]/pages/single-page.tsx b/app/[locale]/[...slug]/pages/single-page.tsx index eb35350d9..72539732b 100644 --- a/app/[locale]/[...slug]/pages/single-page.tsx +++ b/app/[locale]/[...slug]/pages/single-page.tsx @@ -1,23 +1,13 @@ import DynamicContentManager from '@/components/layout/dynamic-content-manager/dynamic-content-manager'; -import { clientFetch } from '@/lib/sanity/sanity.client'; -import { notFound } from 'next/navigation'; interface SinglePageParams { - query: string; - queryParams: { - slug: string; - locale: string; - }; + data: object | any; } -export default async function SinglePage({ query = '', queryParams }: SinglePageParams) { - const page = await clientFetch(query, queryParams); - - if (!page) return notFound(); - +export default async function SinglePage({ data }: SinglePageParams) { return ( -
- ; -
+ <> + ; + ); } diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 53c2e6fb8..850653a94 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -3,6 +3,7 @@ import { homePageQuery } from 'lib/sanity/queries'; import { clientFetch } from 'lib/sanity/sanity.client'; import { Metadata } from 'next'; import { notFound } from 'next/navigation'; + export const runtime = 'edge'; export async function generateMetadata({ diff --git a/components/cart/modal.tsx b/components/cart/modal.tsx index 957796002..e704be46e 100644 --- a/components/cart/modal.tsx +++ b/components/cart/modal.tsx @@ -7,8 +7,8 @@ import { DEFAULT_OPTION } from 'lib/constants'; import type { Cart } from 'lib/shopify/types'; import { createUrl } from 'lib/utils'; import { useTranslations } from 'next-intl'; +import Link from 'next-intl/link'; import Image from 'next/image'; -import Link from 'next/link'; import { useEffect, useRef, useState } from 'react'; import DeleteItemButton from './delete-item-button'; import EditItemQuantityButton from './edit-item-quantity-button'; diff --git a/components/layout/header/desktop-menu/desktop-menu.tsx b/components/layout/header/desktop-menu/desktop-menu.tsx index 164aa6c79..09119e6fb 100644 --- a/components/layout/header/desktop-menu/desktop-menu.tsx +++ b/components/layout/header/desktop-menu/desktop-menu.tsx @@ -1,6 +1,6 @@ 'use client'; -import Link from 'next/link'; +import Link from 'next-intl/link'; export default function DesktopMenu({ items }: { items: [] }) { return ( diff --git a/components/layout/header/mobile-menu/modal.tsx b/components/layout/header/mobile-menu/modal.tsx index 6c17bea34..76a8cd278 100644 --- a/components/layout/header/mobile-menu/modal.tsx +++ b/components/layout/header/mobile-menu/modal.tsx @@ -1,7 +1,7 @@ 'use client'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '@/components/ui/sheet'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { useState } from 'react'; import OpenMobileMenu from './open-mobile-menu'; diff --git a/components/layout/header/search/modal.tsx b/components/layout/header/search/modal.tsx index 5b907109b..236ffff3e 100644 --- a/components/layout/header/search/modal.tsx +++ b/components/layout/header/search/modal.tsx @@ -9,7 +9,7 @@ import OpenSearch from './open-search'; import { Highlight, Hits } from 'react-instantsearch'; import Search from '@/components/search/search'; -import Link from 'next/link'; +import Link from 'next-intl/link'; export default function SearchModal() { const [isOpen, setIsOpen] = useState(false); diff --git a/components/product/gallery.tsx b/components/product/gallery.tsx index a330028cf..8468def51 100644 --- a/components/product/gallery.tsx +++ b/components/product/gallery.tsx @@ -2,8 +2,8 @@ import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/24/outline'; import { createUrl } from 'lib/utils'; +import Link from 'next-intl/link'; import Image from 'next/image'; -import Link from 'next/link'; import { usePathname, useSearchParams } from 'next/navigation'; export function Gallery({ images }: { images: { src: string; alt: string }[] }) { diff --git a/components/product/product-view.tsx b/components/product/product-view.tsx index 5336bd646..310f7e19c 100644 --- a/components/product/product-view.tsx +++ b/components/product/product-view.tsx @@ -18,7 +18,7 @@ import { Grid } from './grid'; interface ProductViewProps { product: Product; - relatedProducts: Product[]; + relatedProducts?: Product[]; } export default function ProductView({ product, relatedProducts }: ProductViewProps) { diff --git a/components/product/variant-selector.tsx b/components/product/variant-selector.tsx index 89f2a322c..84b26b57a 100644 --- a/components/product/variant-selector.tsx +++ b/components/product/variant-selector.tsx @@ -3,7 +3,7 @@ import clsx from 'clsx'; import { ProductOption, ProductVariant } from 'lib/shopify/types'; import { createUrl } from 'lib/utils'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { usePathname, useSearchParams } from 'next/navigation'; type Combination = { @@ -91,8 +91,8 @@ export function VariantSelector({ className={clsx( 'flex min-w-[48px] items-center justify-center rounded-full border bg-neutral-100 px-2 py-1 text-sm dark:border-neutral-800 dark:bg-neutral-900', { - 'cursor-default ring-2 ring-blue-600': isActive, - 'ring-1 ring-transparent transition duration-300 ease-in-out hover:scale-110 hover:ring-blue-600 ': + 'ring-blue-600 cursor-default ring-2': isActive, + 'hover:ring-blue-600 ring-1 ring-transparent transition duration-300 ease-in-out hover:scale-110 ': !isActive && isAvailableForSale, 'relative z-10 cursor-not-allowed overflow-hidden bg-neutral-100 text-neutral-500 ring-1 ring-neutral-300 before:absolute before:inset-x-0 before:-z-10 before:h-px before:-rotate-45 before:bg-neutral-300 before:transition-transform dark:bg-neutral-900 dark:text-neutral-400 dark:ring-neutral-700 before:dark:bg-neutral-700': !isAvailableForSale diff --git a/components/search/search-result.tsx b/components/search/search-result.tsx index e009946be..26b44add7 100644 --- a/components/search/search-result.tsx +++ b/components/search/search-result.tsx @@ -3,7 +3,7 @@ import Text from '@/components/ui/text/text'; import { cn } from '@/lib/utils'; import { useTranslations } from 'next-intl'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { Configure, Highlight, InfiniteHits } from 'react-instantsearch'; export default function SearchResult() { diff --git a/components/ui/card/card.tsx b/components/ui/card/card.tsx index f37adae51..c359786f5 100644 --- a/components/ui/card/card.tsx +++ b/components/ui/card/card.tsx @@ -2,7 +2,7 @@ import SanityImage from 'components/ui/sanity-image'; import { cn } from 'lib/utils'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { FC } from 'react'; interface CardProps { diff --git a/components/ui/category-card/category-card.tsx b/components/ui/category-card/category-card.tsx index c244c229a..33ba36794 100644 --- a/components/ui/category-card/category-card.tsx +++ b/components/ui/category-card/category-card.tsx @@ -1,6 +1,6 @@ import SanityImage from 'components/ui/sanity-image'; import { cn } from 'lib/utils'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { FC } from 'react'; interface Props { className?: string; diff --git a/components/ui/locale-switcher/locale-switcher.tsx b/components/ui/locale-switcher/locale-switcher.tsx index 36a27c841..e9c826b83 100644 --- a/components/ui/locale-switcher/locale-switcher.tsx +++ b/components/ui/locale-switcher/locale-switcher.tsx @@ -8,7 +8,7 @@ import { } from '@/components/ui/dropdown-menu'; import { LanguageIcon } from '@heroicons/react/24/outline'; import { useLocale, useTranslations } from 'next-intl'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { usePathname } from 'next/navigation'; import { useState } from 'react'; import { supportedLanguages } from '../../../i18n-config'; diff --git a/components/ui/product-card/product-card.tsx b/components/ui/product-card/product-card.tsx index 07639ec4e..e87d096a4 100644 --- a/components/ui/product-card/product-card.tsx +++ b/components/ui/product-card/product-card.tsx @@ -5,7 +5,7 @@ import type { Product } from '@/lib/storm/product'; import Price from 'components/price'; import Text from 'components/ui/text'; import { cn } from 'lib/utils'; -import Link from 'next/link'; +import Link from 'next-intl/link'; import { FC } from 'react'; interface Props { className?: string; diff --git a/middleware.ts b/middleware.ts index 9cc1d2d90..2a111af00 100644 --- a/middleware.ts +++ b/middleware.ts @@ -6,6 +6,7 @@ export default createMiddleware({ // If this locale is matched, pathnames work without a prefix (e.g. `/about`) defaultLocale: 'sv', + localeDetection: false }); export const config = {