11import { Task , TaskQuery } from '@/graphql/graphql' ;
2+ import { useMutation , useQueryClient } from '@tanstack/react-query' ;
3+ import { LoaderCircle } from 'lucide-react' ;
24import { Button } from '@/components/ui/button' ;
35import { getIExec } from '@/externals/iexecSdkClient' ;
46import useUserStore from '@/stores/useUser.store' ;
57import { pluralize } from '@/utils/pluralize' ;
68
79function isClaimable ( task : Task ) : boolean {
810 const isStatusValid = task . status === 'ACTIVE' || task . status === 'REVEALING' ;
9- const isBeforeFinalDeadline = task . contributionDeadline * 1000 < Date . now ( ) ;
11+ const isBeforeFinalDeadline = task . finalDeadline * 1000 < Date . now ( ) ;
1012 return isStatusValid && isBeforeFinalDeadline ;
1113}
1214
@@ -18,32 +20,37 @@ export function ClaimButton({
1820 className ?: string ;
1921} ) {
2022 const { isConnected } = useUserStore ( ) ;
21- if ( ! isConnected || ! tasks ) {
22- return ;
23- }
24- const claimableTasks = tasks . filter ( isClaimable ) ;
25-
26- if ( claimableTasks . length === 0 ) {
27- return null ;
28- }
23+ const queryClient = useQueryClient ( ) ;
2924
30- const handleClaimAll = async ( ) => {
31- const iexec = await getIExec ( ) ;
25+ const { mutate : claimTasks , isPending } = useMutation ( {
26+ mutationFn : async ( ) => {
27+ const iexec = await getIExec ( ) ;
3228
33- for ( const task of claimableTasks ) {
34- try {
35- console . log ( 'Claiming task' , task . taskid ) ;
36- const txHash = await iexec . task . claim ( task . taskid ) ;
37- console . log ( `Task ${ task . taskid } claimed with txHash:` , txHash ) ;
38- } catch ( error ) {
39- console . error ( `Failed to claim task ${ task . taskid } :` , error ) ;
29+ for ( const task of claimableTasks ) {
30+ try {
31+ console . log ( 'Claiming task' , task . taskid ) ;
32+ const txHash = await iexec . task . claim ( task . taskid ) ;
33+ console . log ( `Task ${ task . taskid } claimed with txHash:` , txHash ) ;
34+ } catch ( error ) {
35+ console . error ( `Failed to claim task ${ task . taskid } :` , error ) ;
36+ }
4037 }
41- }
42- } ;
38+ } ,
39+ onSuccess : ( ) => {
40+ queryClient . invalidateQueries ( { queryKey : [ 'task' ] } ) ;
41+ queryClient . invalidateQueries ( { queryKey : [ 'deal' , 'tasks' ] } ) ;
42+ } ,
43+ } ) ;
44+
45+ if ( ! isConnected || ! tasks ) return null ;
46+
47+ const claimableTasks = tasks . filter ( isClaimable ) ;
48+ if ( claimableTasks . length === 0 ) return null ;
4349
4450 return (
45- < Button variant = "link" className = { className } onClick = { handleClaimAll } >
46- Claim { claimableTasks . length } { pluralize ( claimableTasks . length , 'task' ) }
51+ < Button variant = "link" className = { className } onClick = { ( ) => claimTasks ( ) } >
52+ Claim { pluralize ( claimableTasks . length , 'task' ) }
53+ { isPending && < LoaderCircle className = "animate-spin" /> }
4754 </ Button >
4855 ) ;
4956}
0 commit comments