Skip to content

Commit 858f719

Browse files
committed
Clean up frontend market syncing
1 parent e7c8721 commit 858f719

3 files changed

Lines changed: 23 additions & 39 deletions

File tree

packages/nextjs/components/markets/MarketDetail.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export const MarketDetail = ({ market }: MarketDetailProps) => {
273273

274274
if (fetchError) throw fetchError;
275275
if (active && backendComments) {
276-
const mapped: MarketComment[] = backendComments.map(c => ({
276+
const mapped: MarketComment[] = backendComments.map((c: any) => ({
277277
id: c.id,
278278
author: c.display_name,
279279
walletAddress: c.wallet_address,

packages/nextjs/components/markets/MarketGrid.tsx

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
"use client";
22

33
import { useEffect, useMemo, useState } from "react";
4-
import Link from "next/link";
54
import { useRouter, useSearchParams } from "next/navigation";
65
import { useConnectModal } from "@rainbow-me/rainbowkit";
6+
import type { RealtimePostgresChangesPayload } from "@supabase/supabase-js";
77
import { useIsAllowed } from "@zama-fhe/react-sdk";
8-
import { ShieldCheck } from "lucide-react";
98
import { useAccount } from "wagmi";
109
import { type CategoryFilter, CategoryTabs } from "~~/components/markets/CategoryTabs";
1110
import { MarketCard } from "~~/components/markets/MarketCard";
1211
import { useProfile } from "~~/components/profile/ProfileContext";
1312
import { ConfidentialPredictionMarket } from "~~/contracts/ConfidentialPredictionMarket";
1413
import { 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";
1716
import { sepolia } from "~~/utils/chains";
1817
import { deploymentFor } from "~~/utils/contract";
1918
import { 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+
4652
const 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;

packages/nextjs/lib/darkonnetApi.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ const mapSupabaseMarketToApi = (m: any): ApiMarket => ({
241241
updatedAt: m.updated_at,
242242
});
243243

244+
export const mapSupabaseMarketToMarket = (market: any): Market => mapApiMarket(mapSupabaseMarketToApi(market));
245+
244246
export const darkonnetApi = {
245247
baseUrl: "supabase",
246248
wsNotificationsUrl(walletAddress: string) {
@@ -256,7 +258,7 @@ export const darkonnetApi = {
256258
}
257259
const { data, error } = await query.order("created_at", { ascending: false });
258260
if (error) throw error;
259-
return (data || []).map(mapSupabaseMarketToApi).map(mapApiMarket);
261+
return (data || []).map(mapSupabaseMarketToMarket);
260262
},
261263
async getMarket(marketId: string) {
262264
const { data, error } = await supabase

0 commit comments

Comments
 (0)