import React, { useState, useEffect } from 'react'; import { JackpotCard } from './JackpotCard'; import { JackpotSheet } from './JackpotSheet'; import { useJackpot } from '../../hooks/useJackpot'; import { useDubs } from '../../provider'; import type { EnterJackpotMutationResult } from '../../hooks/useEnterJackpot'; import type { JackpotEntry } from '../../types'; import type { ViewStyle } from 'react-native'; export interface JackpotWidgetProps { /** Style applied to the card */ style?: ViewStyle; /** Minimum entry in SOL (default: 0.01) */ minEntry?: number; /** Maximum entry in SOL (default: 10) */ maxEntry?: number; /** Callback when a jackpot entry succeeds */ onEntry?: (result: EnterJackpotMutationResult) => void; /** Callback on entry error */ onError?: (error: Error) => void; } /** * Self-contained Jackpot widget — the first "crypto ad". * * Drop `` anywhere in your app. Shows a live jackpot card * matching the web lobby design with pot amount, player carousel, and * Place Bet button. Tapping opens a scrollable sheet with full entry flow. */ export function JackpotWidget({ style, minEntry, maxEntry, onEntry, onError, }: JackpotWidgetProps) { const [sheetVisible, setSheetVisible] = useState(false); const { round, lastWinner } = useJackpot(); const { client } = useDubs(); const [entries, setEntries] = useState([]); // Fetch entries for the card carousel useEffect(() => { client.getJackpotEntries() .then(res => setEntries(res.entries)) .catch(() => {}); }, [client, round?.entryCount]); return ( <> setSheetVisible(true)} style={style} /> setSheetVisible(false)} onSuccess={(result) => { onEntry?.(result); // Refresh entries after entry client.getJackpotEntries() .then(res => setEntries(res.entries)) .catch(() => {}); }} onError={onError} minEntry={minEntry} maxEntry={maxEntry} /> ); }