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.
- package/lib/commonjs/components/Channel/Channel.js +62 -17
- package/lib/commonjs/components/Channel/Channel.js.map +1 -1
- package/lib/commonjs/store/OfflineDB.js +1 -0
- package/lib/commonjs/store/OfflineDB.js.map +1 -1
- package/lib/commonjs/store/apis/index.js +11 -0
- package/lib/commonjs/store/apis/index.js.map +1 -1
- package/lib/commonjs/store/apis/updatePendingTask.js +34 -0
- package/lib/commonjs/store/apis/updatePendingTask.js.map +1 -0
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Channel/Channel.js +62 -17
- package/lib/module/components/Channel/Channel.js.map +1 -1
- package/lib/module/store/OfflineDB.js +1 -0
- package/lib/module/store/OfflineDB.js.map +1 -1
- package/lib/module/store/apis/index.js +11 -0
- package/lib/module/store/apis/index.js.map +1 -1
- package/lib/module/store/apis/updatePendingTask.js +34 -0
- package/lib/module/store/apis/updatePendingTask.js.map +1 -0
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
- package/lib/typescript/store/OfflineDB.d.ts +1 -0
- package/lib/typescript/store/OfflineDB.d.ts.map +1 -1
- package/lib/typescript/store/apis/index.d.ts +1 -0
- package/lib/typescript/store/apis/index.d.ts.map +1 -1
- package/lib/typescript/store/apis/updatePendingTask.d.ts +3 -0
- package/lib/typescript/store/apis/updatePendingTask.d.ts.map +1 -0
- package/lib/typescript/store/mappers/mapTaskToStorable.d.ts +9 -0
- package/lib/typescript/store/mappers/mapTaskToStorable.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/offline-support/optimistic-update.js +225 -0
- package/src/components/Channel/Channel.tsx +50 -4
- package/src/store/OfflineDB.ts +2 -0
- package/src/store/apis/__tests__/updatePendingTask.test.ts +66 -0
- package/src/store/apis/index.ts +1 -0
- package/src/store/apis/updatePendingTask.ts +24 -0
- 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":[]}
|
package/lib/module/version.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../../src/components/Channel/Channel.tsx"],"names":[],"mappings":"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
|
|
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;;
|
|
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 @@
|
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
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
|
/**
|
package/src/store/OfflineDB.ts
CHANGED
|
@@ -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
|
+
});
|
package/src/store/apis/index.ts
CHANGED
|
@@ -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