@retion-miniapp/sdk 0.8.1 → 0.8.2
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/CHANGELOG.md +6 -0
- package/README.md +47 -38
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.2 — 2026-10-28
|
|
4
|
+
|
|
5
|
+
### Docs
|
|
6
|
+
- Rút gọn README theo cách sử dụng Web SDK: cài package, gọi API, nhận kết quả/event và xử lý lỗi. Bỏ lịch sử version và chi tiết triển khai app chủ khỏi hướng dẫn sử dụng. Không thay đổi API.
|
|
7
|
+
|
|
8
|
+
|
|
3
9
|
## 0.8.1 — 2026-10-28
|
|
4
10
|
|
|
5
11
|
### Docs
|
package/README.md
CHANGED
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
SDK cho web mini app chạy trong app Retion.
|
|
4
4
|
|
|
5
|
-
Tài liệu **Web SDK 0.8.1**, dùng với **Mini App React Native 0.8.1** để có đầy đủ Face ID / Touch ID và speech-to-text đã sửa listener native. App chủ tự cấu hình quyền và build native một lần; web chỉ gọi API và nhận kết quả/event.
|
|
6
|
-
|
|
7
|
-
[Hướng dẫn tích hợp app chủ](https://gist.github.com/vanqui123/e90b4efc40b8a85cc7a4b922ef0378b8) · [Face ID / Touch ID](#face-id--touch-id--android-biometrics) · [Speech-to-text](#nhận-dạng-giọng-nói-080)
|
|
8
|
-
|
|
9
5
|
```bash
|
|
10
6
|
npm i @retion-miniapp/sdk
|
|
11
7
|
```
|
|
@@ -24,7 +20,7 @@ npm i @retion-miniapp/sdk
|
|
|
24
20
|
| [`openLink(url)`](#openlinkurl) | Mở link bằng hệ điều hành (deeplink app khác, tel:, mailto:, https) |
|
|
25
21
|
| [`haptic(type)`](#haptictype) | Rung phản hồi (bấm nút, thanh toán xong…) |
|
|
26
22
|
| [`getBiometricAvailability()` / `authenticateBiometric(req)`](#face-id--touch-id--android-biometrics) | Kiểm tra Face ID / Touch ID và trả nguyên kết quả xác thực native |
|
|
27
|
-
| [`startSpeech(options)` / `stopSpeech()` / `onSpeech(event, cb)`](#nhận-dạng-giọng-nói
|
|
23
|
+
| [`startSpeech(options)` / `stopSpeech()` / `onSpeech(event, cb)`](#nhận-dạng-giọng-nói) | Bắt đầu/dừng nhận dạng và nhận văn bản tạm thời/cuối cùng |
|
|
28
24
|
|
|
29
25
|
**1 mini app = 1 trang, load 1 lần.** Mở mini app ở page / conversation khác, app **không nạp lại trang** mà gọi `onContextChange` — thiếu nó web sẽ hiện dữ liệu page cũ. Đổi tổ chức thì app nạp lại trang.
|
|
30
26
|
|
|
@@ -244,7 +240,7 @@ if (isInHost()) {
|
|
|
244
240
|
| Lỗi | Khi nào |
|
|
245
241
|
|---|---|
|
|
246
242
|
| `INVALID_PARAMS` | url sai định dạng hoặc scheme bị chặn (`javascript:`, `file:`, `data:`, `about:`, `blob:`) |
|
|
247
|
-
| `NOT_SUPPORTED` | Không ứng dụng nào mở được link
|
|
243
|
+
| `NOT_SUPPORTED` | Không ứng dụng nào mở được link hoặc tính năng chưa được hỗ trợ |
|
|
248
244
|
|
|
249
245
|
### `haptic(type)`
|
|
250
246
|
|
|
@@ -314,53 +310,65 @@ MIT
|
|
|
314
310
|
|
|
315
311
|
### Face ID / Touch ID / Android biometrics
|
|
316
312
|
|
|
317
|
-
|
|
313
|
+
Kiểm tra thiết bị hỗ trợ rồi yêu cầu xác thực:
|
|
318
314
|
|
|
319
315
|
```ts
|
|
320
316
|
import { getBiometricAvailability, authenticateBiometric } from '@retion-miniapp/sdk';
|
|
321
317
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
318
|
+
async function authenticate() {
|
|
319
|
+
try {
|
|
320
|
+
const { available } = await getBiometricAvailability();
|
|
321
|
+
if (!available) return;
|
|
322
|
+
|
|
323
|
+
const result = await authenticateBiometric({
|
|
324
|
+
reason: 'Xác nhận danh tính',
|
|
325
|
+
cancelButtonText: 'Huỷ',
|
|
326
|
+
});
|
|
327
|
+
if (!result.success) {
|
|
328
|
+
console.log(result.error);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
// Tiếp tục thao tác sau khi xác thực thành công.
|
|
332
|
+
} catch (error) {
|
|
333
|
+
console.error(error);
|
|
334
|
+
}
|
|
326
335
|
}
|
|
327
336
|
```
|
|
328
337
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
`
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
`
|
|
335
|
-
|
|
338
|
+
| API | Kết quả |
|
|
339
|
+
| --- | --- |
|
|
340
|
+
| `getBiometricAvailability()` | `{ available, biometryType?, error? }` — khả dụng và loại sinh trắc học |
|
|
341
|
+
| `authenticateBiometric({ reason, cancelButtonText? })` | `{ success, error? }` — kết quả xác thực |
|
|
342
|
+
|
|
343
|
+
`reason` là nội dung hộp xác thực, dài 1–200 ký tự. `cancelButtonText` là nhãn nút huỷ, không bắt buộc, tối đa 80 ký tự.
|
|
344
|
+
|
|
345
|
+
Kiểm tra `result.success` trước khi tiếp tục. Người dùng huỷ có thể trả `{ success: false, error: 'User cancellation' }`; lỗi khác có thể đi vào `catch`. Loại xác thực do thiết bị quyết định: `FaceID`, `TouchID` hoặc `Biometrics` trên Android.
|
|
336
346
|
|
|
337
|
-
### Nhận dạng giọng nói
|
|
347
|
+
### Nhận dạng giọng nói
|
|
338
348
|
|
|
339
|
-
|
|
349
|
+
Đăng ký nhận văn bản trước khi bắt đầu nghe:
|
|
340
350
|
|
|
341
351
|
```ts
|
|
342
352
|
import { startSpeech, stopSpeech, onSpeech } from '@retion-miniapp/sdk';
|
|
343
353
|
|
|
344
|
-
// Đăng ký một lần khi component được tạo, trước khi bắt đầu nghe.
|
|
345
354
|
const offPartial = onSpeech('speech.partial', result => console.log(result.text));
|
|
346
|
-
const offFinal = onSpeech('speech.final', result => console.log(result.text
|
|
355
|
+
const offFinal = onSpeech('speech.final', result => console.log(result.text));
|
|
347
356
|
const offError = onSpeech('speech.error', error => console.error(error.code, error.message));
|
|
348
|
-
const offEnd = onSpeech('speech.end', () => console.log('
|
|
357
|
+
const offEnd = onSpeech('speech.end', () => console.log('Đã dừng nghe'));
|
|
349
358
|
|
|
350
|
-
//
|
|
359
|
+
// Gọi khi bấm nút bắt đầu.
|
|
351
360
|
async function startListening() {
|
|
352
361
|
try { await startSpeech({ lang: 'vi-VN' }); }
|
|
353
|
-
catch (error) { console.error(
|
|
362
|
+
catch (error) { console.error(error); }
|
|
354
363
|
}
|
|
355
364
|
|
|
356
|
-
//
|
|
365
|
+
// Gọi khi bấm nút dừng; vẫn giữ listener để nhận câu cuối.
|
|
357
366
|
async function stopListening() {
|
|
358
367
|
try { await stopSpeech(); }
|
|
359
|
-
catch (error) { console.error(
|
|
368
|
+
catch (error) { console.error(error); }
|
|
360
369
|
}
|
|
361
370
|
|
|
362
|
-
// Khi
|
|
363
|
-
// Nếu cần lưu câu cuối, giữ listener cho đến speech.end trước khi dọn.
|
|
371
|
+
// Khi huỷ component: dừng nếu không còn cần nghe và dọn listener.
|
|
364
372
|
async function dispose() {
|
|
365
373
|
try { await stopSpeech(); }
|
|
366
374
|
finally { offPartial(); offFinal(); offError(); offEnd(); }
|
|
@@ -369,16 +377,17 @@ async function dispose() {
|
|
|
369
377
|
|
|
370
378
|
| API / event | Kết quả |
|
|
371
379
|
| --- | --- |
|
|
372
|
-
| `startSpeech(options?)` | `Promise<void
|
|
373
|
-
| `stopSpeech()` |
|
|
374
|
-
| `speech.partial`
|
|
375
|
-
| `speech.
|
|
376
|
-
| `speech.
|
|
380
|
+
| `startSpeech(options?)` | Bắt đầu nghe; trả `Promise<void>`, văn bản đến qua event |
|
|
381
|
+
| `stopSpeech()` | Yêu cầu dừng; trả `Promise<void>`, không phải câu cuối |
|
|
382
|
+
| `speech.partial` | `{ text, isFinal, results }` — văn bản tạm thời |
|
|
383
|
+
| `speech.final` | `{ text, isFinal, results }` — văn bản đã chốt |
|
|
384
|
+
| `speech.error` | `{ code, error, message }` — lỗi khi đang nghe |
|
|
385
|
+
| `speech.end` | Phiên nghe đã kết thúc |
|
|
377
386
|
|
|
378
|
-
|
|
387
|
+
Truyền `lang` để chọn ngôn ngữ, ví dụ `vi-VN`, `en-US`. Mặc định là `vi-VN`, không tự đoán ngôn ngữ đang nói. Muốn đổi ngôn ngữ, dừng phiên hiện tại rồi bắt đầu lại.
|
|
379
388
|
|
|
380
|
-
|
|
389
|
+
Các tuỳ chọn khác: `continuous` (mặc định `true`), `interimResults` (`true`), `addsPunctuation` (`true`), `requiresOnDeviceRecognition` (`false`). Khả năng nhận dạng phụ thuộc thiết bị và dịch vụ đang dùng.
|
|
381
390
|
|
|
382
|
-
|
|
391
|
+
Giữ listener sau khi gọi dừng để nhận câu cuối nếu có, và chờ `speech.end`. Nếu cần lưu câu cuối khi rời màn hình, đợi event kết thúc trước khi dọn listener. Huỷ listener không tự dừng nghe.
|
|
383
392
|
|
|
384
|
-
|
|
393
|
+
Lỗi bắt đầu/dừng đi vào `catch`; lỗi trong phiên đến qua `speech.error`. `BUSY` nghĩa là đang có phiên khác, `PERMISSION_DENIED` là chưa được cấp quyền, `NOT_SUPPORTED` là tính năng chưa được hỗ trợ. Xem thêm [xử lý lỗi](#lỗi).
|
package/dist/index.cjs
CHANGED
package/dist/index.js
CHANGED