ngx-ionic-zone 2.0.2 → 2.0.6

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.
@@ -25,10 +25,11 @@ declare class DbSqliteService implements DbService {
25
25
  putLocalRx(store: any, data: any): Observable<unknown>;
26
26
  get<T>(store: string, key: any): Promise<T>;
27
27
  getRx<T>(store: string, key: any): Observable<T>;
28
+ getByFieldName<T>(storeName: string, fieldName: string, key: any): Promise<Array<T>>;
28
29
  getAll<T>(store: string, opt?: DbFilter): Promise<T>;
29
30
  remove(store: any, key: any): Promise<any>;
30
31
  removeRx(store: any, key: any): Observable<any>;
31
- removeAll(store: any): Promise<unknown>;
32
+ removeAll(store: any): Promise<any>;
32
33
  removeAllRx(store: string): Observable<any>;
33
34
  count(store: any, opts?: {
34
35
  key: any;
@@ -36,9 +37,34 @@ declare class DbSqliteService implements DbService {
36
37
  countRx(store: any, opts?: {
37
38
  key: any;
38
39
  }): Observable<number>;
39
- deleteDb(): Promise<void>;
40
+ deleteDb(): Promise<any>;
40
41
  deleteTable(store: any): Observable<void>;
41
42
  private _prepareTables;
43
+ /**
44
+ * Build WHERE clause based on DbFilter options
45
+ */
46
+ private _buildWhereClause;
47
+ /**
48
+ * Build ORDER BY clause based on DbFilter options
49
+ */
50
+ private _buildOrderByClause;
51
+ /**
52
+ * Build LIMIT and OFFSET clause for pagination
53
+ */
54
+ private _buildLimitClause;
55
+ /**
56
+ * Check if a record exists by primary key
57
+ */
58
+ private _recordExists;
59
+ /**
60
+ * Process value for storage - stringify arrays and objects, convert booleans to integers
61
+ */
62
+ private _processValueForStorage;
63
+ /**
64
+ * Process retrieved data - parse stringified arrays and objects back to their original form
65
+ * Convert integers back to booleans for BOOLEAN type columns
66
+ */
67
+ private _processRetrievedData;
42
68
  private _dbError;
43
69
  static ɵfac: i0.ɵɵFactoryDeclaration<DbSqliteService, never>;
44
70
  static ɵprov: i0.ɵɵInjectableDeclaration<DbSqliteService>;
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, makeEnvironmentProviders } from '@angular/core';
3
3
  import { Subject, Observable } from 'rxjs';
4
- import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';
5
4
  import * as i1 from 'ngx-universal-zone/database';
6
- import { SchemaService, DbService } from 'ngx-universal-zone/database';
5
+ import { KeyRangeType, SchemaService, DbService } from 'ngx-universal-zone/database';
6
+ import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';
7
7
 
8
8
  class DbSqliteService {
9
9
  constructor(config, schemaSvc) {
@@ -79,18 +79,31 @@ class DbSqliteService {
79
79
  async putLocal(store, data) {
80
80
  let sql = ``;
81
81
  const values = [];
82
- const total = await this.count(store);
83
- if (total) {
82
+ // Get primary key field from schema
83
+ const table = this.schemaSvc.schema.stores.filter((s) => s.name === store)[0];
84
+ const pk = table.columns.filter((c) => c.isPrimaryKey)[0];
85
+ const pkName = pk.name;
86
+ const pkValue = data[pkName];
87
+ // Check if record exists by primary key
88
+ let recordExists = false;
89
+ if (pkValue !== undefined && pkValue !== null) {
90
+ recordExists = await this._recordExists(store, pkName, pkValue);
91
+ }
92
+ if (recordExists) {
84
93
  //update
85
94
  sql = `UPDATE ${store} SET `;
86
95
  //columns
87
96
  for (let prop in data) {
88
97
  if (data.hasOwnProperty(prop)) {
89
- sql += `${prop}='${data[prop]}',`;
98
+ const processedValue = this._processValueForStorage(data[prop]);
99
+ sql += `${prop}=?,`;
100
+ values.push(processedValue);
90
101
  }
91
102
  }
92
103
  //remove extra ',' at the end
93
104
  sql = sql.substr(0, sql.length - 1);
105
+ sql += ` WHERE ${pkName} = ?`;
106
+ values.push(pkValue);
94
107
  }
95
108
  else {
96
109
  //insert
@@ -109,7 +122,8 @@ class DbSqliteService {
109
122
  sql += ` VALUES (`;
110
123
  for (let prop in data) {
111
124
  sql += `?,`;
112
- values.push(data[prop]);
125
+ const processedValue = this._processValueForStorage(data[prop]);
126
+ values.push(processedValue);
113
127
  }
114
128
  sql = sql.substr(0, sql.length - 1);
115
129
  sql += `)`;
@@ -139,9 +153,13 @@ class DbSqliteService {
139
153
  const table = this.schemaSvc.schema.stores.filter((s) => s.name === store)[0];
140
154
  const pk = table.columns.filter((c) => c.isPrimaryKey)[0];
141
155
  const pkName = pk.name;
142
- let sql = `SELECT * FROM ${store} WHERE ${pkName} = '${key}' LIMIT 1`;
143
- const { values } = await this._db.query(sql);
144
- return values[0];
156
+ let sql = `SELECT * FROM ${store} WHERE ${pkName} = ? LIMIT 1`;
157
+ const { values } = await this._db.query(sql, [key]);
158
+ const result = values[0];
159
+ if (result) {
160
+ return this._processRetrievedData(result, store);
161
+ }
162
+ return result;
145
163
  }
146
164
  getRx(store, key) {
147
165
  return new Observable((observer) => {
@@ -153,41 +171,110 @@ class DbSqliteService {
153
171
  });
154
172
  });
155
173
  }
174
+ async getByFieldName(storeName, fieldName, key) {
175
+ try {
176
+ const sql = `SELECT * FROM ${storeName} WHERE ${fieldName} = ?`;
177
+ const { values } = await this._db.query(sql, [key]);
178
+ const processedValues = values.map(item => this._processRetrievedData(item, storeName));
179
+ return processedValues;
180
+ }
181
+ catch (error) {
182
+ throw error;
183
+ }
184
+ }
156
185
  getAll(store, opt) {
157
186
  return new Promise(async (resolve, reject) => {
158
187
  let sql = `SELECT * FROM ${store}`;
188
+ const values = [];
159
189
  try {
160
- let data;
161
- const { values } = await this._db.query(sql);
162
- resolve(values);
190
+ // Build WHERE clause based on filter
191
+ const whereClause = this._buildWhereClause(opt, values);
192
+ if (whereClause) {
193
+ sql += ` WHERE ${whereClause}`;
194
+ }
195
+ // Build ORDER BY clause
196
+ const orderByClause = this._buildOrderByClause(opt);
197
+ if (orderByClause) {
198
+ sql += ` ${orderByClause}`;
199
+ }
200
+ // Build LIMIT and OFFSET for pagination
201
+ const limitClause = this._buildLimitClause(opt);
202
+ if (limitClause) {
203
+ sql += ` ${limitClause}`;
204
+ }
205
+ console.log('getAll executing SQL:', sql, 'with values:', values);
206
+ const { values: queryResults } = await this._db.query(sql, values);
207
+ const processedValues = queryResults.map(item => this._processRetrievedData(item, store));
208
+ resolve(processedValues);
163
209
  }
164
210
  catch (e) {
165
211
  reject(e);
166
212
  }
167
213
  });
168
214
  }
169
- remove(store, key) {
170
- return new Promise((resolve, reject) => {
171
- throw 'remove not impleted in db-sql yet';
172
- });
215
+ async remove(store, key) {
216
+ try {
217
+ // Get primary key field from schema
218
+ const table = this.schemaSvc.schema.stores.filter((s) => s.name === store)[0];
219
+ const pk = table.columns.filter((c) => c.isPrimaryKey)[0];
220
+ const pkName = pk.name;
221
+ const sql = `DELETE FROM ${store} WHERE ${pkName} = ?`;
222
+ const result = await this._db.run(sql, [key]);
223
+ return {
224
+ rowsAffected: result.changes.changes
225
+ };
226
+ }
227
+ catch (error) {
228
+ throw error;
229
+ }
173
230
  }
174
231
  removeRx(store, key) {
175
- throw 'remove not impleted in db-sql yet';
176
- }
177
- removeAll(store) {
178
- return new Promise((resolve, reject) => {
179
- throw 'removeAll not impleted in db-sql yet';
232
+ return new Observable((observer) => {
233
+ this.remove(store, key).then((result) => {
234
+ observer.next(result);
235
+ observer.complete();
236
+ }, (error) => {
237
+ observer.error(error);
238
+ });
180
239
  });
181
240
  }
241
+ async removeAll(store) {
242
+ try {
243
+ const sql = `DELETE FROM ${store}`;
244
+ const result = await this._db.run(sql, []);
245
+ return {
246
+ rowsAffected: result.changes.changes
247
+ };
248
+ }
249
+ catch (error) {
250
+ throw error;
251
+ }
252
+ }
182
253
  removeAllRx(store) {
183
- throw 'removeAllRx not impleted in db-sql yet';
254
+ return new Observable((observer) => {
255
+ this.removeAll(store).then((result) => {
256
+ observer.next(result);
257
+ observer.complete();
258
+ }, (error) => {
259
+ observer.error(error);
260
+ });
261
+ });
184
262
  }
185
263
  count(store, opts) {
186
264
  return new Promise(async (resolve, reject) => {
187
- let sql = `SELECT count(*) AS total FROM ${store} `;
265
+ let sql = `SELECT count(*) AS total FROM ${store}`;
266
+ const values = [];
267
+ if (opts && opts.key !== undefined) {
268
+ // Get primary key field from schema
269
+ const table = this.schemaSvc.schema.stores.filter((s) => s.name === store)[0];
270
+ const pk = table.columns.filter((c) => c.isPrimaryKey)[0];
271
+ const pkName = pk.name;
272
+ sql += ` WHERE ${pkName} = ?`;
273
+ values.push(opts.key);
274
+ }
188
275
  try {
189
- const { values } = await this._db.query(sql);
190
- resolve(values[0].total);
276
+ const { values: queryResults } = await this._db.query(sql, values);
277
+ resolve(queryResults[0].total);
191
278
  }
192
279
  catch (e) {
193
280
  reject(e);
@@ -203,9 +290,24 @@ class DbSqliteService {
203
290
  });
204
291
  }
205
292
  async deleteDb() {
293
+ try {
294
+ await this._db.close();
295
+ await this.deleteDatabase();
296
+ return null;
297
+ }
298
+ catch (error) {
299
+ throw error;
300
+ }
206
301
  }
207
302
  deleteTable(store) {
208
- throw 'deleteTable not impleted in db-sql yet';
303
+ return new Observable((observer) => {
304
+ this.removeAll(store).then((result) => {
305
+ observer.next(result);
306
+ observer.complete();
307
+ }, (error) => {
308
+ observer.error(error);
309
+ });
310
+ });
209
311
  }
210
312
  async _prepareTables() {
211
313
  const schemas = this.schemaSvc.schema.stores;
@@ -216,9 +318,25 @@ class DbSqliteService {
216
318
  sql += `CREATE TABLE IF NOT EXISTS ${schema.name} `;
217
319
  sql += `(`;
218
320
  for (let col of schema.columns) {
219
- //TODO: need to fix primary key
220
- // const ikPkTypeNumber = col['type'] == 'INTEGER';
221
- sql += `${col.name}${col.type ? ' ' + col.type : ''}${col['isPrimaryKey'] ? ' PRIMARY KEY' : ''},`;
321
+ // Check if primary key and is INTEGER type for auto increment
322
+ const isPrimaryKey = col['isPrimaryKey'];
323
+ const isIntegerType = col['type'] && col['type'].toUpperCase() === 'INTEGER';
324
+ sql += `${col.name}`;
325
+ // Add type - convert BOOLEAN to INTEGER for SQLite
326
+ if (col.type) {
327
+ const columnType = col.type.toUpperCase() === 'BOOLEAN' ? 'INTEGER' : col.type;
328
+ sql += ` ${columnType}`;
329
+ }
330
+ // Add PRIMARY KEY with AUTOINCREMENT for INTEGER primary keys
331
+ if (isPrimaryKey) {
332
+ if (isIntegerType) {
333
+ sql += ` PRIMARY KEY AUTOINCREMENT`;
334
+ }
335
+ else {
336
+ sql += ` PRIMARY KEY`;
337
+ }
338
+ }
339
+ sql += `,`;
222
340
  }
223
341
  //remove extra ',' at the end
224
342
  sql = sql.substr(0, sql.length - 1);
@@ -226,8 +344,133 @@ class DbSqliteService {
226
344
  // sql += `COMMIT TRANSACTION;`;
227
345
  const promise = this._db.execute(sql);
228
346
  promises.push(promise);
229
- await Promise.all(promises);
230
347
  }
348
+ await Promise.all(promises);
349
+ }
350
+ /**
351
+ * Build WHERE clause based on DbFilter options
352
+ */
353
+ _buildWhereClause(opt, values) {
354
+ if (!opt || !opt.key || opt.value === undefined) {
355
+ return null;
356
+ }
357
+ const keyRange = opt.keyRange || KeyRangeType.equalTo;
358
+ switch (keyRange) {
359
+ case KeyRangeType.equalTo:
360
+ values?.push(opt.value);
361
+ return `${opt.key} = ?`;
362
+ case KeyRangeType.notEqualTo:
363
+ values?.push(opt.value);
364
+ return `${opt.key} != ?`;
365
+ case KeyRangeType.equalToIgnoreCase:
366
+ values?.push(opt.value);
367
+ return `LOWER(${opt.key}) = LOWER(?)`;
368
+ case KeyRangeType.startsWithIgnoreCase:
369
+ values?.push(`${opt.value}%`);
370
+ return `LOWER(${opt.key}) LIKE LOWER(?)`;
371
+ default:
372
+ values?.push(opt.value);
373
+ return `${opt.key} = ?`;
374
+ }
375
+ }
376
+ /**
377
+ * Build ORDER BY clause based on DbFilter options
378
+ */
379
+ _buildOrderByClause(opt) {
380
+ if (!opt?.sortBy) {
381
+ return null;
382
+ }
383
+ const sortType = opt.sortType || 'asc';
384
+ return `ORDER BY ${opt.sortBy} ${sortType.toUpperCase()}`;
385
+ }
386
+ /**
387
+ * Build LIMIT and OFFSET clause for pagination
388
+ */
389
+ _buildLimitClause(opt) {
390
+ if (!opt?.pageSize) {
391
+ return null;
392
+ }
393
+ let clause = `LIMIT ${opt.pageSize}`;
394
+ if (opt.pageIndex && opt.pageIndex > 0) {
395
+ const offset = (opt.pageIndex - 1) * opt.pageSize;
396
+ clause += ` OFFSET ${offset}`;
397
+ }
398
+ return clause;
399
+ }
400
+ /**
401
+ * Check if a record exists by primary key
402
+ */
403
+ async _recordExists(store, pkName, pkValue) {
404
+ try {
405
+ const sql = `SELECT 1 FROM ${store} WHERE ${pkName} = ? LIMIT 1`;
406
+ const { values } = await this._db.query(sql, [pkValue]);
407
+ return values && values.length > 0;
408
+ }
409
+ catch (e) {
410
+ return false;
411
+ }
412
+ }
413
+ /**
414
+ * Process value for storage - stringify arrays and objects, convert booleans to integers
415
+ */
416
+ _processValueForStorage(value) {
417
+ if (value === null || value === undefined) {
418
+ return value;
419
+ }
420
+ // Handle boolean values - convert to integers (SQLite standard)
421
+ if (typeof value === 'boolean') {
422
+ return value ? 1 : 0;
423
+ }
424
+ if (Array.isArray(value) || (typeof value === 'object' && value.constructor === Object)) {
425
+ return JSON.stringify(value);
426
+ }
427
+ return value;
428
+ }
429
+ /**
430
+ * Process retrieved data - parse stringified arrays and objects back to their original form
431
+ * Convert integers back to booleans for BOOLEAN type columns
432
+ */
433
+ _processRetrievedData(data, storeName) {
434
+ if (!data) {
435
+ return data;
436
+ }
437
+ const processedData = { ...data };
438
+ // Get schema information for boolean field identification
439
+ let booleanFields = [];
440
+ if (storeName) {
441
+ const tableSchema = this.schemaSvc.schema.stores.find(s => s.name === storeName);
442
+ if (tableSchema) {
443
+ // Look for fields with BOOLEAN type
444
+ booleanFields = tableSchema.columns
445
+ .filter(col => col.type === 'BOOLEAN')
446
+ .map(col => col.name);
447
+ }
448
+ }
449
+ for (const key in processedData) {
450
+ if (processedData.hasOwnProperty(key)) {
451
+ const value = processedData[key];
452
+ // Convert integers to booleans for BOOLEAN type fields
453
+ if (booleanFields.includes(key) && (value === 0 || value === 1)) {
454
+ processedData[key] = Boolean(value);
455
+ continue;
456
+ }
457
+ // Try to parse if it's a string that looks like JSON
458
+ if (typeof value === 'string') {
459
+ try {
460
+ // Check if it starts and ends with array or object brackets
461
+ if ((value.startsWith('[') && value.endsWith(']')) ||
462
+ (value.startsWith('{') && value.endsWith('}'))) {
463
+ processedData[key] = JSON.parse(value);
464
+ }
465
+ }
466
+ catch (e) {
467
+ // If parsing fails, keep the original string value
468
+ // This ensures we don't break regular string data
469
+ }
470
+ }
471
+ }
472
+ }
473
+ return processedData;
231
474
  }
232
475
  _dbError(err) {
233
476
  alert('Open database ERROR: ' + JSON.stringify(err));
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-ionic-zone-database.mjs","sources":["../../../projects/ngx-ionic-zone/database/db-sql.service.ts","../../../projects/ngx-ionic-zone/database/db.module.ts","../../../projects/ngx-ionic-zone/database/ngx-ionic-zone-database.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\nimport { SchemaService, DbService, DbServiceConfig, DbFilter } from 'ngx-universal-zone/database';\n\nimport { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from '@capacitor-community/sqlite';\n@Injectable()\nexport class DbSqliteService implements DbService {\n private _dbName: string;\n private _db: SQLiteDBConnection;\n private _isDbInitialized = false;\n private dbInitialized = new Subject<any>();\n\n constructor(\n private config: DbServiceConfig, private schemaSvc: SchemaService\n ) {\n this._dbName = config.dbName;\n\n this.open();\n this.initializeDb();\n }\n \n async deleteDatabase(): Promise<void> {\n try {\n await CapacitorSQLite.deleteDatabase({ database: this._dbName });\n } catch (error) {\n throw error;\n }\n }\n\n async open() {\n try {\n const sqlite: SQLiteConnection = new SQLiteConnection(CapacitorSQLite);\n const ret = await sqlite.checkConnectionsConsistency();\n const isConnConsistent = ret.result;\n if (isConnConsistent) {\n this._db = await sqlite.retrieveConnection(this._dbName, false);\n } else {\n this._db = await sqlite.createConnection(\n this._dbName,\n false,\n 'no-encryption',\n 1,\n false\n );\n }\n\n await this._db.open();\n // await this._prepareTables();\n // this.dbInitialized.next(this._db);\n this._isDbInitialized = true;\n } catch (error) {\n this._dbError(error);\n }\n }\n\n initializeDb() {\n const delay = 50;\n //workaround: don't proceed unless db is initialized...wait everytime 50ms\n const _self = this;\n let timerId: any = setTimeout(async function request() {\n if (!_self._isDbInitialized) {\n //retry\n timerId = setTimeout(request, delay);\n } else {\n //clear timeout\n clearTimeout(timerId);\n timerId = null;\n\n await _self._prepareTables.call(_self);\n\n // heavy database operations should start from this...\n _self.dbInitialized.next(_self._db);\n }\n }, delay);\n }\n\n getAllRx<T>(store: string, opt?: DbFilter): Observable<T> {\n return new Observable((observer) => {\n this.getAll<T>(store, opt).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => {\n observer.error(error);\n });\n });\n }\n\n dbInitialized$ = this.dbInitialized.asObservable();\n get Db() {\n return this._db;\n }\n\n async putLocal(store, data: any): Promise<{ rowsAffected; insertId }> {\n let sql = ``;\n const values: any[] = [];\n\n const total = await this.count(store);\n if (total) {\n //update\n sql = `UPDATE ${store} SET `;\n //columns\n for (let prop in data) {\n if (data.hasOwnProperty(prop)) {\n sql += `${prop}='${data[prop]}',`;\n }\n }\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n } else {\n //insert\n sql = `INSERT INTO ${store} `;\n //columns\n sql += `(`;\n for (let prop in data) {\n if (data.hasOwnProperty(prop)) {\n sql += `${prop},`;\n }\n }\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n\n //values\n sql += ` VALUES (`;\n for (let prop in data) {\n sql += `?,`;\n values.push(data[prop]);\n }\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n }\n\n console.log('putLocal executing: ', sql, values);\n const result = await this._db.run(sql, values);\n console.log('putLocal result: ', result);\n\n return {\n rowsAffected: result.changes.changes,\n insertId: result.changes.lastId,\n };\n // this._db.transaction(async (tx) => {\n // const res = await this._executeSql<{ rowsAffected, insertId }>(tx, sql, values);\n // resolve(res);\n // }, (error) => reject(error));\n }\n\n putLocalRx(store, data) {\n return new Observable((observer) => {\n this.putLocal(store, data).then((result) => {\n observer.next(result);\n observer.complete();\n });\n });\n }\n\n async get<T>(store: string, key: any): Promise<T> {\n //get primary key field form schema\n const table: any = this.schemaSvc.schema.stores.filter(\n (s) => s.name === store\n )[0];\n const pk = table.columns.filter((c) => c.isPrimaryKey)[0];\n const pkName = pk.name;\n\n let sql = `SELECT * FROM ${store} WHERE ${pkName} = '${key}' LIMIT 1`;\n const { values } = await this._db.query(sql);\n \n return values[0] as T;\n }\n\n getRx<T>(store: string, key: any): Observable<T> {\n return new Observable((observer) => {\n this.get<T>(store, key).then((result) => {\n observer.next(result);\n observer.complete();\n }, (e) => {\n observer.error(e);\n });\n });\n }\n\n getAll<T>(store: string, opt?: DbFilter): Promise<T> {\n return new Promise(async (resolve, reject) => {\n let sql = `SELECT * FROM ${store}`;\n\n try {\n let data;\n const { values } = await this._db.query(sql);\n resolve(values as any);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n remove(store, key): Promise<any> {\n return new Promise((resolve, reject) => {\n throw 'remove not impleted in db-sql yet';\n });\n }\n\n removeRx(store, key): Observable<any> {\n throw 'remove not impleted in db-sql yet';\n }\n\n removeAll(store) {\n return new Promise((resolve, reject) => {\n throw 'removeAll not impleted in db-sql yet';\n });\n }\n\n removeAllRx(store: string): Observable<any> {\n throw 'removeAllRx not impleted in db-sql yet';\n }\n\n count(store, opts?: { key }): Promise<number> {\n return new Promise(async (resolve, reject) => {\n let sql = `SELECT count(*) AS total FROM ${store} `;\n\n try {\n const { values } = await this._db.query(sql);\n resolve(values[0].total);\n } catch (e) {\n reject(e);\n } });\n }\n\n countRx(store, opts?: { key }) {\n return new Observable<number>((observer) => {\n this.count(store, opts).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => observer.error(error));\n });\n }\n\n async deleteDb() {\n }\n\n \n deleteTable(store): Observable<void> {\n throw 'deleteTable not impleted in db-sql yet';\n }\n\n private async _prepareTables() {\n const schemas = this.schemaSvc.schema.stores;\n\n const promises: any[] = [];\n for (let schema of schemas) {\n // let sql = `BEGIN TRANSACTION;`;\n let sql = '';\n\n sql += `CREATE TABLE IF NOT EXISTS ${schema.name} `;\n sql += `(`;\n\n for (let col of schema.columns) {\n //TODO: need to fix primary key\n // const ikPkTypeNumber = col['type'] == 'INTEGER';\n sql += `${col.name}${col.type ? ' ' + col.type : ''}${\n col['isPrimaryKey'] ? ' PRIMARY KEY' : ''\n },`;\n }\n\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n\n // sql += `COMMIT TRANSACTION;`;\n\n const promise = this._db.execute(sql);\n promises.push(promise); \n await Promise.all(promises);\n }\n}\n\n private _dbError(err) {\n alert('Open database ERROR: ' + JSON.stringify(err));\n }\n}","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from '@angular/core';\nimport { SchemaService } from 'ngx-universal-zone/database';\nimport { DbService } from 'ngx-universal-zone/database';\nimport { DbSqliteService } from './db-sql.service';\n\nexport function dbSqliteFactory(schemaSvc: SchemaService) {\n const dbConfig = schemaSvc.config;\n return new DbSqliteService(dbConfig, schemaSvc);\n}\n\nexport const provideDbSqlite = (): EnvironmentProviders => {\n const providers: Provider[] = [\n SchemaService,\n {\n provide: DbService,\n useFactory: dbSqliteFactory,\n deps: [SchemaService],\n }\n ];\n\n return makeEnvironmentProviders(providers);\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-ionic-zone-database.mjs","sources":["../../../projects/ngx-ionic-zone/database/db-sql.service.ts","../../../projects/ngx-ionic-zone/database/db.module.ts","../../../projects/ngx-ionic-zone/database/ngx-ionic-zone-database.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\nimport { SchemaService, DbService, DbServiceConfig, DbFilter, KeyRangeType } from 'ngx-universal-zone/database';\n\nimport { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from '@capacitor-community/sqlite';\n@Injectable()\nexport class DbSqliteService implements DbService {\n private _dbName: string;\n private _db: SQLiteDBConnection;\n private _isDbInitialized = false;\n private dbInitialized = new Subject<any>();\n\n constructor(\n private config: DbServiceConfig, private schemaSvc: SchemaService\n ) {\n this._dbName = config.dbName;\n\n this.open();\n this.initializeDb();\n }\n \n async deleteDatabase(): Promise<void> {\n try {\n await CapacitorSQLite.deleteDatabase({ database: this._dbName });\n } catch (error) {\n throw error;\n }\n }\n\n async open() {\n try {\n const sqlite: SQLiteConnection = new SQLiteConnection(CapacitorSQLite);\n const ret = await sqlite.checkConnectionsConsistency();\n const isConnConsistent = ret.result;\n if (isConnConsistent) {\n this._db = await sqlite.retrieveConnection(this._dbName, false);\n } else {\n this._db = await sqlite.createConnection(\n this._dbName,\n false,\n 'no-encryption',\n 1,\n false\n );\n }\n\n await this._db.open();\n // await this._prepareTables();\n // this.dbInitialized.next(this._db);\n this._isDbInitialized = true;\n } catch (error) {\n this._dbError(error);\n }\n }\n\n initializeDb() {\n const delay = 50;\n //workaround: don't proceed unless db is initialized...wait everytime 50ms\n const _self = this;\n let timerId: any = setTimeout(async function request() {\n if (!_self._isDbInitialized) {\n //retry\n timerId = setTimeout(request, delay);\n } else {\n //clear timeout\n clearTimeout(timerId);\n timerId = null;\n\n await _self._prepareTables.call(_self);\n\n // heavy database operations should start from this...\n _self.dbInitialized.next(_self._db);\n }\n }, delay);\n }\n\n getAllRx<T>(store: string, opt?: DbFilter): Observable<T> {\n return new Observable((observer) => {\n this.getAll<T>(store, opt).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => {\n observer.error(error);\n });\n });\n }\n\n dbInitialized$ = this.dbInitialized.asObservable();\n get Db() {\n return this._db;\n }\n\n async putLocal(store, data: any): Promise<{ rowsAffected; insertId }> {\n let sql = ``;\n const values: any[] = [];\n\n // Get primary key field from schema\n const table: any = this.schemaSvc.schema.stores.filter(\n (s) => s.name === store\n )[0];\n const pk = table.columns.filter((c) => c.isPrimaryKey)[0];\n const pkName = pk.name;\n const pkValue = data[pkName];\n\n // Check if record exists by primary key\n let recordExists = false;\n if (pkValue !== undefined && pkValue !== null) {\n recordExists = await this._recordExists(store, pkName, pkValue);\n }\n\n if (recordExists) {\n //update\n sql = `UPDATE ${store} SET `;\n //columns\n for (let prop in data) {\n if (data.hasOwnProperty(prop)) {\n const processedValue = this._processValueForStorage(data[prop]);\n sql += `${prop}=?,`;\n values.push(processedValue);\n }\n }\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n sql += ` WHERE ${pkName} = ?`;\n values.push(pkValue);\n } else {\n //insert\n sql = `INSERT INTO ${store} `;\n //columns\n sql += `(`;\n for (let prop in data) {\n if (data.hasOwnProperty(prop)) {\n sql += `${prop},`;\n }\n }\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n\n //values\n sql += ` VALUES (`;\n for (let prop in data) {\n sql += `?,`;\n const processedValue = this._processValueForStorage(data[prop]);\n values.push(processedValue);\n }\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n }\n\n console.log('putLocal executing: ', sql, values);\n const result = await this._db.run(sql, values);\n console.log('putLocal result: ', result);\n\n return {\n rowsAffected: result.changes.changes,\n insertId: result.changes.lastId,\n };\n // this._db.transaction(async (tx) => {\n // const res = await this._executeSql<{ rowsAffected, insertId }>(tx, sql, values);\n // resolve(res);\n // }, (error) => reject(error));\n }\n\n putLocalRx(store, data) {\n return new Observable((observer) => {\n this.putLocal(store, data).then((result) => {\n observer.next(result);\n observer.complete();\n });\n });\n }\n\n async get<T>(store: string, key: any): Promise<T> {\n //get primary key field form schema\n const table: any = this.schemaSvc.schema.stores.filter(\n (s) => s.name === store\n )[0];\n const pk = table.columns.filter((c) => c.isPrimaryKey)[0];\n const pkName = pk.name;\n\n let sql = `SELECT * FROM ${store} WHERE ${pkName} = ? LIMIT 1`;\n const { values } = await this._db.query(sql, [key]);\n \n const result = values[0];\n if (result) {\n return this._processRetrievedData(result, store) as T;\n }\n return result as T;\n }\n\n getRx<T>(store: string, key: any): Observable<T> {\n return new Observable((observer) => {\n this.get<T>(store, key).then((result) => {\n observer.next(result);\n observer.complete();\n }, (e) => {\n observer.error(e);\n });\n });\n }\n\n async getByFieldName<T>(storeName: string, fieldName: string, key: any): Promise<Array<T>> {\n try {\n const sql = `SELECT * FROM ${storeName} WHERE ${fieldName} = ?`;\n const { values } = await this._db.query(sql, [key]);\n \n const processedValues = values.map(item => this._processRetrievedData(item, storeName));\n return processedValues as Array<T>;\n } catch (error) {\n throw error;\n }\n }\n\n getAll<T>(store: string, opt?: DbFilter): Promise<T> {\n return new Promise(async (resolve, reject) => {\n let sql = `SELECT * FROM ${store}`;\n const values: any[] = [];\n\n try {\n // Build WHERE clause based on filter\n const whereClause = this._buildWhereClause(opt, values);\n if (whereClause) {\n sql += ` WHERE ${whereClause}`;\n }\n\n // Build ORDER BY clause\n const orderByClause = this._buildOrderByClause(opt);\n if (orderByClause) {\n sql += ` ${orderByClause}`;\n }\n\n // Build LIMIT and OFFSET for pagination\n const limitClause = this._buildLimitClause(opt);\n if (limitClause) {\n sql += ` ${limitClause}`;\n }\n\n console.log('getAll executing SQL:', sql, 'with values:', values);\n \n const { values: queryResults } = await this._db.query(sql, values);\n const processedValues = queryResults.map(item => this._processRetrievedData(item, store));\n resolve(processedValues as any);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n async remove(store, key): Promise<any> {\n try {\n // Get primary key field from schema\n const table: any = this.schemaSvc.schema.stores.filter(\n (s) => s.name === store\n )[0];\n const pk = table.columns.filter((c) => c.isPrimaryKey)[0];\n const pkName = pk.name;\n\n const sql = `DELETE FROM ${store} WHERE ${pkName} = ?`;\n const result = await this._db.run(sql, [key]);\n \n return {\n rowsAffected: result.changes.changes\n };\n } catch (error) {\n throw error;\n }\n }\n\n removeRx(store, key): Observable<any> {\n return new Observable((observer) => {\n this.remove(store, key).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => {\n observer.error(error);\n });\n });\n }\n\n async removeAll(store): Promise<any> {\n try {\n const sql = `DELETE FROM ${store}`;\n const result = await this._db.run(sql, []);\n \n return {\n rowsAffected: result.changes.changes\n };\n } catch (error) {\n throw error;\n }\n }\n\n removeAllRx(store: string): Observable<any> {\n return new Observable((observer) => {\n this.removeAll(store).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => {\n observer.error(error);\n });\n });\n }\n\n count(store, opts?: { key }): Promise<number> {\n return new Promise(async (resolve, reject) => {\n let sql = `SELECT count(*) AS total FROM ${store}`;\n const values: any[] = [];\n\n if (opts && opts.key !== undefined) {\n // Get primary key field from schema\n const table: any = this.schemaSvc.schema.stores.filter(\n (s) => s.name === store\n )[0];\n const pk = table.columns.filter((c) => c.isPrimaryKey)[0];\n const pkName = pk.name;\n \n sql += ` WHERE ${pkName} = ?`;\n values.push(opts.key);\n }\n\n try {\n const { values: queryResults } = await this._db.query(sql, values);\n resolve(queryResults[0].total);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n countRx(store, opts?: { key }) {\n return new Observable<number>((observer) => {\n this.count(store, opts).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => observer.error(error));\n });\n }\n\n async deleteDb(): Promise<any> {\n try {\n await this._db.close();\n await this.deleteDatabase();\n return null;\n } catch (error) {\n throw error;\n }\n }\n\n \n deleteTable(store): Observable<void> {\n return new Observable<void>((observer) => {\n this.removeAll(store).then((result) => {\n observer.next(result);\n observer.complete();\n }, (error) => {\n observer.error(error);\n });\n });\n }\n\n private async _prepareTables() {\n const schemas = this.schemaSvc.schema.stores;\n\n const promises: any[] = [];\n for (let schema of schemas) {\n // let sql = `BEGIN TRANSACTION;`;\n let sql = '';\n\n sql += `CREATE TABLE IF NOT EXISTS ${schema.name} `;\n sql += `(`;\n\n for (let col of schema.columns) {\n // Check if primary key and is INTEGER type for auto increment\n const isPrimaryKey = col['isPrimaryKey'];\n const isIntegerType = col['type'] && col['type'].toUpperCase() === 'INTEGER';\n \n sql += `${col.name}`;\n \n // Add type - convert BOOLEAN to INTEGER for SQLite\n if (col.type) {\n const columnType = col.type.toUpperCase() === 'BOOLEAN' ? 'INTEGER' : col.type;\n sql += ` ${columnType}`;\n }\n \n // Add PRIMARY KEY with AUTOINCREMENT for INTEGER primary keys\n if (isPrimaryKey) {\n if (isIntegerType) {\n sql += ` PRIMARY KEY AUTOINCREMENT`;\n } else {\n sql += ` PRIMARY KEY`;\n }\n }\n \n sql += `,`;\n }\n\n //remove extra ',' at the end\n sql = sql.substr(0, sql.length - 1);\n sql += `)`;\n\n // sql += `COMMIT TRANSACTION;`;\n\n const promise = this._db.execute(sql);\n promises.push(promise); \n }\n await Promise.all(promises);\n }\n\n /**\n * Build WHERE clause based on DbFilter options\n */\n private _buildWhereClause(opt?: DbFilter, values?: any[]): string | null {\n if (!opt || !opt.key || opt.value === undefined) {\n return null;\n }\n\n const keyRange = opt.keyRange || KeyRangeType.equalTo;\n \n switch (keyRange) {\n case KeyRangeType.equalTo:\n values?.push(opt.value);\n return `${opt.key} = ?`;\n \n case KeyRangeType.notEqualTo:\n values?.push(opt.value);\n return `${opt.key} != ?`;\n \n case KeyRangeType.equalToIgnoreCase:\n values?.push(opt.value);\n return `LOWER(${opt.key}) = LOWER(?)`;\n \n case KeyRangeType.startsWithIgnoreCase:\n values?.push(`${opt.value}%`);\n return `LOWER(${opt.key}) LIKE LOWER(?)`;\n \n default:\n values?.push(opt.value);\n return `${opt.key} = ?`;\n }\n }\n\n /**\n * Build ORDER BY clause based on DbFilter options\n */\n private _buildOrderByClause(opt?: DbFilter): string | null {\n if (!opt?.sortBy) {\n return null;\n }\n\n const sortType = opt.sortType || 'asc';\n return `ORDER BY ${opt.sortBy} ${sortType.toUpperCase()}`;\n }\n\n /**\n * Build LIMIT and OFFSET clause for pagination\n */\n private _buildLimitClause(opt?: DbFilter): string | null {\n if (!opt?.pageSize) {\n return null;\n }\n\n let clause = `LIMIT ${opt.pageSize}`;\n \n if (opt.pageIndex && opt.pageIndex > 0) {\n const offset = (opt.pageIndex - 1) * opt.pageSize;\n clause += ` OFFSET ${offset}`;\n }\n\n return clause;\n }\n\n /**\n * Check if a record exists by primary key\n */\n private async _recordExists(store: string, pkName: string, pkValue: any): Promise<boolean> {\n try {\n const sql = `SELECT 1 FROM ${store} WHERE ${pkName} = ? LIMIT 1`;\n const { values } = await this._db.query(sql, [pkValue]);\n return values && values.length > 0;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Process value for storage - stringify arrays and objects, convert booleans to integers\n */\n private _processValueForStorage(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n \n // Handle boolean values - convert to integers (SQLite standard)\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n \n if (Array.isArray(value) || (typeof value === 'object' && value.constructor === Object)) {\n return JSON.stringify(value);\n }\n \n return value;\n }\n\n /**\n * Process retrieved data - parse stringified arrays and objects back to their original form\n * Convert integers back to booleans for BOOLEAN type columns\n */\n private _processRetrievedData(data: any, storeName?: string): any {\n if (!data) {\n return data;\n }\n\n const processedData = { ...data };\n \n // Get schema information for boolean field identification\n let booleanFields: string[] = [];\n if (storeName) {\n const tableSchema = this.schemaSvc.schema.stores.find(s => s.name === storeName);\n if (tableSchema) {\n // Look for fields with BOOLEAN type\n booleanFields = tableSchema.columns\n .filter(col => col.type === 'BOOLEAN')\n .map(col => col.name);\n }\n }\n \n for (const key in processedData) {\n if (processedData.hasOwnProperty(key)) {\n const value = processedData[key];\n \n // Convert integers to booleans for BOOLEAN type fields\n if (booleanFields.includes(key) && (value === 0 || value === 1)) {\n processedData[key] = Boolean(value);\n continue;\n }\n \n // Try to parse if it's a string that looks like JSON\n if (typeof value === 'string') {\n try {\n // Check if it starts and ends with array or object brackets\n if ((value.startsWith('[') && value.endsWith(']')) || \n (value.startsWith('{') && value.endsWith('}'))) {\n processedData[key] = JSON.parse(value);\n }\n } catch (e) {\n // If parsing fails, keep the original string value\n // This ensures we don't break regular string data\n }\n }\n }\n }\n \n return processedData;\n }\n\n private _dbError(err) {\n alert('Open database ERROR: ' + JSON.stringify(err));\n }\n}","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from '@angular/core';\nimport { SchemaService } from 'ngx-universal-zone/database';\nimport { DbService } from 'ngx-universal-zone/database';\nimport { DbSqliteService } from './db-sql.service';\n\nexport function dbSqliteFactory(schemaSvc: SchemaService) {\n const dbConfig = schemaSvc.config;\n return new DbSqliteService(dbConfig, schemaSvc);\n}\n\nexport const provideDbSqlite = (): EnvironmentProviders => {\n const providers: Provider[] = [\n SchemaService,\n {\n provide: DbService,\n useFactory: dbSqliteFactory,\n deps: [SchemaService],\n }\n ];\n\n return makeEnvironmentProviders(providers);\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injectable, makeEnvironmentProviders } from '@angular/core';
3
3
  import { HttpClient, HttpHeaders, HttpContext, HttpContextToken } from '@angular/common/http';
4
- import { BehaviorSubject, tap, catchError, throwError } from 'rxjs';
4
+ import { BehaviorSubject, Observable, tap, catchError, throwError } from 'rxjs';
5
5
  import { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';
6
6
  import * as i1 from '@ionic/angular';
7
7
 
@@ -14,6 +14,180 @@ class BaseHttpService {
14
14
  this.http = inject(HttpClient);
15
15
  this.config = inject(APP_CONFIG_TOKEN);
16
16
  }
17
+ /**
18
+ * Prepare HTTP headers with authentication and localization
19
+ * Override in subclass to add custom headers (e.g., auth tokens)
20
+ * @returns Promise of HttpHeaders with common headers
21
+ */
22
+ async prepareHeaders() {
23
+ return new HttpHeaders({
24
+ 'Content-Type': 'application/json;charset=utf-8'
25
+ });
26
+ }
27
+ /**
28
+ * Wrap raw API response into IApiResponse format
29
+ * Handles both wrapped ({ data, statusCode, exception }) and unwrapped (direct data) responses
30
+ */
31
+ wrapResponse(response) {
32
+ // Check if response is already wrapped in IApiResponse format
33
+ if (response && typeof response === 'object' && 'data' in response) {
34
+ return response;
35
+ }
36
+ // Unwrapped response - wrap it
37
+ return {
38
+ data: response,
39
+ statusCode: 200
40
+ };
41
+ }
42
+ /**
43
+ * Perform GET request to API with IApiResponse wrapper
44
+ * @param args - HttpParams with url, body (as query params), headers, etc.
45
+ * @returns Observable of wrapped API response
46
+ */
47
+ getData(args) {
48
+ return new Observable((observer) => {
49
+ this.prepareHeaders().then(baseHeaders => {
50
+ let fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;
51
+ // Append query parameters from body
52
+ if (args.body) {
53
+ const params = new URLSearchParams();
54
+ Object.keys(args.body).forEach(key => {
55
+ if (args.body[key] !== null && args.body[key] !== undefined) {
56
+ params.append(key, args.body[key].toString());
57
+ }
58
+ });
59
+ const queryString = params.toString();
60
+ if (queryString) {
61
+ fullUrl += fullUrl.includes('?') ? `&${queryString}` : `?${queryString}`;
62
+ }
63
+ }
64
+ // Merge custom headers with base headers
65
+ let headers = baseHeaders;
66
+ if (args.headers) {
67
+ for (const prop in args.headers) {
68
+ if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {
69
+ headers = headers.set(prop, args.headers[prop]);
70
+ }
71
+ }
72
+ }
73
+ this.http.get(fullUrl, { headers }).subscribe({
74
+ next: (response) => {
75
+ const wrappedResponse = this.wrapResponse(response);
76
+ observer.next(wrappedResponse);
77
+ observer.complete();
78
+ },
79
+ error: (error) => {
80
+ if (args.errorCallback) {
81
+ args.errorCallback(error, args);
82
+ }
83
+ observer.error(error);
84
+ }
85
+ });
86
+ });
87
+ });
88
+ }
89
+ /**
90
+ * Perform POST request to API with IApiResponse wrapper
91
+ * @param args - HttpParams with url, body, headers, etc.
92
+ * @returns Observable of wrapped API response
93
+ */
94
+ postData(args) {
95
+ return new Observable((observer) => {
96
+ this.prepareHeaders().then(baseHeaders => {
97
+ const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;
98
+ // Merge custom headers with base headers
99
+ let headers = baseHeaders;
100
+ if (args.headers) {
101
+ for (const prop in args.headers) {
102
+ if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {
103
+ headers = headers.set(prop, args.headers[prop]);
104
+ }
105
+ }
106
+ }
107
+ this.http.post(fullUrl, args.body || {}, { headers }).subscribe({
108
+ next: (response) => {
109
+ const wrappedResponse = this.wrapResponse(response);
110
+ observer.next(wrappedResponse);
111
+ observer.complete();
112
+ },
113
+ error: (error) => {
114
+ if (args.errorCallback) {
115
+ args.errorCallback(error, args);
116
+ }
117
+ observer.error(error);
118
+ }
119
+ });
120
+ });
121
+ });
122
+ }
123
+ /**
124
+ * Perform PUT request to API with IApiResponse wrapper
125
+ * @param args - HttpParams with url, body, headers, etc.
126
+ * @returns Observable of wrapped API response
127
+ */
128
+ putData(args) {
129
+ return new Observable((observer) => {
130
+ this.prepareHeaders().then(baseHeaders => {
131
+ const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;
132
+ // Merge custom headers with base headers
133
+ let headers = baseHeaders;
134
+ if (args.headers) {
135
+ for (const prop in args.headers) {
136
+ if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {
137
+ headers = headers.set(prop, args.headers[prop]);
138
+ }
139
+ }
140
+ }
141
+ this.http.put(fullUrl, args.body || {}, { headers }).subscribe({
142
+ next: (response) => {
143
+ const wrappedResponse = this.wrapResponse(response);
144
+ observer.next(wrappedResponse);
145
+ observer.complete();
146
+ },
147
+ error: (error) => {
148
+ if (args.errorCallback) {
149
+ args.errorCallback(error, args);
150
+ }
151
+ observer.error(error);
152
+ }
153
+ });
154
+ });
155
+ });
156
+ }
157
+ /**
158
+ * Perform DELETE request to API with IApiResponse wrapper
159
+ * @param args - HttpParams with url, headers, etc.
160
+ * @returns Observable of wrapped API response
161
+ */
162
+ deleteData(args) {
163
+ return new Observable((observer) => {
164
+ this.prepareHeaders().then(baseHeaders => {
165
+ const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;
166
+ // Merge custom headers with base headers
167
+ let headers = baseHeaders;
168
+ if (args.headers) {
169
+ for (const prop in args.headers) {
170
+ if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {
171
+ headers = headers.set(prop, args.headers[prop]);
172
+ }
173
+ }
174
+ }
175
+ this.http.delete(fullUrl, { headers }).subscribe({
176
+ next: (response) => {
177
+ const wrappedResponse = this.wrapResponse(response);
178
+ observer.next(wrappedResponse);
179
+ observer.complete();
180
+ },
181
+ error: (error) => {
182
+ if (args.errorCallback) {
183
+ args.errorCallback(error, args);
184
+ }
185
+ observer.error(error);
186
+ }
187
+ });
188
+ });
189
+ });
190
+ }
17
191
  getDataRx(args) {
18
192
  this._httpInProgressRequest.next(args);
19
193
  if (!args.overrideUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-ionic-zone.mjs","sources":["../../../projects/ngx-ionic-zone/shared/app-config.ts","../../../projects/ngx-ionic-zone/shared/base-http.service.ts","../../../projects/ngx-ionic-zone/shared/haptics.service.ts","../../../projects/ngx-ionic-zone/shared/uz-ionic.provider.ts","../../../projects/ngx-ionic-zone/public-api.ts","../../../projects/ngx-ionic-zone/ngx-ionic-zone.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const APP_CONFIG_TOKEN = new InjectionToken<IAppConfig>('APP_CONFIG');\r\n\r\nexport interface IAppConfig {\r\n baseUrl: string;\r\n baseApiUrl: string;\r\n ping?: IAppConfigPing;\r\n http?: IAppConfigHttp;\r\n}\r\n\r\nexport interface IAppConfigPing {\r\n url?: string;\r\n interval: number;\r\n}\r\n\r\nexport interface IAppConfigHttp {\r\n useNativeHttp: boolean;\r\n}","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse, HttpContext, HttpContextToken } from '@angular/common/http';\n\n// import { CapacitorHttp } from '@capacitor/core';\n\nimport { BehaviorSubject, catchError, tap, throwError } from 'rxjs';\nimport { APP_CONFIG_TOKEN, IAppConfig } from './app-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BaseHttpService {\n private _httpInProgressRequest = new BehaviorSubject<HttpParams>(null);\n\n protected http: HttpClient;\n protected config: IAppConfig;\n\n httpInProgressRequest$ = this._httpInProgressRequest.asObservable();\n\n constructor() {\n this.http = inject(HttpClient);\n this.config = inject(APP_CONFIG_TOKEN);\n }\n\n protected getDataRx<T>(args: HttpParams) {\n this._httpInProgressRequest.next(args);\n\n if (!args.overrideUrl) {\n args.url = `${this.config.baseApiUrl + args.url}`;\n }\n args.body = args.body || {};\n\n for (let prop in args.body) {\n if (args.body.hasOwnProperty(prop) && args.body[prop]) {\n if (args.url.includes('?')) {\n args.url += '&';\n } else {\n args.url += '?';\n }\n args.url += `${prop}=${args.body[prop]}`;\n }\n }\n\n // if(!this.config.http?.useNativeHttp) {\n let headers = new HttpHeaders();\n for (let prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n\n let context = new HttpContext();\n if(args.retryCount != null) {\n context.set(RETRY_COUNT, args.retryCount);\n }\n \n if(args.retryDelay != null) {\n context.set(RETRY_DELAY, args.retryCount);\n }\n \n return this.http.get<T>(args.url, { headers: headers, context: context })\n .pipe(\n tap(() => this._httpInProgressRequest.next(null)),\n catchError((error) => {\n this._httpInProgressRequest.next(null);\n \n //pass error to the caller\n return throwError(() => error);\n }));\n // }\n \n // return new Observable<T>((observer) => {\n // CapacitorHttp.get({\n // url: args.url,\n // headers: args.headers\n // }).then(response => {\n // observer.next(<T>response.data);\n // observer.complete();\n // }).catch(error => {\n // observer.error(error);\n // });\n // });\n }\n\n protected postDataRx<T>(args: HttpParams) {\n this._httpInProgressRequest.next(args);\n\n let newUrl;\n if (!args.overrideUrl) {\n newUrl = `${this.config.baseApiUrl + args.url}`;\n } else {\n newUrl = args.url;\n }\n\n args.url = newUrl;\n\n let context = new HttpContext();\n if(args.retryCount != null) {\n context.set(RETRY_COUNT, args.retryCount);\n }\n\n if(args.retryDelay != null) {\n context.set(RETRY_DELAY, args.retryCount);\n }\n\n console.log('postDataRx', args);\n let body = args.body;\n return this.http.post<T>(args.url, body, { headers: new HttpHeaders(args.headers), context: context })\n .pipe(\n tap(() => this._httpInProgressRequest.next(null)),\n catchError((error) => {\n this._httpInProgressRequest.next(null);\n\n //pass error to the caller\n return throwError(() => error);\n })\n );\n }\n\n protected async handleError(e: HttpErrorResponse, args: HttpParams) {\n switch (e.status) {\n // case 401:\n // const u = await this.userSettingSvc.getCurrentUser();\n // if(u) {\n // //TODO: check for token expiration...\n // //kickout...\n // this.pubsubSvc.publishEvent(UserConstant.EVENT_USER_LOGGEDOUT, { clearCache: true, displayLoginDialog: true });\n // }\n // break;\n default:\n if (!args.errorCallback) {\n let msg;\n //the error might be thrown by e.g a plugin wasn't install properly. In that case text() will not be available\n if (e.message) {\n msg = e.message;\n } else {\n msg = e.error.toString();\n }\n // setTimeout(async () => {\n // await this.helperSvc.alert(msg);\n // });\n } else {\n args.errorCallback(e, args);\n }\n break;\n }\n }\n}\n\nexport interface HttpParams {\n url: string;\n body?: any;\n errorCallback?;\n overrideUrl?: boolean;\n headers?: { [key: string]: string };\n retryCount?: number;\n retryDelay?: number;\n}\n\nexport interface ApiResponse<T> {\n statusCode: number;\n message: any;\n data: T;\n exception: any;\n}\n\n\nexport const RETRY_COUNT = new HttpContextToken(() => 3);\nexport const RETRY_DELAY = new HttpContextToken(() => 5000);","import { Injectable } from '@angular/core';\nimport { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';\nimport { Platform } from '@ionic/angular';\n\nexport interface HapticOptions {\n /**\n * Enable or disable haptic feedback\n */\n enabled?: boolean;\n /**\n * Fallback to vibration on unsupported devices\n */\n fallbackToVibration?: boolean;\n}\n\nexport enum HapticPattern {\n Light = 'light',\n Medium = 'medium',\n Heavy = 'heavy',\n Success = 'success',\n Warning = 'warning',\n Error = 'error',\n Selection = 'selection'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HapticsService {\n private options: HapticOptions = {\n enabled: true,\n fallbackToVibration: true\n };\n\n constructor(private platform: Platform) {}\n\n /**\n * Configure haptic feedback options\n */\n configure(options: Partial<HapticOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Play haptic feedback based on pattern\n */\n async play(pattern: HapticPattern): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n switch (pattern) {\n case HapticPattern.Light:\n await Haptics.impact({ style: ImpactStyle.Light });\n break;\n \n case HapticPattern.Medium:\n await Haptics.impact({ style: ImpactStyle.Medium });\n break;\n \n case HapticPattern.Heavy:\n await Haptics.impact({ style: ImpactStyle.Heavy });\n break;\n \n case HapticPattern.Success:\n await Haptics.notification({ type: NotificationType.Success });\n break;\n \n case HapticPattern.Warning:\n await Haptics.notification({ type: NotificationType.Warning });\n break;\n \n case HapticPattern.Error:\n await Haptics.notification({ type: NotificationType.Error });\n break;\n \n case HapticPattern.Selection:\n await Haptics.selectionStart();\n break;\n \n default:\n await Haptics.impact({ style: ImpactStyle.Light });\n }\n } catch (error) {\n console.warn('Haptic feedback failed:', error);\n \n // Fallback to vibration if haptics are not supported\n if (this.options.fallbackToVibration && this.platform.is('mobile')) {\n this.vibrate(pattern);\n }\n }\n }\n\n /**\n * Play product selection haptic feedback\n */\n async light(): Promise<void> {\n await this.play(HapticPattern.Light);\n }\n\n /**\n * Play product add to cart haptic feedback\n */\n async medium(): Promise<void> {\n await this.play(HapticPattern.Medium);\n }\n\n /**\n * Play order submission haptic feedback\n */\n async heavy(): Promise<void> {\n await this.play(HapticPattern.Heavy);\n }\n\n /**\n * Play order success haptic feedback\n */\n async success(): Promise<void> {\n await this.play(HapticPattern.Success);\n }\n\n /**\n * Play order error haptic feedback\n */\n async orderError(): Promise<void> {\n await this.play(HapticPattern.Error);\n }\n\n /**\n * Play button interaction haptic feedback\n */\n async buttonInteraction(): Promise<void> {\n await this.play(HapticPattern.Selection);\n }\n\n /**\n * Play custom haptic pattern\n */\n async customImpact(style: ImpactStyle): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n await Haptics.impact({ style });\n } catch (error) {\n console.warn('Custom haptic impact failed:', error);\n }\n }\n\n /**\n * Play custom notification haptic\n */\n async customNotification(type: NotificationType): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n await Haptics.notification({ type });\n } catch (error) {\n console.warn('Custom haptic notification failed:', error);\n }\n }\n\n /**\n * Check if haptics are available on the device\n */\n async isAvailable(): Promise<boolean> {\n try {\n // Try to perform a test haptic\n await Haptics.impact({ style: ImpactStyle.Light });\n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Disable haptic feedback\n */\n disable(): void {\n this.options.enabled = false;\n }\n\n /**\n * Enable haptic feedback\n */\n enable(): void {\n this.options.enabled = true;\n }\n\n /**\n * Fallback vibration for unsupported devices\n */\n private vibrate(pattern: HapticPattern): void {\n if (!navigator.vibrate) {\n return;\n }\n\n const vibrationPatterns: Record<HapticPattern, number | number[]> = {\n [HapticPattern.Light]: 50,\n [HapticPattern.Medium]: 100,\n [HapticPattern.Heavy]: 200,\n [HapticPattern.Success]: [100, 50, 100],\n [HapticPattern.Warning]: [150, 100, 150],\n [HapticPattern.Error]: [200, 100, 200, 100, 200],\n [HapticPattern.Selection]: 25\n };\n\n const vibrationPattern = vibrationPatterns[pattern];\n if (Array.isArray(vibrationPattern)) {\n navigator.vibrate(vibrationPattern);\n } else {\n navigator.vibrate(vibrationPattern);\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from \"@angular/core\";\n\nimport { HapticsService } from \"./haptics.service\";\n\nexport const provideUniversalZoneIonic = (): EnvironmentProviders => {\n const providers: Provider[] = [\n HapticsService\n ];\n\n return makeEnvironmentProviders(providers);\n};\n","/*\r\n * Public API Surface of ngx-ionic-zone\r\n */\r\n\r\nexport * from './shared/base-http.service';\r\nexport * from './shared/uz-ionic.provider';\r\nexport * from './shared/app-config';\r\nexport * from './shared/haptics.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-ionic-zone.mjs","sources":["../../../projects/ngx-ionic-zone/shared/app-config.ts","../../../projects/ngx-ionic-zone/shared/base-http.service.ts","../../../projects/ngx-ionic-zone/shared/haptics.service.ts","../../../projects/ngx-ionic-zone/shared/uz-ionic.provider.ts","../../../projects/ngx-ionic-zone/public-api.ts","../../../projects/ngx-ionic-zone/ngx-ionic-zone.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const APP_CONFIG_TOKEN = new InjectionToken<IAppConfig>('APP_CONFIG');\r\n\r\nexport interface IAppConfig {\r\n baseUrl: string;\r\n baseApiUrl: string;\r\n ping?: IAppConfigPing;\r\n http?: IAppConfigHttp;\r\n}\r\n\r\nexport interface IAppConfigPing {\r\n url?: string;\r\n interval: number;\r\n}\r\n\r\nexport interface IAppConfigHttp {\r\n useNativeHttp: boolean;\r\n}","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse, HttpContext, HttpContextToken } from '@angular/common/http';\n\n// import { CapacitorHttp } from '@capacitor/core';\n\nimport { BehaviorSubject, Observable, catchError, map, tap, throwError } from 'rxjs';\nimport { APP_CONFIG_TOKEN, IAppConfig } from './app-config';\n\n/**\n * API response wrapper matching backend CamelCaseResult\n */\nexport interface IApiResponse<T = any> {\n data: T;\n statusCode: number;\n exception?: any;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BaseHttpService {\n private _httpInProgressRequest = new BehaviorSubject<HttpParams | null>(null);\n\n protected http: HttpClient;\n protected config: IAppConfig;\n\n httpInProgressRequest$ = this._httpInProgressRequest.asObservable();\n\n constructor() {\n this.http = inject(HttpClient);\n this.config = inject(APP_CONFIG_TOKEN);\n }\n\n /**\n * Prepare HTTP headers with authentication and localization\n * Override in subclass to add custom headers (e.g., auth tokens)\n * @returns Promise of HttpHeaders with common headers\n */\n protected async prepareHeaders(): Promise<HttpHeaders> {\n return new HttpHeaders({\n 'Content-Type': 'application/json;charset=utf-8'\n });\n }\n\n /**\n * Wrap raw API response into IApiResponse format\n * Handles both wrapped ({ data, statusCode, exception }) and unwrapped (direct data) responses\n */\n private wrapResponse<T>(response: any): IApiResponse<T> {\n // Check if response is already wrapped in IApiResponse format\n if (response && typeof response === 'object' && 'data' in response) {\n return response as IApiResponse<T>;\n }\n \n // Unwrapped response - wrap it\n return {\n data: response as T,\n statusCode: 200\n };\n }\n\n /**\n * Perform GET request to API with IApiResponse wrapper\n * @param args - HttpParams with url, body (as query params), headers, etc.\n * @returns Observable of wrapped API response\n */\n protected getData<T>(args: HttpParams): Observable<IApiResponse<T>> {\n return new Observable((observer) => {\n this.prepareHeaders().then(baseHeaders => {\n let fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;\n\n // Append query parameters from body\n if (args.body) {\n const params = new URLSearchParams();\n Object.keys(args.body).forEach(key => {\n if (args.body[key] !== null && args.body[key] !== undefined) {\n params.append(key, args.body[key].toString());\n }\n });\n const queryString = params.toString();\n if (queryString) {\n fullUrl += fullUrl.includes('?') ? `&${queryString}` : `?${queryString}`;\n }\n }\n\n // Merge custom headers with base headers\n let headers = baseHeaders;\n if (args.headers) {\n for (const prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n }\n\n this.http.get<any>(fullUrl, { headers }).subscribe({\n next: (response) => {\n const wrappedResponse: IApiResponse<T> = this.wrapResponse(response);\n observer.next(wrappedResponse);\n observer.complete();\n },\n error: (error) => {\n if (args.errorCallback) {\n args.errorCallback(error, args);\n }\n observer.error(error);\n }\n });\n });\n });\n }\n\n /**\n * Perform POST request to API with IApiResponse wrapper\n * @param args - HttpParams with url, body, headers, etc.\n * @returns Observable of wrapped API response\n */\n protected postData<T>(args: HttpParams): Observable<IApiResponse<T>> {\n return new Observable((observer) => {\n this.prepareHeaders().then(baseHeaders => {\n const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;\n\n // Merge custom headers with base headers\n let headers = baseHeaders;\n if (args.headers) {\n for (const prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n }\n\n this.http.post<any>(fullUrl, args.body || {}, { headers }).subscribe({\n next: (response) => {\n const wrappedResponse: IApiResponse<T> = this.wrapResponse(response);\n observer.next(wrappedResponse);\n observer.complete();\n },\n error: (error) => {\n if (args.errorCallback) {\n args.errorCallback(error, args);\n }\n observer.error(error);\n }\n });\n });\n });\n }\n\n /**\n * Perform PUT request to API with IApiResponse wrapper\n * @param args - HttpParams with url, body, headers, etc.\n * @returns Observable of wrapped API response\n */\n protected putData<T>(args: HttpParams): Observable<IApiResponse<T>> {\n return new Observable((observer) => {\n this.prepareHeaders().then(baseHeaders => {\n const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;\n\n // Merge custom headers with base headers\n let headers = baseHeaders;\n if (args.headers) {\n for (const prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n }\n\n this.http.put<any>(fullUrl, args.body || {}, { headers }).subscribe({\n next: (response) => {\n const wrappedResponse: IApiResponse<T> = this.wrapResponse(response);\n observer.next(wrappedResponse);\n observer.complete();\n },\n error: (error) => {\n if (args.errorCallback) {\n args.errorCallback(error, args);\n }\n observer.error(error);\n }\n });\n });\n });\n }\n\n /**\n * Perform DELETE request to API with IApiResponse wrapper\n * @param args - HttpParams with url, headers, etc.\n * @returns Observable of wrapped API response\n */\n protected deleteData<T>(args: HttpParams): Observable<IApiResponse<T>> {\n return new Observable((observer) => {\n this.prepareHeaders().then(baseHeaders => {\n const fullUrl = args.overrideUrl ? args.url : `${this.config.baseApiUrl}${args.url}`;\n\n // Merge custom headers with base headers\n let headers = baseHeaders;\n if (args.headers) {\n for (const prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n }\n\n this.http.delete<any>(fullUrl, { headers }).subscribe({\n next: (response) => {\n const wrappedResponse: IApiResponse<T> = this.wrapResponse(response);\n observer.next(wrappedResponse);\n observer.complete();\n },\n error: (error) => {\n if (args.errorCallback) {\n args.errorCallback(error, args);\n }\n observer.error(error);\n }\n });\n });\n });\n }\n\n protected getDataRx<T>(args: HttpParams) {\n this._httpInProgressRequest.next(args);\n\n if (!args.overrideUrl) {\n args.url = `${this.config.baseApiUrl + args.url}`;\n }\n args.body = args.body || {};\n\n for (let prop in args.body) {\n if (args.body.hasOwnProperty(prop) && args.body[prop]) {\n if (args.url.includes('?')) {\n args.url += '&';\n } else {\n args.url += '?';\n }\n args.url += `${prop}=${args.body[prop]}`;\n }\n }\n\n // if(!this.config.http?.useNativeHttp) {\n let headers = new HttpHeaders();\n for (let prop in args.headers) {\n if (args.headers.hasOwnProperty(prop) && args.headers[prop]) {\n headers = headers.set(prop, args.headers[prop]);\n }\n }\n\n let context = new HttpContext();\n if(args.retryCount != null) {\n context.set(RETRY_COUNT, args.retryCount);\n }\n \n if(args.retryDelay != null) {\n context.set(RETRY_DELAY, args.retryCount);\n }\n \n return this.http.get<T>(args.url, { headers: headers, context: context })\n .pipe(\n tap(() => this._httpInProgressRequest.next(null)),\n catchError((error) => {\n this._httpInProgressRequest.next(null);\n \n //pass error to the caller\n return throwError(() => error);\n }));\n // }\n \n // return new Observable<T>((observer) => {\n // CapacitorHttp.get({\n // url: args.url,\n // headers: args.headers\n // }).then(response => {\n // observer.next(<T>response.data);\n // observer.complete();\n // }).catch(error => {\n // observer.error(error);\n // });\n // });\n }\n\n protected postDataRx<T>(args: HttpParams) {\n this._httpInProgressRequest.next(args);\n\n let newUrl;\n if (!args.overrideUrl) {\n newUrl = `${this.config.baseApiUrl + args.url}`;\n } else {\n newUrl = args.url;\n }\n\n args.url = newUrl;\n\n let context = new HttpContext();\n if(args.retryCount != null) {\n context.set(RETRY_COUNT, args.retryCount);\n }\n\n if(args.retryDelay != null) {\n context.set(RETRY_DELAY, args.retryCount);\n }\n\n console.log('postDataRx', args);\n let body = args.body;\n return this.http.post<T>(args.url, body, { headers: new HttpHeaders(args.headers), context: context })\n .pipe(\n tap(() => this._httpInProgressRequest.next(null)),\n catchError((error) => {\n this._httpInProgressRequest.next(null);\n\n //pass error to the caller\n return throwError(() => error);\n })\n );\n }\n\n protected async handleError(e: HttpErrorResponse, args: HttpParams) {\n switch (e.status) {\n // case 401:\n // const u = await this.userSettingSvc.getCurrentUser();\n // if(u) {\n // //TODO: check for token expiration...\n // //kickout...\n // this.pubsubSvc.publishEvent(UserConstant.EVENT_USER_LOGGEDOUT, { clearCache: true, displayLoginDialog: true });\n // }\n // break;\n default:\n if (!args.errorCallback) {\n let msg;\n //the error might be thrown by e.g a plugin wasn't install properly. In that case text() will not be available\n if (e.message) {\n msg = e.message;\n } else {\n msg = e.error.toString();\n }\n // setTimeout(async () => {\n // await this.helperSvc.alert(msg);\n // });\n } else {\n args.errorCallback(e, args);\n }\n break;\n }\n }\n}\n\nexport interface HttpParams {\n url: string;\n body?: any;\n errorCallback?;\n overrideUrl?: boolean;\n headers?: { [key: string]: string };\n retryCount?: number;\n retryDelay?: number;\n}\n\nexport interface ApiResponse<T> {\n statusCode: number;\n message: any;\n data: T;\n exception: any;\n}\n\n\nexport const RETRY_COUNT = new HttpContextToken(() => 3);\nexport const RETRY_DELAY = new HttpContextToken(() => 5000);","import { Injectable } from '@angular/core';\nimport { Haptics, ImpactStyle, NotificationType } from '@capacitor/haptics';\nimport { Platform } from '@ionic/angular';\n\nexport interface HapticOptions {\n /**\n * Enable or disable haptic feedback\n */\n enabled?: boolean;\n /**\n * Fallback to vibration on unsupported devices\n */\n fallbackToVibration?: boolean;\n}\n\nexport enum HapticPattern {\n Light = 'light',\n Medium = 'medium',\n Heavy = 'heavy',\n Success = 'success',\n Warning = 'warning',\n Error = 'error',\n Selection = 'selection'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HapticsService {\n private options: HapticOptions = {\n enabled: true,\n fallbackToVibration: true\n };\n\n constructor(private platform: Platform) {}\n\n /**\n * Configure haptic feedback options\n */\n configure(options: Partial<HapticOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Play haptic feedback based on pattern\n */\n async play(pattern: HapticPattern): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n switch (pattern) {\n case HapticPattern.Light:\n await Haptics.impact({ style: ImpactStyle.Light });\n break;\n \n case HapticPattern.Medium:\n await Haptics.impact({ style: ImpactStyle.Medium });\n break;\n \n case HapticPattern.Heavy:\n await Haptics.impact({ style: ImpactStyle.Heavy });\n break;\n \n case HapticPattern.Success:\n await Haptics.notification({ type: NotificationType.Success });\n break;\n \n case HapticPattern.Warning:\n await Haptics.notification({ type: NotificationType.Warning });\n break;\n \n case HapticPattern.Error:\n await Haptics.notification({ type: NotificationType.Error });\n break;\n \n case HapticPattern.Selection:\n await Haptics.selectionStart();\n break;\n \n default:\n await Haptics.impact({ style: ImpactStyle.Light });\n }\n } catch (error) {\n console.warn('Haptic feedback failed:', error);\n \n // Fallback to vibration if haptics are not supported\n if (this.options.fallbackToVibration && this.platform.is('mobile')) {\n this.vibrate(pattern);\n }\n }\n }\n\n /**\n * Play product selection haptic feedback\n */\n async light(): Promise<void> {\n await this.play(HapticPattern.Light);\n }\n\n /**\n * Play product add to cart haptic feedback\n */\n async medium(): Promise<void> {\n await this.play(HapticPattern.Medium);\n }\n\n /**\n * Play order submission haptic feedback\n */\n async heavy(): Promise<void> {\n await this.play(HapticPattern.Heavy);\n }\n\n /**\n * Play order success haptic feedback\n */\n async success(): Promise<void> {\n await this.play(HapticPattern.Success);\n }\n\n /**\n * Play order error haptic feedback\n */\n async orderError(): Promise<void> {\n await this.play(HapticPattern.Error);\n }\n\n /**\n * Play button interaction haptic feedback\n */\n async buttonInteraction(): Promise<void> {\n await this.play(HapticPattern.Selection);\n }\n\n /**\n * Play custom haptic pattern\n */\n async customImpact(style: ImpactStyle): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n await Haptics.impact({ style });\n } catch (error) {\n console.warn('Custom haptic impact failed:', error);\n }\n }\n\n /**\n * Play custom notification haptic\n */\n async customNotification(type: NotificationType): Promise<void> {\n if (!this.options.enabled) {\n return;\n }\n\n try {\n await Haptics.notification({ type });\n } catch (error) {\n console.warn('Custom haptic notification failed:', error);\n }\n }\n\n /**\n * Check if haptics are available on the device\n */\n async isAvailable(): Promise<boolean> {\n try {\n // Try to perform a test haptic\n await Haptics.impact({ style: ImpactStyle.Light });\n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Disable haptic feedback\n */\n disable(): void {\n this.options.enabled = false;\n }\n\n /**\n * Enable haptic feedback\n */\n enable(): void {\n this.options.enabled = true;\n }\n\n /**\n * Fallback vibration for unsupported devices\n */\n private vibrate(pattern: HapticPattern): void {\n if (!navigator.vibrate) {\n return;\n }\n\n const vibrationPatterns: Record<HapticPattern, number | number[]> = {\n [HapticPattern.Light]: 50,\n [HapticPattern.Medium]: 100,\n [HapticPattern.Heavy]: 200,\n [HapticPattern.Success]: [100, 50, 100],\n [HapticPattern.Warning]: [150, 100, 150],\n [HapticPattern.Error]: [200, 100, 200, 100, 200],\n [HapticPattern.Selection]: 25\n };\n\n const vibrationPattern = vibrationPatterns[pattern];\n if (Array.isArray(vibrationPattern)) {\n navigator.vibrate(vibrationPattern);\n } else {\n navigator.vibrate(vibrationPattern);\n }\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, Provider } from \"@angular/core\";\n\nimport { HapticsService } from \"./haptics.service\";\n\nexport const provideUniversalZoneIonic = (): EnvironmentProviders => {\n const providers: Provider[] = [\n HapticsService\n ];\n\n return makeEnvironmentProviders(providers);\n};\n","/*\r\n * Public API Surface of ngx-ionic-zone\r\n */\r\n\r\nexport * from './shared/base-http.service';\r\nexport * from './shared/uz-ionic.provider';\r\nexport * from './shared/app-config';\r\nexport * from './shared/haptics.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import * as rxjs from 'rxjs';
2
- import { HttpClient, HttpErrorResponse, HttpContextToken } from '@angular/common/http';
1
+ import { HttpClient, HttpHeaders, HttpErrorResponse, HttpContextToken } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
3
  import * as i0 from '@angular/core';
4
4
  import { InjectionToken, EnvironmentProviders } from '@angular/core';
5
5
  import { ImpactStyle, NotificationType } from '@capacitor/haptics';
@@ -20,14 +20,57 @@ interface IAppConfigHttp {
20
20
  useNativeHttp: boolean;
21
21
  }
22
22
 
23
+ /**
24
+ * API response wrapper matching backend CamelCaseResult
25
+ */
26
+ interface IApiResponse<T = any> {
27
+ data: T;
28
+ statusCode: number;
29
+ exception?: any;
30
+ }
23
31
  declare class BaseHttpService {
24
32
  private _httpInProgressRequest;
25
33
  protected http: HttpClient;
26
34
  protected config: IAppConfig;
27
- httpInProgressRequest$: rxjs.Observable<HttpParams>;
35
+ httpInProgressRequest$: Observable<HttpParams>;
28
36
  constructor();
29
- protected getDataRx<T>(args: HttpParams): rxjs.Observable<T>;
30
- protected postDataRx<T>(args: HttpParams): rxjs.Observable<T>;
37
+ /**
38
+ * Prepare HTTP headers with authentication and localization
39
+ * Override in subclass to add custom headers (e.g., auth tokens)
40
+ * @returns Promise of HttpHeaders with common headers
41
+ */
42
+ protected prepareHeaders(): Promise<HttpHeaders>;
43
+ /**
44
+ * Wrap raw API response into IApiResponse format
45
+ * Handles both wrapped ({ data, statusCode, exception }) and unwrapped (direct data) responses
46
+ */
47
+ private wrapResponse;
48
+ /**
49
+ * Perform GET request to API with IApiResponse wrapper
50
+ * @param args - HttpParams with url, body (as query params), headers, etc.
51
+ * @returns Observable of wrapped API response
52
+ */
53
+ protected getData<T>(args: HttpParams): Observable<IApiResponse<T>>;
54
+ /**
55
+ * Perform POST request to API with IApiResponse wrapper
56
+ * @param args - HttpParams with url, body, headers, etc.
57
+ * @returns Observable of wrapped API response
58
+ */
59
+ protected postData<T>(args: HttpParams): Observable<IApiResponse<T>>;
60
+ /**
61
+ * Perform PUT request to API with IApiResponse wrapper
62
+ * @param args - HttpParams with url, body, headers, etc.
63
+ * @returns Observable of wrapped API response
64
+ */
65
+ protected putData<T>(args: HttpParams): Observable<IApiResponse<T>>;
66
+ /**
67
+ * Perform DELETE request to API with IApiResponse wrapper
68
+ * @param args - HttpParams with url, headers, etc.
69
+ * @returns Observable of wrapped API response
70
+ */
71
+ protected deleteData<T>(args: HttpParams): Observable<IApiResponse<T>>;
72
+ protected getDataRx<T>(args: HttpParams): Observable<T>;
73
+ protected postDataRx<T>(args: HttpParams): Observable<T>;
31
74
  protected handleError(e: HttpErrorResponse, args: HttpParams): Promise<void>;
32
75
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseHttpService, never>;
33
76
  static ɵprov: i0.ɵɵInjectableDeclaration<BaseHttpService>;
@@ -138,4 +181,4 @@ declare class HapticsService {
138
181
  }
139
182
 
140
183
  export { APP_CONFIG_TOKEN, BaseHttpService, HapticPattern, HapticsService, RETRY_COUNT, RETRY_DELAY, provideUniversalZoneIonic };
141
- export type { ApiResponse, HapticOptions, HttpParams, IAppConfig, IAppConfigHttp, IAppConfigPing };
184
+ export type { ApiResponse, HapticOptions, HttpParams, IApiResponse, IAppConfig, IAppConfigHttp, IAppConfigPing };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-ionic-zone",
3
- "version": "2.0.2",
3
+ "version": "2.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.0.0",
6
6
  "@angular/core": "^20.0.0",
@@ -21,14 +21,14 @@
21
21
  "types": "./index.d.ts",
22
22
  "default": "./fesm2022/ngx-ionic-zone.mjs"
23
23
  },
24
- "./components": {
25
- "types": "./components/index.d.ts",
26
- "default": "./fesm2022/ngx-ionic-zone-components.mjs"
27
- },
28
24
  "./database": {
29
25
  "types": "./database/index.d.ts",
30
26
  "default": "./fesm2022/ngx-ionic-zone-database.mjs"
31
27
  },
28
+ "./components": {
29
+ "types": "./components/index.d.ts",
30
+ "default": "./fesm2022/ngx-ionic-zone-components.mjs"
31
+ },
32
32
  "./network": {
33
33
  "types": "./network/index.d.ts",
34
34
  "default": "./fesm2022/ngx-ionic-zone-network.mjs"