Skip to content

Commit fdc976a

Browse files
committed
fix: correct deadline and add loading indicator
1 parent 758e93c commit fdc976a

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

src/modules/tasks/ClaimButton.tsx

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { Task, TaskQuery } from '@/graphql/graphql';
2+
import { useMutation, useQueryClient } from '@tanstack/react-query';
3+
import { LoaderCircle } from 'lucide-react';
24
import { Button } from '@/components/ui/button';
35
import { getIExec } from '@/externals/iexecSdkClient';
46
import useUserStore from '@/stores/useUser.store';
57
import { pluralize } from '@/utils/pluralize';
68

79
function 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

Comments
 (0)