-
-
Notifications
You must be signed in to change notification settings - Fork 241
/
Protocol.tsx
87 lines (79 loc) · 3.05 KB
/
Protocol.tsx
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
import { useEffect, useCallback } from 'react';
import { useLocation } from 'react-router-dom';
import { isWeb, isDesktop } from '@suite-utils/env';
import { getProtocolInfo } from '@suite-utils/parseUri';
import { useActions } from '@suite-hooks';
import * as notificationActions from '@suite-actions/notificationActions';
import * as protocolActions from '@suite-actions/protocolActions';
import { PROTOCOL_SCHEME } from '@suite-constants/protocol';
const Protocol = () => {
const { addToast, saveCoinProtocol, saveAoppProtocol } = useActions({
addToast: notificationActions.addToast,
saveCoinProtocol: protocolActions.saveCoinProtocol,
saveAoppProtocol: protocolActions.saveAoppProtocol,
});
const handleProtocolRequest = useCallback(
uri => {
const protocolInfo = getProtocolInfo(uri);
switch (protocolInfo?.scheme) {
case PROTOCOL_SCHEME.BITCOIN: {
const { scheme, amount, address } = protocolInfo;
saveCoinProtocol(scheme, address, amount);
addToast({
type: 'coin-scheme-protocol',
address,
scheme,
amount,
autoClose: false,
});
break;
}
case PROTOCOL_SCHEME.AOPP: {
const { asset, msg, callback, format } = protocolInfo;
saveAoppProtocol({
asset,
message: msg,
callback,
format,
});
addToast({
type: 'aopp-protocol',
message: msg,
asset,
autoClose: false,
});
break;
}
default:
break;
}
},
[addToast, saveCoinProtocol, saveAoppProtocol],
);
const { search } = useLocation();
useEffect(() => {
if (search) {
const query = new URLSearchParams(search);
const uri = query.get('uri');
if (uri) {
handleProtocolRequest(uri);
}
}
}, [search, handleProtocolRequest]);
useEffect(() => {
if (isWeb() && navigator.registerProtocolHandler) {
navigator.registerProtocolHandler(
'bitcoin',
`${window.location.origin}${process.env.ASSET_PREFIX ?? ''}/?uri=%s`,
// @ts-ignore - title is deprecated but it is recommended to be set because of backwards-compatibility
'Bitcoin / Trezor Suite',
);
}
if (isDesktop()) {
// @ts-ignore TS2339: Property 'desktopApi' does not exist on type 'Window & typeof globalThis'.
window.desktopApi?.on('protocol/open', handleProtocolRequest);
}
}, [handleProtocolRequest]);
return null;
};
export default Protocol;