= ({
className={cn(
'w-full rounded-xl border bg-white/[0.04] px-3 py-2 text-white outline-none transition-colors',
'border-white/10 focus:border-amber-500/50 focus:ring-2 focus:ring-amber-500/15',
- !amountValid && amountText.trim() ? 'border-red-500/40' : ''
+ !amountValid && amountText.trim()
+ ? 'border-red-500/40'
+ : ''
)}
aria-label="Trade amount"
data-focus-order="1"
data-testid="trade-dialog-amount"
/>
-
+
Holdings: {formatNumber(availableHoldings)} keys
{side === 'sell' &&
@@ -109,7 +117,9 @@ const TradeDialog: React.FC = ({
label="of holdings"
value={(parsedAmount / availableHoldings) * 100}
tone={
- parsedAmount > availableHoldings ? 'negative' : 'neutral'
+ parsedAmount > availableHoldings
+ ? 'negative'
+ : 'neutral'
}
/>
)}
@@ -145,10 +155,16 @@ const TradeDialog: React.FC = ({
type="button"
onClick={() => onConfirm(parsedAmount)}
disabled={!amountValid || isSubmitting}
+ aria-busy={isSubmitting || undefined}
data-focus-order="3"
data-testid="trade-dialog-confirm"
>
- {isSubmitting ? 'Submitting…' : confirmLabel}
+
+ {confirmLabel}
+
diff --git a/src/components/common/TransactionFailureDrawer.tsx b/src/components/common/TransactionFailureDrawer.tsx
index 21c63ec..6ccce35 100644
--- a/src/components/common/TransactionFailureDrawer.tsx
+++ b/src/components/common/TransactionFailureDrawer.tsx
@@ -11,6 +11,11 @@ import { Button } from '@/components/ui/button';
import { AlertCircle, Copy, Check } from 'lucide-react';
import showToast from '@/utils/toast.util';
import { formatTimestampTooltip } from '@/utils/time.utils';
+import CopySuccessAnnouncement from '@/components/common/CopySuccessAnnouncement';
+import {
+ COPY_SUCCESS_TOAST_ARIA_PROPS,
+ useCopySuccessAnnouncement,
+} from '@/hooks/useCopySuccessAnnouncement';
export interface TransactionFailureDetails {
txHash?: string;
@@ -38,6 +43,7 @@ const TransactionFailureDrawer: React.FC = ({
const [copiedField, setCopiedField] = useState<
'errorCode' | 'txHash' | null
>(null);
+ const { announcement, announceCopySuccess } = useCopySuccessAnnouncement();
const copyToClipboard = async (
text: string,
@@ -45,7 +51,14 @@ const TransactionFailureDrawer: React.FC = ({
) => {
try {
await navigator.clipboard.writeText(text);
- showToast.success('Copied to clipboard');
+ showToast.success('Copied to clipboard', {
+ ariaProps: COPY_SUCCESS_TOAST_ARIA_PROPS,
+ });
+ announceCopySuccess(
+ field === 'errorCode'
+ ? 'Error code copied.'
+ : 'Transaction hash copied.'
+ );
setCopiedField(field);
window.setTimeout(() => setCopiedField(null), 2000);
} catch {
@@ -148,16 +161,6 @@ const TransactionFailureDrawer: React.FC = ({
)}
-
- {copiedField === 'errorCode'
- ? 'Error code copied to clipboard'
- : ''}
-