@clockpay/react-native 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -13
- package/lib/commonjs/api/client.js +39 -0
- package/lib/commonjs/api/client.js.map +1 -1
- package/lib/commonjs/api/endpoints.js +3 -0
- package/lib/commonjs/api/endpoints.js.map +1 -1
- package/lib/commonjs/components/icons.js +19 -0
- package/lib/commonjs/components/icons.js.map +1 -1
- package/lib/commonjs/components/payment-button.js +53 -39
- package/lib/commonjs/components/payment-button.js.map +1 -1
- package/lib/commonjs/components/selection-sheet.js +393 -0
- package/lib/commonjs/components/selection-sheet.js.map +1 -0
- package/lib/commonjs/internal/format.js +11 -0
- package/lib/commonjs/internal/format.js.map +1 -1
- package/lib/module/api/client.js +39 -0
- package/lib/module/api/client.js.map +1 -1
- package/lib/module/api/endpoints.js +3 -0
- package/lib/module/api/endpoints.js.map +1 -1
- package/lib/module/components/icons.js +18 -0
- package/lib/module/components/icons.js.map +1 -1
- package/lib/module/components/payment-button.js +56 -42
- package/lib/module/components/payment-button.js.map +1 -1
- package/lib/module/components/selection-sheet.js +391 -0
- package/lib/module/components/selection-sheet.js.map +1 -0
- package/lib/module/internal/format.js +10 -0
- package/lib/module/internal/format.js.map +1 -1
- package/lib/typescript/api/client.d.ts +7 -1
- package/lib/typescript/api/client.d.ts.map +1 -1
- package/lib/typescript/api/endpoints.d.ts +3 -0
- package/lib/typescript/api/endpoints.d.ts.map +1 -1
- package/lib/typescript/components/icons.d.ts +1 -0
- package/lib/typescript/components/icons.d.ts.map +1 -1
- package/lib/typescript/components/payment-button.d.ts +3 -2
- package/lib/typescript/components/payment-button.d.ts.map +1 -1
- package/lib/typescript/components/selection-sheet.d.ts +25 -0
- package/lib/typescript/components/selection-sheet.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/internal/format.d.ts +2 -0
- package/lib/typescript/internal/format.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +65 -2
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/api/client.ts +45 -0
- package/src/api/endpoints.ts +3 -0
- package/src/components/icons.tsx +14 -0
- package/src/components/payment-button.tsx +54 -38
- package/src/components/selection-sheet.tsx +383 -0
- package/src/index.ts +10 -0
- package/src/internal/format.ts +8 -0
- package/src/types.ts +75 -2
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { useMemo, useState } from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import { ClockPayClient } from '../api/client';
|
|
3
|
+
import { useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
6
5
|
import { resolveTheme } from '../internal/theme';
|
|
6
|
+
import { SelectionSheet } from './selection-sheet';
|
|
7
7
|
import { PaymentSheet } from './payment-sheet';
|
|
8
8
|
import { LogoIcon } from './icons';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Drop-in payment button for React Native. Renders a "Pay with Clockpay" trigger
|
|
12
|
-
* that
|
|
12
|
+
* that opens a coin/network selection sheet, generates a payment link, then opens
|
|
13
|
+
* a Stripe-style bottom-sheet payment modal.
|
|
13
14
|
*/
|
|
14
|
-
import { jsx as _jsx,
|
|
15
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
16
|
export function PaymentButton({
|
|
16
17
|
publicKey,
|
|
17
|
-
|
|
18
|
+
amount,
|
|
19
|
+
currency,
|
|
20
|
+
reference,
|
|
21
|
+
meta,
|
|
18
22
|
appearance,
|
|
19
23
|
label = 'Pay with Clockpay',
|
|
20
24
|
disabled,
|
|
@@ -24,62 +28,72 @@ export function PaymentButton({
|
|
|
24
28
|
onError,
|
|
25
29
|
onClose
|
|
26
30
|
}) {
|
|
31
|
+
const [selecting, setSelecting] = useState(false);
|
|
27
32
|
const [checkout, setCheckout] = useState(null);
|
|
28
|
-
const [
|
|
29
|
-
|
|
33
|
+
const [paymentVisible, setPaymentVisible] = useState(false);
|
|
34
|
+
// Holds the checkout produced by the selection sheet until it finishes closing,
|
|
35
|
+
// so the two sheets never present at the same time.
|
|
36
|
+
const pending = useRef(null);
|
|
30
37
|
const theme = useMemo(() => resolveTheme(appearance), [appearance]);
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
setCheckout(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
setLoading(false);
|
|
38
|
+
const handleProceed = data => {
|
|
39
|
+
pending.current = data;
|
|
40
|
+
setSelecting(false); // animate the selection sheet out first
|
|
41
|
+
};
|
|
42
|
+
const handleSelectionClosed = () => {
|
|
43
|
+
if (pending.current) {
|
|
44
|
+
setCheckout(pending.current);
|
|
45
|
+
pending.current = null;
|
|
46
|
+
setPaymentVisible(true);
|
|
47
|
+
} else {
|
|
48
|
+
onClose?.();
|
|
43
49
|
}
|
|
44
50
|
};
|
|
45
|
-
const
|
|
51
|
+
const handlePaymentClosed = () => {
|
|
46
52
|
setCheckout(null);
|
|
47
53
|
onClose?.();
|
|
48
54
|
};
|
|
49
55
|
return /*#__PURE__*/_jsxs(View, {
|
|
50
|
-
children: [/*#__PURE__*/
|
|
56
|
+
children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
51
57
|
activeOpacity: 0.8,
|
|
52
|
-
disabled: disabled
|
|
53
|
-
onPress:
|
|
58
|
+
disabled: disabled,
|
|
59
|
+
onPress: () => setSelecting(true),
|
|
54
60
|
style: [styles.button, {
|
|
55
61
|
backgroundColor: theme.buttonBg,
|
|
56
62
|
borderColor: theme.buttonBorder,
|
|
57
63
|
borderRadius: theme.radius,
|
|
58
|
-
opacity: disabled
|
|
64
|
+
opacity: disabled ? 0.6 : 1
|
|
59
65
|
}],
|
|
60
|
-
children:
|
|
61
|
-
size:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
children: [/*#__PURE__*/_jsx(LogoIcon, {
|
|
67
|
+
size: 16
|
|
68
|
+
}), typeof label === 'string' ? /*#__PURE__*/_jsx(Text, {
|
|
69
|
+
style: [styles.label, {
|
|
70
|
+
color: theme.buttonFg,
|
|
71
|
+
fontFamily: theme.fontFamily
|
|
72
|
+
}],
|
|
73
|
+
children: label
|
|
74
|
+
}) : label]
|
|
75
|
+
}), /*#__PURE__*/_jsx(SelectionSheet, {
|
|
76
|
+
visible: selecting,
|
|
77
|
+
publicKey: publicKey,
|
|
78
|
+
apiBaseUrl: apiBaseUrl,
|
|
79
|
+
theme: theme,
|
|
80
|
+
amount: amount,
|
|
81
|
+
currency: currency,
|
|
82
|
+
reference: reference,
|
|
83
|
+
meta: meta,
|
|
84
|
+
onRequestClose: () => setSelecting(false),
|
|
85
|
+
onClosed: handleSelectionClosed,
|
|
86
|
+
onProceed: handleProceed,
|
|
87
|
+
onError: onError
|
|
74
88
|
}), checkout && /*#__PURE__*/_jsx(PaymentSheet, {
|
|
75
|
-
visible:
|
|
89
|
+
visible: paymentVisible,
|
|
76
90
|
checkout: checkout,
|
|
77
91
|
publicKey: publicKey,
|
|
78
92
|
apiBaseUrl: apiBaseUrl,
|
|
79
93
|
theme: theme,
|
|
80
94
|
redirectUrl: redirectUrl,
|
|
81
|
-
onRequestClose: () =>
|
|
82
|
-
onClosed:
|
|
95
|
+
onRequestClose: () => setPaymentVisible(false),
|
|
96
|
+
onClosed: handlePaymentClosed,
|
|
83
97
|
onSuccess: onSuccess,
|
|
84
98
|
onError: onError
|
|
85
99
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","
|
|
1
|
+
{"version":3,"names":["useMemo","useRef","useState","StyleSheet","Text","TouchableOpacity","View","resolveTheme","SelectionSheet","PaymentSheet","LogoIcon","jsx","_jsx","jsxs","_jsxs","PaymentButton","publicKey","amount","currency","reference","meta","appearance","label","disabled","apiBaseUrl","redirectUrl","onSuccess","onError","onClose","selecting","setSelecting","checkout","setCheckout","paymentVisible","setPaymentVisible","pending","theme","handleProceed","data","current","handleSelectionClosed","handlePaymentClosed","children","activeOpacity","onPress","style","styles","button","backgroundColor","buttonBg","borderColor","buttonBorder","borderRadius","radius","opacity","size","color","buttonFg","fontFamily","visible","onRequestClose","onClosed","onProceed","create","flexDirection","alignItems","justifyContent","gap","paddingVertical","paddingHorizontal","borderWidth","fontSize","fontWeight"],"sourceRoot":"..\\..\\..\\src","sources":["components/payment-button.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
5
|
+
import { SvgUri } from 'react-native-svg';
|
|
6
|
+
import { ClockPayClient } from '../api/client';
|
|
7
|
+
import { formatMoney } from '../internal/format';
|
|
8
|
+
import { BottomSheet } from './bottom-sheet';
|
|
9
|
+
import { ChevronDownIcon, CloseIcon, LogoIcon } from './icons';
|
|
10
|
+
|
|
11
|
+
/** Renders a coin's remote SVG logo. Falls back to a neutral placeholder circle. */
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
function CoinLogo({
|
|
14
|
+
uri
|
|
15
|
+
}) {
|
|
16
|
+
if (!uri) return null;
|
|
17
|
+
return /*#__PURE__*/_jsx(View, {
|
|
18
|
+
style: styles.logo,
|
|
19
|
+
children: /*#__PURE__*/_jsx(SvgUri, {
|
|
20
|
+
width: 20,
|
|
21
|
+
height: 20,
|
|
22
|
+
uri: uri
|
|
23
|
+
})
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** A lightweight inline dropdown — taps to expand a list of options in place. */
|
|
27
|
+
function Dropdown({
|
|
28
|
+
label,
|
|
29
|
+
placeholder,
|
|
30
|
+
value,
|
|
31
|
+
options,
|
|
32
|
+
disabled,
|
|
33
|
+
loading,
|
|
34
|
+
theme,
|
|
35
|
+
onSelect
|
|
36
|
+
}) {
|
|
37
|
+
const [open, setOpen] = useState(false);
|
|
38
|
+
const selected = options.find(o => o.id === value);
|
|
39
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
40
|
+
style: [styles.field, open && styles.fieldOpen],
|
|
41
|
+
children: [/*#__PURE__*/_jsxs(Text, {
|
|
42
|
+
style: styles.label,
|
|
43
|
+
children: [label, " ", /*#__PURE__*/_jsx(Text, {
|
|
44
|
+
style: styles.req,
|
|
45
|
+
children: "*"
|
|
46
|
+
})]
|
|
47
|
+
}), /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
48
|
+
activeOpacity: 0.7,
|
|
49
|
+
disabled: disabled,
|
|
50
|
+
style: [styles.select, disabled && styles.selectDisabled],
|
|
51
|
+
onPress: () => setOpen(o => !o),
|
|
52
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
53
|
+
style: styles.selectValue,
|
|
54
|
+
children: [selected?.image && /*#__PURE__*/_jsx(CoinLogo, {
|
|
55
|
+
uri: selected.image
|
|
56
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
57
|
+
style: [styles.selectText, !selected && styles.placeholder],
|
|
58
|
+
children: loading ? 'Loading…' : selected ? selected.label : placeholder
|
|
59
|
+
})]
|
|
60
|
+
}), loading ? /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
61
|
+
size: "small",
|
|
62
|
+
color: "#94a3b8"
|
|
63
|
+
}) : /*#__PURE__*/_jsx(ChevronDownIcon, {})]
|
|
64
|
+
}), open && !disabled && /*#__PURE__*/_jsx(View, {
|
|
65
|
+
style: styles.options,
|
|
66
|
+
children: options.map(o => /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
67
|
+
style: styles.option,
|
|
68
|
+
onPress: () => {
|
|
69
|
+
onSelect(o.id);
|
|
70
|
+
setOpen(false);
|
|
71
|
+
},
|
|
72
|
+
children: [o.image && /*#__PURE__*/_jsx(CoinLogo, {
|
|
73
|
+
uri: o.image
|
|
74
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
75
|
+
style: [styles.optionText, o.id === value && {
|
|
76
|
+
color: theme.accent,
|
|
77
|
+
fontWeight: '600'
|
|
78
|
+
}],
|
|
79
|
+
children: o.label
|
|
80
|
+
})]
|
|
81
|
+
}, o.id))
|
|
82
|
+
})]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* First step of the payment flow: the buyer picks a coin and then a settlement
|
|
88
|
+
* network. On continue, a payment link is generated (`create-link`) and the
|
|
89
|
+
* resulting checkout initiated, handing a {@link CheckoutData} to the caller so
|
|
90
|
+
* the payment sheet can open.
|
|
91
|
+
*/
|
|
92
|
+
export function SelectionSheet({
|
|
93
|
+
visible,
|
|
94
|
+
publicKey,
|
|
95
|
+
apiBaseUrl,
|
|
96
|
+
theme,
|
|
97
|
+
amount,
|
|
98
|
+
currency,
|
|
99
|
+
reference,
|
|
100
|
+
meta,
|
|
101
|
+
onRequestClose,
|
|
102
|
+
onClosed,
|
|
103
|
+
onProceed,
|
|
104
|
+
onError
|
|
105
|
+
}) {
|
|
106
|
+
const client = useMemo(() => new ClockPayClient(publicKey, apiBaseUrl), [publicKey, apiBaseUrl]);
|
|
107
|
+
const [coins, setCoins] = useState([]);
|
|
108
|
+
const [networks, setNetworks] = useState([]);
|
|
109
|
+
const [coinId, setCoinId] = useState('');
|
|
110
|
+
const [networkId, setNetworkId] = useState('');
|
|
111
|
+
const [loadingCoins, setLoadingCoins] = useState(false);
|
|
112
|
+
const [loadingNetworks, setLoadingNetworks] = useState(false);
|
|
113
|
+
const [submitting, setSubmitting] = useState(false);
|
|
114
|
+
const [error, setError] = useState(null);
|
|
115
|
+
|
|
116
|
+
// Load the available coins once the sheet opens.
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (!visible) return;
|
|
119
|
+
let active = true;
|
|
120
|
+
setLoadingCoins(true);
|
|
121
|
+
setError(null);
|
|
122
|
+
client.getCoins().then(list => active && setCoins(list)).catch(e => active && setError(e.message)).finally(() => active && setLoadingCoins(false));
|
|
123
|
+
return () => {
|
|
124
|
+
active = false;
|
|
125
|
+
};
|
|
126
|
+
}, [visible, client]);
|
|
127
|
+
|
|
128
|
+
// Load the networks for the selected coin.
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
setNetworks([]);
|
|
131
|
+
setNetworkId('');
|
|
132
|
+
if (!coinId) return;
|
|
133
|
+
let active = true;
|
|
134
|
+
setLoadingNetworks(true);
|
|
135
|
+
setError(null);
|
|
136
|
+
client.getNetworks(coinId).then(list => active && setNetworks(list)).catch(e => active && setError(e.message)).finally(() => active && setLoadingNetworks(false));
|
|
137
|
+
return () => {
|
|
138
|
+
active = false;
|
|
139
|
+
};
|
|
140
|
+
}, [coinId, client]);
|
|
141
|
+
const canSubmit = Boolean(coinId && networkId && !submitting);
|
|
142
|
+
const proceed = async () => {
|
|
143
|
+
if (!canSubmit) return;
|
|
144
|
+
setSubmitting(true);
|
|
145
|
+
setError(null);
|
|
146
|
+
try {
|
|
147
|
+
const link = await client.createLink({
|
|
148
|
+
amount,
|
|
149
|
+
currency,
|
|
150
|
+
coinId,
|
|
151
|
+
networkId,
|
|
152
|
+
reference,
|
|
153
|
+
meta
|
|
154
|
+
});
|
|
155
|
+
const response = await client.initiatePayment(link.clientSecret);
|
|
156
|
+
onProceed(response.data);
|
|
157
|
+
} catch (e) {
|
|
158
|
+
const err = e instanceof Error ? e : new Error('Failed to start checkout.');
|
|
159
|
+
setError(err.message);
|
|
160
|
+
onError?.(err);
|
|
161
|
+
} finally {
|
|
162
|
+
setSubmitting(false);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const coinOptions = coins.map(c => ({
|
|
166
|
+
id: c.id,
|
|
167
|
+
label: c.name.toUpperCase(),
|
|
168
|
+
image: c.image
|
|
169
|
+
}));
|
|
170
|
+
const networkOptions = networks.map(n => ({
|
|
171
|
+
id: n.id,
|
|
172
|
+
label: n.name.toUpperCase()
|
|
173
|
+
}));
|
|
174
|
+
return /*#__PURE__*/_jsxs(BottomSheet, {
|
|
175
|
+
visible: visible,
|
|
176
|
+
onClose: onRequestClose,
|
|
177
|
+
onClosed: onClosed,
|
|
178
|
+
closeOnBackdropPress: false,
|
|
179
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
180
|
+
style: styles.header,
|
|
181
|
+
children: [/*#__PURE__*/_jsx(LogoIcon, {
|
|
182
|
+
size: 18
|
|
183
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
184
|
+
style: [styles.title, {
|
|
185
|
+
color: theme.accent
|
|
186
|
+
}],
|
|
187
|
+
children: "Pay with Clockpay"
|
|
188
|
+
}), /*#__PURE__*/_jsx(Pressable, {
|
|
189
|
+
onPress: onRequestClose,
|
|
190
|
+
style: styles.cancel,
|
|
191
|
+
hitSlop: 8,
|
|
192
|
+
accessibilityRole: "button",
|
|
193
|
+
accessibilityLabel: "Cancel",
|
|
194
|
+
children: /*#__PURE__*/_jsx(CloseIcon, {
|
|
195
|
+
size: 22
|
|
196
|
+
})
|
|
197
|
+
})]
|
|
198
|
+
}), /*#__PURE__*/_jsxs(ScrollView, {
|
|
199
|
+
showsVerticalScrollIndicator: false,
|
|
200
|
+
keyboardShouldPersistTaps: "handled",
|
|
201
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
202
|
+
style: styles.card,
|
|
203
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
204
|
+
style: styles.muted,
|
|
205
|
+
children: "You are paying"
|
|
206
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
207
|
+
style: styles.amount,
|
|
208
|
+
children: formatMoney(amount, currency)
|
|
209
|
+
})]
|
|
210
|
+
}), /*#__PURE__*/_jsx(Dropdown, {
|
|
211
|
+
label: "Select coin",
|
|
212
|
+
placeholder: "Select a coin",
|
|
213
|
+
value: coinId,
|
|
214
|
+
options: coinOptions,
|
|
215
|
+
disabled: submitting,
|
|
216
|
+
loading: loadingCoins,
|
|
217
|
+
theme: theme,
|
|
218
|
+
onSelect: setCoinId
|
|
219
|
+
}), /*#__PURE__*/_jsx(Dropdown, {
|
|
220
|
+
label: "Select preferred network",
|
|
221
|
+
placeholder: !coinId ? 'Select a coin first' : 'Select a network',
|
|
222
|
+
value: networkId,
|
|
223
|
+
options: networkOptions,
|
|
224
|
+
disabled: !coinId || submitting,
|
|
225
|
+
loading: loadingNetworks,
|
|
226
|
+
theme: theme,
|
|
227
|
+
onSelect: setNetworkId
|
|
228
|
+
}), error && /*#__PURE__*/_jsx(Text, {
|
|
229
|
+
style: styles.error,
|
|
230
|
+
children: error
|
|
231
|
+
}), /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
232
|
+
style: [styles.primaryBtn, {
|
|
233
|
+
backgroundColor: canSubmit ? theme.accent : '#dff0f7',
|
|
234
|
+
borderRadius: theme.radius
|
|
235
|
+
}],
|
|
236
|
+
disabled: !canSubmit,
|
|
237
|
+
onPress: proceed,
|
|
238
|
+
children: submitting ? /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
239
|
+
size: "small",
|
|
240
|
+
color: "#fff"
|
|
241
|
+
}) : /*#__PURE__*/_jsx(Text, {
|
|
242
|
+
style: [styles.primaryBtnText, {
|
|
243
|
+
color: canSubmit ? '#fff' : '#9ca3af'
|
|
244
|
+
}],
|
|
245
|
+
children: "Continue"
|
|
246
|
+
})
|
|
247
|
+
})]
|
|
248
|
+
})]
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const styles = StyleSheet.create({
|
|
252
|
+
header: {
|
|
253
|
+
flexDirection: 'row',
|
|
254
|
+
alignItems: 'center',
|
|
255
|
+
justifyContent: 'center',
|
|
256
|
+
gap: 8,
|
|
257
|
+
paddingBottom: 16
|
|
258
|
+
},
|
|
259
|
+
title: {
|
|
260
|
+
fontSize: 16,
|
|
261
|
+
fontWeight: '700'
|
|
262
|
+
},
|
|
263
|
+
cancel: {
|
|
264
|
+
position: 'absolute',
|
|
265
|
+
right: 0,
|
|
266
|
+
top: -2,
|
|
267
|
+
padding: 4
|
|
268
|
+
},
|
|
269
|
+
card: {
|
|
270
|
+
borderWidth: 1,
|
|
271
|
+
borderColor: '#edf1f6',
|
|
272
|
+
borderRadius: 16,
|
|
273
|
+
padding: 20,
|
|
274
|
+
alignItems: 'center',
|
|
275
|
+
marginBottom: 20
|
|
276
|
+
},
|
|
277
|
+
muted: {
|
|
278
|
+
fontSize: 13,
|
|
279
|
+
color: '#94a3b8'
|
|
280
|
+
},
|
|
281
|
+
amount: {
|
|
282
|
+
fontSize: 24,
|
|
283
|
+
fontWeight: '700',
|
|
284
|
+
color: '#000',
|
|
285
|
+
marginTop: 4
|
|
286
|
+
},
|
|
287
|
+
field: {
|
|
288
|
+
marginBottom: 16,
|
|
289
|
+
position: 'relative'
|
|
290
|
+
},
|
|
291
|
+
// Lift the open dropdown (and its overlay list) above the fields below it.
|
|
292
|
+
fieldOpen: {
|
|
293
|
+
zIndex: 20,
|
|
294
|
+
elevation: 20
|
|
295
|
+
},
|
|
296
|
+
label: {
|
|
297
|
+
fontSize: 14,
|
|
298
|
+
fontWeight: '500',
|
|
299
|
+
color: '#1e1e1e',
|
|
300
|
+
marginBottom: 6
|
|
301
|
+
},
|
|
302
|
+
req: {
|
|
303
|
+
color: '#fb7185'
|
|
304
|
+
},
|
|
305
|
+
select: {
|
|
306
|
+
flexDirection: 'row',
|
|
307
|
+
alignItems: 'center',
|
|
308
|
+
justifyContent: 'space-between',
|
|
309
|
+
borderWidth: 1,
|
|
310
|
+
borderColor: '#d9d9d9',
|
|
311
|
+
borderRadius: 8,
|
|
312
|
+
paddingVertical: 12,
|
|
313
|
+
paddingHorizontal: 12
|
|
314
|
+
},
|
|
315
|
+
selectDisabled: {
|
|
316
|
+
backgroundColor: '#f5f5f5'
|
|
317
|
+
},
|
|
318
|
+
selectValue: {
|
|
319
|
+
flexDirection: 'row',
|
|
320
|
+
alignItems: 'center',
|
|
321
|
+
gap: 8,
|
|
322
|
+
flexShrink: 1
|
|
323
|
+
},
|
|
324
|
+
selectText: {
|
|
325
|
+
fontSize: 14,
|
|
326
|
+
color: '#1e1e1e'
|
|
327
|
+
},
|
|
328
|
+
placeholder: {
|
|
329
|
+
color: '#9ca3af'
|
|
330
|
+
},
|
|
331
|
+
logo: {
|
|
332
|
+
width: 20,
|
|
333
|
+
height: 20,
|
|
334
|
+
borderRadius: 10,
|
|
335
|
+
overflow: 'hidden',
|
|
336
|
+
backgroundColor: '#f0f2f5',
|
|
337
|
+
alignItems: 'center',
|
|
338
|
+
justifyContent: 'center'
|
|
339
|
+
},
|
|
340
|
+
options: {
|
|
341
|
+
position: 'absolute',
|
|
342
|
+
top: '100%',
|
|
343
|
+
left: 0,
|
|
344
|
+
right: 0,
|
|
345
|
+
marginTop: 6,
|
|
346
|
+
zIndex: 20,
|
|
347
|
+
elevation: 8,
|
|
348
|
+
backgroundColor: '#ffffff',
|
|
349
|
+
borderWidth: 1,
|
|
350
|
+
borderColor: '#edf1f6',
|
|
351
|
+
borderRadius: 8,
|
|
352
|
+
maxHeight: 220,
|
|
353
|
+
overflow: 'hidden',
|
|
354
|
+
shadowColor: '#0f172a',
|
|
355
|
+
shadowOpacity: 0.18,
|
|
356
|
+
shadowRadius: 12,
|
|
357
|
+
shadowOffset: {
|
|
358
|
+
width: 0,
|
|
359
|
+
height: 6
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
option: {
|
|
363
|
+
flexDirection: 'row',
|
|
364
|
+
alignItems: 'center',
|
|
365
|
+
gap: 8,
|
|
366
|
+
paddingVertical: 12,
|
|
367
|
+
paddingHorizontal: 12,
|
|
368
|
+
borderBottomWidth: 1,
|
|
369
|
+
borderBottomColor: '#f1f5f9'
|
|
370
|
+
},
|
|
371
|
+
optionText: {
|
|
372
|
+
fontSize: 14,
|
|
373
|
+
color: '#1e1e1e'
|
|
374
|
+
},
|
|
375
|
+
error: {
|
|
376
|
+
color: '#ef4444',
|
|
377
|
+
fontSize: 13,
|
|
378
|
+
marginBottom: 12
|
|
379
|
+
},
|
|
380
|
+
primaryBtn: {
|
|
381
|
+
width: '100%',
|
|
382
|
+
paddingVertical: 15,
|
|
383
|
+
alignItems: 'center',
|
|
384
|
+
marginTop: 4
|
|
385
|
+
},
|
|
386
|
+
primaryBtnText: {
|
|
387
|
+
fontSize: 16,
|
|
388
|
+
fontWeight: '600'
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
//# sourceMappingURL=selection-sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useMemo","useState","ActivityIndicator","Pressable","ScrollView","StyleSheet","Text","TouchableOpacity","View","SvgUri","ClockPayClient","formatMoney","BottomSheet","ChevronDownIcon","CloseIcon","LogoIcon","jsx","_jsx","jsxs","_jsxs","CoinLogo","uri","style","styles","logo","children","width","height","Dropdown","label","placeholder","value","options","disabled","loading","theme","onSelect","open","setOpen","selected","find","o","id","field","fieldOpen","req","activeOpacity","select","selectDisabled","onPress","selectValue","image","selectText","size","color","map","option","optionText","accent","fontWeight","SelectionSheet","visible","publicKey","apiBaseUrl","amount","currency","reference","meta","onRequestClose","onClosed","onProceed","onError","client","coins","setCoins","networks","setNetworks","coinId","setCoinId","networkId","setNetworkId","loadingCoins","setLoadingCoins","loadingNetworks","setLoadingNetworks","submitting","setSubmitting","error","setError","active","getCoins","then","list","catch","e","message","finally","getNetworks","canSubmit","Boolean","proceed","link","createLink","response","initiatePayment","clientSecret","data","err","Error","coinOptions","c","name","toUpperCase","networkOptions","n","onClose","closeOnBackdropPress","header","title","cancel","hitSlop","accessibilityRole","accessibilityLabel","showsVerticalScrollIndicator","keyboardShouldPersistTaps","card","muted","primaryBtn","backgroundColor","borderRadius","radius","primaryBtnText","create","flexDirection","alignItems","justifyContent","gap","paddingBottom","fontSize","position","right","top","padding","borderWidth","borderColor","marginBottom","marginTop","zIndex","elevation","paddingVertical","paddingHorizontal","flexShrink","overflow","left","maxHeight","shadowColor","shadowOpacity","shadowRadius","shadowOffset","borderBottomWidth","borderBottomColor"],"sourceRoot":"..\\..\\..\\src","sources":["components/selection-sheet.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,16 @@ export function formatTime(totalSeconds) {
|
|
|
9
9
|
const seconds = safe % 60;
|
|
10
10
|
return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
|
|
11
11
|
}
|
|
12
|
+
const CURRENCY_SYMBOLS = {
|
|
13
|
+
ngn: '₦',
|
|
14
|
+
usd: '$'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** Formats a fiat amount with its currency symbol, e.g. `formatMoney(20000, 'ngn')` → `₦20,000`. */
|
|
18
|
+
export function formatMoney(amount, currency) {
|
|
19
|
+
const symbol = CURRENCY_SYMBOLS[currency?.toLowerCase()] ?? '';
|
|
20
|
+
return `${symbol}${amount.toLocaleString()}`;
|
|
21
|
+
}
|
|
12
22
|
|
|
13
23
|
/** Resolves the on-chain code used to verify a transaction for a given checkout. */
|
|
14
24
|
export function resolveNetworkCode(network, fallback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NETWORK_CODES","formatTime","totalSeconds","safe","Math","max","minutes","floor","seconds","String","padStart","resolveNetworkCode","network","fallback","key","
|
|
1
|
+
{"version":3,"names":["NETWORK_CODES","formatTime","totalSeconds","safe","Math","max","minutes","floor","seconds","String","padStart","CURRENCY_SYMBOLS","ngn","usd","formatMoney","amount","currency","symbol","toLowerCase","toLocaleString","resolveNetworkCode","network","fallback","key","truncateMiddle","value","lead","tail","length","slice"],"sourceRoot":"..\\..\\..\\src","sources":["internal/format.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,aAAa;;AAE3C;AACA,OAAO,SAASC,UAAUA,CAACC,YAAoB,EAAU;EACvD,MAAMC,IAAI,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,YAAY,CAAC;EACtC,MAAMI,OAAO,GAAGF,IAAI,CAACG,KAAK,CAACJ,IAAI,GAAG,EAAE,CAAC;EACrC,MAAMK,OAAO,GAAGL,IAAI,GAAG,EAAE;EACzB,OAAO,GAAGM,MAAM,CAACH,OAAO,CAAC,CAACI,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAID,MAAM,CAACD,OAAO,CAAC,CAACE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAClF;AAEA,MAAMC,gBAAwC,GAAG;EAAEC,GAAG,EAAE,GAAG;EAAEC,GAAG,EAAE;AAAI,CAAC;;AAEvE;AACA,OAAO,SAASC,WAAWA,CAACC,MAAc,EAAEC,QAAgB,EAAU;EACpE,MAAMC,MAAM,GAAGN,gBAAgB,CAACK,QAAQ,EAAEE,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE;EAC9D,OAAO,GAAGD,MAAM,GAAGF,MAAM,CAACI,cAAc,CAAC,CAAC,EAAE;AAC9C;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAACC,OAAgB,EAAEC,QAAiB,EAAU;EAC9E,MAAMC,GAAG,GAAGF,OAAO,EAAEH,WAAW,CAAC,CAAC,IAAI,EAAE;EACxC,OAAOlB,aAAa,CAACuB,GAAG,CAAC,IAAID,QAAQ,IAAI,EAAE;AAC7C;;AAEA;AACA,OAAO,SAASE,cAAcA,CAACC,KAAa,EAAEC,IAAI,GAAG,EAAE,EAAEC,IAAI,GAAG,CAAC,EAAU;EACzE,IAAIF,KAAK,CAACG,MAAM,IAAIF,IAAI,GAAGC,IAAI,GAAG,CAAC,EAAE,OAAOF,KAAK;EACjD,OAAO,GAAGA,KAAK,CAACI,KAAK,CAAC,CAAC,EAAEH,IAAI,CAAC,IAAID,KAAK,CAACI,KAAK,CAAC,CAACF,IAAI,CAAC,EAAE;AACxD","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CheckoutResponse, VerifyCryptoPayload, VerifyCryptoResponse } from '../types';
|
|
1
|
+
import type { CheckoutResponse, Coin, CreateLinkData, CreateLinkPayload, Network, VerifyCryptoPayload, VerifyCryptoResponse } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* A small, typed wrapper around the ClockPay REST API.
|
|
4
4
|
*
|
|
@@ -9,6 +9,12 @@ import type { CheckoutResponse, VerifyCryptoPayload, VerifyCryptoResponse } from
|
|
|
9
9
|
export declare class ClockPayClient {
|
|
10
10
|
private readonly http;
|
|
11
11
|
constructor(publicKey: string, apiBaseUrl?: string);
|
|
12
|
+
/** Lists the coins a buyer can pay with. */
|
|
13
|
+
getCoins(): Promise<Coin[]>;
|
|
14
|
+
/** Lists the settlement networks available for a given coin. */
|
|
15
|
+
getNetworks(coinId: string): Promise<Network[]>;
|
|
16
|
+
/** Generates a payment link, returning its reference and client secret. */
|
|
17
|
+
createLink(payload: CreateLinkPayload): Promise<CreateLinkData>;
|
|
12
18
|
/** Initiates a checkout for the given client secret. */
|
|
13
19
|
initiatePayment(clientSecret: string): Promise<CheckoutResponse>;
|
|
14
20
|
/** Verifies an on-chain transaction by hash. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAclB;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAclD,wDAAwD;IAClD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAetE,gDAAgD;IAC1C,YAAY,CAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;CAWjC"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EAEJ,cAAc,EACd,iBAAiB,EAEjB,OAAO,EAEP,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAclB;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAclD,4CAA4C;IACtC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IASjC,gEAAgE;IAC1D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAcrD,2EAA2E;IACrE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAYrE,wDAAwD;IAClD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAetE,gDAAgD;IAC1C,YAAY,CAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;CAWjC"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export declare const endpoints: Readonly<{
|
|
2
|
+
coins: "/wallet/client/checkout/coins";
|
|
3
|
+
networks: "/wallet/client/checkout/networks";
|
|
4
|
+
createLink: "/payment/client/create-link";
|
|
2
5
|
initiatePayment: "/payment/client/checkout";
|
|
3
6
|
verifyCrypto: "/transactions/verify-crypto";
|
|
4
7
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../../src/api/endpoints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../../src/api/endpoints.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;EAMpB,CAAC"}
|
|
@@ -7,6 +7,7 @@ export declare function LogoIcon({ size }: IconProps): import("react").JSX.Eleme
|
|
|
7
7
|
export declare function CloseIcon({ size, color }: IconProps): import("react").JSX.Element;
|
|
8
8
|
export declare function CopyIcon({ size, color }: IconProps): import("react").JSX.Element;
|
|
9
9
|
export declare function InfoIcon({ size }: IconProps): import("react").JSX.Element;
|
|
10
|
+
export declare function ChevronDownIcon({ size, color }: IconProps): import("react").JSX.Element;
|
|
10
11
|
export declare function CheckIcon({ size }: IconProps): import("react").JSX.Element;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=icons.d.ts.map
|