Skip to content

Commit 968aba6

Browse files
committed
fetching and display a users favourite countries
1 parent 6c61629 commit 968aba6

File tree

7 files changed

+75
-23
lines changed

7 files changed

+75
-23
lines changed

app/components/CountryList.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const CountryList = ({ data }: { data: Country[] }) => {
3131

3232
return (
3333
<>
34-
<div className="flex flex-wrap md:flex-nowrap justify-between py-10 gap-5">
34+
<div className="flex flex-wrap md:flex-nowrap justify-between pb-10 gap-5">
3535
<SearchCountry search={search} setSearch={setSearch} />
3636

3737
<RegionSelect

app/components/shared/NavBar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import Link from "next/link";
2-
import { GlobeAsiaAustraliaIcon } from "@heroicons/react/24/outline";
32
import ThemeToggle from "./ThemeToggle";
3+
import { GlobeAsiaAustraliaIcon } from "@heroicons/react/24/outline";
44
import { SignedIn, SignedOut, SignInButton } from "@clerk/nextjs";
55
import { SignOutButton } from "./SignOutButton";
66
import { getUser } from "@/lib/user";
77
import { auth } from "@clerk/nextjs/server";
88

99
const NavBar = async () => {
1010
const { userId } = auth();
11-
11+
1212
if (userId) await getUser();
1313

1414
return (

app/favourite-countries/page.tsx

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { getCountry } from "@/lib/countries";
2+
import { getFavouriteCountries } from "@/lib/user";
3+
import { SignedIn, SignedOut } from "@clerk/nextjs";
4+
import { auth } from "@clerk/nextjs/server";
5+
import CountryCard from "../components/CountryCard";
6+
7+
const FavouriteCountriesPage = async () => {
8+
const { userId } = auth();
9+
10+
let favouriteCountries = [];
11+
12+
if (userId) {
13+
const { countries = [], error } = await getFavouriteCountries();
14+
15+
if (error) return <div className="px-4 md:container mt-10">{error}</div>;
16+
17+
if (countries.length > 0) {
18+
favouriteCountries = await Promise.all(
19+
countries.map(async (country) => {
20+
const { data } = await getCountry(country.country);
21+
return data;
22+
})
23+
);
24+
}
25+
}
26+
27+
return (
28+
<div className="px-4 md:container mt-10">
29+
<h1 className="mb-10 text-lg font-semibold">Favourite Countries</h1>
30+
<SignedOut>
31+
<p>Please sign in to see your favourite countries</p>
32+
</SignedOut>
33+
<SignedIn>
34+
<ul className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8">
35+
{favouriteCountries.map((country) => (
36+
<li key={country.cca3}>
37+
<CountryCard country={country} />
38+
</li>
39+
))}
40+
</ul>
41+
</SignedIn>
42+
</div>
43+
);
44+
};
45+
46+
export default FavouriteCountriesPage;

app/favourites/page.tsx

-17
This file was deleted.

app/page.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ export default async function Home() {
1111
);
1212

1313
return (
14-
<main className="px-4 md:container mb-10">
14+
<main className="px-4 md:container my-10">
1515
{error && <p>{error}</p>}
1616

17-
<CountryList data={countriesInAlphabeticalOrder} />
17+
{!error && <CountryList data={countriesInAlphabeticalOrder} />}
1818
<ScrollButton />
1919
</main>
2020
);

lib/user.ts

+15
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,18 @@ export async function getUser() {
2424
console.error(error);
2525
}
2626
}
27+
28+
export async function getFavouriteCountries() {
29+
try {
30+
const user = await getUser();
31+
if (!user) return { error: "User not found" };
32+
33+
const countries = await prisma.favouriteCountry.findMany({
34+
where: { userId: user.id },
35+
});
36+
37+
return { countries };
38+
} catch (error) {
39+
return { error: "Error fetching data" };
40+
}
41+
}

prisma/schema.prisma

+9-1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,13 @@ model User {
1717
id Int @id @default(autoincrement())
1818
name String?
1919
email String @unique
20-
favCountries String[]
20+
favoriteCountries FavouriteCountry[]
2121
}
22+
23+
model FavouriteCountry {
24+
id Int @id @default(autoincrement())
25+
userId Int
26+
country String
27+
user User @relation(fields: [userId], references: [id])
28+
}
29+

0 commit comments

Comments
 (0)