stream-chat-react-native-core 9.0.0-beta.13 → 9.0.0-beta.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.
Files changed (35) hide show
  1. package/lib/commonjs/components/Channel/Channel.js +62 -17
  2. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  3. package/lib/commonjs/store/OfflineDB.js +1 -0
  4. package/lib/commonjs/store/OfflineDB.js.map +1 -1
  5. package/lib/commonjs/store/apis/index.js +11 -0
  6. package/lib/commonjs/store/apis/index.js.map +1 -1
  7. package/lib/commonjs/store/apis/updatePendingTask.js +34 -0
  8. package/lib/commonjs/store/apis/updatePendingTask.js.map +1 -0
  9. package/lib/commonjs/version.json +1 -1
  10. package/lib/module/components/Channel/Channel.js +62 -17
  11. package/lib/module/components/Channel/Channel.js.map +1 -1
  12. package/lib/module/store/OfflineDB.js +1 -0
  13. package/lib/module/store/OfflineDB.js.map +1 -1
  14. package/lib/module/store/apis/index.js +11 -0
  15. package/lib/module/store/apis/index.js.map +1 -1
  16. package/lib/module/store/apis/updatePendingTask.js +34 -0
  17. package/lib/module/store/apis/updatePendingTask.js.map +1 -0
  18. package/lib/module/version.json +1 -1
  19. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  20. package/lib/typescript/store/OfflineDB.d.ts +1 -0
  21. package/lib/typescript/store/OfflineDB.d.ts.map +1 -1
  22. package/lib/typescript/store/apis/index.d.ts +1 -0
  23. package/lib/typescript/store/apis/index.d.ts.map +1 -1
  24. package/lib/typescript/store/apis/updatePendingTask.d.ts +3 -0
  25. package/lib/typescript/store/apis/updatePendingTask.d.ts.map +1 -0
  26. package/lib/typescript/store/mappers/mapTaskToStorable.d.ts +9 -0
  27. package/lib/typescript/store/mappers/mapTaskToStorable.d.ts.map +1 -1
  28. package/package.json +2 -2
  29. package/src/__tests__/offline-support/optimistic-update.js +225 -0
  30. package/src/components/Channel/Channel.tsx +50 -4
  31. package/src/store/OfflineDB.ts +2 -0
  32. package/src/store/apis/__tests__/updatePendingTask.test.ts +66 -0
  33. package/src/store/apis/index.ts +1 -0
  34. package/src/store/apis/updatePendingTask.ts +24 -0
  35. package/src/version.json +1 -1
@@ -0,0 +1,34 @@
1
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.updatePendingTask = void 0;
6
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+ var _mapTaskToStorable = require("../mappers/mapTaskToStorable");
9
+ var _createUpdateQuery = require("../sqlite-utils/createUpdateQuery");
10
+ var _SqliteClient = require("../SqliteClient");
11
+ var _excluded = ["createdAt", "id"];
12
+ var updatePendingTask = exports.updatePendingTask = function () {
13
+ var _ref2 = (0, _asyncToGenerator2.default)(function* (_ref) {
14
+ var id = _ref.id,
15
+ task = _ref.task;
16
+ var storableTask = (0, _mapTaskToStorable.mapTaskToStorable)(task);
17
+ var createdAt = storableTask.createdAt,
18
+ taskId = storableTask.id,
19
+ nextTask = (0, _objectWithoutProperties2.default)(storableTask, _excluded);
20
+ var query = (0, _createUpdateQuery.createUpdateQuery)('pendingTasks', nextTask, {
21
+ id: id
22
+ });
23
+ _SqliteClient.SqliteClient.logger == null || _SqliteClient.SqliteClient.logger('info', 'updatePendingTask', {
24
+ id: id,
25
+ task: nextTask
26
+ });
27
+ yield _SqliteClient.SqliteClient.executeSql.apply(null, query);
28
+ return [query];
29
+ });
30
+ return function updatePendingTask(_x) {
31
+ return _ref2.apply(this, arguments);
32
+ };
33
+ }();
34
+ //# sourceMappingURL=updatePendingTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_mapTaskToStorable","require","_createUpdateQuery","_SqliteClient","_excluded","updatePendingTask","exports","_ref2","_asyncToGenerator2","default","_ref","id","task","storableTask","mapTaskToStorable","createdAt","taskId","nextTask","_objectWithoutProperties2","query","createUpdateQuery","SqliteClient","logger","executeSql","apply","_x","arguments"],"sourceRoot":"../../../../src","sources":["store/apis/updatePendingTask.ts"],"mappings":";;;;;;;AAEA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AAA+C,IAAAG,SAAA;AAExC,IAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA;EAAA,IAAAE,KAAA,OAAAC,kBAAA,CAAAC,OAAA,EAAG,WAAAC,IAAA,EAAiD;IAAA,IAAxCC,EAAE,GAAAD,IAAA,CAAFC,EAAE;MAAEC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IAChD,IAAMC,YAAY,GAAG,IAAAC,oCAAiB,EAACF,IAAI,CAAC;IAE5C,IAAQG,SAAS,GAA8BF,YAAY,CAAnDE,SAAS;MAAMC,MAAM,GAAkBH,YAAY,CAAxCF,EAAE;MAAaM,QAAQ,OAAAC,yBAAA,CAAAT,OAAA,EAAKI,YAAY,EAAAT,SAAA;IAE3D,IAAMe,KAAK,GAAG,IAAAC,oCAAiB,EAAC,cAAc,EAAEH,QAAQ,EAAE;MACxDN,EAAE,EAAFA;IACF,CAAC,CAAC;IAEFU,0BAAY,CAACC,MAAM,YAAnBD,0BAAY,CAACC,MAAM,CAAG,MAAM,EAAE,mBAAmB,EAAE;MACjDX,EAAE,EAAFA,EAAE;MACFC,IAAI,EAAEK;IACR,CAAC,CAAC;IAEF,MAAMI,0BAAY,CAACE,UAAU,CAACC,KAAK,CAAC,IAAI,EAAEL,KAAK,CAAC;IAEhD,OAAO,CAACA,KAAK,CAAC;EAChB,CAAC;EAAA,gBAjBYd,iBAAiBA,CAAAoB,EAAA;IAAA,OAAAlB,KAAA,CAAAiB,KAAA,OAAAE,SAAA;EAAA;AAAA,GAiB7B","ignoreList":[]}
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "9.0.0-beta.13"
2
+ "version": "9.0.0-beta.15"
3
3
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../../src/components/Channel/Channel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAqD,MAAM,OAAO,CAAC;AAOpG,OAAO,EAGL,OAAO,IAAI,WAAW,EAGtB,YAAY,EAKZ,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,EAEV,OAAO,IAAI,aAAa,EAExB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAmBrB,OAAO,EACL,4BAA4B,EAE7B,MAAM,gEAAgE,CAAC;AAKxE,OAAO,EAAE,mBAAmB,EAAmB,MAAM,8CAA8C,CAAC;AACpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wCAAwC,CAAC;AAE1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACnF,OAAO,EACL,6BAA6B,EAE9B,MAAM,wDAAwD,CAAC;AAChE,OAAO,EACL,oBAAoB,EAErB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,2BAA2B,EAE5B,MAAM,8DAA8D,CAAC;AACtE,OAAO,EACL,gCAAgC,EAEjC,MAAM,wEAAwE,CAAC;AAEhF,OAAO,EACL,kBAAkB,EAElB,UAAU,EACX,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,uBAAuB,EAExB,MAAM,sDAAsD,CAAC;AAa9D,OAAO,EAEL,2BAA2B,EAC5B,MAAM,wCAAwC,CAAC;AAOhD,OAAO,EAKL,YAAY,EACb,MAAM,mBAAmB,CAAC;AAwB3B,OAAO,EAEL,iBAAiB,EAClB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAEL,2BAA2B,EAC5B,MAAM,0DAA0D,CAAC;AAgFlE,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAAY,EA8BtC,CAAC;AAoBF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,GACxE,OAAO,CACL,IAAI,CACF,4BAA4B,EAC1B,aAAa,GACb,UAAU,GACV,yBAAyB,GACzB,+BAA+B,GAC/B,sCAAsC,GACtC,qCAAqC,GACrC,uCAAuC,GACvC,yBAAyB,CAC5B,CACF,GACD,OAAO,CACL,IAAI,CACF,mBAAmB,EACjB,qBAAqB,GACrB,6BAA6B,GAC7B,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,kBAAkB,GAClB,+BAA+B,GAC/B,sBAAsB,GACtB,cAAc,GACd,qBAAqB,CACxB,CACF,GACD,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,sBAAsB,GAAG,UAAU,CAAC,GACtE,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAC,CAAC,GAC7F,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,GAClC,OAAO,CACL,IAAI,CAAC,gCAAgC,EAAE,UAAU,GAAG,aAAa,GAAG,mBAAmB,CAAC,CACzF,GACD,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,mBAAmB,CAAC,GAClE,OAAO,CACL,IAAI,CACF,oBAAoB,EAClB,0BAA0B,GAC1B,YAAY,GACZ,iBAAiB,GACjB,0BAA0B,GAC1B,YAAY,GACZ,+BAA+B,GAC/B,wBAAwB,GACxB,+BAA+B,GAC/B,oBAAoB,GACpB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,oBAAoB,GACpB,qBAAqB,GACrB,aAAa,GACb,UAAU,GACV,oBAAoB,GACpB,SAAS,GACT,sBAAsB,GACtB,OAAO,GACP,cAAc,GACd,WAAW,GACX,YAAY,GACZ,cAAc,GACd,mBAAmB,GACnB,YAAY,GACZ,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,aAAa,GACb,mBAAmB,GACnB,iBAAiB,GACjB,qBAAqB,GACrB,uBAAuB,GACvB,mBAAmB,GACnB,6BAA6B,GAC7B,uBAAuB,GACvB,eAAe,GACf,SAAS,GACT,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,0BAA0B,GAC1B,2BAA2B,GAC3B,qBAAqB,GACrB,4BAA4B,GAC5B,uBAAuB,GACvB,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,eAAe,GACf,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,qBAAqB,GACrB,uBAAuB,GACvB,4BAA4B,GAC5B,qBAAqB,GACrB,gBAAgB,GAChB,uBAAuB,GACvB,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,aAAa,GACb,0BAA0B,GAC1B,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,4BAA4B,GAC5B,gBAAgB,GAChB,oBAAoB,GACpB,kBAAkB,GAClB,gBAAgB,GAChB,uBAAuB,GACvB,4BAA4B,GAC5B,0BAA0B,GAC1B,oBAAoB,GACpB,sBAAsB,GACtB,kBAAkB,GAClB,iBAAiB,GACjB,uBAAuB,GACvB,kBAAkB,GAClB,yBAAyB,GACzB,uBAAuB,GACvB,OAAO,GACP,0BAA0B,GAC1B,sBAAsB,GACtB,gBAAgB,GAChB,oBAAoB,GACpB,iBAAiB,GACjB,0BAA0B,GAC1B,YAAY,GACZ,mBAAmB,GACnB,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,4BAA4B,GAC5B,sBAAsB,CACzB,CACF,GACD,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC,GAC1D,OAAO,CACL,IAAI,CAAC,kBAAkB,EAAE,8BAA8B,GAAG,gCAAgC,CAAC,CAC5F,GAAG;IACF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB;;OAEG;IACH,mCAAmC,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC3E;;;;;;;OAOG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAClB,OAAO,EAAE,WAAW,EACpB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC,oBAAoB,CAAC,KAAK,IAAI,KACxF,IAAI,CAAC;IACV;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,aAAa,EAC1B,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAErC;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE;QAChC,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,aAAa,CAAC;QACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;KAC9B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1D,OAAO,CAAC,EAAE,oBAAoB,KAC3B,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7C;;OAEG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,gBAAgB,CAAC,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAC3D;;;;;;;;;;;;;;;;;;OAkBG;IACH,sBAAsB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC1E,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC/D;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,qCAAqC,CAAC,EAAE,MAAM,CAAC;IAC/C,uBAAuB,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC/D;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CACT,IAAI,CACF,6BAA6B,EAC3B,wBAAwB,GACxB,mBAAmB,GACnB,4BAA4B,GAC5B,kCAAkC,CACrC,CACF,CAAC;AA0hDJ,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC,GACrF,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GAAG;IACzC,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,iBAAiB,CAAC,YAAY,CAAC,sBAwC7D,CAAC"}
1
+ {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../../src/components/Channel/Channel.tsx"],"names":[],"mappings":"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"}
@@ -69,6 +69,7 @@ export declare class OfflineDB extends AbstractOfflineDB {
69
69
  limit?: number;
70
70
  }) => Promise<import("stream-chat").ReactionResponse[] | null>;
71
71
  addPendingTask: (task: import("stream-chat").PendingTask) => Promise<() => Promise<void>>;
72
+ updatePendingTask: ({ id, task }: import("stream-chat").DBUpdatePendingTaskType) => Promise<import("./types").PreparedQueries[]>;
72
73
  deletePendingTask: ({ id }: {
73
74
  id: number;
74
75
  }) => Promise<import("./types").PreparedQueries[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"OfflineDB.d.ts","sourceRoot":"","sources":["../../../src/store/OfflineDB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AAKrB,qBAAa,SAAU,SAAQ,iBAAiB;gBAClC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE;IAI9C,kBAAkB;;eAJlB,CAAF;eAA4B,CAAA;YAAiB,CAAC;uDAIA;IAE5C,cAAc;;eAG6C,CAAA;2BACzD,CAAF;uDAJoC;IAGpC,oBAAoB,GAAI,mCAAmC,0BAA0B,kDACR;IAG7E,iBAAiB,GAAI,kCAAkC,uBAAuB,kDACL;IAEzE,UAAU;;eAjBgC,CAAC;uDAiBf;IAE5B,WAAW;;eAVwB,CAAC;uDAUN;IAE9B,QAAQ;;;iBAhBe,CAAC;8DAgBA;IAExB,WAAW;;iBA7BW,CAAC;eACX,CAAC;uDA4BiB;IAE9B,iBAAiB;;eAzBc,CAAC;uDAyBU;IAE1C,WAAW;;;eAtBF,CAAC;uDAsBoB;IAE9B,cAAc;;eAlBH,CAAC;uDAkBwB;IAEpC,aAAa;;;eA1BwB,CAAC;uDA0BJ;IAElC,aAAa;;eAvBgD,CAAC;uDAuB5B;IAGlC,WAAW,GAAI,kBAAkB,iBAAiB,2EACa;IAG/D,mBAAmB,GAAI,2BAA2B,yBAAyB,kFACF;IAEzE,iBAAiB,0BAAwB;IAGzC,eAAe,GAAI,YAAY,qBAAqB,iCACH;IAEjD,cAAc,GAAI,YAAY,oBAAoB,kEACF;IAEhD,YAAY;;eAzCkB,CAAC;YAAuC,CAAC;aAE1D,CAAC;mEAuC+B;IAE7C,cAAc,4EAAsB;IAEpC,iBAAiB;;uDAAyB;IAE1C,cAAc;;eAxDJ,CAAC;eAGwB,CAAC;uDAqDA;IAEpC,YAAY;;;eA9De,CAAA;uDA8DK;IAEhC,aAAa;;eApEJ,CAAC;uDAoEwB;IAElC,wBAAwB;;oBAvExB,CAAF;eAAmB,CAAC;mDAuEsC;IAExD,gBAAgB;;eAvDoC,CAAA;uDAuDZ;IAExC,iBAAiB;;eA1EjB,CAAD;kDA0EuC;IAEtC,iBAAiB,6HAAyB;IAE1C,eAAe;iBA1ER,CAAC;uDA0E8B;IAEtC,cAAc;;;eA/DgB,CAAC;uDA+DK;IAEpC,cAAc;;;eAnEF,CAAC;uDAmEuB;IAEpC,aAAa;;2BAAqB;IAElC,OAAO,sBAAwB;IAE/B,eAAe,uEAAgC;IAE/C,YAAY,yBAAmC;CAChD"}
1
+ {"version":3,"file":"OfflineDB.d.ts","sourceRoot":"","sources":["../../../src/store/OfflineDB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AAKrB,qBAAa,SAAU,SAAQ,iBAAiB;gBAClC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE;IAI9C,kBAAkB;;eAJlB,CAAF;eAA4B,CAAA;YAAiB,CAAC;uDAIA;IAE5C,cAAc;;eAG6C,CAAA;2BACzD,CAAF;uDAJoC;IAGpC,oBAAoB,GAAI,mCAAmC,0BAA0B,kDACR;IAG7E,iBAAiB,GAAI,kCAAkC,uBAAuB,kDACL;IAEzE,UAAU;;eAjBgC,CAAC;uDAiBf;IAE5B,WAAW;;eAVwB,CAAC;uDAUN;IAE9B,QAAQ;;;iBAhBe,CAAC;8DAgBA;IAExB,WAAW;;iBA7BW,CAAC;eACX,CAAC;uDA4BiB;IAE9B,iBAAiB;;eAzBc,CAAC;uDAyBU;IAE1C,WAAW;;;eAtBF,CAAC;uDAsBoB;IAE9B,cAAc;;eAlBH,CAAC;uDAkBwB;IAEpC,aAAa;;;eA1BwB,CAAC;uDA0BJ;IAElC,aAAa;;eAvBgD,CAAC;uDAuB5B;IAGlC,WAAW,GAAI,kBAAkB,iBAAiB,2EACa;IAG/D,mBAAmB,GAAI,2BAA2B,yBAAyB,kFACF;IAEzE,iBAAiB,0BAAwB;IAGzC,eAAe,GAAI,YAAY,qBAAqB,iCACH;IAEjD,cAAc,GAAI,YAAY,oBAAoB,kEACF;IAEhD,YAAY;;eAzCkB,CAAC;YAAuC,CAAC;aAE1D,CAAC;mEAuC+B;IAE7C,cAAc,4EAAsB;IAEpC,iBAAiB,gHAAyB;IAE1C,iBAAiB;;uDAAyB;IAE1C,cAAc;;eA1DJ,CAAC;eAGwB,CAAC;uDAuDA;IAEpC,YAAY;;;eAhEe,CAAA;uDAgEK;IAEhC,aAAa;;eAtEJ,CAAC;uDAsEwB;IAElC,wBAAwB;;oBAzExB,CAAF;eAAmB,CAAC;mDAyEsC;IAExD,gBAAgB;;eAzDoC,CAAA;uDAyDZ;IAExC,iBAAiB;;eA5EjB,CAAD;kDA4EuC;IAEtC,iBAAiB,6HAAyB;IAE1C,eAAe;iBA5ER,CAAC;uDA4E8B;IAEtC,cAAc;;;eAjEgB,CAAC;uDAiEK;IAEpC,cAAc;;;eArEF,CAAC;uDAqEuB;IAEpC,aAAa;;2BAAqB;IAElC,OAAO,sBAAwB;IAE/B,eAAe,uEAAgC;IAE/C,YAAY,yBAAmC;CAChD"}
@@ -13,6 +13,7 @@ export * from './getLastSyncedAt';
13
13
  export * from './getMembers';
14
14
  export * from './getReads';
15
15
  export * from './updateMessage';
16
+ export * from './updatePendingTask';
16
17
  export * from './updateReaction';
17
18
  export * from './insertReaction';
18
19
  export * from './deleteReaction';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/store/apis/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/store/apis/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DBUpdatePendingTaskType } from 'stream-chat';
2
+ export declare const updatePendingTask: ({ id, task }: DBUpdatePendingTaskType) => Promise<import("../types").PreparedQueries[]>;
3
+ //# sourceMappingURL=updatePendingTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updatePendingTask.d.ts","sourceRoot":"","sources":["../../../../src/store/apis/updatePendingTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAM3D,eAAO,MAAM,iBAAiB,GAAU,cAAc,uBAAuB,kDAiB5E,CAAC"}
@@ -8,6 +8,15 @@ export declare const mapTaskToStorable: (task: PendingTask) => {
8
8
  id?: number;
9
9
  threadId?: string;
10
10
  type: import("stream-chat").PendingTaskTypes["sendReaction"];
11
+ } | {
12
+ createdAt: string;
13
+ payload: string;
14
+ channelId?: string;
15
+ channelType?: string;
16
+ messageId?: string;
17
+ id?: number;
18
+ threadId?: string;
19
+ type: import("stream-chat").PendingTaskTypes["updateMessage"];
11
20
  } | {
12
21
  createdAt: string;
13
22
  payload: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mapTaskToStorable.d.ts","sourceRoot":"","sources":["../../../../src/store/mappers/mapTaskToStorable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,iBAAiB,GAAI,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIjD,CAAC"}
1
+ {"version":3,"file":"mapTaskToStorable.d.ts","sourceRoot":"","sources":["../../../../src/store/mappers/mapTaskToStorable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,iBAAiB,GAAI,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIjD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "stream-chat-react-native-core",
3
3
  "description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
4
- "version": "9.0.0-beta.13",
4
+ "version": "9.0.0-beta.15",
5
5
  "author": {
6
6
  "company": "Stream.io Inc",
7
7
  "name": "Stream.io Inc"
@@ -84,7 +84,7 @@
84
84
  "path": "0.12.7",
85
85
  "react-native-markdown-package": "1.8.2",
86
86
  "react-native-url-polyfill": "^2.0.0",
87
- "stream-chat": "^9.36.1",
87
+ "stream-chat": "^9.40.0",
88
88
  "use-sync-external-store": "^1.5.0"
89
89
  },
90
90
  "peerDependencies": {
@@ -15,6 +15,7 @@ import { getOrCreateChannelApi } from '../../mock-builders/api/getOrCreateChanne
15
15
  import { sendMessageApi } from '../../mock-builders/api/sendMessage';
16
16
  import { sendReactionApi } from '../../mock-builders/api/sendReaction';
17
17
  import { useMockedApis } from '../../mock-builders/api/useMockedApis';
18
+ import { generateFileReference } from '../../mock-builders/attachments';
18
19
  import dispatchConnectionChangedEvent from '../../mock-builders/event/connectionChanged';
19
20
  import { generateChannelResponse } from '../../mock-builders/generator/channel';
20
21
  import { generateMember } from '../../mock-builders/generator/member';
@@ -25,6 +26,7 @@ import { getTestClientWithUser } from '../../mock-builders/mock';
25
26
  import { upsertChannels } from '../../store/apis';
26
27
  import { SqliteClient } from '../../store/SqliteClient';
27
28
  import { BetterSqlite } from '../../test-utils/BetterSqlite';
29
+ import { MessageStatusTypes } from '../../utils/utils';
28
30
 
29
31
  test('Workaround to allow exporting tests', () => expect(true).toBe(true));
30
32
 
@@ -397,6 +399,229 @@ export const OptimisticUpdates = () => {
397
399
  });
398
400
  });
399
401
 
402
+ describe('edit message', () => {
403
+ it('should keep the optimistic edit in state and DB if the LLC queues the edit', async () => {
404
+ const message = channel.state.messages[0];
405
+ const editedText = 'edited while offline';
406
+
407
+ render(
408
+ <Chat client={chatClient} enableOfflineSupport>
409
+ <Channel
410
+ channel={channel}
411
+ doUpdateMessageRequest={async (_channelId, localMessage, options) => {
412
+ await chatClient.offlineDb.addPendingTask({
413
+ channelId: channel.id,
414
+ channelType: channel.type,
415
+ messageId: message.id,
416
+ payload: [localMessage, undefined, options],
417
+ type: 'update-message',
418
+ });
419
+ return {
420
+ message: {
421
+ ...localMessage,
422
+ message_text_updated_at: new Date(),
423
+ updated_at: new Date(),
424
+ },
425
+ };
426
+ }}
427
+ >
428
+ <CallbackEffectWithContext
429
+ callback={async ({ editMessage }) => {
430
+ await editMessage({
431
+ localMessage: {
432
+ ...message,
433
+ cid: channel.cid,
434
+ text: editedText,
435
+ },
436
+ options: {},
437
+ });
438
+ }}
439
+ context={MessageInputContext}
440
+ >
441
+ <View testID='children' />
442
+ </CallbackEffectWithContext>
443
+ </Channel>
444
+ </Chat>,
445
+ );
446
+
447
+ await waitFor(() => expect(screen.getByTestId('children')).toBeTruthy());
448
+
449
+ await waitFor(async () => {
450
+ const updatedMessage = channel.state.findMessage(message.id);
451
+ const pendingTasksRows = await BetterSqlite.selectFromTable('pendingTasks');
452
+ const dbMessages = await BetterSqlite.selectFromTable('messages');
453
+ const dbMessage = dbMessages.find((row) => row.id === message.id);
454
+
455
+ expect(updatedMessage.text).toBe(editedText);
456
+ expect(updatedMessage.message_text_updated_at).toBeTruthy();
457
+ expect(pendingTasksRows).toHaveLength(1);
458
+ expect(pendingTasksRows[0].type).toBe('update-message');
459
+ expect(dbMessage.text).toBe(editedText);
460
+ expect(dbMessage.messageTextUpdatedAt).toBeTruthy();
461
+ });
462
+ });
463
+
464
+ it('should keep the optimistic edit if the request fails', async () => {
465
+ const message = channel.state.messages[0];
466
+ const editedText = 'should stay optimistic';
467
+
468
+ render(
469
+ <Chat client={chatClient} enableOfflineSupport>
470
+ <Channel
471
+ channel={channel}
472
+ doUpdateMessageRequest={() => {
473
+ throw new Error('validation');
474
+ }}
475
+ >
476
+ <CallbackEffectWithContext
477
+ callback={async ({ editMessage }) => {
478
+ try {
479
+ await editMessage({
480
+ localMessage: {
481
+ ...message,
482
+ cid: channel.cid,
483
+ text: editedText,
484
+ },
485
+ options: {},
486
+ });
487
+ } catch (e) {
488
+ // do nothing
489
+ }
490
+ }}
491
+ context={MessageInputContext}
492
+ >
493
+ <View testID='children' />
494
+ </CallbackEffectWithContext>
495
+ </Channel>
496
+ </Chat>,
497
+ );
498
+
499
+ await waitFor(() => expect(screen.getByTestId('children')).toBeTruthy());
500
+
501
+ await waitFor(async () => {
502
+ const updatedMessage = channel.state.findMessage(message.id);
503
+ const pendingTasksRows = await BetterSqlite.selectFromTable('pendingTasks');
504
+ const dbMessages = await BetterSqlite.selectFromTable('messages');
505
+ const dbMessage = dbMessages.find((row) => row.id === message.id);
506
+
507
+ expect(updatedMessage.text).toBe(editedText);
508
+ expect(pendingTasksRows).toHaveLength(0);
509
+ expect(dbMessage.text).toBe(editedText);
510
+ });
511
+ });
512
+
513
+ it('should not set message_text_updated_at during optimistic edit of a failed message', async () => {
514
+ const message = channel.state.messages[0];
515
+ const optimisticStateSpy = jest.fn();
516
+
517
+ render(
518
+ <Chat client={chatClient} enableOfflineSupport>
519
+ <Channel
520
+ channel={channel}
521
+ doUpdateMessageRequest={() => {
522
+ const optimisticMessage = channel.state.findMessage(message.id);
523
+ optimisticStateSpy(optimisticMessage);
524
+
525
+ return {
526
+ message: {
527
+ ...optimisticMessage,
528
+ },
529
+ };
530
+ }}
531
+ >
532
+ <CallbackEffectWithContext
533
+ callback={async ({ editMessage }) => {
534
+ await editMessage({
535
+ localMessage: {
536
+ ...message,
537
+ cid: channel.cid,
538
+ status: MessageStatusTypes.FAILED,
539
+ text: 'edited failed message',
540
+ },
541
+ options: {},
542
+ });
543
+ }}
544
+ context={MessageInputContext}
545
+ >
546
+ <View testID='children' />
547
+ </CallbackEffectWithContext>
548
+ </Channel>
549
+ </Chat>,
550
+ );
551
+
552
+ await waitFor(() => expect(screen.getByTestId('children')).toBeTruthy());
553
+
554
+ await waitFor(() => {
555
+ expect(optimisticStateSpy).toHaveBeenCalled();
556
+ expect(optimisticStateSpy.mock.calls[0][0].message_text_updated_at).toBeUndefined();
557
+ });
558
+ });
559
+
560
+ it('should keep the optimistic edit for attachment updates without auto-queueing', async () => {
561
+ const message = channel.state.messages[0];
562
+ const editedText = 'edited attachment message';
563
+ const localUri = 'file://edited-attachment.png';
564
+
565
+ render(
566
+ <Chat client={chatClient} enableOfflineSupport>
567
+ <Channel
568
+ channel={channel}
569
+ doUpdateMessageRequest={() => {
570
+ throw new Error('offline');
571
+ }}
572
+ >
573
+ <CallbackEffectWithContext
574
+ callback={async ({ editMessage }) => {
575
+ try {
576
+ await editMessage({
577
+ localMessage: {
578
+ ...message,
579
+ attachments: [
580
+ {
581
+ asset_url: localUri,
582
+ originalFile: generateFileReference({
583
+ name: 'edited-attachment.png',
584
+ type: 'image/png',
585
+ uri: localUri,
586
+ }),
587
+ type: 'file',
588
+ },
589
+ ],
590
+ cid: channel.cid,
591
+ text: editedText,
592
+ },
593
+ options: {},
594
+ });
595
+ } catch (e) {
596
+ // do nothing
597
+ }
598
+ }}
599
+ context={MessageInputContext}
600
+ >
601
+ <View testID='children' />
602
+ </CallbackEffectWithContext>
603
+ </Channel>
604
+ </Chat>,
605
+ );
606
+
607
+ await waitFor(() => expect(screen.getByTestId('children')).toBeTruthy());
608
+
609
+ await waitFor(async () => {
610
+ const updatedMessage = channel.state.findMessage(message.id);
611
+ const pendingTasksRows = await BetterSqlite.selectFromTable('pendingTasks');
612
+ const dbMessages = await BetterSqlite.selectFromTable('messages');
613
+ const dbMessage = dbMessages.find((row) => row.id === message.id);
614
+ const storedAttachments = JSON.parse(dbMessage.attachments);
615
+
616
+ expect(updatedMessage.text).toBe(editedText);
617
+ expect(updatedMessage.attachments[0].asset_url).toBe(localUri);
618
+ expect(pendingTasksRows).toHaveLength(0);
619
+ expect(dbMessage.text).toBe(editedText);
620
+ expect(storedAttachments[0].asset_url).toBe(localUri);
621
+ });
622
+ });
623
+ });
624
+
400
625
  describe('pending task execution', () => {
401
626
  it('pending task should be executed after connection is recovered', async () => {
402
627
  const message = channel.state.messages[0];
@@ -1560,10 +1560,56 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
1560
1560
  );
1561
1561
 
1562
1562
  const editMessage: InputMessageInputContextValue['editMessage'] = useStableCallback(
1563
- ({ localMessage, options }) =>
1564
- doUpdateMessageRequest
1565
- ? doUpdateMessageRequest(channel?.cid || '', localMessage, options)
1566
- : client.updateMessage(localMessage, undefined, options),
1563
+ async ({ localMessage, options }) => {
1564
+ if (!channel) {
1565
+ throw new Error('Channel has not been initialized');
1566
+ }
1567
+
1568
+ const cid = channel.cid;
1569
+ const currentMessage = channel.state.findMessage(localMessage.id, localMessage.parent_id);
1570
+ const isFailedMessage =
1571
+ currentMessage?.status === MessageStatusTypes.FAILED ||
1572
+ localMessage.status === MessageStatusTypes.FAILED;
1573
+ const optimisticEditedAt = new Date();
1574
+ const optimisticEditedAtString = optimisticEditedAt.toISOString();
1575
+ const optimisticMessage = {
1576
+ ...currentMessage,
1577
+ ...localMessage,
1578
+ cid,
1579
+ message_text_updated_at: isFailedMessage ? undefined : optimisticEditedAtString,
1580
+ updated_at: optimisticEditedAt,
1581
+ } as unknown as LocalMessage;
1582
+
1583
+ updateMessage(optimisticMessage);
1584
+ threadInstance?.updateParentMessageOrReplyLocally(
1585
+ optimisticMessage as unknown as MessageResponse,
1586
+ );
1587
+ client.offlineDb?.executeQuerySafely(
1588
+ (db) =>
1589
+ db.updateMessage({
1590
+ message: { ...optimisticMessage, cid },
1591
+ }),
1592
+ { method: 'updateMessage' },
1593
+ );
1594
+
1595
+ const response = doUpdateMessageRequest
1596
+ ? await doUpdateMessageRequest(cid, localMessage, options)
1597
+ : await client.updateMessage(localMessage, undefined, options);
1598
+
1599
+ if (response?.message) {
1600
+ updateMessage(response.message);
1601
+ threadInstance?.updateParentMessageOrReplyLocally(response.message);
1602
+ client.offlineDb?.executeQuerySafely(
1603
+ (db) =>
1604
+ db.updateMessage({
1605
+ message: { ...response.message, cid },
1606
+ }),
1607
+ { method: 'updateMessage' },
1608
+ );
1609
+ }
1610
+
1611
+ return response;
1612
+ },
1567
1613
  );
1568
1614
 
1569
1615
  /**
@@ -67,6 +67,8 @@ export class OfflineDB extends AbstractOfflineDB {
67
67
 
68
68
  addPendingTask = api.addPendingTask;
69
69
 
70
+ updatePendingTask = api.updatePendingTask;
71
+
70
72
  deletePendingTask = api.deletePendingTask;
71
73
 
72
74
  deleteReaction = api.deleteReaction;
@@ -0,0 +1,66 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+
3
+ import { addPendingTask, getPendingTasks, updatePendingTask } from '..';
4
+ import { generateMessage } from '../../../mock-builders/generator/message';
5
+ import { BetterSqlite } from '../../../test-utils/BetterSqlite';
6
+ import { SqliteClient } from '../../SqliteClient';
7
+
8
+ describe('updatePendingTask', () => {
9
+ beforeEach(async () => {
10
+ await SqliteClient.initializeDatabase();
11
+ await BetterSqlite.openDB();
12
+ });
13
+
14
+ afterEach(() => {
15
+ BetterSqlite.dropAllTables();
16
+ BetterSqlite.closeDB();
17
+ jest.clearAllMocks();
18
+ });
19
+
20
+ it('should replace an existing pending task row by id without changing its createdAt ordering', async () => {
21
+ const channelId = uuidv4();
22
+ const originalMessage = generateMessage({
23
+ cid: `messaging:${channelId}`,
24
+ id: uuidv4(),
25
+ text: 'original text',
26
+ });
27
+
28
+ await addPendingTask({
29
+ channelId,
30
+ channelType: 'messaging',
31
+ messageId: originalMessage.id,
32
+ payload: [originalMessage, {}],
33
+ type: 'send-message',
34
+ });
35
+
36
+ const [originalRow] = await BetterSqlite.selectFromTable('pendingTasks');
37
+ const [originalTask] = await getPendingTasks({ messageId: originalMessage.id });
38
+
39
+ const editedMessage = {
40
+ ...originalMessage,
41
+ text: 'edited text',
42
+ };
43
+
44
+ await updatePendingTask({
45
+ id: originalTask.id,
46
+ task: {
47
+ channelId,
48
+ channelType: 'messaging',
49
+ messageId: originalMessage.id,
50
+ payload: [editedMessage, {}],
51
+ type: 'send-message',
52
+ },
53
+ });
54
+
55
+ const [updatedRow] = await BetterSqlite.selectFromTable('pendingTasks');
56
+ const [updatedTask] = await getPendingTasks({ messageId: originalMessage.id });
57
+
58
+ expect(updatedRow.id).toBe(originalRow.id);
59
+ expect(updatedRow.createdAt).toBe(originalRow.createdAt);
60
+ expect(updatedRow.type).toBe('send-message');
61
+ expect(JSON.parse(updatedRow.payload)[0].text).toBe('edited text');
62
+ expect(updatedTask.id).toBe(originalTask.id);
63
+ expect(updatedTask.type).toBe('send-message');
64
+ expect(updatedTask.payload[0].text).toBe('edited text');
65
+ });
66
+ });
@@ -13,6 +13,7 @@ export * from './getLastSyncedAt';
13
13
  export * from './getMembers';
14
14
  export * from './getReads';
15
15
  export * from './updateMessage';
16
+ export * from './updatePendingTask';
16
17
  export * from './updateReaction';
17
18
  export * from './insertReaction';
18
19
  export * from './deleteReaction';
@@ -0,0 +1,24 @@
1
+ import type { DBUpdatePendingTaskType } from 'stream-chat';
2
+
3
+ import { mapTaskToStorable } from '../mappers/mapTaskToStorable';
4
+ import { createUpdateQuery } from '../sqlite-utils/createUpdateQuery';
5
+ import { SqliteClient } from '../SqliteClient';
6
+
7
+ export const updatePendingTask = async ({ id, task }: DBUpdatePendingTaskType) => {
8
+ const storableTask = mapTaskToStorable(task);
9
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
+ const { createdAt, id: taskId, ...nextTask } = storableTask;
11
+
12
+ const query = createUpdateQuery('pendingTasks', nextTask, {
13
+ id,
14
+ });
15
+
16
+ SqliteClient.logger?.('info', 'updatePendingTask', {
17
+ id,
18
+ task: nextTask,
19
+ });
20
+
21
+ await SqliteClient.executeSql.apply(null, query);
22
+
23
+ return [query];
24
+ };
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "9.0.0-beta.13"
2
+ "version": "9.0.0-beta.15"
3
3
  }