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