@planningcenter/chat-react-native 3.38.0-rc.8 → 3.38.0-rc.9
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/groups/use_group_chat_conversation_payload.d.ts.map +1 -1
- package/build/hooks/groups/use_group_chat_conversation_payload.js +1 -0
- package/build/hooks/groups/use_group_chat_conversation_payload.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/hooks/use_group_chat_conversation_payload.test.tsx +50 -0
- package/src/hooks/groups/use_group_chat_conversation_payload.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_group_chat_conversation_payload.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKzD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAc,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"use_group_chat_conversation_payload.d.ts","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKzD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAc,EAAE,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBjF;AAED,UAAU,4BAA6B,SAAQ,cAAc;IAC3D,IAAI,EAAE,8BAA8B,CAAA;IACpC,KAAK,EAAE,MAAM,CAAA;CACd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_group_chat_conversation_payload.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,0CAA0C;AAO/E,MAAM,UAAU,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAS;IAChF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,cAAc,OAAO,4BAA4B,CAAA;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAA4C;YAC/D,GAAG;YACH,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,8BAA8B;oBACpC,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC1B;aACF;SACF,CAAC;QACJ,SAAS,EAAE,aAAa;QACxB,OAAO;KACR,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiResource, ResourceObject } from '../../types'\nimport { useApiClient } from '../use_api_client'\n\nconst STALE_TIME_MS = 25 * 60 * 1000 // under Groups' 30-min server-side expiry\n\ninterface Props {\n groupId: number\n enabled?: boolean\n}\n\nexport function useGroupChatConversationPayload({ groupId, enabled = true }: Props) {\n const apiClient = useApiClient()\n const url = `/me/groups/${groupId}/chat_conversation_payload`\n\n const { data, ...rest } = useQuery({\n queryKey: ['groups', url],\n queryFn: () =>\n apiClient.groups.post<ApiResource<GroupChatConversationPayload>>({\n url,\n data: {\n data: {\n type: 'GroupChatConversationPayload',\n attributes: { title: '' },\n },\n },\n }),\n staleTime: STALE_TIME_MS,\n enabled,\n })\n\n return { payload: data?.data.value, ...rest }\n}\n\ninterface GroupChatConversationPayload extends ResourceObject {\n type: 'GroupChatConversationPayload'\n value: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use_group_chat_conversation_payload.js","sourceRoot":"","sources":["../../../src/hooks/groups/use_group_chat_conversation_payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,0CAA0C;AAO/E,MAAM,UAAU,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAS;IAChF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,cAAc,OAAO,4BAA4B,CAAA;IAE7D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;QACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,MAAM,CAAC,IAAI,CAA4C;YAC/D,GAAG;YACH,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,8BAA8B;oBACpC,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC1B;aACF;SACF,CAAC;QACJ,SAAS,EAAE,aAAa;QACxB,cAAc,EAAE,QAAQ;QACxB,OAAO;KACR,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiResource, ResourceObject } from '../../types'\nimport { useApiClient } from '../use_api_client'\n\nconst STALE_TIME_MS = 25 * 60 * 1000 // under Groups' 30-min server-side expiry\n\ninterface Props {\n groupId: number\n enabled?: boolean\n}\n\nexport function useGroupChatConversationPayload({ groupId, enabled = true }: Props) {\n const apiClient = useApiClient()\n const url = `/me/groups/${groupId}/chat_conversation_payload`\n\n const { data, ...rest } = useQuery({\n queryKey: ['groups', url],\n queryFn: () =>\n apiClient.groups.post<ApiResource<GroupChatConversationPayload>>({\n url,\n data: {\n data: {\n type: 'GroupChatConversationPayload',\n attributes: { title: '' },\n },\n },\n }),\n staleTime: STALE_TIME_MS,\n refetchOnMount: 'always',\n enabled,\n })\n\n return { payload: data?.data.value, ...rest }\n}\n\ninterface GroupChatConversationPayload extends ResourceObject {\n type: 'GroupChatConversationPayload'\n value: string\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "3.38.0-rc.
|
|
3
|
+
"version": "3.38.0-rc.9",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"react-native": "./src/index.tsx",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
28
28
|
"@fortawesome/react-native-fontawesome": "^0.3.2",
|
|
29
|
-
"@planningcenter/emoji-keyboard": "3.38.0-rc.
|
|
29
|
+
"@planningcenter/emoji-keyboard": "3.38.0-rc.9",
|
|
30
30
|
"lodash-inflection": "^1.5.0",
|
|
31
31
|
"react-compiler-runtime": "^1.0.0"
|
|
32
32
|
},
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"react-native-url-polyfill": "^2.0.0",
|
|
73
73
|
"typescript": "~5.9.2"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "b823f9b053cad4fbf7e0efafd6e30cc37e16ab80"
|
|
76
76
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { QueryClientProvider } from '@tanstack/react-query'
|
|
2
|
+
import { renderHook, waitFor } from '@testing-library/react-native'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
import { buildTestQueryClient } from '../../__utils__/query_client'
|
|
5
|
+
import { useGroupChatConversationPayload } from '../../hooks/groups/use_group_chat_conversation_payload'
|
|
6
|
+
import * as useApiClientModule from '../../hooks/use_api_client'
|
|
7
|
+
|
|
8
|
+
const mockGroupsPost = (impl: jest.Mock) => {
|
|
9
|
+
jest.spyOn(useApiClientModule, 'useApiClient').mockReturnValue({
|
|
10
|
+
groups: { post: impl },
|
|
11
|
+
} as unknown as ReturnType<typeof useApiClientModule.useApiClient>)
|
|
12
|
+
return impl
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const resolveWith = (value: string) =>
|
|
16
|
+
jest.fn().mockResolvedValue({
|
|
17
|
+
data: { type: 'GroupChatConversationPayload', id: '1', value },
|
|
18
|
+
links: {},
|
|
19
|
+
meta: {},
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
describe('useGroupChatConversationPayload', () => {
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
jest.restoreAllMocks()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('refetches on mount even when a fresh payload is already cached', async () => {
|
|
28
|
+
// Prime the cache as if a payload was fetched moments ago. The hook's 25-min staleTime
|
|
29
|
+
// means the default refetchOnMount would treat this as fresh and skip the request, so a
|
|
30
|
+
// group composition change on web would stay invisible until the cache is dropped (app
|
|
31
|
+
// restart). refetchOnMount: 'always' must override that and refetch on every mount.
|
|
32
|
+
const queryClient = buildTestQueryClient()
|
|
33
|
+
queryClient.setQueryData(['groups', '/me/groups/1/chat_conversation_payload'], {
|
|
34
|
+
data: { type: 'GroupChatConversationPayload', id: '1', value: 'stale' },
|
|
35
|
+
links: {},
|
|
36
|
+
meta: {},
|
|
37
|
+
})
|
|
38
|
+
const post = mockGroupsPost(resolveWith('fresh'))
|
|
39
|
+
const wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
40
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
const { result } = renderHook(() => useGroupChatConversationPayload({ groupId: 1 }), {
|
|
44
|
+
wrapper,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
await waitFor(() => expect(post).toHaveBeenCalledTimes(1))
|
|
48
|
+
await waitFor(() => expect(result.current.payload).toBe('fresh'))
|
|
49
|
+
})
|
|
50
|
+
})
|