From 402abc3e770254333d3b99bc812c32e099ea4577 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 27 Sep 2023 19:26:20 +0300 Subject: [PATCH] Add voucher balance subscription (#1415) --- utils/gear-hooks/package.json | 2 +- .../hooks/api/voucher/use-voucher-balance.ts | 23 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/utils/gear-hooks/package.json b/utils/gear-hooks/package.json index 85950de8b2..1b101d1e17 100644 --- a/utils/gear-hooks/package.json +++ b/utils/gear-hooks/package.json @@ -1,6 +1,6 @@ { "name": "@gear-js/react-hooks", - "version": "0.6.9", + "version": "0.6.10", "description": "React hooks used across Gear applications", "author": "Gear Technologies", "license": "GPL-3.0", diff --git a/utils/gear-hooks/src/hooks/api/voucher/use-voucher-balance.ts b/utils/gear-hooks/src/hooks/api/voucher/use-voucher-balance.ts index 2ac474b1fb..e8b0c65bc4 100644 --- a/utils/gear-hooks/src/hooks/api/voucher/use-voucher-balance.ts +++ b/utils/gear-hooks/src/hooks/api/voucher/use-voucher-balance.ts @@ -1,4 +1,5 @@ import { HexString, generateVoucherId } from '@gear-js/api'; +import { UnsubscribePromise } from '@polkadot/api/types'; import { AccountContext, AlertContext, ApiContext } from 'context'; import { useContext, useEffect, useState } from 'react'; @@ -12,20 +13,32 @@ function useVoucherBalance(programId: HexString | undefined) { const [voucherBalance, setVoucherBalance] = useState(); const isVoucherBalanceReady = voucherBalance !== undefined; + const voucherId = programId && accountAddress ? generateVoucherId(accountAddress, programId) : undefined; + useEffect(() => { setVoucherBalance(undefined); - if (!programId || !isApiReady || !accountAddress) return; - - const id = generateVoucherId(accountAddress, programId); + if (!isApiReady || !voucherId) return; api.balance - .findOut(id) + .findOut(voucherId) .then((result) => setVoucherBalance(result.toString())) .catch(({ message }: Error) => alert.error(message)); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isApiReady, accountAddress, programId]); + }, [isApiReady, voucherId]); + + // TODO: useBalanceSubscription, same as in Account context + useEffect(() => { + if (!isApiReady || !voucherId) return; + + const unsub = api.gearEvents.subscribeToBalanceChanges(voucherId, (result) => setVoucherBalance(result.toString())); + + return () => { + unsub.then((unsubCallback) => unsubCallback()); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isApiReady, voucherId]); return { voucherBalance, isVoucherBalanceReady }; }