Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
64f1354
test
DangDuyLe Mar 8, 2025
3a27c77
add graphs
DangDuyLe Mar 8, 2025
a0f644c
add icons
DangDuyLe Mar 8, 2025
4281e53
add link for pages.tsx in transactions
DangDuyLe Mar 8, 2025
c18ce56
add wallet graph back to transaction page
DangDuyLe Mar 8, 2025
301401d
ahihii
HungPhan-0612 Mar 9, 2025
f54af13
Merge pull request #41 from TTMordred/hungphannelan2
TTMordred Mar 9, 2025
26a95d0
Update README.md
TTMordred Mar 10, 2025
df45da0
Update README.md
TTMordred Mar 10, 2025
bcb08c9
Update README.md
TTMordred Mar 10, 2025
6d9d2de
rename file and optimize transaction page
DangDuyLe Mar 10, 2025
d085ea3
fix conflict
DangDuyLe Mar 10, 2025
58e2356
refix error of npm run build
DangDuyLe Mar 10, 2025
fa2e250
Merge branch 'main' into branchcuadangduy
DangDuyLe Mar 10, 2025
16cd0b1
readd transaction table into transation page
DangDuyLe Mar 10, 2025
1332e4a
Merge branch 'branchcuadangduy' of https://github.com/TTMordred/Crypt…
DangDuyLe Mar 10, 2025
a3b9b80
aghhh
nguyen-trg Mar 10, 2025
4293a3e
Update README.md
TTMordred Mar 10, 2025
bacfee7
hello, do map hon ne
TTMordred Mar 10, 2025
2eb8bc1
Merge pull request #48 from TTMordred/NFT
Woft257 Mar 10, 2025
eb3d910
Update NFTCard.tsx
Woft257 Mar 10, 2025
bf8f552
fix
nguyen-trg Mar 11, 2025
51b56ca
sửa như e duy sửa
nguyen-trg Mar 11, 2025
0a2b79c
commit lại
nguyen-trg Mar 11, 2025
4e1050d
commit thêm
nguyen-trg Mar 11, 2025
c804722
hmmm
nguyen-trg Mar 11, 2025
ffcc137
concard
trinhnguyen1101 Mar 11, 2025
3f48f12
readded transaction table
DangDuyLe Mar 11, 2025
b88cc3c
Merge branch 'branchcuadangduy' of https://github.com/TTMordred/Crypt…
DangDuyLe Mar 11, 2025
7426740
readded files
DangDuyLe Mar 11, 2025
ad82a4b
fix bug
DangDuyLe Mar 11, 2025
e23c8e4
retry add transaction table
DangDuyLe Mar 11, 2025
dd917b7
Update README.md
TTMordred Mar 11, 2025
5d6ba1b
Merge branch 'main' into chia_folder_2
TTMordred Mar 11, 2025
19b7e86
Merge pull request #51 from TTMordred/chia_folder_2
TTMordred Mar 11, 2025
49b1e53
oke
TTMordred Mar 11, 2025
68e1f70
Update particle colors in ParticlesBackground component
TTMordred Mar 11, 2025
bb77a2b
Merge branch 'main' into branchcuadangduy
TTMordred Mar 12, 2025
bacdcea
Merge pull request #55 from TTMordred/branchcuadangduy
TTMordred Mar 12, 2025
af65c98
Add Supabase integration and caching for global data; update styles a…
TTMordred Mar 13, 2025
7a797f6
Update README with NextAuth and WalletConnect configuration details
TTMordred Mar 13, 2025
56e3e60
Update route.ts
TTMordred Mar 13, 2025
371b9be
keep main
TTMordred Mar 13, 2025
a639384
Refactor login page to use environment variables for Infura and Walle…
TTMordred Mar 13, 2025
ffc7f55
Update login page to store only non-sensitive user display informatio…
TTMordred Mar 13, 2025
b8a23a3
Potential fix for code scanning alert no. 5: Clear text storage of se…
TTMordred Mar 13, 2025
72e0d4a
Add root layout configuration and pending transactions API endpoint
TTMordred Mar 13, 2025
7933591
Merge branch 'update-supabase-for-database' of https://github.com/TTM…
TTMordred Mar 13, 2025
3ef3c0e
Add TypeScript type definition for encryptData function and update de…
TTMordred Mar 13, 2025
6d781e8
Potential fix for code scanning alert no. 6: Use of password hash wit…
TTMordred Mar 13, 2025
6284853
Add bcryptjs for password hashing and update login logic to enhance s…
TTMordred Mar 13, 2025
68c4404
Refactor transaction page to use Suspense for loading states and add …
TTMordred Mar 13, 2025
eff332e
Add client-side polyfills for crypto and other modules in webpack con…
TTMordred Mar 13, 2025
466721c
Add new dependencies for virtual scrolling and browser compatibility
TTMordred Mar 13, 2025
806b994
Update package dependencies and restore missing modules for improved …
TTMordred Mar 13, 2025
1f1bc3c
Update layout metadata for CryptoPath with SEO enhancements and socia…
TTMordred Mar 13, 2025
05182af
Add remote image patterns and update webpack configuration for client…
TTMordred Mar 13, 2025
6a92d94
Merge pull request #57 from TTMordred/update-supabase-for-database
TTMordred Mar 13, 2025
d18e9d7
Refactor component imports and restructure Search,Search-offchain com…
HungPhan-0612 Mar 14, 2025
7c008d3
Merge pull request #58 from TTMordred/hungphannelan2
TTMordred Mar 14, 2025
108b0cc
Refactor RevenueGraph and WalletCharts components to fetch and displa…
DangDuyLe Mar 14, 2025
8224e7a
Refactor button and input components to use consistent rounded styles…
HungPhan-0612 Mar 14, 2025
5fc6df6
Merge pull request #61 from TTMordred/hungphannelan2
HungPhan-0612 Mar 14, 2025
31a2911
Enhance TransactionGraph and API routes to support dynamic network se…
TTMordred Mar 14, 2025
3a9b193
Merge pull request #62 from TTMordred/infura_scan_wallet
TTMordred Mar 14, 2025
f4f5727
reerror
TTMordred Mar 14, 2025
bd374b8
Add address shortening functionality for user display names in Header…
TTMordred Mar 14, 2025
9c098ee
Merge pull request #63 from TTMordred/fix_longaddress_displayname
TTMordred Mar 14, 2025
0a215fa
Add TransactionSection to TransactionExplorer and refactor NetworkSta…
DangDuyLe Mar 14, 2025
0adcc24
Enhance TransactionExplorer with coin selection functionality in Reve…
DangDuyLe Mar 14, 2025
fbb6882
Refactor layout and improve styling in RevenueGraph and WalletCharts …
DangDuyLe Mar 14, 2025
f41d782
Refactor Infura API key to use environment variable
TTMordred Mar 14, 2025
698f878
Remove custom CSS file containing scrollbar styles and animations to …
DangDuyLe Mar 14, 2025
1cbb81b
Merge branch 'main' into branchcuadangduy
DangDuyLe Mar 14, 2025
2827a8c
Refactor transaction components to improve styling and readability, u…
DangDuyLe Mar 15, 2025
810cb4a
Enhance RevenueGraph component by adding display names for LoadingSta…
DangDuyLe Mar 15, 2025
3f6d6be
Refactor RevenueGraph component to improve performance and enhance us…
DangDuyLe Mar 15, 2025
536d7b0
Remove cryptoService.ts file, eliminating the CoinGecko API service a…
DangDuyLe Mar 15, 2025
58f2abb
Fix indentation in cryptoService.ts file for improved code readability.
DangDuyLe Mar 15, 2025
ea2758a
Merge pull request #70 from TTMordred/branchcuadangduy
TTMordred Mar 15, 2025
6ab251d
Add DappRadar API routes and TrendingNFTs component for NFT data fetc…
HungPhan-0612 Mar 15, 2025
da64b3d
Merge pull request #71 from TTMordred/hungphanne
TTMordred Mar 15, 2025
30123fd
aghhh
trinhnguyen1101 Mar 15, 2025
6d7613c
pls
trinhnguyen1101 Mar 15, 2025
0187cb7
Merge pull request #75 from TTMordred/new_settings_supabase_2
TTMordred Mar 15, 2025
f7f9cc5
everything related to search
TTMordred Mar 15, 2025
3dac9e6
set layout to force dynamic rendering
TTMordred Mar 15, 2025
0dc8d94
add SettingsProvider to RootLayout for improved context management
TTMordred Mar 15, 2025
099da99
Merge pull request #76 from TTMordred/search__update
TTMordred Mar 15, 2025
a49c526
add SearchOnTop component and enhance navigation with search function…
HungPhan-0612 Mar 15, 2025
347371b
Merge pull request #77 from TTMordred/hungphannelan2
TTMordred Mar 15, 2025
7e48e75
Refactor NFTTabs and NFTCard components for improved type safety, sty…
DangDuyLe Mar 15, 2025
38a9fc5
Merge pull request #78 from TTMordred/branchcuadangduy
TTMordred Mar 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,21 @@ npm install next --legacy-peer-deps
touch .env.local
```
Populate `.env.local` with:
```
```dotenv
ETHERSCAN_API_KEY=YOUR_API_KEY
ETHERSCAN_API_URL=https://api.etherscan.io/api
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-email@example.com
SMTP_PASSWORD=your-password
NEO4J_URI=neo4j+s://your-database-uri
NEO4J_USERNAME=your-username
NEO4J_PASSWORD=your-password
NEXTAUTH_URL=https://cryptopath.vercel.app/
NEXTAUTH_SECRET=your-secret-key
NEXT_PUBLIC_INFURA_KEY=your-infura-key
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=your-walletconnect-projectid
```
```bash
# Start the development server
Expand Down
259 changes: 133 additions & 126 deletions app/NFT/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import NFTCard from '@/components/NFT/NFTCard';
import NFTTabs from '@/components/NFT/NFTTabs';
import Pagination from '@/components/NFT/Pagination';
import { useWallet } from '@/components/Faucet/walletcontext';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import ParticlesBackground from '@/components/ParticlesBackground';

// Contract addresses
const NFT_CONTRACT_ADDRESS = "0x279Bd9304152E0349427c4B7F35FffFD439edcFa";
Expand Down Expand Up @@ -156,6 +158,24 @@ export default function NFTMarketplace() {
}
}, [account]);

useEffect(() => {
if (account) {
fetchNFTs();
const interval = setInterval(fetchNFTs, 15000);
return () => clearInterval(interval);
}
}, [account, fetchNFTs]);

useEffect(() => {
setCurrentPage(1);
}, [activeTab]);

useEffect(() => {
if (account) {
fetchPathBalance(account);
}
}, [account, fetchPathBalance]);

// Pagination
const paginatedData = useMemo(() => {
const start = (currentPage - 1) * ITEMS_PER_PAGE;
Expand Down Expand Up @@ -282,142 +302,129 @@ export default function NFTMarketplace() {
}
};

// Effects
useEffect(() => {
if (account) {
fetchNFTs();
const interval = setInterval(fetchNFTs, 15000);
return () => clearInterval(interval);
}
}, [account, fetchNFTs]);

useEffect(() => {
setCurrentPage(1);
}, [activeTab]);

useEffect(() => {
if (account) {
fetchPathBalance(account);
}
}, [account, fetchPathBalance]);

return (
<div className="min-h-screen bg-gray-900 p-6 lg:p-8 relative overflow-hidden">
{/* Background effects */}

<header className="flex flex-col lg:flex-row justify-between items-center mb-8 gap-6 animate-fade-in">
<h1 className="text-3xl lg:text-4xl font-bold bg-gradient-to-r from-orange-400 to-purple-400 bg-clip-text text-transparent">
NFT Marketplace
</h1>
<div className="flex items-center gap-4">
{account && (
<div className="hidden sm:flex items-center px-4 py-2 bg-gray-800 rounded-lg border border-gray-700 backdrop-blur-xs">
<span className="text-orange-400 font-mono font-medium tracking-tight">
{pathBalance}
</span>
<span className="text-gray-300 ml-2 font-medium">PATH</span>
</div>
)}
<button
onClick={() => {
if (!account) {
if (!window.ethereum) {
alert('Please install MetaMask!');
return;
<div className="relative min-h-screen bg-transparent text-white font-exo2">
<ParticlesBackground />
<div className="container mx-auto p-4 relative z-10">
{/* Updated header section with centered title */}
<header className="relative p-4 bg-black rounded-md shadow-md">
{/* Centered title */}
<h1 className="text-center text-3xl lg:text-4xl font-bold tracking-tight text-orange-400">
NFT Marketplace
</h1>
{/* Wallet info positioned absolutely to the right */}
<div className="absolute top-1/2 right-4 transform -translate-y-1/2 flex items-center gap-4">
{account && (
<div className="hidden sm:flex items-center space-x-2 px-3 py-2 bg-black rounded-full border border-gray-800">
<span className="text-orange-500 font-mono font-medium tracking-tight">
{pathBalance}
</span>
<span className="text-white font-medium">PATH</span>
</div>
)}
<button
onClick={() => {
if (!account) {
if (!window.ethereum) {
alert('Please install MetaMask!');
return;
}
connectWallet();
}
connectWallet();
}}
className="flex items-center px-5 py-2 rounded-full bg-orange-500 hover:bg-orange-600 text-white transition-all text-sm lg:text-base shadow-lg"
>
{account
? `Connected: ${account.slice(0, 6)}...${account.slice(-4)}`
: 'Connect Wallet'
}
}}
className="px-6 py-2 bg-orange-500/90 hover:bg-orange-600 rounded-xl transition-all text-sm lg:text-base
shadow-lg hover:shadow-orange-500/20"
>
{account ?
`Connected: ${account.slice(0, 6)}...${account.slice(-4)}` :
'Connect Wallet'
}
</button>
</div>
</header>

<NFTTabs
activeTab={activeTab}
setActiveTab={setActiveTab}
balances={{
market: nftData.market.length,
owned: nftData.owned.length,
listings: nftData.listings.length
}}
/>

{!account ? (
<div className="text-center py-20 text-gray-400 animate-fade-in">
Please connect your wallet to view NFTs
</div>
) : (
<>
{isInitialLoad ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-5">
{[...Array(8)].map((_, i) => (
<div
key={i}
className="animate-pulse bg-gray-800 rounded-xl h-[500px] shadow-lg"
/>
))}
</div>
) : (
<>
</button>
</div>
</header>
{/* End updated header section */}

<NFTTabs
activeTab={activeTab}
setActiveTab={setActiveTab}
balances={{
market: nftData.market.length,
owned: nftData.owned.length,
listings: nftData.listings.length
}}
/>

{!account ? (
<div className="text-center py-20 text-gray-400">
Please connect your wallet to view NFTs
</div>
) : (
<>
{isInitialLoad ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-5">
{paginatedData.map((nft, index) => (
{[...Array(8)].map((_, i) => (
<div
key={nft.id}
className="animate-fade-in-right"
style={{ animationDelay: `${index * 50}ms` }}
>
<NFTCard
nft={nft}
mode={activeTab === 'listings' ? 'listing' : activeTab}
onAction={
activeTab === 'market' ? (tokenId, price) => handleBuyNFT(tokenId, price || '0') :
activeTab === 'owned' ? (tokenId, price) => handleListNFT(tokenId, price || '0') :
handleUnlistNFT
}
processing={processing}
/>
</div>
key={i}
className="animate-pulse bg-black rounded-xl h-[500px] shadow-lg"
/>
))}
</div>
) : (
<>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-5">
{paginatedData.map((nft, index) => (
<div
key={nft.id}
className="animate-fade-in-right"
style={{ animationDelay: `${index * 50}ms` }}
>
<NFTCard
nft={nft}
mode={activeTab === 'listings' ? 'listing' : activeTab}
onAction={
activeTab === 'market'
? (tokenId, price) => handleBuyNFT(tokenId, price || '0')
: activeTab === 'owned'
? (tokenId, price) => handleListNFT(tokenId, price || '0')
: handleUnlistNFT
}
processing={processing}
/>
</div>
))}
</div>

{totalPages > 1 && (
<div className="mt-8 animate-scale-up">
<Pagination
currentPage={currentPage}
totalPages={totalPages}
onPageChange={handlePageChange}
{totalPages > 1 && (
<div className="mt-8">
<Pagination
currentPage={currentPage}
totalPages={totalPages}
onPageChange={handlePageChange}
/>
</div>
)}
</>
)}
</>
)}

{processing && (
<div className="fixed inset-0 bg-black/80 backdrop-blur-xs flex items-center justify-center z-50">
<div className="bg-black/90 p-8 rounded-2xl text-center border border-orange-400/20 shadow-xl">
<div className="animate-spin h-12 w-12 border-4 border-orange-400 border-t-transparent rounded-full mb-4 mx-auto" />
<h3 className="text-xl text-white mb-2 font-semibold">Processing Transaction</h3>
<div className="flex items-center justify-center space-x-2">
{[...Array(3)].map((_, i) => (
<div
key={i}
className="animate-float h-3 w-3 bg-orange-400 rounded-full"
style={{ animationDelay: `${i * 0.2}s` }}
/>
</div>
)}
</>
)}
</>
)}

{processing && (
<div className="fixed inset-0 bg-black/80 backdrop-blur-xs flex items-center justify-center z-50 animate-fade-in">
<div className="bg-gray-800/90 p-8 rounded-2xl text-center border border-orange-400/20 shadow-xl">
<div className="animate-spin h-12 w-12 border-4 border-orange-400 border-t-transparent rounded-full mb-4 mx-auto" />
<h3 className="text-xl text-white mb-2 font-semibold">Processing Transaction</h3>
<div className="flex items-center justify-center space-x-2">
{[...Array(3)].map((_, i) => (
<div
key={i}
className="animate-float h-3 w-3 bg-orange-400 rounded-full"
style={{ animationDelay: `${i * 0.2}s` }}
/>
))}
))}
</div>
</div>
</div>
</div>
)}
)}
</div>
</div>
);
}
}
39 changes: 39 additions & 0 deletions app/api/dappradar-trending-nft/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const chain = searchParams.get('chain') || 'ethereum';
const API_KEY = process.env.REACT_APP_DAPPRADAR_API_KEY;

try {
const nftResponse = await fetch(`https://apis.dappradar.com/v2/nfts/collections?range=24h&sort=sales&order=desc&chain=${chain}&resultsPerPage=10`, {
headers: {
accept: 'application/json',
'x-api-key': API_KEY || '',
},
}
);


// Check if any request failed.
if (!nftResponse.ok) {
return NextResponse.json(
{
error: `Returned an error: dapps(${nftResponse.status}))`,
},
{ status: 404 }
);
}

const nftData = await nftResponse.json();

return NextResponse.json({
nfts: nftData,
});
} catch (error: any) {
return NextResponse.json(
{ error: error.message || 'Internal server error' },
{ status: 500 }
);
}
}
Loading