import { Env } from '@lombard.finance/sdk-common'; import React, { useEffect } from 'react'; import { IOutput, useFetchOutputs } from '../../hooks/useFetchOutputs'; import { Button } from '../Button/Button'; import { ErrorDisplay } from '../ErrorDisplay/ErrorDisplay'; import { SelectField } from '../SelectField/SelectField'; import { Spinner } from '../Spinner'; interface OutputSelectorProps { address: string | undefined; environment: Env; isConnected: boolean; selectedOutput: IOutput | null; onOutputSelect: (output: IOutput | null) => void; className?: string; } export const OutputSelector: React.FC = ({ address, environment, isConnected, selectedOutput, onOutputSelect, className = '', }) => { const { outputs, isLoadingOutputs, outputsError, refetchOutputs } = useFetchOutputs({ address: address, environment, isConnected: isConnected, }); // biome-ignore lint/correctness/useExhaustiveDependencies: Intentionally reset only on context change useEffect(() => { onOutputSelect(null); }, [isConnected, address, environment, onOutputSelect]); const statusLabel = (status: string) => { switch (status) { case 'NOTARIZATION_STATUS_SESSION_APPROVED': return 'Ready to mint'; case 'NOTARIZATION_STATUS_PENDING': case 'NOTARIZATION_STATUS_GMP_PENDING': return 'Pending'; case 'NOTARIZATION_STATUS_SUBMITTED': return 'Submitted'; case 'NOTARIZATION_STATUS_FAILED': return 'Failed'; case 'NOTARIZATION_STATUS_GMP_HANDLED': return 'Auto-claimed'; default: return status; } }; const outputOptions = [ { value: '', label: '-- Select a Bitcoin transaction --' }, ...outputs.map((output) => ({ value: output.txid, label: `${output.txid.substring(0, 10)}... - ${ Number.parseFloat(output.value) / 10 ** 8 } BTC [${statusLabel(output.notarization_status)}]`, })), ]; const handleSelectChange = (e: React.ChangeEvent) => { const selected = outputs.find((o) => o.txid === e.target.value); onOutputSelect(selected || null); }; return (
{isLoadingOutputs ? (
Loading available outputs...
) : outputsError ? ( ) : outputs.length === 0 ? (
No pending Bitcoin outputs found for your address ( {address?.substring(0, 6)}...) on {environment}. You might need to stake Bitcoin first or check the selected network.
) : ( <> {selectedOutput && (
Selected Output Details:

TxID: {selectedOutput.txid}

Amount:{' '} {Number.parseFloat(selectedOutput.value) / 10 ** 8} BTC

Block Height:{' '} {selectedOutput.block_height || 'N/A'}

Status:{' '} {statusLabel(selectedOutput.notarization_status)}

{selectedOutput.token_address && (

Token: {selectedOutput.token_address}

)} {selectedOutput.raw_payload ? ( Has payload ) : ( Awaiting notarization )} {selectedOutput.proof && ( Has proof )}
)} )}
); };