@planningcenter/chat-react-native 3.6.0-rc.0 → 3.6.0-rc.1
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/build/hooks/use_conversation_messages.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages.js +3 -1
- package/build/hooks/use_conversation_messages.js.map +1 -1
- package/package.json +3 -2
- package/src/__tests__/hooks/use_conversation_messages.ts +59 -0
- package/src/hooks/use_conversation_messages.ts +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_conversation_messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAEL,wBAAwB,EAEzB,MAAM,oBAAoB,CAAA;AAE3B,eAAO,MAAM,uBAAuB,wBACb;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,SACzC,wBAAwB;;;;;;
|
|
1
|
+
{"version":3,"file":"use_conversation_messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAEL,wBAAwB,EAEzB,MAAM,oBAAoB,CAAA;AAE3B,eAAO,MAAM,uBAAuB,wBACb;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,SACzC,wBAAwB;;;;;;CAkBhC,CAAA;AAED,eAAO,MAAM,sBAAsB,wBAAyB;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;CAoBrF,CAAA;AAEF,eAAO,MAAM,mBAAmB,wBAAyB;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,iDAGnF,CAAA"}
|
|
@@ -3,7 +3,9 @@ import { getRequestQueryKey, useSuspensePaginator, } from './use_suspense_api';
|
|
|
3
3
|
export const useConversationMessages = ({ conversation_id }, opts) => {
|
|
4
4
|
const { data, refetch, isRefetching, fetchNextPage } = useSuspensePaginator(getMessagesRequestArgs({ conversation_id }), opts);
|
|
5
5
|
const queryKey = getMessagesQueryKey({ conversation_id });
|
|
6
|
-
const messages = useMemo(() => data
|
|
6
|
+
const messages = useMemo(() => data
|
|
7
|
+
.filter(message => !message.deletedAt && (message.attachments?.length || message.text?.length))
|
|
8
|
+
.sort((a, b) => -a.id.localeCompare(b.id)), [data]);
|
|
7
9
|
return { messages, refetch, isRefetching, fetchNextPage, queryKey };
|
|
8
10
|
};
|
|
9
11
|
export const getMessagesRequestArgs = ({ conversation_id }) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_conversation_messages.js","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EACL,kBAAkB,EAElB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,EAAE,eAAe,EAA+B,EAChD,IAA+B,EAC/B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,oBAAoB,CACzE,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC,EAC3C,IAAI,CACL,CAAA;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"use_conversation_messages.js","sourceRoot":"","sources":["../../src/hooks/use_conversation_messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EACL,kBAAkB,EAElB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,EAAE,eAAe,EAA+B,EAChD,IAA+B,EAC/B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,oBAAoB,CACzE,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC,EAC3C,IAAI,CACL,CAAA;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CACH,IAAI;SACD,MAAM,CACL,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CACvF;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9C,CAAC,IAAI,CAAC,CACP,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAA;AACrE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EAAE,eAAe,EAA+B,EAAE,EAAE,CAAC,CAAC;IAC3F,GAAG,EAAE,qBAAqB,eAAe,WAAW;IACpD,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE;QACX,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,MAAM;gBACN,gBAAgB;gBAChB,MAAM;gBACN,aAAa;gBACb,YAAY;gBACZ,YAAY;gBACZ,QAAQ;gBACR,iBAAiB;aAClB;YACD,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC;SACtE;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACvC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,eAAe,EAA+B,EAAE,EAAE;IACtF,MAAM,WAAW,GAAG,sBAAsB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IAC/D,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAA;AACxC,CAAC,CAAA","sourcesContent":["import { useMemo } from 'react'\nimport { MessageResource } from '../types'\nimport {\n getRequestQueryKey,\n SuspensePaginatorOptions,\n useSuspensePaginator,\n} from './use_suspense_api'\n\nexport const useConversationMessages = (\n { conversation_id }: { conversation_id: number },\n opts?: SuspensePaginatorOptions\n) => {\n const { data, refetch, isRefetching, fetchNextPage } = useSuspensePaginator<MessageResource>(\n getMessagesRequestArgs({ conversation_id }),\n opts\n )\n const queryKey = getMessagesQueryKey({ conversation_id })\n const messages = useMemo(\n () =>\n data\n .filter(\n message => !message.deletedAt && (message.attachments?.length || message.text?.length)\n )\n .sort((a, b) => -a.id.localeCompare(b.id)),\n [data]\n )\n\n return { messages, refetch, isRefetching, fetchNextPage, queryKey }\n}\n\nexport const getMessagesRequestArgs = ({ conversation_id }: { conversation_id: number }) => ({\n url: `/me/conversations/${conversation_id}/messages`,\n data: {\n perPage: 25,\n fields: {\n Message: [\n 'text',\n 'text_edited_at',\n 'mine',\n 'attachments',\n 'created_at',\n 'deleted_at',\n 'author',\n 'reaction_counts',\n ],\n Person: ['name', 'avatar'],\n ReactionCount: ['value', 'count', 'mine', 'message_id', 'author_ids'],\n },\n include: ['author', 'reaction_counts'],\n },\n})\n\nexport const getMessagesQueryKey = ({ conversation_id }: { conversation_id: number }) => {\n const requestArgs = getMessagesRequestArgs({ conversation_id })\n return getRequestQueryKey(requestArgs)\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "3.6.0-rc.
|
|
3
|
+
"version": "3.6.0-rc.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@react-native/eslint-config": "^0.79.2",
|
|
50
|
+
"@testing-library/react-hooks": "^8.0.1",
|
|
50
51
|
"@types/jest": "^29.5.14",
|
|
51
52
|
"@typescript-eslint/parser": "^8.32.0",
|
|
52
53
|
"expo-module-scripts": "^4.1.6",
|
|
@@ -54,5 +55,5 @@
|
|
|
54
55
|
"prettier": "^3.4.2",
|
|
55
56
|
"typescript": "<5.6.0"
|
|
56
57
|
},
|
|
57
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "2086ceda5d9c58e73b8497a3c8d371146c297cd1"
|
|
58
59
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { renderHook } from '@testing-library/react-hooks'
|
|
2
|
+
import * as useSuspenseApi from '../../hooks/use_suspense_api'
|
|
3
|
+
import {
|
|
4
|
+
getMessagesQueryKey,
|
|
5
|
+
getMessagesRequestArgs,
|
|
6
|
+
useConversationMessages,
|
|
7
|
+
} from '../../hooks/use_conversation_messages'
|
|
8
|
+
|
|
9
|
+
const mockMessages = [
|
|
10
|
+
{
|
|
11
|
+
id: '1',
|
|
12
|
+
text: 'Hello',
|
|
13
|
+
deletedAt: null,
|
|
14
|
+
attachments: [],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: '2',
|
|
18
|
+
text: '',
|
|
19
|
+
deletedAt: null,
|
|
20
|
+
attachments: [{ id: 'a1' }],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: '3',
|
|
24
|
+
text: '',
|
|
25
|
+
deletedAt: '2024-01-01',
|
|
26
|
+
attachments: [],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: '4',
|
|
30
|
+
text: '',
|
|
31
|
+
deletedAt: null,
|
|
32
|
+
attachments: [],
|
|
33
|
+
},
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
describe('useConversationMessages', () => {
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
jest.spyOn(useSuspenseApi, 'useSuspensePaginator').mockReturnValue({
|
|
39
|
+
data: mockMessages,
|
|
40
|
+
refetch: jest.fn(),
|
|
41
|
+
isRefetching: false,
|
|
42
|
+
fetchNextPage: jest.fn(),
|
|
43
|
+
} as any)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
jest.restoreAllMocks()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('filters out empty or deleted messages and sorts by id descending', () => {
|
|
51
|
+
const { result } = renderHook(() => useConversationMessages({ conversation_id: 123 }))
|
|
52
|
+
expect(result.current.messages).toEqual([
|
|
53
|
+
mockMessages[1], // id: '2'
|
|
54
|
+
mockMessages[0], // id: '1'
|
|
55
|
+
])
|
|
56
|
+
// id: '3' is deleted and filtered out
|
|
57
|
+
// id: '4' is filtered out because it has no text or attachments
|
|
58
|
+
})
|
|
59
|
+
})
|
|
@@ -16,7 +16,12 @@ export const useConversationMessages = (
|
|
|
16
16
|
)
|
|
17
17
|
const queryKey = getMessagesQueryKey({ conversation_id })
|
|
18
18
|
const messages = useMemo(
|
|
19
|
-
() =>
|
|
19
|
+
() =>
|
|
20
|
+
data
|
|
21
|
+
.filter(
|
|
22
|
+
message => !message.deletedAt && (message.attachments?.length || message.text?.length)
|
|
23
|
+
)
|
|
24
|
+
.sort((a, b) => -a.id.localeCompare(b.id)),
|
|
20
25
|
[data]
|
|
21
26
|
)
|
|
22
27
|
|