-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathuseFiatOrderStatus.ts
More file actions
116 lines (102 loc) · 3.14 KB
/
Copy pathuseFiatOrderStatus.ts
File metadata and controls
116 lines (102 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import { useEffect, useRef, useState } from 'react';
import { TransactionStatus } from '@metamask/transaction-controller';
import { RampsOrderStatus, isTerminalOrderStatus } from '@metamask/ramps-controller';
import Engine from '../../../../../core/Engine';
import type { Severity } from '../../components/status-icon';
const POLL_INTERVAL_MS = 5000;
export interface FiatOrderStatusResult {
severity: Severity;
statusText: string;
cryptoSymbol: string | undefined;
paymentMethodName: string | undefined;
}
export function useFiatOrderStatus(
fiatOrderId: string | undefined,
fiatProvider: string | undefined,
walletAddress: string | undefined,
parentTransactionStatus: TransactionStatus,
): FiatOrderStatusResult {
const [orderStatus, setOrderStatus] = useState<
RampsOrderStatus | undefined
>();
const [cryptoSymbol, setCryptoSymbol] = useState<string | undefined>();
const [paymentMethodName, setPaymentMethodName] = useState<
string | undefined
>();
const intervalRef = useRef<ReturnType<typeof setInterval>>(undefined);
useEffect(() => {
if (!fiatOrderId || !fiatProvider || !walletAddress) {
return undefined;
}
const poll = () => {
Engine.context.RampsController.getOrder(
fiatProvider,
fiatOrderId,
walletAddress,
)
.then((order) => {
setOrderStatus(order.status);
setCryptoSymbol(order.cryptoCurrency?.symbol);
setPaymentMethodName(order.paymentMethod?.name);
if (isTerminalOrderStatus(order.status)) {
clearInterval(intervalRef.current);
}
})
.catch(() => undefined);
};
poll();
intervalRef.current = setInterval(poll, POLL_INTERVAL_MS);
return () => {
clearInterval(intervalRef.current);
};
}, [fiatOrderId, fiatProvider, walletAddress]);
const resolvedStatus =
orderStatus ?? deriveFromTransactionStatus(parentTransactionStatus);
return {
severity: getSeverityFromOrderStatus(resolvedStatus),
statusText: getStatusText(resolvedStatus),
cryptoSymbol,
paymentMethodName,
};
}
function deriveFromTransactionStatus(
txStatus: TransactionStatus,
): RampsOrderStatus {
switch (txStatus) {
case TransactionStatus.confirmed:
return RampsOrderStatus.Completed;
case TransactionStatus.failed:
case TransactionStatus.dropped:
return RampsOrderStatus.Failed;
default:
return RampsOrderStatus.Pending;
}
}
function getSeverityFromOrderStatus(
status: RampsOrderStatus | undefined,
): Severity {
switch (status) {
case RampsOrderStatus.Completed:
return 'success';
case RampsOrderStatus.Failed:
case RampsOrderStatus.Cancelled:
case RampsOrderStatus.IdExpired:
return 'error';
default:
return 'warning';
}
}
function getStatusText(status: RampsOrderStatus | undefined): string {
switch (status) {
case RampsOrderStatus.Completed:
return 'Completed';
case RampsOrderStatus.Failed:
return 'Failed';
case RampsOrderStatus.Cancelled:
return 'Cancelled';
case RampsOrderStatus.IdExpired:
return 'Expired';
default:
return 'Pending';
}
}