// Copyright 2017-2025 @pezkuwi/app-extrinsics authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { SubmittableExtrinsic, SubmittableExtrinsicFunction } from '@pezkuwi/api/types'; import type { RawParam } from '@pezkuwi/react-params/types'; import type { DecodedExtrinsic } from './types.js'; import React, { useCallback, useState } from 'react'; import { Button, InputAddress, MarkError, TxButton } from '@pezkuwi/react-components'; import { useApi } from '@pezkuwi/react-hooks'; import { Extrinsic } from '@pezkuwi/react-params'; import { BalanceFree } from '@pezkuwi/react-query'; import Decoded from './Decoded.js'; import { useTranslation } from './translate.js'; interface Props { className?: string; defaultValue: DecodedExtrinsic | null; } interface DefaultExtrinsic { defaultArgs?: RawParam[]; defaultFn: SubmittableExtrinsicFunction<'promise'>; } function extractDefaults (value: DecodedExtrinsic | null, defaultFn: SubmittableExtrinsicFunction<'promise'>): DefaultExtrinsic { if (!value) { return { defaultFn }; } return { defaultArgs: value.call.args.map((value) => ({ isValid: true, value })), defaultFn: value.fn }; } function Selection ({ className, defaultValue }: Props): React.ReactElement { const { t } = useTranslation(); const { apiDefaultTxSudo } = useApi(); const [accountId, setAccountId] = useState(null); const [error, setError] = useState(null); const [extrinsic, setExtrinsic] = useState | null>(null); const [{ defaultArgs, defaultFn }] = useState(() => extractDefaults(defaultValue, apiDefaultTxSudo)); const _onExtrinsicChange = useCallback( (method?: SubmittableExtrinsic<'promise'>) => setExtrinsic(() => method || null), [] ); const _onExtrinsicError = useCallback( (error?: Error | null) => setError(error ? error.message : null), [] ); return (
{t('free balance')}} params={accountId} /> } onChange={setAccountId} type='account' /> {error && !extrinsic && ( )}
); } export default React.memo(Selection);