Skip to content

Commit

Permalink
updated docker file
Browse files Browse the repository at this point in the history
  • Loading branch information
manideep1428 committed Sep 15, 2024
1 parent e886d53 commit 57a86f3
Show file tree
Hide file tree
Showing 9 changed files with 303 additions and 60 deletions.
6 changes: 6 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ RUN npm install

COPY . .

WORKDIR /app/db

RUN npx prisma generate

WORKDIR /app

RUN npm run build

EXPOSE 3000
Expand Down
File renamed without changes.
1 change: 1 addition & 0 deletions app/api/auth/[...nextauth]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export const authOptions: NextAuthOptions = {
},
pages: {
signIn: '/auth/signin',
// signUp :"/api/signup"
},
callbacks: {
async jwt({ token, user }) {
Expand Down
2 changes: 1 addition & 1 deletion app/auth/signup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export default function SignUp() {
if (signInResult?.error) {
setError(signInResult.error)
} else {
router.push('/dashboard')
router.push('/')
}
} else {
setError(result.message)
Expand Down
106 changes: 48 additions & 58 deletions app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
"use client"

import { useEffect, useState } from "react"
import { useEffect, useState, createContext, useContext } from "react"
import { useRouter } from "next/navigation"
import Image from "next/image"
import { getCrypto } from "@/app/utils/ServerProps"
import { formatNumber } from "@/app/utils/Algorithms"
import useOnlineStatus from "@/hooks/onlineChecker"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Card, CardContent } from "@/components/ui/card"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Skeleton } from "@/components/ui/skeleton"
import { ArrowUpDown } from "lucide-react"

type CryptoData = {
id: string
Expand All @@ -21,17 +22,19 @@ type CryptoData = {
price_change_percentage_24h: number
}

const CryptoContext = createContext<{ cryptoData: CryptoData[], setCryptoData: React.Dispatch<React.SetStateAction<CryptoData[]>> } | null>(null)

export default function CryptoDashboard() {
const isOnline = useOnlineStatus()
const [cryptoData, setCryptoData] = useState<CryptoData[]>([])
const [loading, setLoading] = useState(true)
const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc')
const router = useRouter()

useEffect(() => {
const fetchAndUpdateCryptoData = async () => {
if (!isOnline) return
const data = await getCrypto()
//@ts-ignore
setCryptoData(data)
setLoading(false)
}
Expand All @@ -46,6 +49,17 @@ export default function CryptoDashboard() {
router.push(`/trade/${symbol.toUpperCase()}_USDC`)
}

const handleSort = () => {
const newOrder = sortOrder === 'asc' ? 'desc' : 'asc'
setSortOrder(newOrder)
const sortedData = [...cryptoData].sort((a, b) => {
return newOrder === 'asc'
? a.price_change_percentage_24h - b.price_change_percentage_24h
: b.price_change_percentage_24h - a.price_change_percentage_24h
})
setCryptoData(sortedData)
}

if (!isOnline) {
return (
<div className="flex justify-center items-center h-screen">
Expand All @@ -59,78 +73,54 @@ export default function CryptoDashboard() {
}

return (
<main className="container mx-auto p-4 min-h-screen">
<Card className="w-full overflow-hidden">
<CardContent className="p-6">
{loading ? (
<div className="space-y-6">
{[...Array(5)].map((_, i) => (
<div key={i} className="flex items-center space-x-6">
<Skeleton className="h-16 w-16 rounded-full" />
<div className="space-y-3 flex-1">
<Skeleton className="h-6 w-3/4" />
<Skeleton className="h-4 w-1/2" />
<CryptoContext.Provider value={{ cryptoData, setCryptoData }}>
<main className="container mx-auto p-4 min-h-screen">
<Card className="w-full overflow-hidden bg-gray-100 dark:bg-black">
<CardContent className="p-6">
{loading ? (
<div className="space-y-6">
{[...Array(10)].map((_, i) => (
<div key={i} className="flex items-center space-x-6">
<Skeleton className="h-16 w-16 rounded-full" />
<div className="space-y-3 flex-1">
<Skeleton className="h-6 w-3/4" />
<Skeleton className="h-4 w-1/2" />
</div>
</div>
</div>
))}
</div>
) : (
<>
<div className="grid grid-cols-1 gap-6 sm:hidden">
{cryptoData.map(crypto => (
<Card
key={crypto.id}
onClick={() => handleRedirect(crypto.symbol, crypto.image)}
className="p-6 hover:bg-gray-200 dark:hover:bg-gray-800 transition duration-300 cursor-pointer"
>
<CardContent className="p-6">
<div className="flex items-center gap-4 mb-4">
<Image src={crypto.image} width={48} height={48} alt={crypto.name} className="rounded-full" />
<span className="text-2xl font-bold">{crypto.name}</span>
</div>
<div className="grid grid-cols-2 gap-4 text-lg">
<div>Price: <span className="font-semibold">${crypto.current_price.toLocaleString()}</span></div>
<div>
24h Change:
<span className={`font-semibold ${crypto.price_change_percentage_24h < 0 ? 'text-red-500' : 'text-green-500'}`}>
{crypto.price_change_percentage_24h > 0 ? '+' : ''}
{crypto.price_change_percentage_24h.toFixed(2)}%
</span>
</div>
<div>Market Cap: <span className="font-semibold">${formatNumber(crypto.market_cap)}</span></div>
<div>24h Volume: <span className="font-semibold">${formatNumber(crypto.market_cap_change_24h)}</span></div>
</div>
</CardContent>
</Card>
))}
</div>
<div className="hidden sm:block overflow-x-auto">
) : (
<div className="overflow-x-auto">
<Table className="w-full">
<TableHeader>
<TableRow className="hover:bg-white dark:hover:bg-gray-800 transition-colors duration-200">
<TableRow className="hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors duration-200">
<TableHead className="text-lg font-bold">Name</TableHead>
<TableHead className="text-lg font-bold">Price</TableHead>
<TableHead className="text-lg font-bold hidden md:table-cell">Market Cap</TableHead>
<TableHead className="text-lg font-bold hidden lg:table-cell">24h Volume</TableHead>
<TableHead className="text-lg font-bold">24h Change</TableHead>
<TableHead
className="text-lg font-bold cursor-pointer"
onClick={handleSort}
>
24h Change
<ArrowUpDown className="ml-2 h-4 w-4 inline" />
</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{cryptoData.map(crypto => (
<TableRow
key={crypto.id}
onClick={() => handleRedirect(crypto.symbol, crypto.image)}
className="cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors duration-200"
className="cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors duration-200"
>
<TableCell className="py-4">
<div className="flex items-center gap-4">
<TableCell className="py-4 px-2 bottom-none">
<div className="flex items-center gap-2">
<Image src={crypto.image} width={40} height={40} alt={crypto.name} className="rounded-full" />
<span className="text-xl font-semibold">{crypto.name}</span>
</div>
</TableCell>
<TableCell className="text-xl font-bold">${crypto.current_price.toLocaleString()}</TableCell>
<TableCell className="hidden md:table-cell text-lg">${formatNumber(crypto.market_cap)}</TableCell>
<TableCell className="hidden lg:table-cell text-lg">${formatNumber(crypto.market_cap_change_24h)}</TableCell>
<TableCell className="text-lg font-semibold">
<span className={crypto.price_change_percentage_24h < 0 ? 'text-red-500' : 'text-green-500'}>
{crypto.price_change_percentage_24h > 0 ? '+' : ''}
Expand All @@ -142,10 +132,10 @@ export default function CryptoDashboard() {
</TableBody>
</Table>
</div>
</>
)}
</CardContent>
</Card>
</main>
)}
</CardContent>
</Card>
</main>
</CryptoContext.Provider>
)
}
141 changes: 141 additions & 0 deletions app/test/page.tsx
Original file line number Diff line number Diff line change
@@ -1 +1,142 @@

"use client"

import { useEffect, useState, createContext, useContext } from "react"
import { useRouter } from "next/navigation"
import Image from "next/image"
import { getCrypto } from "@/app/utils/ServerProps"
import { formatNumber } from "@/app/utils/Algorithms"
import useOnlineStatus from "@/hooks/onlineChecker"
import { Card, CardContent } from "@/components/ui/card"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Skeleton } from "@/components/ui/skeleton"
import { ArrowUpDown } from "lucide-react"

type CryptoData = {
id: string
symbol: string
name: string
image: string
current_price: number
market_cap: number
market_cap_change_24h: number
price_change_percentage_24h: number
}

const CryptoContext = createContext<{ cryptoData: CryptoData[], setCryptoData: React.Dispatch<React.SetStateAction<CryptoData[]>> } | null>(null)

export default function CryptoDashboard() {
const isOnline = useOnlineStatus()
const [cryptoData, setCryptoData] = useState<CryptoData[]>([])
const [loading, setLoading] = useState(true)
const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc')
const router = useRouter()

useEffect(() => {
const fetchAndUpdateCryptoData = async () => {
if (!isOnline) return
const data = await getCrypto()
setCryptoData(data)
setLoading(false)
}

fetchAndUpdateCryptoData()
const interval = setInterval(fetchAndUpdateCryptoData, 10000)
return () => clearInterval(interval)
}, [isOnline])

const handleRedirect = (symbol: string, imageUrl: string) => {
localStorage.setItem("imageUrl", imageUrl)
router.push(`/trade/${symbol.toUpperCase()}_USDC`)
}

const handleSort = () => {
const newOrder = sortOrder === 'asc' ? 'desc' : 'asc'
setSortOrder(newOrder)
const sortedData = [...cryptoData].sort((a, b) => {
return newOrder === 'asc'
? a.price_change_percentage_24h - b.price_change_percentage_24h
: b.price_change_percentage_24h - a.price_change_percentage_24h
})
setCryptoData(sortedData)
}

if (!isOnline) {
return (
<div className="flex justify-center items-center h-screen">
<Card className="w-full max-w-md">
<CardContent className="p-6 text-center text-2xl font-semibold">
Sorry, you are not connected to the internet.
</CardContent>
</Card>
</div>
)
}

return (
<CryptoContext.Provider value={{ cryptoData, setCryptoData }}>
<main className="container mx-auto p-4 min-h-screen">
<Card className="w-full overflow-hidden bg-gray-100 dark:bg-black">
<CardContent className="p-6">
{loading ? (
<div className="space-y-6">
{[...Array(10)].map((_, i) => (
<div key={i} className="flex items-center space-x-6">
<Skeleton className="h-16 w-16 rounded-full" />
<div className="space-y-3 flex-1">
<Skeleton className="h-6 w-3/4" />
<Skeleton className="h-4 w-1/2" />
</div>
</div>
))}
</div>
) : (
<div className="overflow-x-auto">
<Table className="w-full">
<TableHeader>
<TableRow className="hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors duration-200">
<TableHead className="text-lg font-bold">Name</TableHead>
<TableHead className="text-lg font-bold">Price</TableHead>
<TableHead className="text-lg font-bold hidden md:table-cell">Market Cap</TableHead>
<TableHead
className="text-lg font-bold cursor-pointer"
onClick={handleSort}
>
24h Change
<ArrowUpDown className="ml-2 h-4 w-4 inline" />
</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{cryptoData.map(crypto => (
<TableRow
key={crypto.id}
onClick={() => handleRedirect(crypto.symbol, crypto.image)}
className="cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors duration-200"
>
<TableCell className="py-4 px-2 bottom-none">
<div className="flex items-center gap-2">
<Image src={crypto.image} width={40} height={40} alt={crypto.name} className="rounded-full" />
<span className="text-xl font-semibold">{crypto.name}</span>
</div>
</TableCell>
<TableCell className="text-xl font-bold">${crypto.current_price.toLocaleString()}</TableCell>
<TableCell className="hidden md:table-cell text-lg">${formatNumber(crypto.market_cap)}</TableCell>
<TableCell className="text-lg font-semibold">
<span className={crypto.price_change_percentage_24h < 0 ? 'text-red-500' : 'text-green-500'}>
{crypto.price_change_percentage_24h > 0 ? '+' : ''}
{crypto.price_change_percentage_24h.toFixed(2)}%
</span>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</div>
)}
</CardContent>
</Card>
</main>
</CryptoContext.Provider>
)
}
2 changes: 1 addition & 1 deletion components/Appbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export const Appbar = () => {
</button>
</div>
<div className="hidden md:flex flex-row justify-center gap-5">
<SuccessButton onClick={handleDeposit}>Deposit</SuccessButton>
<Button onClick={handleDeposit}>Deposit</Button>
<Input type="search" placeholder="Search markets" className="max-w-sm" />
<DarkModeToggle/>
{session.data?.user ? (
Expand Down
Loading

0 comments on commit 57a86f3

Please sign in to comment.