react-native-custom-ota 1.0.1 → 1.0.3
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 +1 -0
- package/ios/CustomOTABundleResolver.h +13 -0
- package/lib/commonjs/ProgressModal.js +163 -0
- package/lib/commonjs/hoc.js +39 -1
- package/lib/commonjs/index.js +9 -1
- package/lib/commonjs/manager.js +71 -6
- package/lib/commonjs/types.js +12 -1
- package/lib/commonjs/useCustomOTA.js +119 -0
- package/lib/module/ProgressModal.js +155 -0
- package/lib/module/hoc.js +42 -4
- package/lib/module/index.js +9 -1
- package/lib/module/manager.js +72 -7
- package/lib/module/types.js +11 -0
- package/lib/module/useCustomOTA.js +116 -0
- package/lib/typescript/ProgressModal.d.ts +17 -0
- package/lib/typescript/ProgressModal.js +163 -0
- package/lib/typescript/hoc.d.ts +1 -0
- package/lib/typescript/hoc.js +39 -1
- package/lib/typescript/index.d.ts +7 -0
- package/lib/typescript/index.js +9 -1
- package/lib/typescript/manager.d.ts +19 -5
- package/lib/typescript/manager.js +71 -6
- package/lib/typescript/types.d.ts +29 -0
- package/lib/typescript/types.js +12 -1
- package/lib/typescript/useCustomOTA.d.ts +35 -0
- package/lib/typescript/useCustomOTA.js +119 -0
- package/package.json +1 -1
- package/src/ProgressModal.tsx +214 -0
- package/src/hoc.tsx +56 -4
- package/src/index.ts +9 -1
- package/src/manager.ts +83 -9
- package/src/types.ts +32 -0
- package/src/useCustomOTA.ts +177 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { useEffect, useState, useCallback } from "react";
|
|
2
|
+
import { CustomOTAManager } from "./manager";
|
|
3
|
+
import {
|
|
4
|
+
DownloadProgress,
|
|
5
|
+
LocalPackage,
|
|
6
|
+
RemotePackage,
|
|
7
|
+
SyncOptions,
|
|
8
|
+
SyncStatus,
|
|
9
|
+
DetailedStatus
|
|
10
|
+
} from "./types";
|
|
11
|
+
|
|
12
|
+
export interface UseCustomOTAReturn {
|
|
13
|
+
/** Đang kiểm tra cập nhật */
|
|
14
|
+
isChecking: boolean;
|
|
15
|
+
/** Đang trong tiến trình tải xuống hoặc cài đặt */
|
|
16
|
+
isDownloading: boolean;
|
|
17
|
+
/** Thông tin tiến độ tải chi tiết */
|
|
18
|
+
progress: DownloadProgress;
|
|
19
|
+
/** Trạng thái tổng quát của Sync */
|
|
20
|
+
syncStatus: SyncStatus;
|
|
21
|
+
/** Trạng thái chi tiết (IDLE, CHECKING, DOWNLOADING, VERIFYING, INSTALLING, COMPLETED, ERROR) */
|
|
22
|
+
detailedStatus: DetailedStatus;
|
|
23
|
+
/** Thông điệp trạng thái bằng chữ (tiếng Việt thân thiện) */
|
|
24
|
+
statusText: string;
|
|
25
|
+
/** Thông tin phiên bản OTA hiện tại của máy */
|
|
26
|
+
activeMetadata: LocalPackage | null;
|
|
27
|
+
/** Phiên bản active hiện tại (vd: '1.0.8') */
|
|
28
|
+
activeVersion: string;
|
|
29
|
+
/** Kiểm tra bản cập nhật mới từ server */
|
|
30
|
+
checkForUpdate: (options: {
|
|
31
|
+
serverUrl: string;
|
|
32
|
+
appId?: string;
|
|
33
|
+
apiKey?: string;
|
|
34
|
+
nativeVersion?: string;
|
|
35
|
+
channel?: string;
|
|
36
|
+
}) => Promise<RemotePackage | null>;
|
|
37
|
+
/** Thực hiện đồng bộ tự động */
|
|
38
|
+
sync: (options: SyncOptions) => Promise<SyncStatus>;
|
|
39
|
+
/** Khởi động lại ứng dụng để áp dụng bản OTA */
|
|
40
|
+
restartApp: () => Promise<void>;
|
|
41
|
+
/** Làm mới thông tin metadata phiên bản hiện tại */
|
|
42
|
+
refreshMetadata: () => Promise<LocalPackage>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function useCustomOTA(): UseCustomOTAReturn {
|
|
46
|
+
const [isChecking, setIsChecking] = useState(false);
|
|
47
|
+
const [isDownloading, setIsDownloading] = useState(false);
|
|
48
|
+
const [progress, setProgress] = useState<DownloadProgress>({
|
|
49
|
+
totalBytes: 0,
|
|
50
|
+
receivedBytes: 0,
|
|
51
|
+
percentage: 0,
|
|
52
|
+
progress: 0
|
|
53
|
+
});
|
|
54
|
+
const [syncStatus, setSyncStatus] = useState<SyncStatus>(SyncStatus.UP_TO_DATE);
|
|
55
|
+
const [detailedStatus, setDetailedStatus] = useState<DetailedStatus>(DetailedStatus.IDLE);
|
|
56
|
+
const [statusText, setStatusText] = useState("");
|
|
57
|
+
const [activeMetadata, setActiveMetadata] = useState<LocalPackage | null>(null);
|
|
58
|
+
|
|
59
|
+
const refreshMetadata = useCallback(async () => {
|
|
60
|
+
try {
|
|
61
|
+
const meta = await CustomOTAManager.getUpdateMetadata();
|
|
62
|
+
setActiveMetadata(meta);
|
|
63
|
+
return meta;
|
|
64
|
+
} catch {
|
|
65
|
+
return {
|
|
66
|
+
currentVersion: "0.0.0",
|
|
67
|
+
previousVersion: null,
|
|
68
|
+
pending: false,
|
|
69
|
+
ready: true,
|
|
70
|
+
failedVersions: []
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}, []);
|
|
74
|
+
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
refreshMetadata();
|
|
77
|
+
|
|
78
|
+
// Đăng ký nhận sự kiện tiến độ toàn cục
|
|
79
|
+
const removeProgressListener = CustomOTAManager.addProgressListener((prog) => {
|
|
80
|
+
setProgress(prog);
|
|
81
|
+
setIsDownloading(true);
|
|
82
|
+
setDetailedStatus(DetailedStatus.DOWNLOADING);
|
|
83
|
+
setStatusText(`Đang tải bản cập nhật: ${prog.percentage}%`);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const removeStatusListener = CustomOTAManager.addDetailedStatusListener((status, msg) => {
|
|
87
|
+
setDetailedStatus(status);
|
|
88
|
+
if (msg) setStatusText(msg);
|
|
89
|
+
|
|
90
|
+
if (status === DetailedStatus.DOWNLOADING) {
|
|
91
|
+
setIsDownloading(true);
|
|
92
|
+
} else if (status === DetailedStatus.COMPLETED || status === DetailedStatus.ERROR) {
|
|
93
|
+
setIsDownloading(false);
|
|
94
|
+
refreshMetadata();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
return () => {
|
|
99
|
+
removeProgressListener();
|
|
100
|
+
removeStatusListener();
|
|
101
|
+
};
|
|
102
|
+
}, [refreshMetadata]);
|
|
103
|
+
|
|
104
|
+
const checkForUpdate = useCallback(
|
|
105
|
+
async (options: {
|
|
106
|
+
serverUrl: string;
|
|
107
|
+
appId?: string;
|
|
108
|
+
apiKey?: string;
|
|
109
|
+
nativeVersion?: string;
|
|
110
|
+
channel?: string;
|
|
111
|
+
}) => {
|
|
112
|
+
setIsChecking(true);
|
|
113
|
+
setDetailedStatus(DetailedStatus.CHECKING);
|
|
114
|
+
setStatusText("Đang kiểm tra phiên bản mới...");
|
|
115
|
+
try {
|
|
116
|
+
const update = await CustomOTAManager.checkForUpdate(options);
|
|
117
|
+
if (update && update.updateAvailable) {
|
|
118
|
+
setDetailedStatus(DetailedStatus.UPDATE_AVAILABLE);
|
|
119
|
+
setStatusText(`Tìm thấy bản cập nhật mới v${update.otaVersion}`);
|
|
120
|
+
} else {
|
|
121
|
+
setDetailedStatus(DetailedStatus.IDLE);
|
|
122
|
+
setStatusText("Ứng dụng đang ở phiên bản mới nhất");
|
|
123
|
+
}
|
|
124
|
+
return update;
|
|
125
|
+
} catch (err: any) {
|
|
126
|
+
setDetailedStatus(DetailedStatus.ERROR);
|
|
127
|
+
setStatusText(err.message || "Lỗi khi kiểm tra cập nhật");
|
|
128
|
+
throw err;
|
|
129
|
+
} finally {
|
|
130
|
+
setIsChecking(false);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
[]
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const sync = useCallback(
|
|
137
|
+
async (options: SyncOptions) => {
|
|
138
|
+
setIsChecking(true);
|
|
139
|
+
setProgress({ totalBytes: 0, receivedBytes: 0, percentage: 0, progress: 0 });
|
|
140
|
+
try {
|
|
141
|
+
const status = await CustomOTAManager.sync(
|
|
142
|
+
options,
|
|
143
|
+
(s) => setSyncStatus(s),
|
|
144
|
+
(prog) => setProgress(prog)
|
|
145
|
+
);
|
|
146
|
+
setSyncStatus(status);
|
|
147
|
+
await refreshMetadata();
|
|
148
|
+
return status;
|
|
149
|
+
} finally {
|
|
150
|
+
setIsChecking(false);
|
|
151
|
+
setIsDownloading(false);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
[refreshMetadata]
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const restartApp = useCallback(async () => {
|
|
158
|
+
await CustomOTAManager.restartApp();
|
|
159
|
+
}, []);
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
isChecking,
|
|
163
|
+
isDownloading,
|
|
164
|
+
progress,
|
|
165
|
+
syncStatus,
|
|
166
|
+
detailedStatus,
|
|
167
|
+
statusText,
|
|
168
|
+
activeMetadata,
|
|
169
|
+
activeVersion: activeMetadata?.currentVersion || "0.0.0",
|
|
170
|
+
checkForUpdate,
|
|
171
|
+
sync,
|
|
172
|
+
restartApp,
|
|
173
|
+
refreshMetadata
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export default useCustomOTA;
|