Skip to content

Commit 8fe1982

Browse files
committed
Add nuqs for query state management in country list
1 parent c216e08 commit 8fe1982

File tree

4 files changed

+52
-7
lines changed

4 files changed

+52
-7
lines changed

app/components/country-list.tsx

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
"use client";
2-
import { useState } from "react";
2+
import { useQueryState } from "nuqs";
33
import { Country } from "../types/types";
44
import CountryCard from "./country-card";
55
import RegionSelect from "./region-select";
66
import SearchCountry from "./country-search";
77
import { usePathname } from "next/navigation";
88
import { FavouriteCountry } from "@prisma/client";
99
import { ArrowUpDown } from "lucide-react";
10+
import { parseAsString, parseAsStringLiteral } from "nuqs";
1011

1112
type Props = {
1213
data: Country[];
@@ -16,9 +17,12 @@ type Props = {
1617
};
1718

1819
const CountryList = ({ data, removeFavourite, countries, userId }: Props) => {
19-
const [search, setSearch] = useState("");
20-
const [selectedRegion, setSelectedRegion] = useState("all");
21-
const [sortDirection, setSortDirection] = useState<"asc" | "desc">("asc");
20+
const [search, setSearch] = useQueryState('search', parseAsString.withDefault(""));
21+
const [selectedRegion, setSelectedRegion] = useQueryState('region', parseAsString.withDefault("all"));
22+
const [sortDirection, setSortDirection] = useQueryState(
23+
'sort',
24+
parseAsStringLiteral(['asc', 'desc']).withDefault("asc")
25+
);
2226

2327
const pathname = usePathname();
2428

@@ -40,10 +44,10 @@ const CountryList = ({ data, removeFavourite, countries, userId }: Props) => {
4044
return (
4145
<div>
4246
<div className="flex flex-wrap md:flex-nowrap justify-between gap-5">
43-
<SearchCountry search={search} setSearch={setSearch} />
47+
<SearchCountry search={search || ""} setSearch={setSearch} />
4448

4549
<RegionSelect
46-
selectedRegion={selectedRegion}
50+
selectedRegion={selectedRegion || "all"}
4751
setSelectedRegion={setSelectedRegion}
4852
/>
4953
</div>

app/layout.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ClerkProvider } from "@clerk/nextjs";
55
import ScrollButton from "./components/shared/scroll-btn";
66
import NavBar from "./components/shared/navbar";
77
import Footer from "./components/shared/footer";
8+
import { NuqsAdapter } from "nuqs/adapters/next/app";
89

910
const notoSans = Noto_Sans({ subsets: ["latin"] });
1011

@@ -24,7 +25,9 @@ export default function RootLayout({
2425
<body className={notoSans.className}>
2526
<main className="flex flex-col min-h-dvh md:min-h-screen">
2627
<NavBar />
27-
<div className="px-4 md:container mt-10 flex-grow">{children}</div>
28+
<div className="px-4 md:container mt-10 flex-grow">
29+
<NuqsAdapter>{children}</NuqsAdapter>
30+
</div>
2831
<ScrollButton />
2932
<Footer />
3033
</main>

package-lock.json

+37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"lucide-solid": "^0.474.0",
2525
"next": "^14.2.23",
2626
"next-themes": "^0.3.0",
27+
"nuqs": "^2.3.2",
2728
"prisma": "^5.18.0",
2829
"react": "^18",
2930
"react-dom": "^18",

0 commit comments

Comments
 (0)