import React, { useState } from "react"; import Head from "next/head"; import Container from "../components/content/Container"; import Main from "../components/content/Main"; import SearchInput from "../components/inputs/SearchInput"; import BoldGradientHeading from "../components/titles/BoldGradientHeading"; import CryptoChartCard from "../components/cards/CryptoChartCard"; import { cryptoChartOptions } from "../constants"; import { useCryptoList } from "../queries"; import numeral from "numeral"; import Wrapper from "../components/content/Wrapper"; import Sidebar from "../components/sidebar/Sidebar"; import { Tabs, Tab } from "../components/tabs/Tab"; import { CollectionIcon, TableIcon } from "@heroicons/react/outline"; import { Table, TableCell, TableRow } from "../components/table/Table"; import Image from "next/image"; import CryptoRowLineChart from "../components/charts/CryptoRowLineChart"; import classNames from "classnames"; import Link from "next/link"; export default function Home() { const [searchText, setSearchText] = useState(""); const listOfCoins = useCryptoList("usd", 21, false); const filteredCoins = listOfCoins.data?.filter((coin) => { return coin.name.toLowerCase().includes(searchText.toLowerCase()); }); return ( <div> <Head> <title>CryptoMetrics</title> <meta name="description" content="CryptoMetrics" /> <link rel="icon" href="/favicon.ico" /> </Head> <Wrapper> <Sidebar active="home" /> <Main> <Container> {/* Header */} <div className="flex flex-row justify-between"> {/* Main Project Title */} <BoldGradientHeading>Home</BoldGradientHeading> {/* Search Field */} <SearchInput onChange={(e) => setSearchText(e?.target.value)} /> </div> {/* Main Content */} <Tabs> <Tab id="card-view" content={<CollectionIcon className="w-6 h-6 dark:text-white" />} > <div className="flex flex-wrap gap-x-10 gap-y-10 mt-3"> {!listOfCoins.isLoading && filteredCoins.map((coin) => { return ( <CryptoChartCard key={coin.symbol} currencyId={coin.id} currencyName={coin.name} symbol={coin.symbol.toUpperCase()} icon={coin.image} info={ "$" + numeral(coin.current_price).format("0,0.[0000000]") } detail={ numeral(coin.price_change_percentage_24h).format( "+0.0[00]" ) + "%" } detailColor={ coin.price_change_percentage_24h > 0 ? "text-green-500" : "text-red-500" } options={cryptoChartOptions( coin.price_change_percentage_24h > 0 ? ["#3DBAA2"] : ["#FF7A68"], true )} type="area" /> ); })} </div> </Tab> <Tab id="list-view" content={<TableIcon className="w-6 h-6 dark:text-white" />} > <Table> <TableRow className="h-14 items-center sticky top-0 z-50"> <TableCell className="w-6 h-10"></TableCell> <TableCell className="w-24 h-10"> <p className="font-medium text-base text-center">Name</p> </TableCell> <TableCell className="w-24 h-10"> <p className="font-medium text-base text-center">Price</p> </TableCell> <TableCell className="w-[10%] h-10"> <p className="font-medium text-base text-center"> Market Cap </p> </TableCell> <TableCell className="w-40 h-10"> <p className="font-medium text-base text-center"> 24h change in % </p> </TableCell> <TableCell className="w-40 h-10"> <p className="font-medium text-base text-center"> 24h change in $ </p> </TableCell> <TableCell className="h-10"> <div className="w-52"> <p className="font-medium text-base text-center"> Chart </p> </div> </TableCell> </TableRow> {!listOfCoins.isLoading && filteredCoins.map((coin, index) => { return ( <Link key={"table_row_" + index} href={`/coins/${coin.id}`} passHref > <a> <TableRow> <TableCell className="w-6"> <Image src={coin.image} width="32px" height="32px" alt={`${coin.id}_icon`} layout="fixed" ></Image> </TableCell> <TableCell className="w-24"> <p className="font-medium text-base text-center"> {coin.name} </p> <p className="font-light text-gray-300 text-sm mt-1"> {coin.symbol.toUpperCase()} </p> </TableCell> <TableCell className="w-24"> <p className="font-light text-base text-blue-500 mt-1"> $ {numeral(coin.current_price).format( "0,0.[0000000]" )} </p> </TableCell> <TableCell className="w-[10%]"> <p className="font-light text-base text-pink-400 mt-1"> $ {numeral(coin.market_cap).format( "0,0.[000]a" )} </p> </TableCell> <TableCell className="w-40"> <p className={classNames( "font-light text-base mt-1", { "text-red-400": coin.price_change_percentage_24h < 0, "text-green-400": coin.price_change_percentage_24h >= 0, } )} > {numeral( coin.price_change_percentage_24h ).format("+0.0[00]")} % </p> </TableCell> <TableCell className="w-40"> <p className={classNames( "font-light text-base mt-1", { "text-red-400": coin.price_change_24h < 0, "text-green-400": coin.price_change_24h >= 0, } )} > {numeral(coin.price_change_24h).format( "$0,0.[0000]" )} </p> </TableCell> <TableCell> <div className="h-[50px] w-52"> <CryptoRowLineChart currencyId={coin.id} color={ coin.price_change_24h >= 0 ? "#10B981" : "#EF4444" } /> </div> </TableCell> </TableRow> </a> </Link> ); })} </Table> </Tab> </Tabs> </Container> </Main> </Wrapper> </div> ); }