Skip to content

Commit 13ec810

Browse files
authored
fix: [app dir bootstrapping 8] useParamsWithFallback hook and add tests (calcom#12041)
* fix: first solution using RouterContext * fix: second solution by importing router from next/compat/router * fix return type
1 parent 367c8a9 commit 13ec810

File tree

3 files changed

+81
-6
lines changed

3 files changed

+81
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { renderHook } from "@testing-library/react-hooks";
2+
import { vi } from "vitest";
3+
import { describe, expect, it } from "vitest";
4+
5+
import { useParamsWithFallback } from "./useParamsWithFallback";
6+
7+
describe("useParamsWithFallback hook", () => {
8+
it("should return router.query when param is null", () => {
9+
vi.mock("next/navigation", () => ({
10+
useParams: vi.fn().mockReturnValue(null),
11+
}));
12+
13+
vi.mock("next/compat/router", () => ({
14+
useRouter: vi.fn().mockReturnValue({ query: { id: 1 } }),
15+
}));
16+
17+
const { result } = renderHook(() => useParamsWithFallback());
18+
19+
expect(result.current).toEqual({ id: 1 });
20+
});
21+
22+
it("should return router.query when param is undefined", () => {
23+
vi.mock("next/navigation", () => ({
24+
useParams: vi.fn().mockReturnValue(undefined),
25+
}));
26+
27+
vi.mock("next/compat/router", () => ({
28+
useRouter: vi.fn().mockReturnValue({ query: { id: 1 } }),
29+
}));
30+
31+
const { result } = renderHook(() => useParamsWithFallback());
32+
33+
expect(result.current).toEqual({ id: 1 });
34+
});
35+
36+
it("should return useParams() if it exists", () => {
37+
vi.mock("next/navigation", () => ({
38+
useParams: vi.fn().mockReturnValue({ id: 1 }),
39+
}));
40+
41+
vi.mock("next/compat/router", () => ({
42+
useRouter: vi.fn().mockReturnValue(null),
43+
}));
44+
45+
const { result } = renderHook(() => useParamsWithFallback());
46+
47+
expect(result.current).toEqual({ id: 1 });
48+
});
49+
50+
it("should return useParams() if it exists", () => {
51+
vi.mock("next/navigation", () => ({
52+
useParams: vi.fn().mockReturnValue({ id: 1 }),
53+
}));
54+
55+
vi.mock("next/compat/router", () => ({
56+
useRouter: vi.fn().mockReturnValue({ query: { id: 2 } }),
57+
}));
58+
59+
const { result } = renderHook(() => useParamsWithFallback());
60+
61+
expect(result.current).toEqual({ id: 1 });
62+
});
63+
});
+10-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
"use client";
22

3+
import { useRouter as useCompatRouter } from "next/compat/router";
34
import { useParams } from "next/navigation";
4-
import { useRouter } from "next/router";
5+
import type { ParsedUrlQuery } from "querystring";
6+
7+
interface Params {
8+
[key: string]: string | string[];
9+
}
510

611
/**
712
* This hook is a workaround until pages are migrated to app directory.
813
*/
9-
export function useParamsWithFallback() {
10-
const router = useRouter();
11-
const params = useParams();
12-
return params || router.query;
14+
export function useParamsWithFallback(): Params | ParsedUrlQuery {
15+
const params = useParams(); // always `null` in pages router
16+
const router = useCompatRouter(); // always `null` in app router
17+
return params ?? router?.query ?? {};
1318
}

vitest.workspace.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const workspaces = packagedEmbedTestsOnly
3636
test: {
3737
include: ["packages/**/*.{test,spec}.{ts,js}", "apps/**/*.{test,spec}.{ts,js}"],
3838
// TODO: Ignore the api until tests are fixed
39-
exclude: ["**/node_modules/**/*", "packages/embeds/**/*"],
39+
exclude: ["**/node_modules/**/*", "packages/embeds/**/*", "packages/lib/hooks/**/*"],
4040
setupFiles: ["setupVitest.ts"],
4141
},
4242
},
@@ -67,6 +67,13 @@ const workspaces = packagedEmbedTestsOnly
6767
setupFiles: ["packages/app-store/test-setup.ts"],
6868
},
6969
},
70+
{
71+
test: {
72+
name: "@calcom/packages/lib/hooks",
73+
include: ["packages/lib/hooks/**/*.{test,spec}.{ts,js}"],
74+
environment: "jsdom",
75+
},
76+
},
7077
];
7178

7279
export default defineWorkspace(workspaces);

0 commit comments

Comments
 (0)