From d1219f53fccb7f6d8a417c44903feb121476a5ce Mon Sep 17 00:00:00 2001 From: laryhills Date: Mon, 8 Sep 2025 19:35:29 +0100 Subject: [PATCH] feat: add GET_USER_POOLS with status filter --- src/app/hooks/useGetUserPools.ts | 81 ++++++++++++++++++++++++++++++++ src/constants/functionNames.ts | 1 + 2 files changed, 82 insertions(+) create mode 100644 src/app/hooks/useGetUserPools.ts diff --git a/src/app/hooks/useGetUserPools.ts b/src/app/hooks/useGetUserPools.ts new file mode 100644 index 0000000..451bbaa --- /dev/null +++ b/src/app/hooks/useGetUserPools.ts @@ -0,0 +1,81 @@ +import { PoolDetails } from "@/lib/types"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; +import { PREDIFI_ABI } from "../abi/predifi_abi"; +import { useContractFetch } from "./useBlockchain"; +import { num, shortString, CairoOption, CairoOptionVariant } from "starknet"; +import { GET_USER_POOLS } from "@/constants/functionNames"; + +export type PoolStatus = "active" | "locked" | "settled" | "closed" | "suspended"; + +interface UseGetUserPoolsOptions { + userAddress?: string; + statusFilter?: PoolStatus; +} + +export default function useGetUserPools({ + userAddress, + statusFilter, +}: UseGetUserPoolsOptions = {}) { + const [pools, setPools] = useState([]); + + const router = useRouter(); + + const params = statusFilter ? [userAddress, new CairoOption(CairoOptionVariant.Some, statusFilter)] : [userAddress, new CairoOption(CairoOptionVariant.None)] + + const { + readIsLoading: loading, + readError, + readData: poolDetailsList, + } = useContractFetch(PREDIFI_ABI, GET_USER_POOLS, params); + + useEffect(() => { + if (!Array.isArray(poolDetailsList)) return; + const decodedPools = poolDetailsList.map( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (pool: any): PoolDetails => ({ + poolId: pool.pool_id.toString(), + address: num.toHex(pool.address), + poolName: shortString.decodeShortString(pool.poolName), + poolDescription: pool.poolDescription, + poolImage: pool.poolImage, + eventSourceUrl: pool.poolEventSourceUrl, + startTime: pool.poolStartTime.toString(), + lockTime: pool.poolLockTime.toString(), + endTime: pool.poolEndTime.toString(), + option1: shortString.decodeShortString(pool.option1), + option2: shortString.decodeShortString(pool.option2), + totalStakeOption1: pool.totalStakeOption1.toString(), + totalStakeOption2: pool.totalStakeOption2.toString(), + totalBetAmountStrk: pool.totalBetAmountStrk.toString(), + totalBetCount: pool.totalBetCount.toString(), + initialStakeShares: pool.initial_stakes_share, + minBet: pool.minBetAmount.toString(), + maxBet: pool.maxBetAmount.toString(), + creatorFee: pool.creatorFee.toString(), + isPrivate: pool.isPrivate.toString(), + category: Object.keys(pool.category?.variant || {})[0] ?? "Unknown", + poolType: Object.keys(pool.poolType?.variant || {})[0] ?? "Unknown", + status: Object.keys(pool.status?.variant || {})[0] ?? "Unknown", + }) + ); + + setPools(decodedPools); + }, [poolDetailsList]); + + const handleViewPool = (id: string) => { + router.push(`/dashboard/pool-market/${id}`); + }; + + const handleBackToHome = () => { + router.push(`/`); + }; + + return { + loading, + pools, + readError, + handleViewPool, + handleBackToHome + }; +} diff --git a/src/constants/functionNames.ts b/src/constants/functionNames.ts index 7a3235a..e64a982 100644 --- a/src/constants/functionNames.ts +++ b/src/constants/functionNames.ts @@ -3,6 +3,7 @@ export const GET_SETTLED_POOLS = "get_settled_pools" export const GET_LOCKED_POOLS = "get_locked_pools"; export const GET_ACTIVE_POOLS = "get_active_pools"; export const GET_CLOSED_POOLS = "get_closed_pools" +export const GET_USER_POOLS = "get_user_pools" export const MANUALLY_UPDATE_POOL_STATE = "manually_update_pool_state" export const GET_POOL_VOTE = "get_pool_vote"