@heyama/pay-react-native 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +99 -2
- package/assets/fonts/Figtree-Bold.ttf +0 -0
- package/assets/fonts/Figtree-ExtraBold.ttf +0 -0
- package/assets/fonts/Figtree-Medium.ttf +0 -0
- package/assets/fonts/Figtree-Regular.ttf +0 -0
- package/assets/fonts/Figtree-SemiBold.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/assets/logos/apple-pay.png +0 -0
- package/assets/logos/card.png +0 -0
- package/assets/logos/google-pay.png +0 -0
- package/assets/logos/mastercard.png +0 -0
- package/assets/logos/mixx.png +0 -0
- package/assets/logos/moov.png +0 -0
- package/assets/logos/mtn.png +0 -0
- package/assets/logos/orange.png +0 -0
- package/assets/logos/paypal.png +0 -0
- package/assets/logos/visa.png +0 -0
- package/assets/logos/wave.png +0 -0
- package/dist/checkout-core/hooks/use-checkout-controller.d.ts +9 -0
- package/dist/checkout-core/hooks/use-checkout-controller.js +319 -0
- package/dist/checkout-core/hooks/use-checkout-timers.d.ts +15 -0
- package/dist/checkout-core/hooks/use-checkout-timers.js +44 -0
- package/dist/checkout-core/hooks/use-phone-number.d.ts +7 -0
- package/dist/checkout-core/hooks/use-phone-number.js +82 -0
- package/dist/checkout-core/messages/en.d.ts +253 -0
- package/dist/checkout-core/messages/en.js +243 -0
- package/dist/checkout-core/messages/fr.d.ts +4 -0
- package/dist/checkout-core/messages/fr.js +245 -0
- package/dist/checkout-core/models/checkout.card.utils.d.ts +22 -0
- package/dist/checkout-core/models/checkout.card.utils.js +101 -0
- package/dist/checkout-core/models/checkout.constants.d.ts +56 -0
- package/dist/checkout-core/models/checkout.constants.js +142 -0
- package/dist/checkout-core/models/checkout.enum.d.ts +133 -0
- package/dist/checkout-core/models/checkout.enum.js +150 -0
- package/dist/checkout-core/models/checkout.interface.d.ts +417 -0
- package/dist/checkout-core/models/checkout.interface.js +1 -0
- package/dist/checkout-core/models/checkout.money.utils.d.ts +7 -0
- package/dist/checkout-core/models/checkout.money.utils.js +21 -0
- package/dist/checkout-core/models/checkout.phone.utils.d.ts +33 -0
- package/dist/checkout-core/models/checkout.phone.utils.js +159 -0
- package/dist/checkout-core/models/checkout.view.utils.d.ts +34 -0
- package/dist/checkout-core/models/checkout.view.utils.js +205 -0
- package/dist/checkout-core/models/domain.enum.d.ts +56 -0
- package/dist/checkout-core/models/domain.enum.js +62 -0
- package/dist/components/BrissotoPayProvider.d.ts +6 -0
- package/dist/components/BrissotoPayProvider.js +41 -0
- package/dist/components/PaymentSheetModal.d.ts +8 -0
- package/dist/components/PaymentSheetModal.js +77 -0
- package/dist/components/SheetBone.d.ts +3 -0
- package/dist/components/SheetBone.js +12 -0
- package/dist/components/SheetButton.d.ts +3 -0
- package/dist/components/SheetButton.js +33 -0
- package/dist/components/SheetCardFields.d.ts +8 -0
- package/dist/components/SheetCardFields.js +66 -0
- package/dist/components/SheetChosenMethod.d.ts +3 -0
- package/dist/components/SheetChosenMethod.js +60 -0
- package/dist/components/SheetCodeField.d.ts +8 -0
- package/dist/components/SheetCodeField.js +97 -0
- package/dist/components/SheetContent.d.ts +3 -0
- package/dist/components/SheetContent.js +106 -0
- package/dist/components/SheetFailed.d.ts +3 -0
- package/dist/components/SheetFailed.js +43 -0
- package/dist/components/SheetForm.d.ts +8 -0
- package/dist/components/SheetForm.js +101 -0
- package/dist/components/SheetHeader.d.ts +6 -0
- package/dist/components/SheetHeader.js +69 -0
- package/dist/components/SheetIcon.d.ts +3 -0
- package/dist/components/SheetIcon.js +70 -0
- package/dist/components/SheetLayout.d.ts +9 -0
- package/dist/components/SheetLayout.js +48 -0
- package/dist/components/SheetLogo.d.ts +3 -0
- package/dist/components/SheetLogo.js +20 -0
- package/dist/components/SheetMessage.d.ts +3 -0
- package/dist/components/SheetMessage.js +15 -0
- package/dist/components/SheetMethodCard.d.ts +3 -0
- package/dist/components/SheetMethodCard.js +32 -0
- package/dist/components/SheetPhoneField.d.ts +3 -0
- package/dist/components/SheetPhoneField.js +58 -0
- package/dist/components/SheetRow.d.ts +3 -0
- package/dist/components/SheetRow.js +28 -0
- package/dist/components/SheetSimulator.d.ts +6 -0
- package/dist/components/SheetSimulator.js +39 -0
- package/dist/components/SheetSkeleton.d.ts +5 -0
- package/dist/components/SheetSkeleton.js +23 -0
- package/dist/components/SheetSuccess.d.ts +3 -0
- package/dist/components/SheetSuccess.js +51 -0
- package/dist/components/SheetSummary.d.ts +3 -0
- package/dist/components/SheetSummary.js +32 -0
- package/dist/components/SheetTerminal.d.ts +3 -0
- package/dist/components/SheetTerminal.js +21 -0
- package/dist/components/SheetText.d.ts +5 -0
- package/dist/components/SheetText.js +25 -0
- package/dist/components/SheetToast.d.ts +3 -0
- package/dist/components/SheetToast.js +24 -0
- package/dist/components/SheetWaiting.d.ts +7 -0
- package/dist/components/SheetWaiting.js +77 -0
- package/dist/hooks/use-native-platform.d.ts +10 -0
- package/dist/hooks/use-native-platform.js +47 -0
- package/dist/hooks/use-payment-sheet.d.ts +4 -0
- package/dist/hooks/use-payment-sheet.js +10 -0
- package/dist/hooks/use-sheet-motion.d.ts +7 -0
- package/dist/hooks/use-sheet-motion.js +62 -0
- package/dist/hooks/use-sheet-resize.d.ts +6 -0
- package/dist/hooks/use-sheet-resize.js +15 -0
- package/dist/hooks/use-sheet-theme.d.ts +4 -0
- package/dist/hooks/use-sheet-theme.js +12 -0
- package/dist/hooks/use-watched-payment.d.ts +6 -0
- package/dist/hooks/use-watched-payment.js +17 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/models/sheet.constants.d.ts +39 -0
- package/dist/models/sheet.constants.js +78 -0
- package/dist/models/sheet.enum.d.ts +16 -0
- package/dist/models/sheet.enum.js +18 -0
- package/dist/models/sheet.interface.d.ts +232 -0
- package/dist/models/sheet.interface.js +1 -0
- package/dist/models/sheet.utils.d.ts +43 -0
- package/dist/models/sheet.utils.js +132 -0
- package/dist/services/checkout.service.d.ts +7 -0
- package/dist/services/checkout.service.js +39 -0
- package/package.json +58 -4
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
import { DIAL_CODES } from "../models/checkout.constants.js";
|
|
3
|
+
import { caretAfterDigits, formatInternational, formatNational, getPhoneStatus, placeholderOf, readTypedNumber, toE164, } from "../models/checkout.phone.utils.js";
|
|
4
|
+
const digitsOf = (text) => text.replace(/\D/g, '');
|
|
5
|
+
/**
|
|
6
|
+
* The Mobile Money number, checked by the country's own rules
|
|
7
|
+
* (libphonenumber-js) and grouped as the payer types. A space deleted takes
|
|
8
|
+
* the digit before it. The field itself is the platform's.
|
|
9
|
+
*/
|
|
10
|
+
export function usePhoneNumber({ country, countries, onCountryChange, }) {
|
|
11
|
+
const [number, setNumber] = useState({
|
|
12
|
+
country,
|
|
13
|
+
digits: '',
|
|
14
|
+
pending: null,
|
|
15
|
+
});
|
|
16
|
+
const [touched, setTouched] = useState(false);
|
|
17
|
+
const [focused, setFocused] = useState(false);
|
|
18
|
+
const [submitTried, setSubmitTried] = useState(false);
|
|
19
|
+
// The page moved to another country: the number belonged to the previous one.
|
|
20
|
+
const ours = number.country === country;
|
|
21
|
+
const digits = ours ? number.digits : '';
|
|
22
|
+
const pending = ours ? number.pending : null;
|
|
23
|
+
const value = pending === null
|
|
24
|
+
? formatNational(digits, country)
|
|
25
|
+
: formatInternational(pending);
|
|
26
|
+
const type = (typed, caret) => {
|
|
27
|
+
let raw = typed;
|
|
28
|
+
let before = digitsOf(typed.slice(0, caret)).length;
|
|
29
|
+
const international = /^\s*(\+|00)/.test(typed);
|
|
30
|
+
if (!international &&
|
|
31
|
+
typed.length < value.length &&
|
|
32
|
+
digitsOf(typed) === digitsOf(value) &&
|
|
33
|
+
before > 0) {
|
|
34
|
+
// Backspace on a space: the payer meant the digit before it.
|
|
35
|
+
const all = digitsOf(typed);
|
|
36
|
+
raw = all.slice(0, before - 1) + all.slice(before);
|
|
37
|
+
before -= 1;
|
|
38
|
+
}
|
|
39
|
+
const next = readTypedNumber(raw, country, countries);
|
|
40
|
+
setNumber(next);
|
|
41
|
+
setSubmitTried(false);
|
|
42
|
+
if (next.country !== country)
|
|
43
|
+
onCountryChange(next.country);
|
|
44
|
+
return international
|
|
45
|
+
? null
|
|
46
|
+
: caretAfterDigits(formatNational(next.digits, next.country), before);
|
|
47
|
+
};
|
|
48
|
+
const status = getPhoneStatus({
|
|
49
|
+
country,
|
|
50
|
+
digits,
|
|
51
|
+
foreign: pending !== null,
|
|
52
|
+
touched,
|
|
53
|
+
focused,
|
|
54
|
+
submitTried,
|
|
55
|
+
});
|
|
56
|
+
const reject = useCallback(() => {
|
|
57
|
+
setTouched(true);
|
|
58
|
+
setSubmitTried(true);
|
|
59
|
+
}, []);
|
|
60
|
+
const fill = useCallback((e164) => {
|
|
61
|
+
const next = readTypedNumber(e164, country, [country]);
|
|
62
|
+
if (next.country === country && next.pending === null)
|
|
63
|
+
setNumber(next);
|
|
64
|
+
}, [country]);
|
|
65
|
+
return {
|
|
66
|
+
value,
|
|
67
|
+
type,
|
|
68
|
+
e164: pending === null ? toE164(digits, country) : '',
|
|
69
|
+
dial: DIAL_CODES[country],
|
|
70
|
+
placeholder: placeholderOf(country),
|
|
71
|
+
status,
|
|
72
|
+
focused,
|
|
73
|
+
onFocus: () => setFocused(true),
|
|
74
|
+
onBlur: () => {
|
|
75
|
+
setFocused(false);
|
|
76
|
+
if (value.length > 0)
|
|
77
|
+
setTouched(true);
|
|
78
|
+
},
|
|
79
|
+
reject,
|
|
80
|
+
fill,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
total_label: string;
|
|
3
|
+
total: string;
|
|
4
|
+
details: string;
|
|
5
|
+
hide_details: string;
|
|
6
|
+
each: string;
|
|
7
|
+
pay_with: string;
|
|
8
|
+
unavailable: string;
|
|
9
|
+
soon: string;
|
|
10
|
+
phone_label: string;
|
|
11
|
+
helper: string;
|
|
12
|
+
phone_errors: {
|
|
13
|
+
start: string;
|
|
14
|
+
short: string;
|
|
15
|
+
invalid: string;
|
|
16
|
+
empty: string;
|
|
17
|
+
country: string;
|
|
18
|
+
operator: string;
|
|
19
|
+
};
|
|
20
|
+
otp_label: string;
|
|
21
|
+
otp_placeholder: string;
|
|
22
|
+
otp_help: string;
|
|
23
|
+
card_fields: {
|
|
24
|
+
title: string;
|
|
25
|
+
number: string;
|
|
26
|
+
number_placeholder: string;
|
|
27
|
+
expiry: string;
|
|
28
|
+
expiry_placeholder: string;
|
|
29
|
+
cvc: string;
|
|
30
|
+
cvc_placeholder: string;
|
|
31
|
+
incomplete: string;
|
|
32
|
+
simulator_note: string;
|
|
33
|
+
};
|
|
34
|
+
mismatch: string;
|
|
35
|
+
switch_to: string;
|
|
36
|
+
pay_short: string;
|
|
37
|
+
pay_plain: string;
|
|
38
|
+
sending: string;
|
|
39
|
+
tab_wallet: string;
|
|
40
|
+
tab_card: string;
|
|
41
|
+
wallets: {
|
|
42
|
+
paypal: {
|
|
43
|
+
name: string;
|
|
44
|
+
sub: string;
|
|
45
|
+
};
|
|
46
|
+
'apple-pay': {
|
|
47
|
+
name: string;
|
|
48
|
+
sub: string;
|
|
49
|
+
};
|
|
50
|
+
'google-pay': {
|
|
51
|
+
name: string;
|
|
52
|
+
sub: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
countries: {
|
|
56
|
+
cm: string;
|
|
57
|
+
ci: string;
|
|
58
|
+
sn: string;
|
|
59
|
+
bj: string;
|
|
60
|
+
tg: string;
|
|
61
|
+
bf: string;
|
|
62
|
+
intl: string;
|
|
63
|
+
};
|
|
64
|
+
country: string;
|
|
65
|
+
change: string;
|
|
66
|
+
secured_by: string;
|
|
67
|
+
help: string;
|
|
68
|
+
terms: string;
|
|
69
|
+
privacy: string;
|
|
70
|
+
test_sub: string;
|
|
71
|
+
test_badge: string;
|
|
72
|
+
loading: string;
|
|
73
|
+
confirm_title: string;
|
|
74
|
+
sent_to: string;
|
|
75
|
+
remaining: string;
|
|
76
|
+
steps: {
|
|
77
|
+
first: string;
|
|
78
|
+
last: string;
|
|
79
|
+
};
|
|
80
|
+
no_prompt: string;
|
|
81
|
+
dial: string;
|
|
82
|
+
dial_only: string;
|
|
83
|
+
resend: string;
|
|
84
|
+
cancel: string;
|
|
85
|
+
checking_title: string;
|
|
86
|
+
checking_with: string;
|
|
87
|
+
checking_card: string;
|
|
88
|
+
simulator: {
|
|
89
|
+
title: string;
|
|
90
|
+
body: string;
|
|
91
|
+
no_answer: string;
|
|
92
|
+
approved: string;
|
|
93
|
+
declined: string;
|
|
94
|
+
insufficient_funds: string;
|
|
95
|
+
no_account: string;
|
|
96
|
+
wrong_pin: string;
|
|
97
|
+
wrong_code: string;
|
|
98
|
+
provider_error: string;
|
|
99
|
+
wrong_amount: string;
|
|
100
|
+
approved_late: string;
|
|
101
|
+
reversed: string;
|
|
102
|
+
};
|
|
103
|
+
failure: {
|
|
104
|
+
declined: {
|
|
105
|
+
title: string;
|
|
106
|
+
body: string;
|
|
107
|
+
next: string;
|
|
108
|
+
};
|
|
109
|
+
insufficient_funds: {
|
|
110
|
+
title: string;
|
|
111
|
+
body: string;
|
|
112
|
+
next: string;
|
|
113
|
+
};
|
|
114
|
+
no_account: {
|
|
115
|
+
title: string;
|
|
116
|
+
body: string;
|
|
117
|
+
next: string;
|
|
118
|
+
};
|
|
119
|
+
wrong_pin: {
|
|
120
|
+
title: string;
|
|
121
|
+
body: string;
|
|
122
|
+
next: string;
|
|
123
|
+
};
|
|
124
|
+
wrong_code: {
|
|
125
|
+
title: string;
|
|
126
|
+
body: string;
|
|
127
|
+
next: string;
|
|
128
|
+
};
|
|
129
|
+
provider_error: {
|
|
130
|
+
title: string;
|
|
131
|
+
body: string;
|
|
132
|
+
next: string;
|
|
133
|
+
};
|
|
134
|
+
timeout: {
|
|
135
|
+
title: string;
|
|
136
|
+
body: string;
|
|
137
|
+
next: string;
|
|
138
|
+
};
|
|
139
|
+
mismatch: {
|
|
140
|
+
title: string;
|
|
141
|
+
body: string;
|
|
142
|
+
next: string;
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
retry: string;
|
|
146
|
+
retry_code: string;
|
|
147
|
+
use_another: string;
|
|
148
|
+
try_with: string;
|
|
149
|
+
tries_left: string;
|
|
150
|
+
tries_value: string;
|
|
151
|
+
not_charged: string;
|
|
152
|
+
success_title: string;
|
|
153
|
+
paid_to: string;
|
|
154
|
+
amount: string;
|
|
155
|
+
method: string;
|
|
156
|
+
number: string;
|
|
157
|
+
card: string;
|
|
158
|
+
date: string;
|
|
159
|
+
reference: string;
|
|
160
|
+
copy: string;
|
|
161
|
+
copied: string;
|
|
162
|
+
download: string;
|
|
163
|
+
return_to: string;
|
|
164
|
+
return_in: string;
|
|
165
|
+
stay: string;
|
|
166
|
+
expired: {
|
|
167
|
+
title: string;
|
|
168
|
+
body: string;
|
|
169
|
+
};
|
|
170
|
+
cancelled: {
|
|
171
|
+
title: string;
|
|
172
|
+
body: string;
|
|
173
|
+
};
|
|
174
|
+
locked_screen: {
|
|
175
|
+
title: string;
|
|
176
|
+
body: string;
|
|
177
|
+
};
|
|
178
|
+
invalid: {
|
|
179
|
+
title: string;
|
|
180
|
+
body: string;
|
|
181
|
+
};
|
|
182
|
+
no_method: {
|
|
183
|
+
title: string;
|
|
184
|
+
body: string;
|
|
185
|
+
};
|
|
186
|
+
contact_support: string;
|
|
187
|
+
get_help: string;
|
|
188
|
+
returning: string;
|
|
189
|
+
not_redirected: string;
|
|
190
|
+
contact_title: string;
|
|
191
|
+
reference_title: string;
|
|
192
|
+
reference_hint: string;
|
|
193
|
+
close: string;
|
|
194
|
+
sheet: {
|
|
195
|
+
approve_title: string;
|
|
196
|
+
approve_body: string;
|
|
197
|
+
expires_in: string;
|
|
198
|
+
resend_in: string;
|
|
199
|
+
done_in: string;
|
|
200
|
+
close_title: string;
|
|
201
|
+
close_body: string;
|
|
202
|
+
keep_waiting: string;
|
|
203
|
+
dial: string;
|
|
204
|
+
};
|
|
205
|
+
faqs: {
|
|
206
|
+
not_received: {
|
|
207
|
+
q: string;
|
|
208
|
+
a: string;
|
|
209
|
+
};
|
|
210
|
+
debited: {
|
|
211
|
+
q: string;
|
|
212
|
+
a: string;
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
channels: {
|
|
216
|
+
whatsapp: string;
|
|
217
|
+
email: string;
|
|
218
|
+
};
|
|
219
|
+
error: {
|
|
220
|
+
title: string;
|
|
221
|
+
body: string;
|
|
222
|
+
retry: string;
|
|
223
|
+
};
|
|
224
|
+
refusals: {
|
|
225
|
+
closed: string;
|
|
226
|
+
method: string;
|
|
227
|
+
phone: string;
|
|
228
|
+
code: string;
|
|
229
|
+
busy: string;
|
|
230
|
+
};
|
|
231
|
+
toast: {
|
|
232
|
+
copied: string;
|
|
233
|
+
downloaded: string;
|
|
234
|
+
switched: string;
|
|
235
|
+
unavailable: string;
|
|
236
|
+
soon: string;
|
|
237
|
+
no_answer: string;
|
|
238
|
+
failed: string;
|
|
239
|
+
resent: string;
|
|
240
|
+
resend_wait: string;
|
|
241
|
+
preview: string;
|
|
242
|
+
dial: string;
|
|
243
|
+
};
|
|
244
|
+
dark_mode: string;
|
|
245
|
+
light_mode: string;
|
|
246
|
+
language_label: string;
|
|
247
|
+
receipt_title: string;
|
|
248
|
+
meta: {
|
|
249
|
+
title: string;
|
|
250
|
+
description: string;
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
export default _default;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
total_label: 'Amount to pay',
|
|
3
|
+
total: 'Total',
|
|
4
|
+
details: 'Details',
|
|
5
|
+
hide_details: 'Hide',
|
|
6
|
+
each: '{price} each',
|
|
7
|
+
pay_with: 'Pay with',
|
|
8
|
+
unavailable: 'Temporarily unavailable',
|
|
9
|
+
soon: 'Coming soon',
|
|
10
|
+
phone_label: 'Mobile Money number',
|
|
11
|
+
helper: 'The number linked to your {method} account',
|
|
12
|
+
phone_errors: {
|
|
13
|
+
start: 'Cameroon mobile numbers start with 6',
|
|
14
|
+
short: 'This number is too short',
|
|
15
|
+
invalid: "This number isn't valid",
|
|
16
|
+
empty: 'Enter your Mobile Money number',
|
|
17
|
+
country: 'Enter a number from one of the countries offered',
|
|
18
|
+
operator: "This number isn't on Orange or MTN",
|
|
19
|
+
},
|
|
20
|
+
otp_label: 'Payment code',
|
|
21
|
+
otp_placeholder: 'Enter the code',
|
|
22
|
+
otp_help: 'Dial this code on your {method} phone to get a payment code, then enter it here.',
|
|
23
|
+
card_fields: {
|
|
24
|
+
title: 'Card details',
|
|
25
|
+
number: 'Card number',
|
|
26
|
+
number_placeholder: '1234 1234 1234 1234',
|
|
27
|
+
expiry: 'Expiry date',
|
|
28
|
+
expiry_placeholder: 'MM / YY',
|
|
29
|
+
cvc: 'Security code',
|
|
30
|
+
cvc_placeholder: 'CVC',
|
|
31
|
+
incomplete: 'Check the card number, expiry date and security code.',
|
|
32
|
+
simulator_note: 'Simulator card fields: no real card is charged.',
|
|
33
|
+
},
|
|
34
|
+
mismatch: 'Looks like a {method} number. Switch?',
|
|
35
|
+
switch_to: 'Switch',
|
|
36
|
+
pay_short: 'Pay {amount} {currency} with',
|
|
37
|
+
pay_plain: 'Pay {amount} {currency}',
|
|
38
|
+
sending: 'Sending request…',
|
|
39
|
+
tab_wallet: 'Mobile Money',
|
|
40
|
+
tab_card: 'Card & wallet',
|
|
41
|
+
wallets: {
|
|
42
|
+
paypal: { name: 'PayPal', sub: 'PayPal account' },
|
|
43
|
+
'apple-pay': { name: 'Apple Pay', sub: 'iPhone · Mac' },
|
|
44
|
+
'google-pay': { name: 'Google Pay', sub: 'Android · Chrome' },
|
|
45
|
+
},
|
|
46
|
+
countries: {
|
|
47
|
+
cm: 'Cameroon',
|
|
48
|
+
ci: 'Côte d’Ivoire',
|
|
49
|
+
sn: 'Senegal',
|
|
50
|
+
bj: 'Benin',
|
|
51
|
+
tg: 'Togo',
|
|
52
|
+
bf: 'Burkina Faso',
|
|
53
|
+
intl: 'International',
|
|
54
|
+
},
|
|
55
|
+
country: 'Country',
|
|
56
|
+
change: 'Change',
|
|
57
|
+
secured_by: 'Payment secured by',
|
|
58
|
+
help: 'Need help?',
|
|
59
|
+
terms: 'Terms',
|
|
60
|
+
privacy: 'Privacy',
|
|
61
|
+
test_sub: 'No real money will be moved',
|
|
62
|
+
test_badge: 'Test',
|
|
63
|
+
loading: 'Loading the payment',
|
|
64
|
+
confirm_title: 'Confirm the payment on your phone',
|
|
65
|
+
sent_to: 'We sent a {method} request to',
|
|
66
|
+
remaining: 'left to approve',
|
|
67
|
+
steps: {
|
|
68
|
+
first: 'Unlock your phone and open the request',
|
|
69
|
+
last: 'Enter your PIN to approve',
|
|
70
|
+
},
|
|
71
|
+
no_prompt: "Didn't get the request?",
|
|
72
|
+
dial: 'Send it again, or dial this code to see pending payments',
|
|
73
|
+
dial_only: 'Send it again to your phone',
|
|
74
|
+
resend: 'Send again',
|
|
75
|
+
cancel: 'Cancel payment',
|
|
76
|
+
checking_title: 'Confirming your payment',
|
|
77
|
+
checking_with: '{method} is checking your code for',
|
|
78
|
+
checking_card: '{method} is checking your card.',
|
|
79
|
+
simulator: {
|
|
80
|
+
title: 'Simulator',
|
|
81
|
+
body: 'Test payment: pick what happens to it.',
|
|
82
|
+
no_answer: 'A number ending in {suffix} gets no answer on start.',
|
|
83
|
+
approved: 'Approve',
|
|
84
|
+
declined: 'Decline',
|
|
85
|
+
insufficient_funds: 'Low balance',
|
|
86
|
+
no_account: 'No account',
|
|
87
|
+
wrong_pin: 'Wrong PIN',
|
|
88
|
+
wrong_code: 'Wrong code',
|
|
89
|
+
provider_error: 'Provider error',
|
|
90
|
+
wrong_amount: 'Approve a wrong amount',
|
|
91
|
+
approved_late: 'Approve late',
|
|
92
|
+
reversed: 'Approve, then reverse',
|
|
93
|
+
},
|
|
94
|
+
failure: {
|
|
95
|
+
declined: {
|
|
96
|
+
title: 'Payment declined',
|
|
97
|
+
body: 'The {method} request was declined on your phone.',
|
|
98
|
+
next: 'Try again, or pay with another method.',
|
|
99
|
+
},
|
|
100
|
+
insufficient_funds: {
|
|
101
|
+
title: 'Insufficient balance',
|
|
102
|
+
body: 'Your {method} balance is too low for this payment.',
|
|
103
|
+
next: 'Top up your account and try again, or pay with another method.',
|
|
104
|
+
},
|
|
105
|
+
no_account: {
|
|
106
|
+
title: 'No {method} account',
|
|
107
|
+
body: 'This number has no {method} account.',
|
|
108
|
+
next: 'Check the number and try again, or pay with another method.',
|
|
109
|
+
},
|
|
110
|
+
wrong_pin: {
|
|
111
|
+
title: 'Wrong PIN',
|
|
112
|
+
body: 'The PIN entered for {method} was not the right one.',
|
|
113
|
+
next: 'Try again with the right PIN.',
|
|
114
|
+
},
|
|
115
|
+
wrong_code: {
|
|
116
|
+
title: 'Wrong or expired code',
|
|
117
|
+
body: 'The {method} payment code was not accepted.',
|
|
118
|
+
next: 'Get a new code and try again.',
|
|
119
|
+
},
|
|
120
|
+
provider_error: {
|
|
121
|
+
title: '{method} is not responding',
|
|
122
|
+
body: "{method} couldn't process the payment. It isn't on your side.",
|
|
123
|
+
next: 'Try again in a moment, or pay with another method.',
|
|
124
|
+
},
|
|
125
|
+
timeout: {
|
|
126
|
+
title: 'Payment not confirmed',
|
|
127
|
+
body: "{method} didn't confirm the payment in time.",
|
|
128
|
+
next: 'Try again, or pay with another method.',
|
|
129
|
+
},
|
|
130
|
+
mismatch: {
|
|
131
|
+
title: 'Payment to be checked',
|
|
132
|
+
body: '{method} reported a different amount from the one asked. The payment was not accepted.',
|
|
133
|
+
next: 'Contact support with the payment reference before trying again.',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
retry: 'Try again',
|
|
137
|
+
retry_code: 'Try with a new code',
|
|
138
|
+
use_another: 'Use another method',
|
|
139
|
+
try_with: 'Try with {method}',
|
|
140
|
+
tries_left: 'Attempts left',
|
|
141
|
+
tries_value: '{left} of {max}',
|
|
142
|
+
not_charged: 'Nothing was taken from your account.',
|
|
143
|
+
success_title: 'Payment successful',
|
|
144
|
+
paid_to: 'Paid to {app}',
|
|
145
|
+
amount: 'Amount',
|
|
146
|
+
method: 'Method',
|
|
147
|
+
number: 'Number',
|
|
148
|
+
card: 'Card',
|
|
149
|
+
date: 'Date',
|
|
150
|
+
reference: 'Reference',
|
|
151
|
+
copy: 'Copy',
|
|
152
|
+
copied: 'Copied',
|
|
153
|
+
download: 'Download receipt',
|
|
154
|
+
return_to: 'Return to {app}',
|
|
155
|
+
return_in: 'Return to {app} ({seconds})',
|
|
156
|
+
stay: 'Stay on this page',
|
|
157
|
+
expired: {
|
|
158
|
+
title: 'This payment link has expired',
|
|
159
|
+
body: 'Go back to {app} to get a new one.',
|
|
160
|
+
},
|
|
161
|
+
cancelled: {
|
|
162
|
+
title: 'This payment was cancelled',
|
|
163
|
+
body: 'Go back to {app} to pay again.',
|
|
164
|
+
},
|
|
165
|
+
locked_screen: {
|
|
166
|
+
title: 'Too many attempts',
|
|
167
|
+
body: 'For your security, this payment is paused after too many unsuccessful attempts.',
|
|
168
|
+
},
|
|
169
|
+
invalid: {
|
|
170
|
+
title: "This link isn't valid",
|
|
171
|
+
body: "We couldn't find this payment. The link may be incomplete. Open it again from the app you were paying in.",
|
|
172
|
+
},
|
|
173
|
+
no_method: {
|
|
174
|
+
title: 'No way to pay right now',
|
|
175
|
+
body: '{app} offers no payment method at the moment. Try again later.',
|
|
176
|
+
},
|
|
177
|
+
contact_support: 'Contact support',
|
|
178
|
+
get_help: 'Get help',
|
|
179
|
+
returning: 'Returning to {app}…',
|
|
180
|
+
not_redirected: 'Not redirected? Tap here',
|
|
181
|
+
contact_title: 'Contact support',
|
|
182
|
+
reference_title: 'Payment reference',
|
|
183
|
+
reference_hint: 'Share it with support so we can find your payment quickly.',
|
|
184
|
+
close: 'Close',
|
|
185
|
+
sheet: {
|
|
186
|
+
approve_title: 'Approve on your phone',
|
|
187
|
+
approve_body: 'Enter your {method} PIN in the request sent to {phone}.',
|
|
188
|
+
expires_in: 'Expires in',
|
|
189
|
+
resend_in: 'Send again in {clock}',
|
|
190
|
+
done_in: 'Done ({seconds})',
|
|
191
|
+
close_title: 'Close the payment?',
|
|
192
|
+
close_body: 'The request is still on your phone. If you approve it, the payment goes through.',
|
|
193
|
+
keep_waiting: 'Keep waiting',
|
|
194
|
+
dial: 'Dial {code}',
|
|
195
|
+
},
|
|
196
|
+
faqs: {
|
|
197
|
+
not_received: {
|
|
198
|
+
q: "I didn't get the request on my phone",
|
|
199
|
+
a: 'Check that your phone is on and has network. You can also dial the code shown on the waiting screen to see and approve pending payments.',
|
|
200
|
+
},
|
|
201
|
+
debited: {
|
|
202
|
+
q: 'I was debited but the page says failed',
|
|
203
|
+
a: "Don't pay again. Contact support with your payment reference so we can check it.",
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
channels: {
|
|
207
|
+
whatsapp: 'WhatsApp',
|
|
208
|
+
email: 'Email',
|
|
209
|
+
},
|
|
210
|
+
error: {
|
|
211
|
+
title: 'This page could not load',
|
|
212
|
+
body: 'Nothing was charged. Try again in a moment.',
|
|
213
|
+
retry: 'Try again',
|
|
214
|
+
},
|
|
215
|
+
refusals: {
|
|
216
|
+
closed: 'This payment can no longer be paid.',
|
|
217
|
+
method: 'This method is not available right now. Pick another one.',
|
|
218
|
+
phone: 'This number does not belong to this method’s country.',
|
|
219
|
+
code: 'Enter the payment code you generated.',
|
|
220
|
+
busy: 'Your earlier attempts are still in progress. Wait for their answer before trying again.',
|
|
221
|
+
},
|
|
222
|
+
toast: {
|
|
223
|
+
copied: 'Reference copied',
|
|
224
|
+
downloaded: 'Receipt downloaded',
|
|
225
|
+
switched: 'Switched to {method}',
|
|
226
|
+
unavailable: '{method} is temporarily unavailable',
|
|
227
|
+
soon: '{method} is coming soon',
|
|
228
|
+
no_answer: 'No answer yet: try again or pick another method',
|
|
229
|
+
failed: 'Something went wrong. Try again.',
|
|
230
|
+
resent: 'Request sent again to {phone}',
|
|
231
|
+
resend_wait: 'Wait a few seconds before asking again.',
|
|
232
|
+
preview: 'Preview only: nothing is paid here',
|
|
233
|
+
dial: 'Dial {code} from your {method} phone.',
|
|
234
|
+
},
|
|
235
|
+
dark_mode: 'Dark mode',
|
|
236
|
+
light_mode: 'Light mode',
|
|
237
|
+
language_label: 'Language / Langue',
|
|
238
|
+
receipt_title: 'Brissoto Pay: Payment successful',
|
|
239
|
+
meta: {
|
|
240
|
+
title: 'Secure payment',
|
|
241
|
+
description: 'Pay securely by mobile money or card with Brissoto Pay.',
|
|
242
|
+
},
|
|
243
|
+
};
|