1- import { ClaimStatus , type Claims } from "@repo/shared" ;
1+ import { ClaimStatus } from "@repo/shared" ;
2+ import { QueryClient , QueryClientProvider , useQuery } from "@tanstack/react-query" ;
23import { bech32 } from "bech32" ;
34import { Layers } from "lucide-react" ;
45import queryString from "query-string" ;
5- import { useEffect , useState } from "react" ;
6+ import { useEffect , useMemo } from "react" ;
67import { getClaimsByIds } from "../api/claims" ;
78import { PaymentInfo } from "../components/PaymentInfo" ;
89import { PaymentWait } from "../components/PaymentWait" ;
910import { getBitcoinFiatValue } from "../utils/getBitcoinFiatValue" ;
1011import { formatCurrency , formatNumber } from "../utils/numbers" ;
12+ import { QUERY_KEYS } from "../utils/queryKeys" ;
1113import { subscribeSSE } from "../utils/sse" ;
1214import { useBitcoinExchangeRate } from "../utils/useBitcoinExchangeRate" ;
1315import { SuccessIcon } from "./SuccessIcon" ;
1416import { WaitIcon } from "./WaitIcon" ;
1517
18+ const queryClient = new QueryClient ( ) ;
19+
1620export const Claim = ( ) => {
21+ return (
22+ < QueryClientProvider client = { queryClient } >
23+ < ClaimComponent />
24+ </ QueryClientProvider >
25+ ) ;
26+ } ;
27+
28+ export const ClaimComponent = ( ) => {
1729 const id = queryString . parse ( window . location . search ) . id as string | undefined ;
18- const [ claim , setClaim ] = useState < Claims | null > ( null ) ;
1930 const { usdExchangeRate, fetchExchangeRate } = useBitcoinExchangeRate ( ) ;
2031
32+ const { data : claims = [ ] , refetch } = useQuery ( {
33+ queryKey : [ QUERY_KEYS . GET_CLAIMS , [ id ] ] ,
34+ queryFn : ( ) => getClaimsByIds ( [ id as string ] ) ,
35+ enabled : ! ! id ,
36+ refetchOnWindowFocus : true ,
37+ } ) ;
38+
39+ const claim = useMemo ( ( ) => claims [ 0 ] , [ claims ] ) ;
40+
2141 const withdrawLink = `https://stackorange.com/api/payments/withdraw/${ id } ` ;
42+
2243 const withdrawLinkLnurl = bech32
2344 . encode ( "lnurl" , bech32 . toWords ( Buffer . from ( withdrawLink , "utf8" ) ) , 1023 )
2445 . toUpperCase ( ) ;
2546
26- useEffect ( ( ) => {
27- if ( ! id ) {
28- return ;
29- }
30-
31- getClaimsByIds ( [ id ] ) . then ( ( claims ) => {
32- setClaim ( claims [ 0 ] ) ;
33- } ) ;
34- } , [ id ] ) ;
35-
3647 useEffect ( ( ) => {
3748 if ( ! claim || claim . status !== ClaimStatus . PAID ) {
3849 return ;
@@ -44,15 +55,15 @@ export const Claim = () => {
4455 `${ import . meta. env . PUBLIC_API_URL || "" } /api/payments/${ claim . id } ` ,
4556 ( { paymentId } ) => {
4657 if ( paymentId === claim . id ) {
47- setClaim ( ( prev ) => ( prev ? { ... prev , status : ClaimStatus . CLAIMED } : null ) ) ;
58+ refetch ( ) ;
4859 }
4960 } ,
5061 ) ;
5162
5263 return ( ) => {
5364 eventSource . close ( ) ;
5465 } ;
55- } , [ claim , fetchExchangeRate ] ) ;
66+ } , [ claim , fetchExchangeRate , refetch ] ) ;
5667
5768 if ( ! claim ) {
5869 return null ;
0 commit comments