diff --git a/apps/docs/package.json b/apps/docs/package.json index e7772995..14af084c 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -23,6 +23,6 @@ }, "devDependencies": { "@iconify-json/lucide": "1.2.17", - "typescript": "5.7.2" + "typescript": "5.6.2" } } diff --git a/apps/screenshot-service/package.json b/apps/screenshot-service/package.json index cba141d5..3f22bca7 100644 --- a/apps/screenshot-service/package.json +++ b/apps/screenshot-service/package.json @@ -20,6 +20,6 @@ }, "devDependencies": { "@openstatus/tsconfig": "workspace:*", - "typescript": "5.4.4" + "typescript": "5.6.2" } } diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts index 40c3d680..1b3be084 100644 --- a/apps/web/next-env.d.ts +++ b/apps/web/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/web/next.config.js b/apps/web/next.config.js index f9d0e7ef..fdba0cf4 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -12,33 +12,15 @@ const securityHeaders = [ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, - swcMinify: true, transpilePackages: ["@openstatus/ui", "@openstatus/api"], - experimental: { - outputFileTracingIncludes: { - "/": [ - "./node_modules/.pnpm/@google-cloud/tasks/build/esm/src/**/*.json", - "./node_modules/@google-cloud/tasks/build/esm/src/**/*.js", - ], - }, - serverComponentsExternalPackages: [ - // "libsql", - // "@libsql", - "@react-email/components", - "@react-email/render", - "@google-cloud/tasks", - // "@libsql/client", - // "@libsql/hrana-client", - // "better-sqlite3" + outputFileTracingIncludes: { + "/": [ + "./node_modules/.pnpm/@google-cloud/tasks/build/esm/src/**/*.json", + "./node_modules/@google-cloud/tasks/build/esm/src/**/*.js", ], - /** - * The default stale revalidate time for SWR requests is 1year. - * We can't rely on the default because the status pages will always return the - * STALE data before revalidate. - * @link https://nextjs.org/docs/app/api-reference/next-config-js/swrDelta - */ - swrDelta: 120, }, + serverExternalPackages: ["@google-cloud/tasks"], + expireTime: 180, // 3 minutes logging: { fetches: { fullUrl: true, diff --git a/apps/web/package.json b/apps/web/package.json index a8048a8a..c0ad724d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,7 +13,7 @@ "@auth/core": "0.34.1", "@auth/drizzle-adapter": "1.7.0", "@google-cloud/tasks": "4.0.1", - "@hookform/resolvers": "3.3.1", + "@hookform/resolvers": "3.9.1", "@libsql/client": "0.14.0", "@openstatus/analytics": "workspace:*", "@openstatus/api": "workspace:*", @@ -32,55 +32,54 @@ "@openstatus/ui": "workspace:*", "@openstatus/upstash": "workspace:*", "@openstatus/utils": "workspace:*", - "@radix-ui/react-portal": "1.0.4", - "@sentry/integrations": "7.116.0", - "@sentry/nextjs": "7.116.0", + "@radix-ui/react-portal": "1.1.3", + "@sentry/nextjs": "8.46.0", "@stripe/stripe-js": "2.1.6", "@t3-oss/env-nextjs": "0.7.0", "@tailwindcss/container-queries": "0.1.1", "@tailwindcss/typography": "0.5.10", - "@tanstack/react-query": "5.59.0", - "@tanstack/react-query-devtools": "5.59.0", + "@tanstack/react-query": "5.62.8", + "@tanstack/react-query-devtools": "5.62.8", "@tanstack/react-table": "8.10.3", - "@trpc/client": "11.0.0-rc.553", - "@trpc/next": "11.0.0-rc.553", - "@trpc/react-query": "11.0.0-rc.553", - "@trpc/server": "11.0.0-rc.553", + "@trpc/client": "11.0.0-rc.666", + "@trpc/next": "11.0.0-rc.666", + "@trpc/react-query": "11.0.0-rc.666", + "@trpc/server": "11.0.0-rc.666", "@unkey/api": "0.23.0", "@upstash/qstash": "2.6.2", "@upstash/redis": "1.22.1", "@vercel/blob": "0.23.3", "class-variance-authority": "0.7.0", - "clsx": "2.0.0", - "cmdk": "1.0.0", + "clsx": "2.1.1", + "cmdk": "1.0.4", "cobe": "0.6.3", "date-fns": "2.30.0", "date-fns-tz": "2.0.0", - "lucide-react": "0.279.0", + "lucide-react": "0.468.0", "nanoid": "5.0.7", - "next": "14.2.15", - "next-auth": "5.0.0-beta.21", - "next-plausible": "3.12.0", + "next": "15.1.1", + "next-auth": "5.0.0-beta.25", + "next-plausible": "3.12.4", "next-themes": "0.2.1", "nuqs": "2.2.3", "posthog-js": "1.136.1", "posthog-node": "4.0.1", "random-word-slugs": "0.1.7", - "react": "18.3.1", - "react-day-picker": "8.8.2", - "react-dom": "18.3.1", - "react-hook-form": "7.47.0", - "react-tweet": "3.1.1", + "react": "19.0.0", + "react-day-picker": "8.10.1", + "react-dom": "19.0.0", + "react-hook-form": "7.54.1", + "react-tweet": "3.2.1", "reading-time": "1.5.0", - "recharts": "2.12.7", + "recharts": "2.15.0", "rehype-pretty-code": "0.10.0", "rehype-react": "7.2.0", "remark-parse": "10.0.2", "remark-rehype": "10.1.0", - "resend": "4.0.0", + "resend": "4.0.1", "rss": "1.2.2", "shiki": "0.14.4", - "sonner": "1.5.0", + "sonner": "1.7.1", "stripe": "13.8.0", "superjson": "1.13.3", "tailwind-merge": "1.14.0", @@ -90,11 +89,11 @@ "devDependencies": { "@content-collections/core": "0.7.3", "@content-collections/mdx": "0.2.0", - "@content-collections/next": "0.2.3", + "@content-collections/next": "0.2.4", "@openstatus/tsconfig": "workspace:*", "@types/node": "20.14.8", - "@types/react": "18.3.3", - "@types/react-dom": "18.3.0", + "@types/react": "19.0.1", + "@types/react-dom": "19.0.2", "@types/rss": "0.0.32", "autoprefixer": "10.4.19", "postcss": "8.4.38", @@ -102,7 +101,13 @@ "rehype-slug": "5.1.0", "remark-gfm": "3.0.1", "tailwindcss": "3.4.3", - "typescript": "5.5.2", + "typescript": "5.6.2", "unified": "10.1.2" + }, + "pnpm": { + "overrides": { + "@types/react": "19.0.1", + "@types/react-dom": "19.0.2" + } } } diff --git a/apps/web/sentry.client.config.ts b/apps/web/sentry.client.config.ts index c71fa294..8d95a5b8 100644 --- a/apps/web/sentry.client.config.ts +++ b/apps/web/sentry.client.config.ts @@ -2,7 +2,6 @@ // The config you add here will be used whenever a users loads a page in their browser. // https://docs.sentry.io/platforms/javascript/guides/nextjs/ -import { CaptureConsole as CaptureConsoleIntegration } from "@sentry/integrations"; import * as Sentry from "@sentry/nextjs"; import { env } from "@/env"; @@ -24,15 +23,7 @@ Sentry.init({ // You can remove this option if you're not planning to use the Sentry Session Replay feature: integrations: [ - new Sentry.Replay({ - // Additional Replay configuration goes in here, for example: - maskAllText: true, - blockAllMedia: true, - }), - new CaptureConsoleIntegration({ - // array of methods that should be captured - // defaults to ['log', 'info', 'warn', 'error', 'debug', 'assert'] - levels: ["error"], - }), + Sentry.replayIntegration({ maskAllText: true, blockAllMedia: true }), + Sentry.captureConsoleIntegration({ levels: ["error"] }), ], }); diff --git a/apps/web/sentry.edge.config.ts b/apps/web/sentry.edge.config.ts index 95d1b0b5..fe2e14cd 100644 --- a/apps/web/sentry.edge.config.ts +++ b/apps/web/sentry.edge.config.ts @@ -2,7 +2,6 @@ // The config you add here will be used whenever one of the edge features is loaded. // Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally. // https://docs.sentry.io/platforms/javascript/guides/nextjs/ -import { CaptureConsole as CaptureConsoleIntegration } from "@sentry/integrations"; import * as Sentry from "@sentry/nextjs"; import { env } from "@/env"; @@ -15,11 +14,5 @@ Sentry.init({ // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, - integrations: [ - new CaptureConsoleIntegration({ - // array of methods that should be captured - // defaults to ['log', 'info', 'warn', 'error', 'debug', 'assert'] - levels: ["error"], - }), - ], + integrations: [Sentry.captureConsoleIntegration({ levels: ["error"] })], }); diff --git a/apps/web/sentry.server.config.ts b/apps/web/sentry.server.config.ts index 6e969b4f..c6bab57e 100644 --- a/apps/web/sentry.server.config.ts +++ b/apps/web/sentry.server.config.ts @@ -2,7 +2,6 @@ // The config you add here will be used whenever the server handles a request. // https://docs.sentry.io/platforms/javascript/guides/nextjs/ -import { CaptureConsole as CaptureConsoleIntegration } from "@sentry/integrations"; import * as Sentry from "@sentry/nextjs"; import { env } from "@/env"; @@ -15,11 +14,5 @@ Sentry.init({ // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, - integrations: [ - new CaptureConsoleIntegration({ - // array of methods that should be captured - // defaults to ['log', 'info', 'warn', 'error', 'debug', 'assert'] - levels: ["error"], - }), - ], + integrations: [Sentry.captureConsoleIntegration({ levels: ["error"] })], }); diff --git a/apps/web/src/app/(content)/blog/[slug]/page.tsx b/apps/web/src/app/(content)/blog/[slug]/page.tsx index 81c77970..59eb4f67 100644 --- a/apps/web/src/app/(content)/blog/[slug]/page.tsx +++ b/apps/web/src/app/(content)/blog/[slug]/page.tsx @@ -19,11 +19,10 @@ export async function generateStaticParams() { })); } -export async function generateMetadata({ - params, -}: { - params: { slug: string }; +export async function generateMetadata(props: { + params: Promise<{ slug: string }>; }): Promise { + const params = await props.params; const post = allPosts.find((post) => post.slug === params.slug); if (!post) { return; @@ -58,7 +57,10 @@ export async function generateMetadata({ }; } -export default function PostPage({ params }: { params: { slug: string } }) { +export default async function PostPage(props: { + params: Promise<{ slug: string }>; +}) { + const params = await props.params; const post = allPosts.find((post) => post.slug === params.slug); if (!post) notFound(); diff --git a/apps/web/src/app/(content)/blog/page.tsx b/apps/web/src/app/(content)/blog/page.tsx index a7febe37..e2ec08bf 100644 --- a/apps/web/src/app/(content)/blog/page.tsx +++ b/apps/web/src/app/(content)/blog/page.tsx @@ -34,11 +34,10 @@ export const metadata: Metadata = { }, }; -export default function Post({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Post(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const { pageIndex } = searchParamsCache.parse(searchParams); const posts = allPosts diff --git a/apps/web/src/app/(content)/changelog/[slug]/page.tsx b/apps/web/src/app/(content)/changelog/[slug]/page.tsx index da372872..874df4d6 100644 --- a/apps/web/src/app/(content)/changelog/[slug]/page.tsx +++ b/apps/web/src/app/(content)/changelog/[slug]/page.tsx @@ -22,11 +22,10 @@ export async function generateStaticParams() { })); } -export async function generateMetadata({ - params, -}: { - params: { slug: string }; +export async function generateMetadata(props: { + params: Promise<{ slug: string }>; }): Promise { + const params = await props.params; const post = allChangelogs.find((post) => post.slug === params.slug); if (!post) { return; @@ -76,11 +75,10 @@ function getChangelogPagination(slug: string) { }; } -export default function ChangelogPage({ - params, -}: { - params: { slug: string }; +export default async function ChangelogPage(props: { + params: Promise<{ slug: string }>; }) { + const params = await props.params; const post = allChangelogs.find((post) => post.slug === params.slug); if (!post) { diff --git a/apps/web/src/app/(content)/changelog/page.tsx b/apps/web/src/app/(content)/changelog/page.tsx index cde250ab..f3c60462 100644 --- a/apps/web/src/app/(content)/changelog/page.tsx +++ b/apps/web/src/app/(content)/changelog/page.tsx @@ -34,11 +34,10 @@ export const metadata: Metadata = { }, }; -export default function ChangelogClient({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function ChangelogClient(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const { pageIndex } = searchParamsCache.parse(searchParams); const changelogs = allChangelogs diff --git a/apps/web/src/app/app/(auth)/login/page.tsx b/apps/web/src/app/app/(auth)/login/page.tsx index 6cf3b7a1..8151bda2 100644 --- a/apps/web/src/app/app/(auth)/login/page.tsx +++ b/apps/web/src/app/app/(auth)/login/page.tsx @@ -11,11 +11,10 @@ import { searchParamsCache } from "./search-params"; const isDev = process.env.NODE_ENV === "development"; -export default function Page({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const { redirectTo } = searchParamsCache.parse(searchParams); return ( diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/layout.tsx index 777b28b6..c35862e0 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/layout.tsx @@ -4,13 +4,14 @@ import { Header } from "@/components/dashboard/header"; import AppPageWithSidebarLayout from "@/components/layout/app-page-with-sidebar-layout"; import { api } from "@/trpc/server"; -export default async function Layout({ - children, - params, -}: { +export default async function Layout(props: { children: React.ReactNode; - params: { workspaceSlug: string; id: string }; + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; + + const { children } = props; + const id = params.id; const [incidents, incident] = await Promise.all([ diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/overview/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/overview/page.tsx index 266e7b52..0d610fe9 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/overview/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/overview/page.tsx @@ -16,11 +16,10 @@ import { Event } from "./_components/event"; * */ -export default async function IncidentPage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function IncidentPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const incident = await api.incident.getIncidentById.query({ id: Number(params.id), }); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/page.tsx index 2265f50d..afc3b215 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/incidents/[id]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function Page({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; return redirect(`./${params.id}/overview`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/layout.tsx index 89258aa9..79d26293 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/layout.tsx @@ -5,13 +5,14 @@ import type { ReactNode } from "react"; import { WorkspaceClientCookie } from "../worskpace-client-cookie"; // TODO: make the container min-h-screen and the footer below! -export default async function AppLayout({ - children, - params, -}: { +export default async function AppLayout(props: { children: ReactNode; - params: { workspaceSlug: string }; + params: Promise<{ workspaceSlug: string }>; }) { + const params = await props.params; + + const { children } = props; + const { workspaceSlug } = params; const workspaces = await api.workspace.getUserWorkspaces.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/(overview)/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/(overview)/page.tsx index e9575937..08f1186e 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/(overview)/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/(overview)/page.tsx @@ -10,11 +10,10 @@ import { prepareMetricsByPeriod, prepareStatusByPeriod } from "@/lib/tb"; import { api } from "@/trpc/server"; import { searchParamsCache } from "./search-params"; -export default async function MonitorPage({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function MonitorPage(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const search = searchParamsCache.parse(searchParams); const monitors = await api.monitor.getMonitorsByWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/data/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/data/page.tsx index 5eec6172..1dd46d42 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/data/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/data/page.tsx @@ -7,13 +7,12 @@ import { api } from "@/trpc/server"; import { DataTableWrapper } from "./_components/data-table-wrapper"; import { searchParamsCache } from "./search-params"; -export default async function Page({ - params, - searchParams, -}: { - params: { workspaceSlug: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = params.id; const search = searchParamsCache.parse(searchParams); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/details/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/details/page.tsx index 029fafc4..afb690d0 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/details/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/details/page.tsx @@ -7,14 +7,11 @@ import { ResponseDetails } from "@/components/monitor-dashboard/response-details import { api } from "@/trpc/server"; import { searchParamsCache } from "./search-params"; -export default async function Details({ - // biome-ignore lint/correctness/noUnusedVariables: - params, - searchParams, -}: { - params: { id: string; workspaceSlug: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Details(props: { + params: Promise<{ id: string; workspaceSlug: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const search = searchParamsCache.parse(searchParams); if (!search.monitorId) return ; diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/edit/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/edit/page.tsx index d50899ce..53e67729 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/edit/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/edit/page.tsx @@ -2,13 +2,12 @@ import { MonitorForm } from "@/components/forms/monitor/form"; import { api } from "@/trpc/server"; import { searchParamsCache } from "./search-params"; -export default async function EditPage({ - params, - searchParams, -}: { - params: { workspaceSlug: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function EditPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = Number(params.id); const monitor = await api.monitor.getMonitorById.query({ id }); const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/layout.tsx index 36b5c8c9..9033319c 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/layout.tsx @@ -14,13 +14,14 @@ export const revalidate = 0; // revalidate the data at most every hour export const dynamic = "force-dynamic"; export const fetchCache = "force-no-store"; -export default async function Layout({ - children, - params, -}: { +export default async function Layout(props: { children: React.ReactNode; - params: { workspaceSlug: string; id: string }; + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; + + const { children } = props; + const id = params.id; const monitor = await api.monitor.getMonitorById.query({ diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/overview/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/overview/page.tsx index bbd4718d..c773c9e7 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/overview/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/overview/page.tsx @@ -23,13 +23,12 @@ import { searchParamsCache, } from "./search-params"; -export default async function Page({ - params, - searchParams, -}: { - params: { workspaceSlug: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = params.id; const search = searchParamsCache.parse(searchParams); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/page.tsx index 2265f50d..afc3b215 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/[id]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function Page({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; return redirect(`./${params.id}/overview`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/new/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/new/page.tsx index cbf9fae5..80804b18 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/new/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/monitors/new/page.tsx @@ -4,11 +4,10 @@ import { MonitorForm } from "@/components/forms/monitor/form"; import { api } from "@/trpc/server"; import { searchParamsCache } from "./search-params"; -export default async function Page({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const workspace = await api.workspace.getWorkspace.query(); const notifications = await api.notification.getNotificationsByWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/edit/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/edit/page.tsx index a2e1a2d1..7a5d8e10 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/edit/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/edit/page.tsx @@ -1,11 +1,10 @@ import { NotificationForm } from "@/components/forms/notification/form"; import { api } from "@/trpc/server"; -export default async function EditPage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function EditPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const [workspace, monitors, notification] = await Promise.all([ api.workspace.getWorkspace.query(), api.monitor.getMonitorsByWorkspace.query(), diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/layout.tsx index c06126a6..da8b3742 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/layout.tsx @@ -4,13 +4,14 @@ import { Header } from "@/components/dashboard/header"; import AppPageWithSidebarLayout from "@/components/layout/app-page-with-sidebar-layout"; import { api } from "@/trpc/server"; -export default async function Layout({ - children, - params, -}: { +export default async function Layout(props: { children: React.ReactNode; - params: { workspaceSlug: string; id: string }; + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; + + const { children } = props; + const id = params.id; const notification = await api.notification.getNotificationById.query({ diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/page.tsx index 293f97b0..f012d87d 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/[id]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function Page({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; return redirect(`./${params.id}/edit`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/[channel]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/[channel]/page.tsx index 71197d24..7384b82b 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/[channel]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/[channel]/page.tsx @@ -6,11 +6,10 @@ import { getLimit } from "@openstatus/db/src/schema/plan/utils"; import { notFound } from "next/navigation"; -export default async function ChannelPage({ - params, -}: { - params: { channel: string }; +export default async function ChannelPage(props: { + params: Promise<{ channel: string }>; }) { + const params = await props.params; const validation = notificationProviderSchema .exclude(["pagerduty"]) .safeParse(params.channel); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/pagerduty/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/pagerduty/page.tsx index 8b0dace8..3d0c209c 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/pagerduty/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/notifications/new/pagerduty/page.tsx @@ -8,11 +8,10 @@ import { searchParamsCache } from "./search-params"; // REMINDER: PagerDuty requires a different workflow, thus the separate page -export default async function PagerDutyPage({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function PagerDutyPage(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const workspace = await api.workspace.getWorkspace.query(); const monitors = await api.monitor.getMonitorsByWorkspace.query(); const params = searchParamsCache.parse(searchParams); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/page.tsx index 5dcd8269..f588daf7 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function DashboardRedirect({ - params, -}: { - params: { workspaceSlug: string }; +export default async function DashboardRedirect(props: { + params: Promise<{ workspaceSlug: string }>; }) { + const params = await props.params; return redirect(`/app/${params.workspaceSlug}/monitors`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/page.tsx index e964cbd1..af9e941e 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/settings/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function SettingsPage({ - params, -}: { - params: { workspaceSlug: string }; +export default async function SettingsPage(props: { + params: Promise<{ workspaceSlug: string }>; }) { + const params = await props.params; return redirect(`/app/${params.workspaceSlug}/settings/general`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/domain/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/domain/page.tsx index fd4f66aa..84281993 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/domain/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/domain/page.tsx @@ -6,11 +6,10 @@ import { ProFeatureAlert } from "@/components/billing/pro-feature-alert"; import { CustomDomainForm } from "@/components/forms/custom-domain-form"; import { api } from "@/trpc/server"; -export default async function CustomDomainPage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function CustomDomainPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const id = Number(params.id); const page = await api.page.getPageById.query({ id }); const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/edit/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/edit/page.tsx index 5a4bd358..d7cf76a3 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/edit/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/edit/page.tsx @@ -4,13 +4,12 @@ import { StatusPageForm } from "@/components/forms/status-page/form"; import { api } from "@/trpc/server"; import { searchParamsCache } from "./search-params"; -export default async function EditPage({ - params, - searchParams, -}: { - params: { workspaceSlug: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function EditPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = Number(params.id); const page = await api.page.getPageById.query({ id }); const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/layout.tsx index 3b071488..8ea399ab 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/layout.tsx @@ -8,13 +8,14 @@ import { Header } from "@/components/dashboard/header"; import AppPageWithSidebarLayout from "@/components/layout/app-page-with-sidebar-layout"; import { api } from "@/trpc/server"; -export default async function Layout({ - children, - params, -}: { +export default async function Layout(props: { children: React.ReactNode; - params: { workspaceSlug: string; id: string }; + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; + + const { children } = props; + const id = params.id; const page = await api.page.getPageById.query({ diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/(overview)/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/(overview)/page.tsx index bcb1e977..b3df41ac 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/(overview)/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/(overview)/page.tsx @@ -5,11 +5,10 @@ import { api } from "@/trpc/server"; import { Button } from "@openstatus/ui/src/components/button"; import Link from "next/link"; -export default async function MaintenancePage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function MaintenancePage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const maintenances = await api.maintenance.getByPage.query({ id: Number(params.id), }); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/[maintenanceId]/edit/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/[maintenanceId]/edit/page.tsx index 8ce6db98..816b493f 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/[maintenanceId]/edit/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/[maintenanceId]/edit/page.tsx @@ -1,11 +1,10 @@ import { MaintenanceForm } from "@/components/forms/maintenance/form"; import { api } from "@/trpc/server"; -export default async function MaintenancePage({ - params, -}: { - params: { workspaceSlug: string; id: string; maintenanceId: string }; +export default async function MaintenancePage(props: { + params: Promise<{ workspaceSlug: string; id: string; maintenanceId: string }>; }) { + const params = await props.params; const monitors = await api.monitor.getMonitorsByPageId.query({ id: Number(params.id), }); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/new/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/new/page.tsx index 4d81588c..c89ee08f 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/new/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/maintenances/new/page.tsx @@ -1,11 +1,10 @@ import { MaintenanceForm } from "@/components/forms/maintenance/form"; import { api } from "@/trpc/server"; -export default async function MaintenancePage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function MaintenancePage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const monitors = await api.monitor.getMonitorsByPageId.query({ id: Number(params.id), }); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/page.tsx index 293f97b0..f012d87d 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function Page({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; return redirect(`./${params.id}/edit`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/(overview)/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/(overview)/page.tsx index d595a13c..c35a38c6 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/(overview)/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/(overview)/page.tsx @@ -8,11 +8,10 @@ import { columns } from "@/components/data-table/status-report/columns"; import { DataTable } from "@/components/data-table/status-report/data-table"; import { api } from "@/trpc/server"; -export default async function MonitorPage({ - params, -}: { - params: { id: string }; +export default async function MonitorPage(props: { + params: Promise<{ id: string }>; }) { + const params = await props.params; const reports = await api.statusReport.getStatusReportByPageId.query({ id: Number.parseInt(params.id), }); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/edit/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/edit/page.tsx index ee74e329..defbb1e2 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/edit/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/edit/page.tsx @@ -1,11 +1,10 @@ import { StatusReportForm } from "@/components/forms/status-report/form"; import { api } from "@/trpc/server"; -export default async function EditPage({ - params, -}: { - params: { workspaceSlug: string; id: string; reportId: string }; +export default async function EditPage(props: { + params: Promise<{ workspaceSlug: string; id: string; reportId: string }>; }) { + const params = await props.params; const statusUpdate = await api.statusReport.getStatusReportById.query({ id: Number.parseInt(params.reportId), pageId: Number.parseInt(params.id), diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/overview/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/overview/page.tsx index 78268dd5..92ea0bd6 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/overview/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/overview/page.tsx @@ -9,11 +9,10 @@ import { Events } from "@/components/status-update/events"; import { api } from "@/trpc/server"; import { Header } from "./_components/header"; -export default async function OverviewPage({ - params, -}: { - params: { workspaceSlug: string; id: string; reportId: string }; +export default async function OverviewPage(props: { + params: Promise<{ workspaceSlug: string; id: string; reportId: string }>; }) { + const params = await props.params; const report = await api.statusReport.getStatusReportById.query({ id: Number.parseInt(params.reportId), pageId: Number.parseInt(params.id), diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/page.tsx index 16a25f2e..20ee86dd 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/[reportId]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default function Page({ - params, -}: { - params: { workspaceSlug: string; reportId: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; reportId: string }>; }) { + const params = await props.params; return redirect(`./${params.reportId}/overview`); } diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/new/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/new/page.tsx index 11371a08..894d1a99 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/new/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/reports/new/page.tsx @@ -1,11 +1,10 @@ import { StatusReportForm } from "@/components/forms/status-report/form"; import { api } from "@/trpc/server"; -export default async function NewPage({ - params, -}: { - params: { id: string; reportId: string }; +export default async function NewPage(props: { + params: Promise<{ id: string; reportId: string }>; }) { + const params = await props.params; const monitors = await api.monitor.getMonitorsByWorkspace.query(); return ( diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/subscribers/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/subscribers/page.tsx index cd95e8cd..d367e74b 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/subscribers/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/[id]/subscribers/page.tsx @@ -5,11 +5,10 @@ import { columns } from "@/components/data-table/page-subscriber/columns"; import { DataTable } from "@/components/data-table/page-subscriber/data-table"; import { api } from "@/trpc/server"; -export default async function CustomDomainPage({ - params, -}: { - params: { workspaceSlug: string; id: string }; +export default async function CustomDomainPage(props: { + params: Promise<{ workspaceSlug: string; id: string }>; }) { + const params = await props.params; const id = Number(params.id); const page = await api.page.getPageById.query({ id }); const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/new/page.tsx b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/new/page.tsx index 21eec07a..4e432fd0 100644 --- a/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/new/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/(dashboard)/status-pages/new/page.tsx @@ -3,11 +3,10 @@ import { redirect } from "next/navigation"; import { StatusPageForm } from "@/components/forms/status-page/form"; import { api } from "@/trpc/server"; -export default async function Page({ - params, -}: { - params: { workspaceSlug: string }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string }>; }) { + const params = await props.params; const allMonitors = await api.monitor.getMonitorsByWorkspace.query(); const isLimitReached = await api.page.isPageLimitReached.query(); const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/[workspaceSlug]/onboarding/layout.tsx b/apps/web/src/app/app/[workspaceSlug]/onboarding/layout.tsx index e2c7bbaf..786d1912 100644 --- a/apps/web/src/app/app/[workspaceSlug]/onboarding/layout.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/onboarding/layout.tsx @@ -5,13 +5,14 @@ import { AppHeader } from "@/components/layout/header/app-header"; import { WorkspaceClientCookie } from "../worskpace-client-cookie"; // TODO: make the container min-h-screen and the footer below! -export default async function AppLayout({ - params, - children, -}: { - params: { workspaceSlug: string }; +export default async function AppLayout(props: { + params: Promise<{ workspaceSlug: string }>; children: ReactNode; }) { + const params = await props.params; + + const { children } = props; + const { workspaceSlug } = params; return (
diff --git a/apps/web/src/app/app/[workspaceSlug]/onboarding/page.tsx b/apps/web/src/app/app/[workspaceSlug]/onboarding/page.tsx index ad735d94..ec465acc 100644 --- a/apps/web/src/app/app/[workspaceSlug]/onboarding/page.tsx +++ b/apps/web/src/app/app/[workspaceSlug]/onboarding/page.tsx @@ -9,11 +9,10 @@ import { StatusPageForm } from "@/components/forms/status-page/form"; import { api } from "@/trpc/server"; import { Description } from "./_components/description"; -export default async function Onboarding({ - params, -}: { - params: { workspaceSlug: string }; +export default async function Onboarding(props: { + params: Promise<{ workspaceSlug: string }>; }) { + const params = await props.params; const { workspaceSlug } = params; const workspace = await api.workspace.getWorkspace.query(); diff --git a/apps/web/src/app/app/invite/page.tsx b/apps/web/src/app/app/invite/page.tsx index cf83201a..be412a45 100644 --- a/apps/web/src/app/app/invite/page.tsx +++ b/apps/web/src/app/app/invite/page.tsx @@ -7,11 +7,10 @@ import { searchParamsCache } from "./search-params"; const AlertTriangle = Icons["alert-triangle"]; -export default async function InvitePage({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function InvitePage(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const { token } = searchParamsCache.parse(searchParams); const { message, data } = token ? await api.invitation.acceptInvitation.mutate({ token }) diff --git a/apps/web/src/app/app/layout.tsx b/apps/web/src/app/app/layout.tsx index 3d366bdf..fb27594e 100644 --- a/apps/web/src/app/app/layout.tsx +++ b/apps/web/src/app/app/layout.tsx @@ -1,13 +1,8 @@ import { SessionProvider } from "next-auth/react"; -import { PHProvider } from "@/providers/posthog"; - -const PostHogPageview = dynamic(() => import("@/app/PostHogPageView"), { - ssr: false, -}); +import { PHProvider } from "@/lib/posthog/provider"; import { Bubble } from "@/components/support/bubble"; -import dynamic from "next/dynamic"; export default function AuthLayout({ children, // will be a page or nested layout @@ -16,7 +11,6 @@ export default function AuthLayout({ }) { return ( - {children} diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 81695d6c..0a5d7eaf 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -40,7 +40,7 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( - + ; +}) { + const params = await props.params; const post = allLegals.find((post) => post.slug === params.slug); if (!post) { diff --git a/apps/web/src/app/play/checker/[id]/page.tsx b/apps/web/src/app/play/checker/[id]/page.tsx index 51827703..939734ec 100644 --- a/apps/web/src/app/play/checker/[id]/page.tsx +++ b/apps/web/src/app/play/checker/[id]/page.tsx @@ -20,11 +20,13 @@ import { import { searchParamsCache } from "./search-params"; interface Props { - params: { id: string }; - searchParams: { [key: string]: string | string[] | undefined }; + params: Promise<{ id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; } -export default async function CheckPage({ params, searchParams }: Props) { +export default async function CheckPage(props: Props) { + const searchParams = await props.searchParams; + const params = await props.params; const { regions } = searchParamsCache.parse(searchParams); const selectedRegions = regions || [...flyRegions]; @@ -68,7 +70,8 @@ export default async function CheckPage({ params, searchParams }: Props) { ); } -export async function generateMetadata({ params }: Props): Promise { +export async function generateMetadata(props: Props): Promise { + const params = await props.params; const title = "Global Speed Checker"; const description = "Get speed insights for your api, website from multiple regions."; diff --git a/apps/web/src/app/play/checker/page.tsx b/apps/web/src/app/play/checker/page.tsx index a6e863a5..2a5f218b 100644 --- a/apps/web/src/app/play/checker/page.tsx +++ b/apps/web/src/app/play/checker/page.tsx @@ -35,11 +35,10 @@ export const metadata: Metadata = { }, }; -export default async function PlayPage({ - searchParams, -}: { - searchParams: { [key: string]: string | string[] | undefined }; +export default async function PlayPage(props: { + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; const { id } = searchParamsCache.parse(searchParams); const data = id ? await getCheckerDataById(id) : null; diff --git a/apps/web/src/app/public/monitors/[id]/page.tsx b/apps/web/src/app/public/monitors/[id]/page.tsx index a30f1356..c63b91f0 100644 --- a/apps/web/src/app/public/monitors/[id]/page.tsx +++ b/apps/web/src/app/public/monitors/[id]/page.tsx @@ -25,13 +25,12 @@ import { searchParamsCache, } from "./search-params"; -export default async function Page({ - params, - searchParams, -}: { - params: { workspaceSlug: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + params: Promise<{ workspaceSlug: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = params.id; const search = searchParamsCache.parse(searchParams); const preferredSettings = getPreferredSettings(); diff --git a/apps/web/src/app/status-page/[domain]/badge/route.tsx b/apps/web/src/app/status-page/[domain]/badge/route.tsx index 985b9a65..e4788e1b 100644 --- a/apps/web/src/app/status-page/[domain]/badge/route.tsx +++ b/apps/web/src/app/status-page/[domain]/badge/route.tsx @@ -45,8 +45,9 @@ const SIZE: Record = { }; export async function GET( req: NextRequest, - { params }: { params: { domain: string } }, + props: { params: Promise<{ domain: string }> }, ) { + const params = await props.params; const { status } = await getStatus(params.domain); const theme = req.nextUrl.searchParams.get("theme"); const size = req.nextUrl.searchParams.get("size"); diff --git a/apps/web/src/app/status-page/[domain]/events/page.tsx b/apps/web/src/app/status-page/[domain]/events/page.tsx index 89ff1bb1..e8e01b23 100644 --- a/apps/web/src/app/status-page/[domain]/events/page.tsx +++ b/apps/web/src/app/status-page/[domain]/events/page.tsx @@ -7,13 +7,15 @@ import { searchParamsCache } from "./search-params"; import { formatter } from "./utils"; type Props = { - params: { domain: string }; - searchParams: { [key: string]: string | string[] | undefined }; + params: Promise<{ domain: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }; export const revalidate = 120; -export default async function Page({ params, searchParams }: Props) { +export default async function Page(props: Props) { + const searchParams = await props.searchParams; + const params = await props.params; const { filter } = searchParamsCache.parse(searchParams); const page = await api.page.getPageBySlug.query({ slug: params.domain }); diff --git a/apps/web/src/app/status-page/[domain]/events/report/[id]/page.tsx b/apps/web/src/app/status-page/[domain]/events/report/[id]/page.tsx index a66dab55..e7d6cf06 100644 --- a/apps/web/src/app/status-page/[domain]/events/report/[id]/page.tsx +++ b/apps/web/src/app/status-page/[domain]/events/report/[id]/page.tsx @@ -7,11 +7,10 @@ import { api } from "@/trpc/server"; import { Badge } from "@openstatus/ui/src/components/badge"; import { CopyLinkButton } from "./_components/copy-link-button"; -export default async function IncidentPage({ - params, -}: { - params: { domain: string; id: string }; +export default async function IncidentPage(props: { + params: Promise<{ domain: string; id: string }>; }) { + const params = await props.params; const report = await api.statusReport.getPublicStatusReportById.query({ slug: params.domain, id: Number(params.id), diff --git a/apps/web/src/app/status-page/[domain]/incidents/[id]/page.tsx b/apps/web/src/app/status-page/[domain]/incidents/[id]/page.tsx index a990e429..4f4455af 100644 --- a/apps/web/src/app/status-page/[domain]/incidents/[id]/page.tsx +++ b/apps/web/src/app/status-page/[domain]/incidents/[id]/page.tsx @@ -1,9 +1,8 @@ import { redirect } from "next/navigation"; -export default async function IncidentPage({ - params, -}: { - params: { domain: string; id: string }; +export default async function IncidentPage(props: { + params: Promise<{ domain: string; id: string }>; }) { + const params = await props.params; redirect(`../events/report/${params.id}`); } diff --git a/apps/web/src/app/status-page/[domain]/layout.tsx b/apps/web/src/app/status-page/[domain]/layout.tsx index 18dfe57b..18d3ef64 100644 --- a/apps/web/src/app/status-page/[domain]/layout.tsx +++ b/apps/web/src/app/status-page/[domain]/layout.tsx @@ -16,13 +16,17 @@ import PasswordProtected from "./_components/password-protected"; import { createProtectedCookieKey, setPrefixUrl } from "./utils"; type Props = { - params: { domain: string }; + params: Promise<{ domain: string }>; children: React.ReactNode; }; -export default async function StatusPageLayout({ children, params }: Props) { +export default async function StatusPageLayout(props: Props) { + const params = await props.params; + + const { children } = props; + const page = await api.page.getPageBySlug.query({ slug: params.domain }); - const timeZone = getRequestHeaderTimezone(); + const timeZone = await getRequestHeaderTimezone(); if (!page) return notFound(); @@ -49,7 +53,7 @@ export default async function StatusPageLayout({ children, params }: Props) { // TODO: move to middleware using NextResponse.rewrite keeping the path without using redirect // and move the PasswordProtected into a page.tsx if (page.passwordProtected) { - const cookie = cookies(); + const cookie = await cookies(); const protectedCookie = cookie.get(createProtectedCookieKey(params.domain)); const password = protectedCookie ? protectedCookie.value : undefined; if (password !== page.password) { @@ -70,7 +74,8 @@ export default async function StatusPageLayout({ children, params }: Props) { ); } -export async function generateMetadata({ params }: Props): Promise { +export async function generateMetadata(props: Props): Promise { + const params = await props.params; const page = await api.page.getPageBySlug.query({ slug: params.domain }); return { diff --git a/apps/web/src/app/status-page/[domain]/monitors/[id]/page.tsx b/apps/web/src/app/status-page/[domain]/monitors/[id]/page.tsx index 78a2fd35..bd686e4f 100644 --- a/apps/web/src/app/status-page/[domain]/monitors/[id]/page.tsx +++ b/apps/web/src/app/status-page/[domain]/monitors/[id]/page.tsx @@ -27,13 +27,12 @@ import { export const revalidate = 120; -export default async function Page({ - params, - searchParams, -}: { - params: { domain: string; id: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + params: Promise<{ domain: string; id: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const id = params.id; const search = searchParamsCache.parse(searchParams); const preferredSettings = getPreferredSettings(); diff --git a/apps/web/src/app/status-page/[domain]/monitors/page.tsx b/apps/web/src/app/status-page/[domain]/monitors/page.tsx index c6dbc8b1..a53b6071 100644 --- a/apps/web/src/app/status-page/[domain]/monitors/page.tsx +++ b/apps/web/src/app/status-page/[domain]/monitors/page.tsx @@ -16,13 +16,12 @@ import { searchParamsCache } from "./search-params"; export const revalidate = 120; -export default async function Page({ - params, - searchParams, -}: { - params: { domain: string }; - searchParams: { [key: string]: string | string[] | undefined }; +export default async function Page(props: { + params: Promise<{ domain: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { + const searchParams = await props.searchParams; + const params = await props.params; const page = await api.page.getPageBySlug.query({ slug: params.domain }); const { quantile, period } = searchParamsCache.parse(searchParams); diff --git a/apps/web/src/app/status-page/[domain]/page.tsx b/apps/web/src/app/status-page/[domain]/page.tsx index 0051c09f..fcb8de83 100644 --- a/apps/web/src/app/status-page/[domain]/page.tsx +++ b/apps/web/src/app/status-page/[domain]/page.tsx @@ -17,13 +17,14 @@ const WORKSPACES = process.env.WORKSPACES_LOOKBACK_30?.split(",").map(Number) || []; type Props = { - params: { domain: string }; - searchParams: { [key: string]: string | string[] | undefined }; + params: Promise<{ domain: string }>; + searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }; export const revalidate = 0; -export default async function Page({ params }: Props) { +export default async function Page(props: Props) { + const params = await props.params; const page = await api.page.getPageBySlug.query({ slug: params.domain }); if (!page) return notFound(); diff --git a/apps/web/src/app/status-page/[domain]/subscribe/route.ts b/apps/web/src/app/status-page/[domain]/subscribe/route.ts index ef0787c6..ada4dbe8 100644 --- a/apps/web/src/app/status-page/[domain]/subscribe/route.ts +++ b/apps/web/src/app/status-page/[domain]/subscribe/route.ts @@ -7,8 +7,9 @@ import { SubscribeEmail, sendEmail } from "@openstatus/emails"; export async function POST( req: Request, - { params }: { params: { domain: string } }, + props: { params: Promise<{ domain: string }> }, ) { + const params = await props.params; // const data = await req.json(); const result = z.object({ email: z.string().email() }).parse(data); diff --git a/apps/web/src/app/status-page/[domain]/verify/[token]/route.ts b/apps/web/src/app/status-page/[domain]/verify/[token]/route.ts index 2bfa8684..c9bd5844 100644 --- a/apps/web/src/app/status-page/[domain]/verify/[token]/route.ts +++ b/apps/web/src/app/status-page/[domain]/verify/[token]/route.ts @@ -3,8 +3,9 @@ import { page, pageSubscriber } from "@openstatus/db/src/schema"; export async function GET( _request: Request, - { params }: { params: { domain: string; token: string } }, + props: { params: Promise<{ domain: string; token: string }> }, ) { + const params = await props.params; const pageId = await db .select() .from(page) diff --git a/apps/web/src/components/content/mdx.tsx b/apps/web/src/components/content/mdx.tsx index 81312bf3..8ebbc921 100644 --- a/apps/web/src/components/content/mdx.tsx +++ b/apps/web/src/components/content/mdx.tsx @@ -17,6 +17,7 @@ export function Mdx({ code, className }: MdxProps) { className, )} > + {/* @ts-expect-error FIXME: nextjs 15 migration */}
); diff --git a/apps/web/src/components/data-table/data-table.tsx b/apps/web/src/components/data-table/data-table.tsx index 242efdbb..49a45d27 100644 --- a/apps/web/src/components/data-table/data-table.tsx +++ b/apps/web/src/components/data-table/data-table.tsx @@ -36,7 +36,7 @@ import { DataTableToolbar } from "./data-table-toolbar"; interface DataTableProps { columns: ColumnDef[]; data: TData[]; - renderSubComponent(props: { row: Row }): React.ReactElement; + renderSubComponent(props: { row: Row }): React.ReactElement; getRowCanExpand(row: Row): boolean; autoResetExpanded?: boolean; defaultColumnFilters?: ColumnFiltersState; diff --git a/apps/web/src/components/layout/marketing-footer.tsx b/apps/web/src/components/layout/marketing-footer.tsx index 020a6095..51f27bab 100644 --- a/apps/web/src/components/layout/marketing-footer.tsx +++ b/apps/web/src/components/layout/marketing-footer.tsx @@ -91,7 +91,7 @@ function FooterLink({ href, label, external = false }: FooterLinkProps) { return ( diff --git a/apps/web/src/components/marketing/stats.tsx b/apps/web/src/components/marketing/stats.tsx index 894525ef..7cafdee6 100644 --- a/apps/web/src/components/marketing/stats.tsx +++ b/apps/web/src/components/marketing/stats.tsx @@ -3,7 +3,7 @@ import { env } from "@/env"; import { numberFormatter } from "@/lib/utils"; import { OSTinybird } from "@openstatus/tinybird"; -const tb = new OSTinybird(env.TINY_BIRD_API_KEY); +const _tb = new OSTinybird(env.TINY_BIRD_API_KEY); export async function Stats() { // const tbLastHourStats = await tb.homeStats({ period: "1h" }); diff --git a/apps/web/src/components/marketing/status-page/tracker-example.tsx b/apps/web/src/components/marketing/status-page/tracker-example.tsx index 384abd1c..f966ac05 100644 --- a/apps/web/src/components/marketing/status-page/tracker-example.tsx +++ b/apps/web/src/components/marketing/status-page/tracker-example.tsx @@ -11,7 +11,8 @@ export async function TrackerExample() {
}> - + {/* */} +