import { type QueryFunctionContext, type UseQueryOptions } from '@tanstack/react-query'; import { type AccountAddresses, type Activity, type CryptoAsset } from '@leather.io/models'; import { type UserSettings, getActivityService } from '@leather.io/services'; import { createServiceQueryKey } from '../shared/query-key.factory'; import { activityQueryOptions } from '../shared/query-options'; function createActivityKeyParams(account: AccountAddresses) { const { id, bitcoin, stacks } = account; return [ id.fingerprint, id.accountIndex, bitcoin?.taprootDescriptor ?? null, bitcoin?.nativeSegwitDescriptor ?? null, bitcoin?.zeroIndexNativeSegwitPayerAddress ?? null, bitcoin?.zeroIndexTaprootPayerAddress ?? null, stacks?.stxAddress ?? null, ] as const; } export function createActivityQueryKey(account: AccountAddresses, settings: UserSettings) { return createServiceQueryKey( 'activity-service--get-activity', createActivityKeyParams(account), settings ); } export function createActivityQueryConfig(account: AccountAddresses, settings: UserSettings) { return { queryKey: createActivityQueryKey(account, settings), queryFn: ({ signal }: QueryFunctionContext) => getActivityService().getActivity(account, signal), ...activityQueryOptions, } satisfies UseQueryOptions; } export function createActivityByAssetQueryKey( account: AccountAddresses, asset: CryptoAsset, settings: UserSettings ) { return createServiceQueryKey( 'activity-service--get-activity-by-asset', [...createActivityKeyParams(account), asset], settings ); } export function createActivityByAssetQueryConfig( account: AccountAddresses, asset: CryptoAsset, settings: UserSettings ) { return { queryKey: createActivityByAssetQueryKey(account, asset, settings), queryFn: ({ signal }: QueryFunctionContext) => getActivityService().getActivityByAsset(account, asset, signal), ...activityQueryOptions, } satisfies UseQueryOptions; }