mirror of
https://github.com/arkorty/B.Tech-Project-III.git
synced 2026-04-19 12:41:48 +00:00
124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
'use client';
|
|
|
|
import { parseErrorMessage } from '@/lib/celo';
|
|
import { getCUSDContract, getTaskEscrowContract } from '@/lib/contracts';
|
|
import { ethers } from 'ethers';
|
|
import { useState } from 'react';
|
|
import { useWalletConnection } from './useWalletConnection';
|
|
|
|
export function useTaskContract() {
|
|
const { signer, address } = useWalletConnection();
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
/**
|
|
* Create task on blockchain
|
|
*/
|
|
const createTask = async (paymentAmount: number, durationInDays: number) => {
|
|
if (!signer || !address) {
|
|
throw new Error('Wallet not connected');
|
|
}
|
|
|
|
setIsLoading(true);
|
|
setError(null);
|
|
|
|
try {
|
|
const contractAddress = process.env.NEXT_PUBLIC_CONTRACT_ADDRESS;
|
|
if (!contractAddress) {
|
|
throw new Error('Contract address not configured');
|
|
}
|
|
|
|
// Step 1: Approve cUSD spending
|
|
console.log('📝 Approving cUSD spending...');
|
|
const cUSDContract = getCUSDContract(signer);
|
|
const amount = ethers.parseEther(paymentAmount.toString());
|
|
|
|
const approveTx = await cUSDContract.approve(contractAddress, amount);
|
|
await approveTx.wait();
|
|
console.log('✅ cUSD approved');
|
|
|
|
// Step 2: Create task
|
|
console.log('📝 Creating task on blockchain...');
|
|
const taskContract = getTaskEscrowContract(signer);
|
|
const createTx = await taskContract.createTask(amount, durationInDays);
|
|
|
|
console.log('⏳ Waiting for confirmation...');
|
|
const receipt = await createTx.wait();
|
|
|
|
// Parse event to get taskId
|
|
const event = receipt.logs.find((log: any) => {
|
|
try {
|
|
const parsed = taskContract.interface.parseLog(log);
|
|
return parsed?.name === 'TaskCreated';
|
|
} catch {
|
|
return false;
|
|
}
|
|
});
|
|
|
|
let taskId = 0;
|
|
if (event) {
|
|
const parsedEvent = taskContract.interface.parseLog(event);
|
|
taskId = Number(parsedEvent?.args[0]);
|
|
}
|
|
|
|
console.log('✅ Task created! Task ID:', taskId);
|
|
|
|
setIsLoading(false);
|
|
return {
|
|
taskId,
|
|
txHash: receipt.hash,
|
|
};
|
|
} catch (err: any) {
|
|
const errorMessage = parseErrorMessage(err);
|
|
setError(errorMessage);
|
|
setIsLoading(false);
|
|
throw new Error(errorMessage);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Check task status on blockchain
|
|
*/
|
|
const checkTaskStatus = async (taskId: number) => {
|
|
if (!signer) {
|
|
throw new Error('Wallet not connected');
|
|
}
|
|
|
|
try {
|
|
const taskContract = getTaskEscrowContract(signer);
|
|
const task = await taskContract.getTask(taskId);
|
|
|
|
return {
|
|
taskId: Number(task.taskId),
|
|
requester: task.requester,
|
|
worker: task.worker,
|
|
paymentAmount: ethers.formatEther(task.paymentAmount),
|
|
status: Number(task.status),
|
|
createdAt: Number(task.createdAt),
|
|
expiresAt: Number(task.expiresAt),
|
|
};
|
|
} catch (err: any) {
|
|
const errorMessage = parseErrorMessage(err);
|
|
throw new Error(errorMessage);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get current task counter
|
|
*/
|
|
const getTaskCounter = async () => {
|
|
const provider = new ethers.JsonRpcProvider(process.env.NEXT_PUBLIC_CELO_RPC_URL);
|
|
const taskContract = getTaskEscrowContract(provider);
|
|
const counter = await taskContract.taskCounter();
|
|
return Number(counter);
|
|
};
|
|
|
|
return {
|
|
createTask,
|
|
checkTaskStatus,
|
|
getTaskCounter,
|
|
isLoading,
|
|
error,
|
|
};
|
|
}
|