diff --git a/assets/images/logo.png b/assets/images/logo.png
new file mode 100644
index 0000000..e270d85
Binary files /dev/null and b/assets/images/logo.png differ
diff --git a/components/CategoryChart.tsx b/components/CategoryChart.tsx
new file mode 100644
index 0000000..d2d37e8
--- /dev/null
+++ b/components/CategoryChart.tsx
@@ -0,0 +1,127 @@
+import React from "react";
+import { useIntl } from "react-intl";
+import { useQuery, gql } from "@apollo/client";
+import { PieChart, Pie, LabelList } from "recharts";
+import Dinero from "dinero.js";
+import Loading from "components/Loading";
+
+const GET_CATEGORY_CHART_DATA = gql`
+ query categoryChartData {
+ queryTransaction {
+ id
+ amount
+ category {
+ id
+ icon
+ name
+ }
+ }
+ }
+`;
+
+const CategoryChart: React.FC = () => {
+ const intl = useIntl();
+ const {
+ data: pieChartData,
+ loading,
+ error,
+ } = useQuery(GET_CATEGORY_CHART_DATA, {});
+ if (error) {
+ console.error(error);
+ }
+
+ const formatChartData = () => {
+ let data: {
+ name: string;
+ icon: string;
+ value: number;
+ categoryId: string;
+ }[] = [];
+
+ if (!pieChartData || !pieChartData.queryTransaction) {
+ return data;
+ }
+
+ pieChartData.queryTransaction.forEach((item: any) => {
+ const categoryIndex = data.findIndex(
+ (c) => c.categoryId === item.category.id
+ );
+ if (item.amount < 0) {
+ if (categoryIndex !== -1) {
+ data[categoryIndex].value += Math.abs(item.amount);
+ } else {
+ data.push({
+ icon: item.category.icon,
+ name: item.category.name,
+ value: Math.abs(item.amount),
+ categoryId: item.category.id,
+ });
+ }
+ }
+ });
+
+ return data;
+ };
+
+ if (loading) {
+ return