@unvired/react-native-wrapper-sdk 0.0.13 → 0.0.15
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/dist/UnviredWrapper.d.ts +25 -22
- package/dist/UnviredWrapper.d.ts.map +1 -1
- package/dist/UnviredWrapper.js +32 -48
- package/dist/lib/auth/AuthBuilder.d.ts.map +1 -0
- package/dist/lib/auth/AuthService.d.ts +27 -0
- package/dist/lib/auth/AuthService.d.ts.map +1 -0
- package/dist/lib/auth/AuthService.js +46 -0
- package/dist/lib/database/DatabaseService.d.ts +86 -0
- package/dist/lib/database/DatabaseService.d.ts.map +1 -0
- package/dist/lib/database/DatabaseService.js +134 -0
- package/dist/lib/file/FileService.d.ts +72 -0
- package/dist/lib/file/FileService.d.ts.map +1 -0
- package/dist/lib/file/FileService.js +136 -0
- package/dist/lib/logger/LoggerService.d.ts +45 -0
- package/dist/lib/logger/LoggerService.d.ts.map +1 -0
- package/dist/lib/logger/LoggerService.js +65 -0
- package/dist/lib/notification/NotificationService.d.ts +28 -0
- package/dist/lib/notification/NotificationService.d.ts.map +1 -0
- package/dist/lib/notification/NotificationService.js +47 -0
- package/dist/lib/settings/SettingsService.d.ts +41 -0
- package/dist/lib/settings/SettingsService.d.ts.map +1 -0
- package/dist/lib/settings/SettingsService.js +108 -0
- package/dist/lib/sync/SyncService.d.ts +96 -0
- package/dist/lib/sync/SyncService.d.ts.map +1 -0
- package/dist/lib/sync/SyncService.js +139 -0
- package/package.json +3 -3
- package/src/UnviredWrapper.ts +34 -52
- package/src/lib/auth/AuthService.ts +45 -0
- package/src/lib/database/DatabaseService.ts +148 -0
- package/src/lib/file/FileService.ts +149 -0
- package/src/lib/logger/LoggerService.ts +70 -0
- package/src/lib/notification/NotificationService.ts +45 -0
- package/src/lib/settings/SettingsService.ts +126 -0
- package/src/lib/sync/SyncService.ts +160 -0
- package/dist/lib/AuthBuilder.d.ts.map +0 -1
- /package/dist/lib/{AuthBuilder.d.ts → auth/AuthBuilder.d.ts} +0 -0
- /package/dist/lib/{AuthBuilder.js → auth/AuthBuilder.js} +0 -0
- /package/src/lib/{AuthBuilder.ts → auth/AuthBuilder.ts} +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PlatformManager } from '@unvired/unvired-ts-core-sdk';
|
|
2
|
+
|
|
3
|
+
export class NotificationService {
|
|
4
|
+
|
|
5
|
+
private get adapter() {
|
|
6
|
+
return PlatformManager.getInstance().getPlatformAdapter().getPushNotificationAdapter();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Requests permission and gets token
|
|
11
|
+
*/
|
|
12
|
+
async requestPermission(options?: { forceShow: boolean }): Promise<void> {
|
|
13
|
+
return this.adapter?.requestPermission(options);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Gets the push token
|
|
18
|
+
*/
|
|
19
|
+
async getToken(): Promise<string | undefined> {
|
|
20
|
+
return this.adapter?.getToken();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Sets callback for token refresh
|
|
25
|
+
*/
|
|
26
|
+
onTokenRefresh(callback: (token: string) => void): void {
|
|
27
|
+
this.adapter?.onTokenRefresh(callback);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Sets listener for incoming notifications (foreground)
|
|
32
|
+
* @param onMessage Callback when a notification is received
|
|
33
|
+
*/
|
|
34
|
+
onNotificationReceived(onMessage: (data: any) => void): void {
|
|
35
|
+
this.adapter?.onMessage(onMessage);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Sets listener for incoming notifications (background)
|
|
40
|
+
* @param onMessage Callback when a notification is received
|
|
41
|
+
*/
|
|
42
|
+
onBackgroundNotificationReceived(onMessage: (data: any) => void): void {
|
|
43
|
+
this.adapter?.onBackgroundMessage(onMessage);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SettingsHelper,
|
|
3
|
+
FrameworkSettingsManager,
|
|
4
|
+
FrameworkSettingsFields,
|
|
5
|
+
UserSettingsManager,
|
|
6
|
+
UserSettingsFields,
|
|
7
|
+
UnviredAccountManager,
|
|
8
|
+
HttpConnection,
|
|
9
|
+
AuthenticationService
|
|
10
|
+
} from '@unvired/unvired-ts-core-sdk';
|
|
11
|
+
|
|
12
|
+
export class SettingsService {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get current log level
|
|
16
|
+
*/
|
|
17
|
+
async getLogLevel(): Promise<string> {
|
|
18
|
+
return FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.logLevel);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Set log level
|
|
23
|
+
* @param logLevel Log Level
|
|
24
|
+
*/
|
|
25
|
+
async setLogLevel(logLevel: string): Promise<void> {
|
|
26
|
+
return SettingsHelper.setLogLevel(logLevel);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Send logs to server
|
|
31
|
+
*/
|
|
32
|
+
async sendLogToServer(): Promise<void> {
|
|
33
|
+
return SettingsHelper.sendLogsToServer();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create and get Log Zip path (for email etc)
|
|
38
|
+
*/
|
|
39
|
+
async getLogZipPath(): Promise<string> {
|
|
40
|
+
return SettingsHelper.createAndGetLogZipPath();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Test Push Notification
|
|
45
|
+
*/
|
|
46
|
+
async testPushNotification(): Promise<void> {
|
|
47
|
+
return SettingsHelper.testPushNotification();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get list of Info Messages
|
|
52
|
+
*/
|
|
53
|
+
async getInfoMessages(): Promise<any[]> {
|
|
54
|
+
return SettingsHelper.getInfoMessages();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get User Settings / Current Account Information
|
|
59
|
+
*/
|
|
60
|
+
async getUserSettings(): Promise<any> {
|
|
61
|
+
const unviredAccount = UnviredAccountManager.getInstance().getLastLoggedInAccount();
|
|
62
|
+
if (!unviredAccount) {
|
|
63
|
+
throw new Error("No account found");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let jwtToken = (AuthenticationService as any).instance.jwtToken;
|
|
67
|
+
// Fallback or re-fetch token logic
|
|
68
|
+
if (!jwtToken) {
|
|
69
|
+
jwtToken = unviredAccount.getJwtToken();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const serverType = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.serverType);
|
|
73
|
+
const emailId = await FrameworkSettingsManager.getInstance().getFieldValue(FrameworkSettingsFields.email);
|
|
74
|
+
const unviredUserId = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.unviredUserId);
|
|
75
|
+
const unviredPassword = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.unviredPassword);
|
|
76
|
+
|
|
77
|
+
// Accessing loginParameters from AuthenticationService might need cast if it's protected/private or simply public
|
|
78
|
+
// index.d.ts says: loginParameters: any;
|
|
79
|
+
const loginParams = (AuthenticationService as any).instance.loginParameters || {};
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
"UNVIRED_ID": unviredUserId,
|
|
83
|
+
"USER_ID": loginParams.username || unviredUserId,
|
|
84
|
+
"FIRST_NAME": unviredAccount.getFirstName(),
|
|
85
|
+
"LAST_NAME": unviredAccount.getLastName(),
|
|
86
|
+
"FULL_NAME": `${unviredAccount.getFirstName()} ${unviredAccount.getLastName()}`,
|
|
87
|
+
"EMAIL": emailId || "",
|
|
88
|
+
"SERVER_URL": unviredAccount.getServerURL(),
|
|
89
|
+
"SERVER_TYPE": serverType || "",
|
|
90
|
+
"LOGIN_TYPE": loginParams.loginType,
|
|
91
|
+
"UNVIRED_PASSWORD": unviredPassword || "",
|
|
92
|
+
"JWT_TOKEN": jwtToken
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Set Auth Token
|
|
98
|
+
* @param token JWT Token
|
|
99
|
+
*/
|
|
100
|
+
async setAuthToken(token: string): Promise<void> {
|
|
101
|
+
(AuthenticationService as any).instance.jwtToken = token;
|
|
102
|
+
await UserSettingsManager.getInstance().setFieldValue(UserSettingsFields.jwtToken, token);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get Auth Token Validity (remaining seconds)
|
|
107
|
+
*/
|
|
108
|
+
async getAuthTokenValidity(): Promise<number> {
|
|
109
|
+
const token = await UserSettingsManager.getInstance().getFieldValue(UserSettingsFields.jwtToken);
|
|
110
|
+
if (!token) return 0;
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
const parts = token.split('.');
|
|
114
|
+
if (parts.length !== 3) return 0;
|
|
115
|
+
|
|
116
|
+
const payload = JSON.parse(atob(parts[1]));
|
|
117
|
+
if (!payload.exp) return 0;
|
|
118
|
+
|
|
119
|
+
const now = Math.floor(Date.now() / 1000);
|
|
120
|
+
const remaining = payload.exp - now;
|
|
121
|
+
return remaining > 0 ? remaining : 0;
|
|
122
|
+
} catch (e) {
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SyncEngine,
|
|
3
|
+
SettingsHelper,
|
|
4
|
+
NotificationListenerHelper,
|
|
5
|
+
OutboxService,
|
|
6
|
+
OutBoxHelper
|
|
7
|
+
} from '@unvired/unvired-ts-core-sdk';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Service for handling Synchronization with Unvired Server
|
|
11
|
+
*/
|
|
12
|
+
export class SyncService {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Submit data to UMP server in sync mode (Foreground)
|
|
16
|
+
* @param reqType Request Type (RQST/PULL/PUSH/QUERY/REQ)
|
|
17
|
+
* @param header Header Data Structure
|
|
18
|
+
* @param customData Custom data string (optional)
|
|
19
|
+
* @param paFunction Process Agent Function Name
|
|
20
|
+
* @param autoSave Whether to auto-save data in DB
|
|
21
|
+
*/
|
|
22
|
+
async syncForeground(reqType: any, header: any, customData: string = "", paFunction: string, autoSave: boolean): Promise<any> {
|
|
23
|
+
return SyncEngine.syncForeground(reqType, header, customData, paFunction, autoSave);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Submit data to UMP server in async mode (Background)
|
|
28
|
+
* @param reqType Request Type
|
|
29
|
+
* @param header Header Data Structure
|
|
30
|
+
* @param customData Custom data string (optional)
|
|
31
|
+
* @param paFunction Process Agent Function Name
|
|
32
|
+
* @param beName Business Entity Name
|
|
33
|
+
*/
|
|
34
|
+
async syncBackground(reqType: any, header: any, customData: string = "", paFunction: string, beName: string): Promise<any> {
|
|
35
|
+
return SyncEngine.syncBackground(reqType, header, customData, paFunction, beName);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Sends request for initial data download
|
|
40
|
+
* @param functions List of functions to execute
|
|
41
|
+
*/
|
|
42
|
+
async sendInitialDataDownloadRequest(functions: any[] = []): Promise<void> {
|
|
43
|
+
return SettingsHelper.requestInitialDataDownload(functions);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Gets synchronization state
|
|
48
|
+
* @param callback Callback to receive state updates
|
|
49
|
+
*/
|
|
50
|
+
getSynchronizationState(callback: (state: string) => void): void {
|
|
51
|
+
NotificationListenerHelper.synchronizationStateListener = callback;
|
|
52
|
+
// Initial state
|
|
53
|
+
callback("idle");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Starts Inbox Handler
|
|
58
|
+
*/
|
|
59
|
+
startInboxHandler(): void {
|
|
60
|
+
// Correct usage of SyncEngine as per SDK definition
|
|
61
|
+
SyncEngine.startInboxHandler();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Starts Data Sender (Outbox Handler)
|
|
66
|
+
*/
|
|
67
|
+
startDataSender(): void {
|
|
68
|
+
OutboxService.getInstance().start();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Request for downloading messages from server
|
|
73
|
+
*/
|
|
74
|
+
getMessages(): void {
|
|
75
|
+
SyncEngine.getMessages();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Register for Data Sender notifications
|
|
80
|
+
* @param callback Callback function
|
|
81
|
+
*/
|
|
82
|
+
registerDataSenderListener(callback: (data: any) => void): void {
|
|
83
|
+
NotificationListenerHelper.dataSenderListener = callback;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Unregister Data Sender notifications
|
|
88
|
+
*/
|
|
89
|
+
unRegisterDataSenderListener(): void {
|
|
90
|
+
NotificationListenerHelper.dataSenderListener = null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Register for Sync Items count updates
|
|
95
|
+
* @param callback Callback function
|
|
96
|
+
*/
|
|
97
|
+
registerSyncItemsCountListener(callback: (count: any) => void): void {
|
|
98
|
+
NotificationListenerHelper.syncItemsCountListener = callback;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if a BE is in the Outbox queue
|
|
103
|
+
* @param beLid BE Header LID
|
|
104
|
+
*/
|
|
105
|
+
async isInOutBox(beLid: string): Promise<boolean> {
|
|
106
|
+
return SettingsHelper.isInOutBoxQueue(beLid);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Check if a BE is in Sent Items
|
|
111
|
+
* @param beLid BE Header LID
|
|
112
|
+
*/
|
|
113
|
+
async isInSentItem(beLid: string): Promise<boolean> {
|
|
114
|
+
return SettingsHelper.isInSentItems(beLid);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get count of items in Outbox
|
|
119
|
+
*/
|
|
120
|
+
async outBoxItemCount(): Promise<number> {
|
|
121
|
+
return SettingsHelper.getOutboxCount();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get count of items in Sent Items
|
|
126
|
+
*/
|
|
127
|
+
async sentItemCount(): Promise<number> {
|
|
128
|
+
return SettingsHelper.getSentItemsCount();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get count of items in Inbox
|
|
133
|
+
*/
|
|
134
|
+
async inBoxItemCount(): Promise<number> {
|
|
135
|
+
return SettingsHelper.getInboxCount();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Delete an entry from Outbox
|
|
140
|
+
* @param beLid BE Header LID
|
|
141
|
+
*/
|
|
142
|
+
async deleteOutBoxEntry(beLid: string): Promise<any> {
|
|
143
|
+
return SyncEngine.removeOutObjectBasedOnLid(beLid);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Lock Data Sender for a specific BE
|
|
148
|
+
* @param beLid BE LID
|
|
149
|
+
*/
|
|
150
|
+
async lockDataSender(beLid: string): Promise<any> {
|
|
151
|
+
return SyncEngine.lockDataSender(beLid);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Unlock Data Sender
|
|
156
|
+
*/
|
|
157
|
+
async unlockDataSender(): Promise<any> {
|
|
158
|
+
return SyncEngine.unlockDataSender();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/AuthBuilder.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|