From 8f98a37be8ac360b3a0630015ecd6cbad3bbe52a Mon Sep 17 00:00:00 2001 From: Jason Schwarz Date: Mon, 26 Jan 2026 12:32:18 -0400 Subject: [PATCH 1/4] feat: EcosystemSetsCarousel component --- package-lock.json | 20 ++ package.json | 1 + public/assets/nfts/azuki.jpg | Bin 0 -> 6357 bytes public/assets/nfts/doodles.jpg | Bin 0 -> 21025 bytes public/assets/nfts/moonbirds.jpg | Bin 0 -> 12764 bytes public/assets/nfts/pudgy-penguins.jpg | Bin 0 -> 13157 bytes public/assets/nfts/yuga-labs.jpg | Bin 0 -> 5684 bytes src/app/(app)/dashboard/page.tsx | 3 + .../dashboard/EcosystemSetsCarousel.tsx | 268 ++++++++++++++++++ 9 files changed, 292 insertions(+) create mode 100644 public/assets/nfts/azuki.jpg create mode 100644 public/assets/nfts/doodles.jpg create mode 100644 public/assets/nfts/moonbirds.jpg create mode 100644 public/assets/nfts/pudgy-penguins.jpg create mode 100644 public/assets/nfts/yuga-labs.jpg create mode 100644 src/components/dashboard/EcosystemSetsCarousel.tsx diff --git a/package-lock.json b/package-lock.json index 570f9f4..1579c9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,6 +68,7 @@ "react-social-icons": "^6.25.0", "recharts": "^2.15.4", "sonner": "^1.7.4", + "swiper": "^12.0.3", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", "vaul": "^0.9.9", @@ -16740,6 +16741,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swiper": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-12.0.3.tgz", + "integrity": "sha512-BHd6U1VPEIksrXlyXjMmRWO0onmdNPaTAFduzqR3pgjvi7KfmUCAm/0cj49u2D7B0zNjMw02TSeXfinC1hDCXg==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "license": "MIT", + "engines": { + "node": ">= 4.7.0" + } + }, "node_modules/tailwind-merge": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", diff --git a/package.json b/package.json index 06d672b..0b4d54d 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "react-social-icons": "^6.25.0", "recharts": "^2.15.4", "sonner": "^1.7.4", + "swiper": "^12.0.3", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", "vaul": "^0.9.9", diff --git a/public/assets/nfts/azuki.jpg b/public/assets/nfts/azuki.jpg new file mode 100644 index 0000000000000000000000000000000000000000..800b31ba21398a23704d5e684311edc690f9cb17 GIT binary patch literal 6357 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 literal 0 HcmV?d00001 diff --git a/public/assets/nfts/doodles.jpg b/public/assets/nfts/doodles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..402a17ddb08328d1a5a94a07009ca5cc410406e6 GIT binary patch literal 21025 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 E4;`ao+5i9m literal 0 HcmV?d00001 diff --git a/public/assets/nfts/pudgy-penguins.jpg b/public/assets/nfts/pudgy-penguins.jpg new file mode 100644 index 0000000000000000000000000000000000000000..383922864a132971b53a644dbc8220b7b2e45f00 GIT binary patch literal 13157 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 literal 0 HcmV?d00001 diff --git a/public/assets/nfts/yuga-labs.jpg b/public/assets/nfts/yuga-labs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8f1efdeadb404b4cb05838602f0acf5630d5908 GIT binary patch literal 5684 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 Ip+mLrA6cZ?RR910 literal 0 HcmV?d00001 diff --git a/src/app/(app)/dashboard/page.tsx b/src/app/(app)/dashboard/page.tsx index 685bd08..bc118d0 100644 --- a/src/app/(app)/dashboard/page.tsx +++ b/src/app/(app)/dashboard/page.tsx @@ -40,6 +40,7 @@ import { OneTimeTasksSection } from "@/components/dashboard/OneTimeTasksSection" import { SBTGatingModal } from "@/components/modals/SBTGatingModal" import { TransactionFeedbackModal } from "@/components/modals/TransactionFeedbackModal" import { ReferralModal } from "@/components/modals/ReferralModal" +import { EcosystemSetCarousel } from "@/components/dashboard/EcosystemSetsCarousel" import type { TaskName } from "@/hooks/use-dashboard-tasks" @@ -204,6 +205,8 @@ const DashboardContent = () => { + + { + const { address: userAddress, isConnected } = useAccount(); + const [verifiedSets, setVerifiedSets] = useState>({}); + const [isInitialLoading, setIsInitialLoading] = useState(true); + const [manualLoadingId, setManualLoadingId] = useState(null); + + const [emblaRef, emblaApi] = useEmblaCarousel({ + loop: true, + align: "start", + skipSnaps: false + }); + + const markAsVerified = useCallback((id: string) => { + setVerifiedSets((prev) => { + if (prev[id]) return prev; + const next = { ...prev, [id]: true }; + localStorage.setItem(`verified_${id}`, "true"); + return next; + }); + }, []); + + const syncWithBlockchain = useCallback((resultsArray: any[]) => { + let globalIndex = 0; + ECOSYSTEM_SETS.forEach((set) => { + // Check all addresses for this specific set + for (let i = 0; i < set.addresses.length; i++) { + const res = resultsArray[globalIndex++]; + // Return once the first balance is found for this set + if (res.status === "success" && Number(res.result) > 0) { + markAsVerified(set.id); + // Advance globalIndex for the remaining addresses in this set and break to next set + globalIndex += (set.addresses.length - 1 - i); + break; + } + } + }); + }, [markAsVerified]); + + const contracts = useMemo(() => { + if (!userAddress || TEST_MODE) return []; + // Flatten all addresses into a single contract call array + return ECOSYSTEM_SETS.flatMap((set) => + set.addresses.map((addr) => ({ + address: addr, + abi: erc721Abi, + functionName: "balanceOf", + args: [userAddress], + })) + ); + }, [userAddress]); + + const { data: blockchainData, refetch } = useReadContracts({ + contracts, + query: { enabled: isConnected && !!userAddress && !TEST_MODE } + }); + + useEffect(() => { + const cached: Record = {}; + ECOSYSTEM_SETS.forEach(s => { + if (localStorage.getItem(`verified_${s.id}`) === "true") cached[s.id] = true; + }); + setVerifiedSets(cached); + + const timer = setTimeout(() => setIsInitialLoading(false), 1200); + return () => clearTimeout(timer); + }, []); + + useEffect(() => { + if (blockchainData && !TEST_MODE) syncWithBlockchain(blockchainData as any[]); + }, [blockchainData, syncWithBlockchain]); + + const handleVerify = async (id: string) => { + setManualLoadingId(id); + await new Promise(resolve => setTimeout(resolve, 800)); + + if (TEST_MODE) { + markAsVerified(id); + } else { + if (!isConnected) { + alert("Please connect your wallet!"); + setManualLoadingId(null); + return; + } + const { data } = await refetch(); + if (data) syncWithBlockchain(data as any[]); + } + setManualLoadingId(null); + }; + + return ( +
+ {TEST_MODE && ( +
+ Test Mode +
+ )} + +
+
+ {isInitialLoading + ? "-- / --" + : `${Object.keys(verifiedSets).length}/${ECOSYSTEM_SETS.length}`}{" "} + Verified +
+
+ +
+
+ +

Verify Assets

+
+
+ +

+ Unlock exclusive badges by verifying your activity. +

+ +
+
+
+ {ECOSYSTEM_SETS.map((set) => { + const isVerified = !!verifiedSets[set.id]; + const isVerifying = manualLoadingId === set.id; + + return ( +
+
+ + {isInitialLoading ? ( +
+
+
+
+
+ ) : ( + <> +
+
+ {set.name} +
+ {isVerified && ( +
+ +
+ )} +
+ +

+ {set.name} +

+ + + + )} +
+
+ ); + })} +
+
+ + + +
+
+ ); +}; \ No newline at end of file From a3563e9ee13430129b03eb76dbaadc53149a17e9 Mon Sep 17 00:00:00 2001 From: Jason Schwarz Date: Tue, 27 Jan 2026 08:23:15 -0400 Subject: [PATCH 2/4] refactor: move assets to R2 bucket --- public/assets/nfts/azuki.jpg | Bin 6357 -> 0 bytes public/assets/nfts/doodles.jpg | Bin 21025 -> 0 bytes public/assets/nfts/moonbirds.jpg | Bin 12764 -> 0 bytes public/assets/nfts/pudgy-penguins.jpg | Bin 13157 -> 0 bytes public/assets/nfts/yuga-labs.jpg | Bin 5684 -> 0 bytes .../dashboard/EcosystemSetsCarousel.tsx | 282 ++++++++++-------- 6 files changed, 157 insertions(+), 125 deletions(-) delete mode 100644 public/assets/nfts/azuki.jpg delete mode 100644 public/assets/nfts/doodles.jpg delete mode 100644 public/assets/nfts/moonbirds.jpg delete mode 100644 public/assets/nfts/pudgy-penguins.jpg delete mode 100644 public/assets/nfts/yuga-labs.jpg diff --git a/public/assets/nfts/azuki.jpg b/public/assets/nfts/azuki.jpg deleted file mode 100644 index 800b31ba21398a23704d5e684311edc690f9cb17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6357 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 diff --git a/public/assets/nfts/doodles.jpg b/public/assets/nfts/doodles.jpg deleted file mode 100644 index 402a17ddb08328d1a5a94a07009ca5cc410406e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21025 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 E4;`ao+5i9m diff --git a/public/assets/nfts/pudgy-penguins.jpg b/public/assets/nfts/pudgy-penguins.jpg deleted file mode 100644 index 383922864a132971b53a644dbc8220b7b2e45f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13157 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 diff --git a/public/assets/nfts/yuga-labs.jpg b/public/assets/nfts/yuga-labs.jpg deleted file mode 100644 index d8f1efdeadb404b4cb05838602f0acf5630d5908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5684 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 Ip+mLrA6cZ?RR910 diff --git a/src/components/dashboard/EcosystemSetsCarousel.tsx b/src/components/dashboard/EcosystemSetsCarousel.tsx index 233d9c8..258710c 100644 --- a/src/components/dashboard/EcosystemSetsCarousel.tsx +++ b/src/components/dashboard/EcosystemSetsCarousel.tsx @@ -1,169 +1,190 @@ -import React, { useState, useEffect, useCallback, useMemo } from "react"; -import useEmblaCarousel from "embla-carousel-react"; -import { ShieldCheck, ChevronLeft, ChevronRight, Loader2, Check, Beaker } from "lucide-react"; -import { useAccount, useReadContracts } from "wagmi"; -import { erc721Abi } from "viem"; +import React, { useState, useEffect, useCallback, useMemo } from "react" +import useEmblaCarousel from "embla-carousel-react" +import { ShieldCheck, ChevronLeft, ChevronRight, Loader2, Check, Beaker } from "lucide-react" +import { useAccount, useReadContracts } from "wagmi" +import { erc721Abi } from "viem" /** * TEST CONFIGURATION * Set TEST_MODE to true to bypass blockchain checks and force successful verification. */ -const TEST_MODE = true; +const TEST_MODE = true + +const ASSETS_URL = process.env.NEXT_PUBLIC_R2_BASE_URL + +const AZUKI_IMG = `${ASSETS_URL}/nfts/azuki.jpg` +const DOODLES_IMG = `${ASSETS_URL}/nfts/doodles.jpg` +const MOONBIRDS_IMG = `${ASSETS_URL}/nfts/moonbirds.jpg` +const PUDGY_PENGUINS_IMG = `${ASSETS_URL}/nfts/pudgy-penguins.jpg` +const YUGA_LABS_IMG = `${ASSETS_URL}/nfts/yuga-labs.jpg` const ECOSYSTEM_SETS = [ - { - id: "pudgy", - name: "Pudgy\nPenguins", - img: "assets/nfts/pudgy-penguins.jpg", + { + id: "pudgy", + name: "Pudgy\nPenguins", + img: PUDGY_PENGUINS_IMG, addresses: [ "0xbd3531da5cf5857e7cfaa92426877b022e612cf8", // Pudgy Penguins "0x524cab2ec69124574082676e6f654a18df49a048", // Lil Pudgys - "0x062e691c2054de82f28008a8ccc6d7a1c8ce060d" // Pudgy Rods - ] as const + "0x062e691c2054de82f28008a8ccc6d7a1c8ce060d", // Pudgy Rods + ] as const, }, - { - id: "moonbirds", - name: "Moonbirds", - img: "assets/nfts/moonbirds.jpg", + { + id: "moonbirds", + name: "Moonbirds", + img: MOONBIRDS_IMG, addresses: [ "0x23581767a106ae21c074b2276d25e5c3e136a68b", // Moonbirds "0x1792a96e5668ad7c167ab804a100ce42395ce54d", // Moonbirds Oddities - "0xc0ffee8ff7e5497c2d6f7684859709225fcc5be8" // Moonbirds Mythics - ] as const + "0xc0ffee8ff7e5497c2d6f7684859709225fcc5be8", // Moonbirds Mythics + ] as const, }, - { - id: "azuki", - name: "Azuki", - img: "assets/nfts/azuki.jpg", + { + id: "azuki", + name: "Azuki", + img: AZUKI_IMG, addresses: [ "0xed5af388653567af2f388e6224dc7c4b3241c544", // Azuki "0x306b1ea3ecdf94ab739f1910bbda052ed4a9f949", // BEANZ - "0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e" // Azuki Elementals - ] as const + "0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e", // Azuki Elementals + ] as const, }, - { - id: "yuga", - name: "Yuga Labs", - img: "assets/nfts/yuga-labs.jpg", + { + id: "yuga", + name: "Yuga Labs", + img: YUGA_LABS_IMG, addresses: [ "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", // BAYC "0x60e4d786628fea6478f785a6d7e704777c86a7c6", // MAYC "0xba30e5f9bb24caa003e9f2f0497ad287fdf95623", // BAKC "0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258", // Otherdeed "0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb", // CryptoPunks - "0x7bd29408f11d2bfc23c34f18275bbf23bb716bc7" // Meebits - ] as const + "0x7bd29408f11d2bfc23c34f18275bbf23bb716bc7", // Meebits + ] as const, }, - { - id: "doodles", - name: "Doodles", - img: "assets/nfts/doodles.jpg", + { + id: "doodles", + name: "Doodles", + img: DOODLES_IMG, addresses: [ "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e", // Doodles "0x89afdbf071050a67cfdc28b2ccb4277eef598f37", // Space Doodles - "0x466cfcd0525189b573e794f554b8a751279213ac" // The Dooplicator - ] as const + "0x466cfcd0525189b573e794f554b8a751279213ac", // The Dooplicator + ] as const, }, -]; +] export const EcosystemSetCarousel = () => { - const { address: userAddress, isConnected } = useAccount(); - const [verifiedSets, setVerifiedSets] = useState>({}); - const [isInitialLoading, setIsInitialLoading] = useState(true); - const [manualLoadingId, setManualLoadingId] = useState(null); + const { address: userAddress, isConnected } = useAccount() + const [verifiedSets, setVerifiedSets] = useState>({}) + const [isInitialLoading, setIsInitialLoading] = useState(true) + const [manualLoadingId, setManualLoadingId] = useState(null) const [emblaRef, emblaApi] = useEmblaCarousel({ loop: true, align: "start", - skipSnaps: false - }); + skipSnaps: false, + }) const markAsVerified = useCallback((id: string) => { setVerifiedSets((prev) => { - if (prev[id]) return prev; - const next = { ...prev, [id]: true }; - localStorage.setItem(`verified_${id}`, "true"); - return next; - }); - }, []); + if (prev[id]) return prev + const next = { ...prev, [id]: true } + localStorage.setItem(`verified_${id}`, "true") + return next + }) + }, []) - const syncWithBlockchain = useCallback((resultsArray: any[]) => { - let globalIndex = 0; - ECOSYSTEM_SETS.forEach((set) => { - // Check all addresses for this specific set - for (let i = 0; i < set.addresses.length; i++) { - const res = resultsArray[globalIndex++]; - // Return once the first balance is found for this set - if (res.status === "success" && Number(res.result) > 0) { - markAsVerified(set.id); - // Advance globalIndex for the remaining addresses in this set and break to next set - globalIndex += (set.addresses.length - 1 - i); - break; + const syncWithBlockchain = useCallback( + (resultsArray: any[]) => { + let globalIndex = 0 + ECOSYSTEM_SETS.forEach((set) => { + // Check all addresses for this specific set + for (let i = 0; i < set.addresses.length; i++) { + const res = resultsArray[globalIndex++] + // Return once the first balance is found for this set + if (res.status === "success" && Number(res.result) > 0) { + markAsVerified(set.id) + // Advance globalIndex for the remaining addresses in this set and break to next set + globalIndex += set.addresses.length - 1 - i + break + } } - } - }); - }, [markAsVerified]); + }) + }, + [markAsVerified] + ) const contracts = useMemo(() => { - if (!userAddress || TEST_MODE) return []; + if (!userAddress || TEST_MODE) return [] // Flatten all addresses into a single contract call array - return ECOSYSTEM_SETS.flatMap((set) => + return ECOSYSTEM_SETS.flatMap((set) => set.addresses.map((addr) => ({ address: addr, abi: erc721Abi, functionName: "balanceOf", args: [userAddress], })) - ); - }, [userAddress]); + ) + }, [userAddress]) const { data: blockchainData, refetch } = useReadContracts({ contracts, - query: { enabled: isConnected && !!userAddress && !TEST_MODE } - }); + query: { enabled: isConnected && !!userAddress && !TEST_MODE }, + }) useEffect(() => { - const cached: Record = {}; - ECOSYSTEM_SETS.forEach(s => { - if (localStorage.getItem(`verified_${s.id}`) === "true") cached[s.id] = true; - }); - setVerifiedSets(cached); + const cached: Record = {} + ECOSYSTEM_SETS.forEach((s) => { + if (localStorage.getItem(`verified_${s.id}`) === "true") cached[s.id] = true + }) + setVerifiedSets(cached) - const timer = setTimeout(() => setIsInitialLoading(false), 1200); - return () => clearTimeout(timer); - }, []); + const timer = setTimeout(() => setIsInitialLoading(false), 1200) + return () => clearTimeout(timer) + }, []) useEffect(() => { - if (blockchainData && !TEST_MODE) syncWithBlockchain(blockchainData as any[]); - }, [blockchainData, syncWithBlockchain]); + if (blockchainData && !TEST_MODE) syncWithBlockchain(blockchainData as any[]) + }, [blockchainData, syncWithBlockchain]) const handleVerify = async (id: string) => { - setManualLoadingId(id); - await new Promise(resolve => setTimeout(resolve, 800)); + setManualLoadingId(id) + await new Promise((resolve) => setTimeout(resolve, 800)) if (TEST_MODE) { - markAsVerified(id); + markAsVerified(id) } else { if (!isConnected) { - alert("Please connect your wallet!"); - setManualLoadingId(null); - return; + alert("Please connect your wallet!") + setManualLoadingId(null) + return } - const { data } = await refetch(); - if (data) syncWithBlockchain(data as any[]); + const { data } = await refetch() + if (data) syncWithBlockchain(data as any[]) } - setManualLoadingId(null); - }; + setManualLoadingId(null) + } + + // Ensure you add these states to your component: + const [canScrollPrev, setCanScrollPrev] = useState(false) + const [canScrollNext, setCanScrollNext] = useState(false) + + // Add this useEffect to handle the logic: + useEffect(() => { + if (!emblaApi) return + const onSelect = () => { + setCanScrollPrev(emblaApi.canScrollPrev()) + setCanScrollNext(emblaApi.canScrollNext()) + } + emblaApi.on("select", onSelect) + emblaApi.on("reInit", onSelect) + onSelect() + }, [emblaApi]) return (
- {TEST_MODE && ( -
- Test Mode -
- )} -
-
+
{isInitialLoading ? "-- / --" : `${Object.keys(verifiedSets).length}/${ECOSYSTEM_SETS.length}`}{" "} @@ -174,25 +195,29 @@ export const EcosystemSetCarousel = () => {
-

Verify Assets

+

Verify Assets

-

- Unlock exclusive badges by verifying your activity. -

+

Unlock exclusive badges by verifying your activity.

-
+ {/* Added 'ml-[-12px]' to offset the padding on the first item and keep alignment centered */} +
{ECOSYSTEM_SETS.map((set) => { - const isVerified = !!verifiedSets[set.id]; - const isVerifying = manualLoadingId === set.id; + const isVerified = !!verifiedSets[set.id] + const isVerifying = manualLoadingId === set.id return ( -
-
- + /* Changed: Added 'pl-3' to provide the gap within the slide itself */ +
+
{isInitialLoading ? (
@@ -202,7 +227,9 @@ export const EcosystemSetCarousel = () => { ) : ( <>
-
+
{set.name} { onClick={() => handleVerify(set.id)} disabled={isVerified || isVerifying} className={`mt-auto w-full py-2 rounded-full text-[9px] font-bold uppercase border tracking-widest transition-all ${ - isVerified - ? "border-blue-900/50 text-[#4da1ff] bg-blue-900/20 cursor-default" + isVerified + ? "border-blue-900/50 text-[#4da1ff] bg-blue-900/20 cursor-default" : "border-[#4da1ff] text-[#4da1ff] hover:bg-[#4da1ff]/10 active:scale-95 cursor-pointer" }`} > @@ -245,24 +272,29 @@ export const EcosystemSetCarousel = () => { )}
- ); + ) })}
- - + {canScrollPrev && ( + + )} + + {canScrollNext && ( + + )}
- ); -}; \ No newline at end of file + ) +} From 62a399f3056b65dcca598fb9bfeac521c6cd1e74 Mon Sep 17 00:00:00 2001 From: Jason Schwarz Date: Tue, 27 Jan 2026 17:12:01 -0400 Subject: [PATCH 3/4] feat: add database --- .../[wallet_address]/route.ts | 99 ++++++++ .../dashboard/EcosystemSetsCarousel.tsx | 239 +++++++++++------- 2 files changed, 253 insertions(+), 85 deletions(-) create mode 100644 src/app/api/user-community-activity/[wallet_address]/route.ts diff --git a/src/app/api/user-community-activity/[wallet_address]/route.ts b/src/app/api/user-community-activity/[wallet_address]/route.ts new file mode 100644 index 0000000..5394cfb --- /dev/null +++ b/src/app/api/user-community-activity/[wallet_address]/route.ts @@ -0,0 +1,99 @@ +import "server-only" +import { NextRequest, NextResponse } from "next/server" +import { pool } from "@/lib/fast-db" + +function isValidWalletAddress(address: string): boolean { + return /^0x[a-fA-F0-9]{40}$/.test(address) +} + +async function getValidatedWalletAddress( + params: Promise<{ wallet_address: string }> +): Promise<{ address: string } | { error: NextResponse }> { + const { wallet_address } = await params + + if (!wallet_address) { + return { + error: NextResponse.json({ error: "Wallet address is required" }, { status: 400 }), + } + } + + if (!isValidWalletAddress(wallet_address)) { + return { + error: NextResponse.json({ error: "Invalid wallet address format" }, { status: 400 }), + } + } + + return { address: wallet_address.toLowerCase() } +} + +/** + * GET /api/user-community-activity/[wallet_address] + * Returns the latest activity per entity for the user (e.g. ecosystem set verifications). + */ +export async function GET( + _request: NextRequest, + { params }: { params: Promise<{ wallet_address: string }> } +) { + try { + const result = await getValidatedWalletAddress(params) + if ("error" in result) return result.error + + const { rows } = await pool.query( + `SELECT entity, activity + FROM ( + SELECT entity, activity, + ROW_NUMBER() OVER (PARTITION BY entity ORDER BY created_at DESC) AS rn + FROM user_activity + WHERE user_address = $1 + ) sub + WHERE rn = 1`, + [result.address] + ) + + const activities: Record = {} + for (const row of rows) { + activities[row.entity] = row.activity === true + } + + return NextResponse.json({ activities }) + } catch (err) { + console.error("Error fetching user community activity:", err) + return NextResponse.json({ error: "Database query failed" }, { status: 500 }) + } +} + +/** + * POST /api/user-community-activity/[wallet_address] + * Save or update one entity's activity. Body: { entity: string, activity: boolean } + */ +export async function POST( + request: NextRequest, + { params }: { params: Promise<{ wallet_address: string }> } +) { + try { + const result = await getValidatedWalletAddress(params) + if ("error" in result) return result.error + + const body = await request.json() + const entity = typeof body?.entity === "string" ? body.entity.trim() : null + const activity = body?.activity === true || body?.activity === "true" + + if (!entity) { + return NextResponse.json( + { error: "entity is required and must be a non-empty string" }, + { status: 400 } + ) + } + + await pool.query( + `INSERT INTO user_activity (user_address, entity, activity) + VALUES ($1, $2, $3)`, + [result.address, entity, activity] + ) + + return NextResponse.json({ ok: true, entity, activity }, { status: 201 }) + } catch (err) { + console.error("Error saving user community activity:", err) + return NextResponse.json({ error: "Database operation failed" }, { status: 500 }) + } +} diff --git a/src/components/dashboard/EcosystemSetsCarousel.tsx b/src/components/dashboard/EcosystemSetsCarousel.tsx index 258710c..5450f34 100644 --- a/src/components/dashboard/EcosystemSetsCarousel.tsx +++ b/src/components/dashboard/EcosystemSetsCarousel.tsx @@ -1,14 +1,9 @@ import React, { useState, useEffect, useCallback, useMemo } from "react" import useEmblaCarousel from "embla-carousel-react" -import { ShieldCheck, ChevronLeft, ChevronRight, Loader2, Check, Beaker } from "lucide-react" +import { ShieldCheck, ChevronLeft, ChevronRight, Loader2, Check, X } from "lucide-react" import { useAccount, useReadContracts } from "wagmi" import { erc721Abi } from "viem" -/** * TEST CONFIGURATION - * Set TEST_MODE to true to bypass blockchain checks and force successful verification. - */ -const TEST_MODE = true - const ASSETS_URL = process.env.NEXT_PUBLIC_R2_BASE_URL const AZUKI_IMG = `${ASSETS_URL}/nfts/azuki.jpg` @@ -16,8 +11,17 @@ const DOODLES_IMG = `${ASSETS_URL}/nfts/doodles.jpg` const MOONBIRDS_IMG = `${ASSETS_URL}/nfts/moonbirds.jpg` const PUDGY_PENGUINS_IMG = `${ASSETS_URL}/nfts/pudgy-penguins.jpg` const YUGA_LABS_IMG = `${ASSETS_URL}/nfts/yuga-labs.jpg` +// const TEST_IMG = `/assets/fast-icon.png` const ECOSYSTEM_SETS = [ + // { + // id: "test", + // name: "test", + // img: TEST_IMG, + // addresses: [ + // "0xd0E132C73C9425072AAB9256d63aa14D798D063A", + // ] as const + // }, { id: "pudgy", name: "Pudgy\nPenguins", @@ -45,7 +49,7 @@ const ECOSYSTEM_SETS = [ addresses: [ "0xed5af388653567af2f388e6224dc7c4b3241c544", // Azuki "0x306b1ea3ecdf94ab739f1910bbda052ed4a9f949", // BEANZ - "0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e", // Azuki Elementals + "0xb6a37b5d14split502c3ab0ae6f3a0e058bc9517786e", // Azuki Elementals ] as const, }, { @@ -73,11 +77,30 @@ const ECOSYSTEM_SETS = [ }, ] +const fetchUserActivity = async (walletAddress: string): Promise> => { + const res = await fetch(`/api/user-community-activity/${walletAddress}`) + if (!res.ok) return {} + const data = await res.json() + return data.activities ?? {} +} + +const saveUserActivity = async (walletAddress: string, entity: string, activity: boolean) => { + const res = await fetch(`/api/user-community-activity/${walletAddress}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ entity, activity }), + }) + if (!res.ok) throw new Error("Failed to save activity") +} + export const EcosystemSetCarousel = () => { const { address: userAddress, isConnected } = useAccount() const [verifiedSets, setVerifiedSets] = useState>({}) + const [failedSets, setFailedSets] = useState>({}) const [isInitialLoading, setIsInitialLoading] = useState(true) const [manualLoadingId, setManualLoadingId] = useState(null) + const [canScrollPrev, setCanScrollPrev] = useState(false) + const [canScrollNext, setCanScrollNext] = useState(false) const [emblaRef, emblaApi] = useEmblaCarousel({ loop: true, @@ -85,51 +108,31 @@ export const EcosystemSetCarousel = () => { skipSnaps: false, }) - const markAsVerified = useCallback((id: string) => { - setVerifiedSets((prev) => { - if (prev[id]) return prev - const next = { ...prev, [id]: true } - localStorage.setItem(`verified_${id}`, "true") - return next - }) - }, []) - - const syncWithBlockchain = useCallback( - (resultsArray: any[]) => { - let globalIndex = 0 - ECOSYSTEM_SETS.forEach((set) => { - // Check all addresses for this specific set - for (let i = 0; i < set.addresses.length; i++) { - const res = resultsArray[globalIndex++] - // Return once the first balance is found for this set - if (res.status === "success" && Number(res.result) > 0) { - markAsVerified(set.id) - // Advance globalIndex for the remaining addresses in this set and break to next set - globalIndex += set.addresses.length - 1 - i - break - } - } + const markAsVerified = useCallback( + (id: string) => { + if (!userAddress) return + saveUserActivity(userAddress, id, true).catch(() => { + // Todo: handle error }) }, - [markAsVerified] + [userAddress] ) const contracts = useMemo(() => { - if (!userAddress || TEST_MODE) return [] - // Flatten all addresses into a single contract call array - return ECOSYSTEM_SETS.flatMap((set) => - set.addresses.map((addr) => ({ - address: addr, - abi: erc721Abi, - functionName: "balanceOf", - args: [userAddress], - })) - ) - }, [userAddress]) + if (!userAddress || !manualLoadingId) return [] + const set = ECOSYSTEM_SETS.find((s) => s.id === manualLoadingId) + if (!set) return [] + return set.addresses.map((addr) => ({ + address: addr, + abi: erc721Abi, + functionName: "balanceOf", + args: [userAddress], + })) + }, [userAddress, manualLoadingId]) - const { data: blockchainData, refetch } = useReadContracts({ + const { data: blockchainData } = useReadContracts({ contracts, - query: { enabled: isConnected && !!userAddress && !TEST_MODE }, + query: { enabled: isConnected && !!userAddress && !!manualLoadingId }, }) useEffect(() => { @@ -144,79 +147,133 @@ export const EcosystemSetCarousel = () => { }, []) useEffect(() => { - if (blockchainData && !TEST_MODE) syncWithBlockchain(blockchainData as any[]) - }, [blockchainData, syncWithBlockchain]) + if (!isConnected || !userAddress) return + fetchUserActivity(userAddress) + .then((activities) => { + const fromApi: Record = {} + Object.entries(activities).forEach(([entity, active]) => { + if (active) fromApi[entity] = true + }) + if (Object.keys(fromApi).length > 0) { + setVerifiedSets((prev) => ({ ...prev, ...fromApi })) + Object.keys(fromApi).forEach((id) => localStorage.setItem(`verified_${id}`, "true")) + } + }) + .catch((e) => console.error("Fetch user activity failed:", e)) + }, [isConnected, userAddress]) - const handleVerify = async (id: string) => { - setManualLoadingId(id) - await new Promise((resolve) => setTimeout(resolve, 800)) + useEffect(() => { + if (!blockchainData || !manualLoadingId) return + const results = blockchainData as { status: string; result?: unknown }[] - if (TEST_MODE) { - markAsVerified(id) + const hasAssets = results.some((res) => res.status === "success" && Number(res.result) > 0) + + if (hasAssets) { + setVerifiedSets((prev) => ({ ...prev, [manualLoadingId]: true })) + setFailedSets((prev) => { + const next = { ...prev } + delete next[manualLoadingId] + return next + }) + localStorage.setItem(`verified_${manualLoadingId}`, "true") + markAsVerified(manualLoadingId) } else { - if (!isConnected) { - alert("Please connect your wallet!") - setManualLoadingId(null) - return - } - const { data } = await refetch() - if (data) syncWithBlockchain(data as any[]) + setFailedSets((prev) => ({ ...prev, [manualLoadingId]: true })) + // Auto-clear failure after 3 seconds to allow retry + setTimeout(() => { + setFailedSets((prev) => { + const next = { ...prev } + delete next[manualLoadingId!] + return next + }) + }, 3000) } setManualLoadingId(null) + }, [blockchainData, manualLoadingId, markAsVerified]) + + const handleVerify = (id: string) => { + setFailedSets((prev) => { + const next = { ...prev } + delete next[id] + return next + }) + setManualLoadingId(id) } - // Ensure you add these states to your component: - const [canScrollPrev, setCanScrollPrev] = useState(false) - const [canScrollNext, setCanScrollNext] = useState(false) + const fitsContainer = !canScrollPrev && !canScrollNext - // Add this useEffect to handle the logic: useEffect(() => { if (!emblaApi) return - const onSelect = () => { + const updateScrollState = () => { setCanScrollPrev(emblaApi.canScrollPrev()) setCanScrollNext(emblaApi.canScrollNext()) } - emblaApi.on("select", onSelect) - emblaApi.on("reInit", onSelect) - onSelect() + emblaApi.on("select", updateScrollState) + emblaApi.on("reInit", updateScrollState) + emblaApi.on("resize", updateScrollState) + updateScrollState() + return () => { + emblaApi.off("select", updateScrollState) + emblaApi.off("reInit", updateScrollState) + emblaApi.off("resize", updateScrollState) + } }, [emblaApi]) return (
-
-
- {isInitialLoading - ? "-- / --" - : `${Object.keys(verifiedSets).length}/${ECOSYSTEM_SETS.length}`}{" "} - Verified -
-
+