@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 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-080) | Bắt đầu/dừng nhận dạng và nhận văn bản tạm thời/cuối cùng |
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, hoặc app chưa hỗ trợ (`@retion-miniapp/react-native` < 0.7.5) |
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
- Với Web SDK **0.8.1**, app chủ cài `@retion-miniapp/react-native@0.8.1` và hoàn tất cấu hình quyền/native. Package tự xử lý biometric, không cần truyền adapter. Xem [cấu hình app chủ](https://github.com/vanqui123/retion-miniapp-react-native/blob/main/docs/BIOMETRICS.md).
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
- const { available, biometryType } = await getBiometricAvailability();
323
- if (available) {
324
- const result = await authenticateBiometric({ reason: 'Xác nhận danh tính', cancelButtonText: 'Huỷ' });
325
- if (!result.success) console.log(result.error);
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
- Từ Web SDK **0.7.3** và host **0.7.8**, kết quả được giữ nguyên từ thư viện native:
330
- `{ success: boolean, error?: string }`. Người dùng huỷ có thể trả `success: false`; hãy kiểm tra
331
- `result.success` trước khi tiếp tục. Lỗi native bị reject vẫn đi qua `MiniAppError` của bridge,
332
- giữ mã và thông báo do native cung cấp khi có. Lỗi bridge như `BUSY`, `INVALID_PARAMS`,
333
- `NOT_SUPPORTED`, `NOT_IN_HOST`, `TIMEOUT` vẫn được reject.
334
- `getBiometricAvailability()` giữ nguyên cả trường `error` của native nếu có.
335
- API xác minh trên thiết bị, không trả dữ liệu sinh trắc học hoặc token đăng nhập backend.
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 (0.8.0)
347
+ ### Nhận dạng giọng nói
338
348
 
339
- API speech có từ **0.8.0**. Khuyên dùng Web SDK **0.8.1** và Mini App React Native **0.8.1**, gồm bản sửa đăng ký listener trên đúng native module để nhận text và event kết thúc. App chủ cấu hình Expo Modules, quyền micro/nhận dạng và build native một lần. Không gắn handler speech hay gửi message theo kênh `chat_sdk`. Xem [hướng dẫn cài đặt và hoạt động đầy đủ](https://github.com/vanqui123/retion-miniapp-react-native/blob/main/docs/SPEECH.md).
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, result.results));
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('Phiên nghe đã kết thúc'));
357
+ const offEnd = onSpeech('speech.end', () => console.log('Đã dừng nghe'));
349
358
 
350
- // Nút bắt đầu gọi hàm này. Promise không trả văn bản.
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('Không bắt đầu được:', error); }
362
+ catch (error) { console.error(error); }
354
363
  }
355
364
 
356
- // Nút dừng: vẫn chờ kết quả cuối hoặc lỗi và event speech.end.
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('Không dừng được:', error); }
368
+ catch (error) { console.error(error); }
360
369
  }
361
370
 
362
- // Khi rời màn hình trong web: dừng nếu không còn cần nghe, rồi dọn listener.
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>` sau khi xin quyền và gửi lệnh bắt đầu; chờ tối đa 2 phút |
373
- | `stopSpeech()` | `Promise<void>` khi gửi lệnh dừng; chờ phản hồi bridge tối đa 15 giây, không phải chờ câu cuối |
374
- | `speech.partial` / `speech.final` | `{ text, isFinal, results, ... }`; giữ dữ liệu native và thêm `text` |
375
- | `speech.error` | `{ code, error, message, ... }`; lỗi xảy ra trong phiên |
376
- | `speech.end` | `undefined`; native kết thúc và host đã giải phóng phiên |
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
- Mặc định: `lang: 'vi-VN'`, `continuous: true`, `interimResults: true`, `addsPunctuation: true`, `requiresOnDeviceRecognition: false`. Web có thể truyền các tuỳ chọn này vào `startSpeech`; tính năng nhận dạng tuỳ thuộc dịch vụ và ngôn ngữ trên thiết bị.
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
- Chỉ một mini app được giữ phiên. Phiên đang bận trả `BUSY`; thiếu quyền trả `PERMISSION_DENIED`; tham số sai trả `INVALID_PARAMS`; mini app không còn hoạt động trả `CANCELLED`; thiếu native module trả `NOT_SUPPORTED`. Lỗi khởi động đi vào Promise; lỗi nhận dạng đi qua event. Host cũ có thể không hỗ trợ API. Trình duyệt ngoài host trả `NOT_IN_HOST`.
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
- Dừng không đảm bảo luôn có `speech.final`: native có thể không nhận được lời nói hoặc báo lỗi rồi kết thúc. `speech.final` trong chế độ nghe liên tục cũng không có nghĩa phiên đã kết thúc. Chỉ dựa vào `speech.end` để biết phiên đã được giải phóng.
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
- Đóng/ẩn mini app, reload WebView hoặc app xuống nền sẽ huỷ phiên. Huỷ listener web không tự tắt micro. Hết thời gian chờ web không tự huỷ lời gọi native hoặc đóng hộp xin quyền; nếu không còn muốn nghe, yêu cầu dừng. API speech không phụ thuộc cài đặt ngôn ngữ của Chat SDK.
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
@@ -157,7 +157,7 @@ var on = (event, listener) => {
157
157
  };
158
158
 
159
159
  // src/version.ts
160
- var SDK_VERSION = "0.8.1" ;
160
+ var SDK_VERSION = "0.8.2" ;
161
161
 
162
162
  // src/apis/app.ts
163
163
  var closeApp = () => call("closeApp");
package/dist/index.js CHANGED
@@ -155,7 +155,7 @@ var on = (event, listener) => {
155
155
  };
156
156
 
157
157
  // src/version.ts
158
- var SDK_VERSION = "0.8.1" ;
158
+ var SDK_VERSION = "0.8.2" ;
159
159
 
160
160
  // src/apis/app.ts
161
161
  var closeApp = () => call("closeApp");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retion-miniapp/sdk",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Retion Mini App SDK — kết nối web mini app với app Retion",
5
5
  "keywords": [
6
6
  "retion",