diff --git a/ai-docs/ai-migration-v9-to-v10.md b/ai-docs/ai-migration-v9-to-v10.md index 85d53d9067..8792307cc1 100644 --- a/ai-docs/ai-migration-v9-to-v10.md +++ b/ai-docs/ai-migration-v9-to-v10.md @@ -762,8 +762,11 @@ Highlights that hit integrator code: annotation so `client.on('x', cb)` narrows automatically. - **Method signatures collapsed to single objects** — `channel.sendReaction({ id, reaction, ... })`, `deleteReaction({ id, type })`, `sendMessage({ message, ... })`, `queryChannels(request)`; - `client.uploadImage_(uri, name, type)` for RN image upload (the object-form `uploadImage` is - web/server-shaped); the `client` constructor is 1–2 args; `client.listeners` is a `Map`; + `client.uploadImage({ file: { uri, name, type } })` for RN image upload — the `file` field takes + a browser `File`/`Blob` or an RN `{ uri, name, type }` descriptor, so the MIME type still has to + be explicit, it just lives on the descriptor now; the same shape applies to `client.uploadFile` + and `channel.uploadFile` / `channel.uploadImage` (which replace `channel.sendFile` / + `sendImage`); the `client` constructor is 1–2 args; `client.listeners` is a `Map`; `createAbortControllerForNextRequest` moved to `client.api`. - **Sort is `SortParamRequest[]`** — `{ last_message_at: -1 }` → `[{ field: 'last_message_at', direction: -1 }]`. diff --git a/package.json b/package.json index 61e998a893..75259552bd 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "examples/ExpoMessaging" ], "resolutions": { - "stream-chat": "10.0.0-rc.2", + "stream-chat": "10.0.0-rc.4", "@types/react": "^19.2.0" }, "engines": { diff --git a/package/src/hooks/actions/__tests__/useChannelActions.test.tsx b/package/src/hooks/actions/__tests__/useChannelActions.test.tsx index f3cfcddd3c..70e1309992 100644 --- a/package/src/hooks/actions/__tests__/useChannelActions.test.tsx +++ b/package/src/hooks/actions/__tests__/useChannelActions.test.tsx @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle -- the LLC's positional RN image-upload helper is `uploadImage_` */ import React, { PropsWithChildren } from 'react'; import { act, renderHook } from '@testing-library/react-native'; @@ -58,7 +57,7 @@ const createClient = () => ({ muteUser: jest.fn(), unblockUser: jest.fn(), unmuteUser: jest.fn(), - uploadImage_: jest.fn().mockResolvedValue({ file: 'https://cdn.example.com/uploaded.png' }), + uploadImage: jest.fn().mockResolvedValue({ file: 'https://cdn.example.com/uploaded.png' }), userID: 'current-user-id', }); @@ -537,11 +536,9 @@ describe('useChannelActions', () => { await result.current.updateImage(imageFile); }); - expect(client.uploadImage_).toHaveBeenCalledWith( - 'file:///tmp/avatar.png', - 'avatar.png', - 'image/png', - ); + expect(client.uploadImage).toHaveBeenCalledWith({ + file: { name: 'avatar.png', type: 'image/png', uri: 'file:///tmp/avatar.png' }, + }); expect(channel.updatePartial).toHaveBeenCalledWith({ set: { image: 'https://cdn.example.com/uploaded.png' }, }); @@ -558,7 +555,7 @@ describe('useChannelActions', () => { }); }); - it('uses doFileUploadRequest instead of client.uploadImage_ when provided', async () => { + it('uses doFileUploadRequest instead of client.uploadImage when provided', async () => { const client = createClient(); const channel = createChannel(client); const doFileUploadRequest = jest @@ -573,7 +570,7 @@ describe('useChannelActions', () => { }); expect(doFileUploadRequest).toHaveBeenCalledWith(imageFile); - expect(client.uploadImage_).not.toHaveBeenCalled(); + expect(client.uploadImage).not.toHaveBeenCalled(); expect(channel.updatePartial).toHaveBeenCalledWith({ set: { image: 'https://cdn.custom.com/avatar.png' }, }); @@ -582,7 +579,7 @@ describe('useChannelActions', () => { it('notifies and skips channel.updatePartial when uploadImage rejects', async () => { const error = new Error('upload failed'); const client = createClient(); - client.uploadImage_.mockRejectedValueOnce(error); + client.uploadImage.mockRejectedValueOnce(error); const channel = createChannel(client); const { result } = renderHook(() => useChannelActions(channel), { wrapper: createWrapper(client), @@ -620,7 +617,7 @@ describe('useChannelActions', () => { await result.current.updateImage(imageFile); }); - expect(client.uploadImage_).toHaveBeenCalledTimes(1); + expect(client.uploadImage).toHaveBeenCalledTimes(1); expect(client.notifications.add).toHaveBeenCalledWith({ message: 'Failed to update channel image', options: { @@ -646,7 +643,7 @@ describe('useChannelActions', () => { await result.current.updateImage(null); }); - expect(client.uploadImage_).not.toHaveBeenCalled(); + expect(client.uploadImage).not.toHaveBeenCalled(); expect(channel.updatePartial).toHaveBeenCalledWith({ unset: ['image'] }); expect(client.notifications.add).toHaveBeenCalledWith({ message: 'Channel image updated', @@ -674,7 +671,7 @@ describe('useChannelActions', () => { await result.current.updateImage(null); }); - expect(client.uploadImage_).not.toHaveBeenCalled(); + expect(client.uploadImage).not.toHaveBeenCalled(); expect(client.notifications.add).toHaveBeenCalledWith({ message: 'Failed to update channel image', options: { @@ -722,7 +719,7 @@ describe('useChannelActions', () => { }); expect(onSuccess).toHaveBeenCalledTimes(1); - client.uploadImage_.mockRejectedValueOnce(new Error('nope')); + client.uploadImage.mockRejectedValueOnce(new Error('nope')); await act(async () => { await result.current.updateImage(imageFile, { onSuccess }); }); diff --git a/package/src/hooks/actions/useChannelActions.ts b/package/src/hooks/actions/useChannelActions.ts index adf31b6844..c3093a8c72 100644 --- a/package/src/hooks/actions/useChannelActions.ts +++ b/package/src/hooks/actions/useChannelActions.ts @@ -485,8 +485,9 @@ export const useChannelActions = (channel: Channel) => { } else { const { file } = doFileUploadRequest ? await doFileUploadRequest(image) - : // eslint-disable-next-line no-underscore-dangle -- LLC's positional RN image-upload helper - await client.uploadImage_(image.uri, image.name, image.type); + : await client.uploadImage({ + file: { name: image.name, type: image.type, uri: image.uri }, + }); await channel.updatePartial({ set: { image: file } }); } addNotification({ diff --git a/yarn.lock b/yarn.lock index c8390840d6..8b6b28cbf5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6125,16 +6125,6 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.8": - version: 9.0.10 - resolution: "@types/jsonwebtoken@npm:9.0.10" - dependencies: - "@types/ms": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/0688ac8fb75f809201cb7e18a12b9d80ce539cb9dd27e1b01e11807cb1a337059e899b8ee3abc3f2c9417f02e363a3069d9eab9ef9724b1da1f0e10713514f94 - languageName: node - linkType: hard - "@types/linkify-it@npm:5.0.0": version: 5.0.0 resolution: "@types/linkify-it@npm:5.0.0" @@ -6181,13 +6171,6 @@ __metadata: languageName: node linkType: hard -"@types/ms@npm:*": - version: 2.1.0 - resolution: "@types/ms@npm:2.1.0" - checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 - languageName: node - linkType: hard - "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": version: 25.7.0 resolution: "@types/node@npm:25.7.0" @@ -6257,15 +6240,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.18.1": - version: 8.18.1 - resolution: "@types/ws@npm:8.18.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab - languageName: node - linkType: hard - "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -7122,7 +7096,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.16.1": +"axios@npm:^1.19.0": version: 1.19.0 resolution: "axios@npm:1.19.0" dependencies: @@ -7721,13 +7695,6 @@ __metadata: languageName: node linkType: hard -"buffer-equal-constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e - languageName: node - linkType: hard - "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -8916,15 +8883,6 @@ __metadata: languageName: node linkType: hard -"ecdsa-sig-formatter@npm:1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c - languageName: node - linkType: hard - "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -10607,7 +10565,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.5, form-data@npm:^4.0.6": +"form-data@npm:^4.0.6": version: 4.0.6 resolution: "form-data@npm:4.0.6" dependencies: @@ -12188,15 +12146,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: 10c0/a058ac8b5e6efe9e46252cb0bc67fd325005d7216451d1a51238bc62d7da8486f828ef017df54ddf742e0fffcbe4b1bcc2a66cc115b027ed0180334cd18df252 - languageName: node - linkType: hard - "issue-parser@npm:^7.0.0": version: 7.0.1 resolution: "issue-parser@npm:7.0.1" @@ -13129,24 +13078,6 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^9.0.3": - version: 9.0.3 - resolution: "jsonwebtoken@npm:9.0.3" - dependencies: - jws: "npm:^4.0.1" - lodash.includes: "npm:^4.3.0" - lodash.isboolean: "npm:^3.0.3" - lodash.isinteger: "npm:^4.0.4" - lodash.isnumber: "npm:^3.0.3" - lodash.isplainobject: "npm:^4.0.6" - lodash.isstring: "npm:^4.0.1" - lodash.once: "npm:^4.0.0" - ms: "npm:^2.1.1" - semver: "npm:^7.5.4" - checksum: 10c0/6ca7f1e54886ea3bde7146a5a22b53847c46e25453c7f7307a69818b9a6ad48c390b2e59d5690fcfd03c529b01960060cc4bb0c686991d6edae2285dfd30f4ba - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -13173,27 +13104,6 @@ __metadata: languageName: node linkType: hard -"jwa@npm:^2.0.1": - version: 2.0.1 - resolution: "jwa@npm:2.0.1" - dependencies: - buffer-equal-constant-time: "npm:^1.0.1" - ecdsa-sig-formatter: "npm:1.0.11" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ab3ebc6598e10dc11419d4ed675c9ca714a387481466b10e8a6f3f65d8d9c9237e2826f2505280a739cf4cbcf511cb288eeec22b5c9c63286fc5a2e4f97e78cf - languageName: node - linkType: hard - -"jws@npm:^4.0.1": - version: 4.0.1 - resolution: "jws@npm:4.0.1" - dependencies: - jwa: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/6be1ed93023aef570ccc5ea8d162b065840f3ef12f0d1bb3114cade844de7a357d5dc558201d9a65101e70885a6fa56b17462f520e6b0d426195510618a154d0 - languageName: node - linkType: hard - "keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -13607,34 +13517,6 @@ __metadata: languageName: node linkType: hard -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: 10c0/0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7 - languageName: node - linkType: hard - -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 10c0/4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7 - languageName: node - linkType: hard - -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 10c0/2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -13663,13 +13545,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 - languageName: node - linkType: hard - "lodash.throttle@npm:^4.1.1": version: 4.1.1 resolution: "lodash.throttle@npm:4.1.1" @@ -18226,26 +18101,19 @@ __metadata: languageName: unknown linkType: soft -"stream-chat@npm:10.0.0-rc.2": - version: 10.0.0-rc.2 - resolution: "stream-chat@npm:10.0.0-rc.2" +"stream-chat@npm:10.0.0-rc.4": + version: 10.0.0-rc.4 + resolution: "stream-chat@npm:10.0.0-rc.4" dependencies: "@stream-io/logger": "npm:^2.0.0" - "@types/jsonwebtoken": "npm:^9.0.8" - "@types/ws": "npm:^8.18.1" - axios: "npm:^1.16.1" - base64-js: "npm:^1.5.1" - form-data: "npm:^4.0.5" - isomorphic-ws: "npm:^5.0.0" - jsonwebtoken: "npm:^9.0.3" + axios: "npm:^1.19.0" linkifyjs: "npm:^4.3.3" - ws: "npm:^8.20.1" dependenciesMeta: esbuild: built: true husky: built: true - checksum: 10c0/a8ad3570d6820edfec476330674fdb2c96dda28324b7ea6f198e9320a5045eea754afd85f88a8a6702f09cd06dbfc88df9f85262ba0bc588c683fc45083c0d49 + checksum: 10c0/44582f022a84fc4924723316d1ed43961d0cd4044ed8544e92347047ed79066f6f365e772af7f47e4d03ca1678a0dca7a10b59663618c360f62bd4f3658475ab languageName: node linkType: hard @@ -19803,21 +19671,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.20.1": - version: 8.21.3 - resolution: "ws@npm:8.21.3" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/7b28dc2863ea0e2cece68d142a3eee90361021b73f750431e6d8076bb7dede5fdfdb75b3d29534b62f411261147b76b1bc80fb5cc63ab0aabd467280e85b22e0 - languageName: node - linkType: hard - "xcode@npm:^3.0.1": version: 3.0.1 resolution: "xcode@npm:3.0.1"