diff --git a/src/app/components/CoinsMarketStats.tsx b/src/app/components/CoinsMarketStats.tsx
new file mode 100644
index 0000000..a29f626
--- /dev/null
+++ b/src/app/components/CoinsMarketStats.tsx
@@ -0,0 +1,157 @@
+import Image from "next/image";
+import { useAppSelector } from "../../redux/store";
+import { ChevronUpIcon } from "../icons/ChevronUpIcon";
+import { ChevronDownIcon } from "../icons/ChevronDownIcon";
+import { Progress } from "../components/ui/progress";
+import formatNumber from "../../app/utils/formatNumber";
+import TableGraph from "./TableGraph";
+import { TableCell, TableRow } from "./ui/table";
+
+type Coin = {
+ id: string;
+ image: string;
+ symbol: string;
+ current_price: number;
+ price_change_percentage_1h_in_currency: number;
+ price_change_percentage_24h_in_currency: number;
+ price_change_percentage_7d_in_currency: number;
+ total_volume: number;
+ market_cap: number;
+ circulating_supply: number;
+ total_supply: number;
+ sparkline_in_7d: SparklineIn7d;
+};
+
+type SparklineIn7d = {
+ price: number[];
+};
+
+type CoinsMarketStatsProps = {
+ coin: Coin;
+ index: number;
+};
+
+export default function CoinsMarketStats({
+ coin,
+ index,
+}: CoinsMarketStatsProps) {
+ const currencySymbol = useAppSelector(
+ (state) => state.currency.currentCurrency.symbol
+ );
+ return (
+ <>
+
+
+
+ {index + 1}
+
+
+
+
+ <>
+
+ {coin.id}
+
+
+ ({coin.symbol})
+
+ >
+
+
+
+ {currencySymbol}
+ {coin.current_price}
+
+
+
+ {coin.price_change_percentage_1h_in_currency > 0 ? (
+
+ ) : (
+
+ )}
+ 0
+ ? "text-[#00F0E2]"
+ : "text-[#FD2263]"
+ }`}
+ >{`${Math.abs(coin.price_change_percentage_1h_in_currency).toFixed(
+ 2
+ )}%`}
+
+
+
+
+ {coin.price_change_percentage_24h_in_currency > 0 ? (
+
+ ) : (
+
+ )}
+ 0
+ ? "text-[#00F0E2]"
+ : "text-[#FD2263]"
+ }`}
+ >{`${Math.abs(coin.price_change_percentage_24h_in_currency).toFixed(
+ 2
+ )}%`}
+
+
+
+
+ {coin.price_change_percentage_7d_in_currency > 0 ? (
+
+ ) : (
+
+ )}
+ 0
+ ? "text-[#00F0E2]"
+ : "text-[#FD2263]"
+ }`}
+ >{`${Math.abs(coin.price_change_percentage_7d_in_currency).toFixed(
+ 2
+ )}%`}
+
+
+
+
+
+ {currencySymbol}
+ {formatNumber(coin.total_volume)}
+
+
+ {currencySymbol}
+ {formatNumber(coin.market_cap)}
+
+
+
+
+
+
+
+ {formatNumber(coin.circulating_supply)}
+
+
+ {formatNumber(coin.total_supply)}
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/components/TableCoins.tsx b/src/app/components/TableCoins.tsx
new file mode 100644
index 0000000..823192a
--- /dev/null
+++ b/src/app/components/TableCoins.tsx
@@ -0,0 +1,68 @@
+"use client";
+import { useEffect } from "react";
+import { useDispatch } from "react-redux";
+import { AppDispatch, useAppSelector } from "../../redux/store";
+import { getCoinMarketData } from "../../redux/features/coinsTableSlice";
+import { Table, TableBody, TableHead, TableHeader, TableRow } from "./ui/table";
+
+import CoinsMarketStats from "./CoinsMarketStats";
+
+export default function TableCoins() {
+ const dispatch: AppDispatch = useDispatch();
+ const { coins, hasError, currentPage } = useAppSelector(
+ (state) => state.coinsTable
+ );
+
+ const currencyCode = useAppSelector(
+ (state) => state.currency.currentCurrency.code
+ );
+
+ useEffect(() => {
+ dispatch(getCoinMarketData({ currency: currencyCode, page: currentPage }));
+ }, [dispatch, currencyCode, currentPage]);
+
+ if (hasError) {
+ return Error fetching data
;
+ }
+
+ return (
+
+
+
+
+ #
+
+
+ Name
+
+
+ Price
+
+
+ 1h%
+
+
+ 24h%
+
+
+ 7d%
+
+
+ 24h volume / Market Cap
+
+
+ Circulating / Total supply
+
+
+ Last 7d
+
+
+
+
+ {coins.map((coin, index) => (
+
+ ))}
+
+
+ );
+}
diff --git a/src/app/components/TableGraph.tsx b/src/app/components/TableGraph.tsx
new file mode 100644
index 0000000..594f811
--- /dev/null
+++ b/src/app/components/TableGraph.tsx
@@ -0,0 +1,32 @@
+"use client";
+import { ResponsiveContainer, AreaChart, Area, YAxis } from "recharts";
+
+type TableGraphProps = {
+ sparklineIn7Days: number[];
+};
+
+export default function TableGraph({ sparklineIn7Days }: TableGraphProps) {
+ const formattedData = sparklineIn7Days.map((price) => ({
+ price,
+ }));
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/components/ui/table.tsx b/src/app/components/ui/table.tsx
new file mode 100644
index 0000000..a0fb636
--- /dev/null
+++ b/src/app/components/ui/table.tsx
@@ -0,0 +1,117 @@
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const Table = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+Table.displayName = "Table";
+
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableHeader.displayName = "TableHeader";
+
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableBody.displayName = "TableBody";
+
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+ tr]:last:border-b-0 dark:bg-slate-800/50",
+ className
+ )}
+ {...props}
+ />
+));
+TableFooter.displayName = "TableFooter";
+
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableRow.displayName = "TableRow";
+
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+ |
+));
+TableHead.displayName = "TableHead";
+
+const TableCell = React.forwardRef<
+ HTMLTableCellElement,
+ React.TdHTMLAttributes
+>(({ className, ...props }, ref) => (
+ |
+));
+TableCell.displayName = "TableCell";
+
+const TableCaption = React.forwardRef<
+ HTMLTableCaptionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableCaption.displayName = "TableCaption";
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+};
diff --git a/src/app/icons/ChevronDownIcon.tsx b/src/app/icons/ChevronDownIcon.tsx
index e905f41..9b34b34 100644
--- a/src/app/icons/ChevronDownIcon.tsx
+++ b/src/app/icons/ChevronDownIcon.tsx
@@ -1,10 +1,16 @@
export const ChevronDownIcon = () => {
return (
-