Skip to content

Commit a78cc73

Browse files
committed
refact: best way to fatching data
1 parent c9d3cdc commit a78cc73

File tree

5 files changed

+105
-58
lines changed

5 files changed

+105
-58
lines changed

app/(main)/home/page.tsx

+47-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ import { Star, BarChart3 } from "lucide-react";
1717

1818
import { UserButton } from "@clerk/nextjs";
1919

20+
import { currentUser } from "@/lib/current-user";
21+
22+
import { redirect } from "next/navigation";
23+
24+
import { db } from "@/lib/db";
25+
2026
const resumeMock = [
2127
{
2228
expenses: 200,
@@ -35,7 +41,41 @@ const resumeMock = [
3541
},
3642
];
3743

38-
const HomePage = () => {
44+
const HomePage = async () => {
45+
const user = await currentUser();
46+
47+
if (!user) return redirect("/sign-in");
48+
49+
const entries = await db.entry.findMany({
50+
where: {
51+
userId: user.id,
52+
},
53+
orderBy: {
54+
createdAt: "desc",
55+
},
56+
});
57+
58+
const expenses = await db.expense.findMany({
59+
where: {
60+
userId: user.id,
61+
},
62+
orderBy: {
63+
createdAt: "desc",
64+
},
65+
});
66+
67+
const getTotal = (type: "expense" | "entry") => {
68+
if (type === "expense") {
69+
return expenses.reduce((ac, curr) => ac + curr.amount, 0);
70+
}
71+
72+
if (type === "entry") {
73+
return entries.reduce((ac, curr) => ac + curr.amount, 0);
74+
}
75+
76+
return 0;
77+
};
78+
3979
return (
4080
<div>
4181
<div className="flex w-full lg:max-w-[1600px] justify-between items-center">
@@ -61,7 +101,10 @@ const HomePage = () => {
61101
Hello, its good to see you! <Star className="w-4 h-4" />
62102
</p>
63103
<div className="md:w-1/2">
64-
<HomeMonthStatus entriesValue={800} expensesValue={400} />
104+
<HomeMonthStatus
105+
entriesValue={getTotal("entry")}
106+
expensesValue={getTotal("expense")}
107+
/>
65108
</div>
66109
<Carousel className="md:w-1/2">
67110
<CarouselContent>
@@ -85,10 +128,10 @@ const HomePage = () => {
85128
</p>
86129
<div className="w-full flex flex-col md:flex-row gap-5">
87130
<div className="md:w-1/2">
88-
<HomeRegisterCard type="entries" />
131+
<HomeRegisterCard type="entries" registers={entries} />
89132
</div>
90133
<div className="md:w-1/2">
91-
<HomeRegisterCard type="expenses" />
134+
<HomeRegisterCard type="expenses" registers={expenses} />
92135
</div>
93136
</div>
94137
</div>

components/home/home-month-status.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ const HomeMonthStatus = ({
2020
entriesValue,
2121
expensesValue,
2222
}: HomeMonthStatusProps) => {
23-
const isPositive = () => entriesValue > expensesValue;
23+
const isPositive = entriesValue > expensesValue;
24+
const isZero = !entriesValue && !expensesValue;
2425

2526
return (
2627
<Card className="md:h-[250px] rounded-2xl shadow-sm">
@@ -37,10 +38,11 @@ const HomeMonthStatus = ({
3738
<p
3839
className={cn(
3940
`text-red-500 flex items-center text-2xl`,
40-
isPositive() && "text-green-400"
41+
isPositive && "text-green-400",
42+
isZero && "text-zinc-400"
4143
)}
4244
>
43-
{isPositive() && <Plus className="w-4 h-4" />}
45+
{isPositive && <Plus className="w-4 h-4" />}
4446
{formatValue(entriesValue - expensesValue)}
4547
</p>
4648
</CardContent>

components/home/home-register-card.tsx

+5-51
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,22 @@ import { Separator } from "../ui/separator";
1212

1313
import { Plus, TrendingDown, TrendingUp } from "lucide-react";
1414

15-
import { cn, formatValue } from "@/lib/utils";
16-
1715
import Link from "next/link";
1816

1917
import useModal from "@/hooks/use-modal-store";
2018

21-
import { Entry, Expense } from "@prisma/client";
19+
import HomeRegisterItems from "./home-register-items";
2220

23-
import { useEffect, useState } from "react";
24-
import axios from "axios";
21+
import { Entry, Expense } from "@prisma/client";
2522

2623
interface HomeRegisterCardProps {
2724
type: "expenses" | "entries";
25+
registers: Expense[] | Entry[];
2826
}
2927

30-
const HomeRegisterCard = ({ type }: HomeRegisterCardProps) => {
31-
const [registers, setRegisters] = useState<Entry[] | Expense[]>([]);
32-
const [loading, setLoading] = useState(true);
28+
const HomeRegisterCard = ({ type, registers }: HomeRegisterCardProps) => {
3329
const { onOpen } = useModal();
3430

35-
useEffect(() => {
36-
getRegisters();
37-
}, []);
38-
39-
const getRegisters = async () => {
40-
console.log(`/api/${type}`);
41-
try {
42-
setLoading(true);
43-
const registers = await axios(`/api/${type}`);
44-
45-
setRegisters(registers.data[type] as Entry[] | Expense[]);
46-
} catch (error) {
47-
console.log(error);
48-
} finally {
49-
setLoading(false);
50-
}
51-
};
52-
5331
return (
5432
<Card className="rounded-2xl shadow-sm">
5533
<CardHeader className="py-3">
@@ -71,31 +49,7 @@ const HomeRegisterCard = ({ type }: HomeRegisterCardProps) => {
7149
<Separator />
7250
<CardContent className="h-[270px] p-2 lg:h-[320px]">
7351
<ScrollArea className="h-full">
74-
{registers.length <= 0 && (
75-
<div className="w-full h-[250px] lg:h-[290px] flex items-center justify-center text-center p-2">
76-
<p className="opacity-60 text-sm lg:text-lg">
77-
You dont have any {type} records yet, create one now!
78-
</p>
79-
</div>
80-
)}
81-
{registers.length > 0 &&
82-
registers.map((register) => (
83-
<button
84-
key={register.id}
85-
className="flex w-full justify-around p-4 border mb-2 rounded-xl"
86-
>
87-
<p>{register.name}</p>
88-
<p>{}</p>
89-
<p
90-
className={cn(
91-
type === "entries" ? "text-green-500" : "text-red-400"
92-
)}
93-
>
94-
{type === "entries" ? "+" : "-"}
95-
{formatValue(register.amount)}
96-
</p>
97-
</button>
98-
))}
52+
<HomeRegisterItems type={type} registers={registers} />
9953
</ScrollArea>
10054
</CardContent>
10155
<Separator />
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { cn, formatValue } from "@/lib/utils";
2+
import { Entry, Expense } from "@prisma/client";
3+
4+
interface HomeRegisterItemsTypeProps {
5+
type: "entries" | "expenses";
6+
registers: Expense[] | Entry[];
7+
}
8+
9+
const HomeRegisterItems = ({ type, registers }: HomeRegisterItemsTypeProps) => {
10+
return (
11+
<>
12+
{registers.length <= 0 && (
13+
<div className="w-full h-[250px] lg:h-[290px] flex items-center justify-center text-center p-2">
14+
<p className="opacity-60 text-sm lg:text-lg">
15+
You dont have any {type} records yet, create one now!
16+
</p>
17+
</div>
18+
)}
19+
{registers.length > 0 &&
20+
registers.map((register) => (
21+
<button
22+
key={register.id}
23+
className="flex w-full justify-around p-4 border mb-2 rounded-xl"
24+
>
25+
<p>{register.name}</p>
26+
<p>{}</p>
27+
<p
28+
className={cn(
29+
type === "entries" ? "text-green-500" : "text-red-400"
30+
)}
31+
>
32+
{type === "entries" ? "+" : "-"}
33+
{formatValue(register.amount)}
34+
</p>
35+
</button>
36+
))}
37+
</>
38+
);
39+
};
40+
41+
export default HomeRegisterItems;

context/TestContext.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { createContext } from "react";
2+
3+
export const TestContext = createContext({});
4+
5+
export const TestProvider = ({ children }: { children: React.ReactNode }) => {
6+
return <TestContext.Provider value={{}}>{children}</TestContext.Provider>;
7+
};

0 commit comments

Comments
 (0)