11"use client" ;
22
33import { useEffect , useMemo , useState } from "react" ;
4- import Link from "next/link" ;
54import { useRouter , useSearchParams } from "next/navigation" ;
65import { useConnectModal } from "@rainbow-me/rainbowkit" ;
6+ import type { RealtimePostgresChangesPayload } from "@supabase/supabase-js" ;
77import { useIsAllowed } from "@zama-fhe/react-sdk" ;
8- import { ShieldCheck } from "lucide-react" ;
98import { useAccount } from "wagmi" ;
109import { type CategoryFilter , CategoryTabs } from "~~/components/markets/CategoryTabs" ;
1110import { MarketCard } from "~~/components/markets/MarketCard" ;
1211import { useProfile } from "~~/components/profile/ProfileContext" ;
1312import { ConfidentialPredictionMarket } from "~~/contracts/ConfidentialPredictionMarket" ;
1413import { type OnchainPoolSnapshot , useOnchainMarketVolumes } from "~~/hooks/markets/useOnchainMarketVolumes" ;
15- import { darkonnetApi } from "~~/lib/darkonnetApi" ;
16- import { type Market , getMarketVolumeScore } from "~~/lib/mockMarkets" ;
14+ import { mapSupabaseMarketToMarket } from "~~/lib/darkonnetApi" ;
15+ import { type Market , getMarketVolumeScore , isMarketEnded } from "~~/lib/mockMarkets" ;
1716import { sepolia } from "~~/utils/chains" ;
1817import { deploymentFor } from "~~/utils/contract" ;
1918import { createClient } from "~~/utils/supabase/client" ;
@@ -43,6 +42,13 @@ const emptyOnchainData: OnchainMarketGridData = {
4342 volumesByMarketId : { } ,
4443} ;
4544
45+ const isLiveMarket = ( market : Market ) =>
46+ market . status !== "pending" &&
47+ market . status !== "declined" &&
48+ market . status !== "resolved" &&
49+ ! market . resolution &&
50+ ! isMarketEnded ( market . endsAt ) ;
51+
4652const OnchainMarketDataBridge = ( {
4753 markets,
4854 onUpdate,
@@ -151,33 +157,6 @@ export const MarketGrid = ({ source = "platform" }: MarketGridProps) => {
151157 let active = true ;
152158 const supabase = createClient ( ) ;
153159
154- const mapSupabaseMarket = ( m : any ) : Market => ( {
155- id : m . market_id ,
156- slug : m . slug ,
157- onchainMarketId : m . onchain_market_id ,
158- question : m . title ,
159- description : m . description ,
160- category : m . category ,
161- yesProbability : m . metadata ?. yesProbability || 0.5 ,
162- encryptedVolumeLabel : m . metadata ?. encryptedVolumeLabel || "Encrypted" ,
163- tradingVolume : m . metadata ?. tradingVolume || 0 ,
164- endsAt : m . metadata ?. endsAt || m . starts_at || new Date ( ) . toISOString ( ) ,
165- signalLabel : m . metadata ?. signalLabel || "Awaiting activity" ,
166- sentimentSignals : m . metadata ?. sentimentSignals || { news : 50 , volume : 50 , crowd : 50 } ,
167- trending : m . metadata ?. trending || false ,
168- rules : m . metadata ?. rules || "" ,
169- sources : m . metadata ?. sources || [ ] ,
170- coverImageDataUrl : m . metadata ?. coverImageDataUrl ,
171- homeLogoUrl : m . home_logo_url ,
172- awayLogoUrl : m . away_logo_url ,
173- homeName : m . home_name ,
174- awayName : m . away_name ,
175- creatorKey : m . creator_wallet_address ,
176- status : m . status ,
177- resolution : m . resolution ,
178- resolvedAt : m . resolved_at ,
179- } ) ;
180-
181160 const syncMarkets = async ( ) => {
182161 setIsLoading ( true ) ;
183162 setError ( "" ) ;
@@ -189,7 +168,7 @@ export const MarketGrid = ({ source = "platform" }: MarketGridProps) => {
189168
190169 if ( fetchError ) throw fetchError ;
191170 if ( ! active ) return ;
192- setMarkets ( data . map ( mapSupabaseMarket ) ) ;
171+ setMarkets ( data . map ( mapSupabaseMarketToMarket ) ) ;
193172 } catch ( err ) {
194173 if ( ! active ) return ;
195174 setMarkets ( [ ] ) ;
@@ -206,11 +185,13 @@ export const MarketGrid = ({ source = "platform" }: MarketGridProps) => {
206185 . on (
207186 "postgres_changes" ,
208187 { event : "*" , schema : "public" , table : "markets" } ,
209- ( payload : { eventType : string ; new : Record < string , unknown > ; old : Record < string , unknown > } ) => {
188+ ( payload : RealtimePostgresChangesPayload < Record < string , unknown > > ) => {
210189 if ( payload . eventType === "INSERT" ) {
211- setMarkets ( prev => [ mapSupabaseMarket ( payload . new ) , ...prev ] ) ;
190+ setMarkets ( prev => [ mapSupabaseMarketToMarket ( payload . new ) , ...prev ] ) ;
212191 } else if ( payload . eventType === "UPDATE" ) {
213- setMarkets ( prev => prev . map ( m => ( m . id === payload . new . market_id ? mapSupabaseMarket ( payload . new ) : m ) ) ) ;
192+ setMarkets ( prev =>
193+ prev . map ( m => ( m . id === payload . new . market_id ? mapSupabaseMarketToMarket ( payload . new ) : m ) ) ,
194+ ) ;
214195 } else if ( payload . eventType === "DELETE" ) {
215196 setMarkets ( prev => prev . filter ( m => m . id === payload . old . market_id ) ) ;
216197 }
@@ -226,14 +207,15 @@ export const MarketGrid = ({ source = "platform" }: MarketGridProps) => {
226207
227208 const visible = useMemo ( ( ) => {
228209 if ( isCreatorMarketView && creatorTab === "mine" && ! isWalletConnected ) return [ ] ;
210+ const liveMarkets = markets . filter ( isLiveMarket ) ;
229211 const sourceMarkets = isCreatorMarketView
230- ? markets . filter ( market => {
212+ ? liveMarkets . filter ( market => {
231213 const isAcceptedCreatorMarket = market . status === "open" && Boolean ( market . creatorKey ) ;
232214 if ( ! isAcceptedCreatorMarket ) return false ;
233215 if ( creatorTab === "mine" ) return Boolean ( creatorKey ) && market . creatorKey ?. toLowerCase ( ) === creatorKey ;
234216 return true ;
235217 } )
236- : markets ;
218+ : liveMarkets ;
237219 if ( filter === "all" ) return sourceMarkets ;
238220 if ( filter === "trending" ) {
239221 const hasOnchainVolumes = Object . keys ( onchainVolumesByMarketId ) . length > 0 ;
0 commit comments