diff --git a/next.config.js b/next.config.js index 639cbcc..1a5f198 100644 --- a/next.config.js +++ b/next.config.js @@ -45,4 +45,4 @@ const nextConfig = (phase, { defaultConfig }) => { }; }; -module.exports = {...withNextIntl(nextConfig)}; +module.exports = withNextIntl(nextConfig); diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index e591c8d..c839634 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -4,11 +4,9 @@ import "./globals.css"; import { ThemeProvider } from "@/components/theme-provider"; import StyledComponentsRegistry from "@/lib/styled-components-registry"; import {NextIntlClientProvider} from 'next-intl'; -import {unstable_setRequestLocale} from 'next-intl/server'; import Footer from "@/components/footer"; import { Navigation } from "@/components/navigation"; -import { notFound } from "next/navigation"; -import {routing} from '@/i18n/routing'; +import { getMessages } from "next-intl/server"; const inter = Inter({ subsets: ["latin"] }); @@ -18,29 +16,14 @@ export const metadata: Metadata = { keywords: ["Zen", "Browser", "Zen Browser", "Web", "Internet", "Fast"], }; -const SUPPORTED_LANGUAGES = ["en", "de"]; - -async function getMessages(locale: string) { - try { - return (await import(`../../../messages/${locale}.json`)).default - } catch (error) { - notFound() - } -} - -export function generateStaticParams() { - return routing.locales.map((locale) => ({locale})); -} - export default async function RootLayout({ children, - params: {locale}, + params: {locale} }: Readonly<{ children: React.ReactNode; params: {locale: string}; }>) { - unstable_setRequestLocale(locale); - const messages = await getMessages(locale); + const messages = await getMessages(); return ( diff --git a/src/app/[locale]/not-found.tsx b/src/app/[locale]/not-found.tsx index d05717c..5855f54 100644 --- a/src/app/[locale]/not-found.tsx +++ b/src/app/[locale]/not-found.tsx @@ -1,8 +1,3 @@ -import { BrandingAssets } from "@/components/branding-assets"; -import Footer from "@/components/footer"; -import { Navigation } from "@/components/navigation"; - -export const runtime = 'edge' export default function NotFoundPage() { return ( diff --git a/src/app/feed.xml/route.ts b/src/app/feed.xml/route.ts deleted file mode 100644 index 4d761f1..0000000 --- a/src/app/feed.xml/route.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Feed } from "feed"; -import { releaseNotes } from "@/lib/release-notes"; -import type { ReleaseNote } from "@/lib/release-notes"; - -// Force feed.xml to be cached as static and remain constant for the lifetime of the current site build. -// The supplied releaseNotes array is constant per build, so this will always be the latest release notes. -export const dynamic = "force-static"; - -/** The default number of entries to include in the RSS feed. */ -const RSS_ENTRY_LIMIT = 20; - -/** - * Handles the GET request for the `feed.xml` endpoint. - * @returns The RSS feed for the Zen Browser release notes. - */ -export async function GET() { - // Just in case the release notes array is empty for whatever reason. - const latestDate = releaseNotes.length > 0 - ? formatRssDate(releaseNotes[0].date) - : new Date(); - - const feed = new Feed({ - id: "https://www.zen-browser.app/release-notes", - link: "https://www.zen-browser.app/release-notes", - title: "Zen Browser Release Notes", - description: "Release Notes for the Zen Browser", - language: "en", - favicon: "https://www.zen-browser.app/favicon.ico", - copyright: `Zen Browser © ${new Date().getFullYear()} - Made with ❤️ by the Zen team.`, - updated: latestDate, - }); - - for (const releaseNote of releaseNotes.slice(0, RSS_ENTRY_LIMIT)) { - feed.addItem({ - title: `Release notes for version ${releaseNote.version}`, - id: `https://www.zen-browser.app/release-notes/${releaseNote.version}`, - link: `https://www.zen-browser.app/release-notes/${releaseNote.version}`, - date: formatRssDate(releaseNote.date), - description: releaseNote.extra, - content: formatReleaseNote(releaseNote), - }); - } - - return new Response(feed.rss2(), { - headers: { - 'Content-Type': 'application/xml; charset=utf-8', - }, - }); -} - -/** - * Formats a date string in the format day/month/year. - * - * Note: If release notes change to ISO format, this will need to be updated. - * @param dateStr The date string to format. - * @returns The passed in date string as a Date object. - */ -function formatRssDate(dateStr: string) { - const splitDate = dateStr.split("/"); - if (splitDate.length !== 3) { - throw new Error("Invalid date format"); - } - - const day = Number(splitDate[0]); - const month = Number(splitDate[1]) - 1; - const year = Number(splitDate[2]); - return new Date(year, month, day); -} - -/** - * Formats the release note entry for use as the content of the RSS feed. - * @param releaseNote The release note to format. - * @returns The formatted release note as a HTML string. - */ -function formatReleaseNote(releaseNote: ReleaseNote) { - let content = "
If you encounter any issues, please report them on the issues page. Thanks everyone for your feedback! ❤️
"; - - if (releaseNote.extra) { - content += `${releaseNote.extra.replace(/(\n)/g, "
")}