diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 631632a79..1166ad97e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,7 +47,7 @@ jobs: npm install -g corepack mkdir -p ~/.volta/bin corepack enable --install-directory ~/.volta/bin - npm install - name: Test Build run: | + npm ci npm run build -w apps/dashboard diff --git a/apps/dashboard/src/app/(base)/[domain]/api/images/[name]/route.ts b/apps/dashboard/src/app/(base)/[domain]/api/images/[name]/route.ts index d82a4e9bd..99048b294 100644 --- a/apps/dashboard/src/app/(base)/[domain]/api/images/[name]/route.ts +++ b/apps/dashboard/src/app/(base)/[domain]/api/images/[name]/route.ts @@ -3,9 +3,9 @@ import { NextRequest } from "next/server"; export async function GET( request: NextRequest, - { params }: { params: { name: string } }, + { params }: { params: Promise<{ name: string }> }, ) { - const { name } = params; + const { name } = await params; const searchParams = request.nextUrl.searchParams; const isIcon = name.includes("_icon"); const [_name, ..._] = name.replace(isIcon ? "_icon" : "_logo", "").split("."); diff --git a/apps/dashboard/src/app/api/images/[name]/route.ts b/apps/dashboard/src/app/api/images/[name]/route.ts index d82a4e9bd..99048b294 100644 --- a/apps/dashboard/src/app/api/images/[name]/route.ts +++ b/apps/dashboard/src/app/api/images/[name]/route.ts @@ -3,9 +3,9 @@ import { NextRequest } from "next/server"; export async function GET( request: NextRequest, - { params }: { params: { name: string } }, + { params }: { params: Promise<{ name: string }> }, ) { - const { name } = params; + const { name } = await params; const searchParams = request.nextUrl.searchParams; const isIcon = name.includes("_icon"); const [_name, ..._] = name.replace(isIcon ? "_icon" : "_logo", "").split("."); diff --git a/ee/apps/platform/next-env.d.ts b/ee/apps/platform/next-env.d.ts index 40c3d6809..1b3be0840 100644 --- a/ee/apps/platform/next-env.d.ts +++ b/ee/apps/platform/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/ee/packages/console/modules/auth/invites/index.tsx b/ee/packages/console/modules/auth/invites/index.tsx index 5a41cfade..555b7e29d 100644 --- a/ee/packages/console/modules/auth/invites/index.tsx +++ b/ee/packages/console/modules/auth/invites/index.tsx @@ -5,10 +5,12 @@ import { trpc } from "@karrio/console/trpc/client"; import { useRouter } from "next/navigation"; import { useEffect } from "react"; -export default function InvitePage({ params }: { params: { token: string } }) { +export default async function InvitePage({ params }: { params: Promise<{ token: string }> }) { + const query = await params; const router = useRouter(); const { toast } = useToast(); const acceptInvitation = trpc.organizations.acceptInvitation.useMutation({ + onSuccess: (org) => { toast({ title: "Welcome!", @@ -27,8 +29,9 @@ export default function InvitePage({ params }: { params: { token: string } }) { }); useEffect(() => { - acceptInvitation.mutate({ token: params.token }); - }, [params.token]); + acceptInvitation.mutate({ token: query.token }); + }, [query.token]); + return (
Please select a project to view its dashboard @@ -472,9 +480,10 @@ export default function DashboardPage({ { retryDeployment.mutate({ - projectId: params.projectId, + projectId: projectId, }); }} + disabled={retryDeployment.status === "loading"} > {retryDeployment.status === "loading" ? ( @@ -504,9 +513,10 @@ export default function DashboardPage({ { checkTenantHealth.mutate({ - projectId: params.projectId, + projectId: projectId, }); }} + disabled={checkTenantHealth.status === "loading"} > Check Tenant Health diff --git a/ee/packages/console/modules/projects/index.tsx b/ee/packages/console/modules/projects/index.tsx index 4ef22d315..291eaebf9 100644 --- a/ee/packages/console/modules/projects/index.tsx +++ b/ee/packages/console/modules/projects/index.tsx @@ -1,13 +1,13 @@ "use client"; import { DashboardHeader } from "@karrio/console/components/dashboard-header"; -import { Search, Plus, Building2, ChevronDown } from "lucide-react"; import { Button } from "@karrio/insiders/components/ui/button"; import { Input } from "@karrio/insiders/components/ui/input"; import { Card } from "@karrio/insiders/components/ui/card"; -import { trpc } from "@karrio/console/trpc/client"; +import { ChevronRight, Search, Plus } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; -import { ChevronRight } from "lucide-react"; +import { trpc } from "@karrio/console/trpc/client"; + export default function Dashboard() { const params = useParams(); diff --git a/ee/packages/console/modules/projects/settings/index.tsx b/ee/packages/console/modules/projects/settings/index.tsx index fec455440..57c7d792b 100644 --- a/ee/packages/console/modules/projects/settings/index.tsx +++ b/ee/packages/console/modules/projects/settings/index.tsx @@ -51,21 +51,24 @@ const ProjectStatusBadge = ({ status }: { status: string }) => { ); }; -export default function SettingsPage({ +export default async function SettingsPage({ params, }: { - params: { orgId: string; projectId: string }; + params: Promise<{ orgId: string; projectId: string }>; }) { const { toast } = useToast(); const router = useRouter(); const utils = trpc.useUtils(); + const { orgId, projectId } = await params; const { data: currentProject } = trpc.projects.get.useQuery({ - id: params.projectId, - orgId: params.orgId, + id: projectId, + orgId: orgId, }); + const { data: tenant } = trpc.projects.tenant.get.useQuery({ - projectId: params.projectId, + projectId: projectId, }); + const updateProject = trpc.projects.update.useMutation<{ id: string; name: string; @@ -93,8 +96,9 @@ export default function SettingsPage({ title: "Success", description: "Project deleted successfully", }); - router.push(`/orgs/${params.orgId}`); + router.push(`/orgs/${orgId}`); }, + onError: (error) => { toast({ title: "Error", @@ -155,9 +159,10 @@ export default function SettingsPage({ const checkTenantHealth = trpc.projects.checkTenantHealth.useMutation({ onSuccess: () => { utils.projects.get.invalidate({ - id: params.projectId, - orgId: params.orgId, + id: projectId, + orgId: orgId, }); + toast({ title: "Success", description: "Tenant health check completed", @@ -178,9 +183,11 @@ export default function SettingsPage({ const handleUpdateProject = async () => { try { await updateProject.mutateAsync({ - id: params.projectId, + orgId, + id: projectId, name: projectName, - orgId: params.orgId, + + }); } catch (error) { // Error is handled by the mutation callbacks @@ -190,11 +197,12 @@ export default function SettingsPage({ const handleDeleteProject = async () => { try { await deleteProject.mutateAsync({ - id: params.projectId, + id: projectId, }); } catch (error) { // Error is handled by the mutation callbacks } + }; const copyToClipboard = (text: string) => { @@ -415,9 +423,10 @@ export default function SettingsPage({ onClick={async () => { try { await removeApiDomain.mutateAsync({ - projectId: params.projectId, + projectId: projectId, domain, }); + } catch (error: any) { toast({ title: "Error", @@ -445,9 +454,10 @@ export default function SettingsPage({ ).value; try { await addApiDomain.mutateAsync({ - projectId: params.projectId, + projectId: projectId, domain, }); + form.reset(); } catch (error: any) { toast({ @@ -520,11 +530,12 @@ export default function SettingsPage({ const currentDomains = tenant?.app_domains || []; await updateDashboardDomains.mutateAsync({ - projectId: params.projectId, + projectId: projectId, domains: currentDomains.filter( (d: string) => d !== domain, ), }); + } catch (error: any) { toast({ title: "Error", @@ -553,9 +564,10 @@ export default function SettingsPage({ try { const currentDomains = tenant?.app_domains || []; await updateDashboardDomains.mutateAsync({ - projectId: params.projectId, + projectId, domains: [...currentDomains, domain], }); + form.reset(); } catch (error: any) { toast({ diff --git a/package.json b/package.json index 6aebebcfb..b2668626b 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,7 @@ "apps/*", "packages/*", "ee/apps/*", - "ee/packages/*", - "ee/platform/packages/*" + "ee/packages/*" ], "packageManager": "npm@10.8.2" } \ No newline at end of file diff --git a/packages/core/context/image.ts b/packages/core/context/image.ts index c9ad960ab..c3e35b9dc 100644 --- a/packages/core/context/image.ts +++ b/packages/core/context/image.ts @@ -3,9 +3,9 @@ import { NextRequest } from "next/server"; export async function GET( request: NextRequest, - { params }: { params: { name: string } }, + { params }: { params: Promise<{ name: string }> }, ) { - const { name } = params; + const { name } = await params; const searchParams = request.nextUrl.searchParams; const isIcon = name.includes("_icon"); const [_name] = name.replace(isIcon ? "_icon" : "_logo", "").split("."); diff --git a/packages/core/modules/Developers/event.tsx b/packages/core/modules/Developers/event.tsx index 54d6127c8..8ead07fe8 100644 --- a/packages/core/modules/Developers/event.tsx +++ b/packages/core/modules/Developers/event.tsx @@ -120,10 +120,12 @@ export const EventComponent = ({ ); }; -export default function EventPage({ params }: { params: { id: string } }) { +export default async function EventPage({ params }: { params: Promise<{ id: string }> }) { + const query = await params; return ( <> - + > ); } + diff --git a/packages/core/modules/Developers/log.tsx b/packages/core/modules/Developers/log.tsx index ae7abd10c..e3926283e 100644 --- a/packages/core/modules/Developers/log.tsx +++ b/packages/core/modules/Developers/log.tsx @@ -361,14 +361,16 @@ export const LogComponent = ({ ); }; -export default function LogPage({ params }: { params: { id: string } }) { +export default async function LogPage({ params }: { params: Promise<{ id: string }> }) { + const query = await params; return ( <> - + > ); } + function parseRecordData(record: any) { if (!record) return null; if (record?.format === "xml") { diff --git a/packages/core/modules/Orders/draft_order.tsx b/packages/core/modules/Orders/draft_order.tsx index bc615b1b8..2d5ecb29e 100644 --- a/packages/core/modules/Orders/draft_order.tsx +++ b/packages/core/modules/Orders/draft_order.tsx @@ -29,13 +29,15 @@ const ContextProviders = bundleContexts([ ModalProvider, ]); -export default function Page({ params }: { params: { id: string } }) { - const Component = (): JSX.Element => { +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const query = await params; + const Component = ({ id }: { id: string }): JSX.Element => { const loader = useLoader(); - const id = params.id || "new"; const [ready, setReady] = useState(false); const [loading, setLoading] = useState(false); const [key, setKey] = useState(`order-${Date.now()}`); + + const { order, current, isNew, DEFAULT_STATE, query, ...mutation } = useOrderForm({ id }); @@ -551,7 +553,7 @@ export default function Page({ params }: { params: { id: string } }) { <> - + > ); diff --git a/packages/core/modules/Resources/graphiql.tsx b/packages/core/modules/Resources/graphiql.tsx index de52b7024..b6427033a 100644 --- a/packages/core/modules/Resources/graphiql.tsx +++ b/packages/core/modules/Resources/graphiql.tsx @@ -9,39 +9,31 @@ import React from "react"; export const generateMetadata = dynamicMetadata("GraphiQL"); -export default function Page(pageProps: any) { - const Component= (): JSX.Element => { - const { metadata } = useAPIMetadata(); - const { - query: { data: session }, - } = useSyncedSession(); +export default function Page() { + const { metadata } = useAPIMetadata(); + const { + query: { data: session }, + } = useSyncedSession(); - const fetcher = React.useMemo(() => { - return createGraphiQLFetcher({ - url: metadata?.GRAPHQL, - headers: { - ...(!!session?.orgId ? { "x-org-id": session.orgId } : {}), - ...(!!session?.testMode ? { "x-test-mode": session.testMode } : {}), - ...(!!session?.accessToken - ? { authorization: `Bearer ${session.accessToken}` } - : {}), - }, - }); - }, [session.accessToken]); - - return ( - - - - ); - }; + const fetcher = React.useMemo(() => { + return createGraphiQLFetcher({ + url: metadata?.GRAPHQL, + headers: { + ...(!!session?.orgId ? { "x-org-id": session.orgId } : {}), + ...(!!session?.testMode ? { "x-test-mode": session.testMode } : {}), + ...(!!session?.accessToken + ? { authorization: `Bearer ${session.accessToken}` } + : {}), + }, + }); + }, [session.accessToken]); return ( - <> - - > + + + ); } diff --git a/packages/core/modules/Shipments/shipment.tsx b/packages/core/modules/Shipments/shipment.tsx index 53104d3be..0f3516a8a 100644 --- a/packages/core/modules/Shipments/shipment.tsx +++ b/packages/core/modules/Shipments/shipment.tsx @@ -759,11 +759,12 @@ export const ShipmentComponent = ({ ); }; -export default function Page({ params }: { params: { id: string } }) { +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const query = await params; return ( <> - + > ); diff --git a/packages/core/modules/Trackers/tracking-page.tsx b/packages/core/modules/Trackers/tracking-page.tsx index d607b6ccb..71a62de9c 100644 --- a/packages/core/modules/Trackers/tracking-page.tsx +++ b/packages/core/modules/Trackers/tracking-page.tsx @@ -11,10 +11,12 @@ export const generateMetadata = dynamicMetadata("Tracking"); type DayEvents = { [k: string]: TrackingEvent[] }; -export default async function Page({ params }: { params: Collection }) { - const id = params?.id as string; +export default async function Page({ params }: { params: Promise }) { + const query = await params; + const id = query?.id as string; const { metadata } = await loadMetadata(); const client = new KarrioClient({ + basePath: url$`${(metadata?.HOST as string) || KARRIO_API}`, }); const { data: tracker, message } = await client.trackers diff --git a/packages/core/modules/Workflows/event.tsx b/packages/core/modules/Workflows/event.tsx index 9fe53b354..265300deb 100644 --- a/packages/core/modules/Workflows/event.tsx +++ b/packages/core/modules/Workflows/event.tsx @@ -226,14 +226,16 @@ export const Component = ({ ); }; -export default function Page({ params }: { params: { id: string } }) { +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const query = await params; return ( <> - + > ); } + export function parseWorkflowEventRecordData(record: any) { if (!record) return null; if (record?.format === "xml") { diff --git a/packages/core/modules/Workflows/workflow.tsx b/packages/core/modules/Workflows/workflow.tsx index c28161556..4a3da01f9 100644 --- a/packages/core/modules/Workflows/workflow.tsx +++ b/packages/core/modules/Workflows/workflow.tsx @@ -40,13 +40,14 @@ const ContextProviders = bundleContexts([ModalProvider]); hljs.registerLanguage("django", django); hljs.registerLanguage("json", json); -export default function Page({ params }: { params: { id: string } }) { - const Component = (): JSX.Element => { +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const Component = ({ id }: { id: string }): JSX.Element => { const loader = useLoader(); - const id = params.id; const { references } = useAPIMetadata(); const [key, setKey] = useState(`workflow-${Date.now()}`); const { + + workflow, current, isNew, @@ -1092,7 +1093,7 @@ export default function Page({ params }: { params: { id: string } }) { tabs={["Editor", "Executions"]} setSelectedToURL={true} > - + > diff --git a/packages/core/package.json b/packages/core/package.json index 65039244d..05ac8d7e3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -40,7 +40,7 @@ "lodash.tonumber": "^4.0.3", "mobx": "^6.12.0", "moment": "^2.29.4", - "next": "15.1.2", + "next": "15.0.3", "next-auth": "^5.0.0-beta.25", "pino": "^7.0.3", "posthog-js": "^1.96.1", @@ -66,4 +66,4 @@ "eslint-config-next": "15.0.3", "typescript": "^5.7.2" } -} +} \ No newline at end of file