@planningcenter/chat-react-native 3.39.0-rc.0 → 3.39.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.
Files changed (36) hide show
  1. package/build/hooks/direct_messages/use_direct_message_affiliations.d.ts +5 -0
  2. package/build/hooks/direct_messages/use_direct_message_affiliations.d.ts.map +1 -0
  3. package/build/hooks/direct_messages/use_direct_message_affiliations.js +20 -0
  4. package/build/hooks/direct_messages/use_direct_message_affiliations.js.map +1 -0
  5. package/build/hooks/direct_messages/use_direct_message_candidates.d.ts +4 -0
  6. package/build/hooks/direct_messages/use_direct_message_candidates.d.ts.map +1 -0
  7. package/build/hooks/direct_messages/use_direct_message_candidates.js +27 -0
  8. package/build/hooks/direct_messages/use_direct_message_candidates.js.map +1 -0
  9. package/build/hooks/direct_messages/use_direct_message_conversation_validate.d.ts +11 -0
  10. package/build/hooks/direct_messages/use_direct_message_conversation_validate.d.ts.map +1 -0
  11. package/build/hooks/direct_messages/use_direct_message_conversation_validate.js +25 -0
  12. package/build/hooks/direct_messages/use_direct_message_conversation_validate.js.map +1 -0
  13. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.d.ts +13 -0
  14. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.d.ts.map +1 -0
  15. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js +51 -0
  16. package/build/hooks/direct_messages/use_find_or_create_direct_message_conversation.js.map +1 -0
  17. package/build/types/resources/direct_message_affiliations.d.ts +8 -0
  18. package/build/types/resources/direct_message_affiliations.d.ts.map +1 -0
  19. package/build/types/resources/direct_message_affiliations.js +2 -0
  20. package/build/types/resources/direct_message_affiliations.js.map +1 -0
  21. package/build/types/resources/direct_message_candidate.d.ts +12 -0
  22. package/build/types/resources/direct_message_candidate.d.ts.map +1 -0
  23. package/build/types/resources/direct_message_candidate.js +2 -0
  24. package/build/types/resources/direct_message_candidate.js.map +1 -0
  25. package/build/types/resources/index.d.ts +2 -0
  26. package/build/types/resources/index.d.ts.map +1 -1
  27. package/build/types/resources/index.js +2 -0
  28. package/build/types/resources/index.js.map +1 -1
  29. package/package.json +2 -2
  30. package/src/hooks/direct_messages/use_direct_message_affiliations.ts +39 -0
  31. package/src/hooks/direct_messages/use_direct_message_candidates.ts +30 -0
  32. package/src/hooks/direct_messages/use_direct_message_conversation_validate.ts +35 -0
  33. package/src/hooks/direct_messages/use_find_or_create_direct_message_conversation.ts +66 -0
  34. package/src/types/resources/direct_message_affiliations.ts +8 -0
  35. package/src/types/resources/direct_message_candidate.ts +12 -0
  36. package/src/types/resources/index.ts +2 -0
@@ -0,0 +1,5 @@
1
+ export declare function useDirectMessageAffiliations(): {
2
+ groups: Map<number, string>;
3
+ teams: Map<number, string>;
4
+ };
5
+ //# sourceMappingURL=use_direct_message_affiliations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_affiliations.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_affiliations.ts"],"names":[],"mappings":"AAMA,wBAAgB,4BAA4B;;;EAgC3C"}
@@ -0,0 +1,20 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useMemo } from 'react';
3
+ import { useApiClient } from '../use_api_client';
4
+ export function useDirectMessageAffiliations() {
5
+ const apiClient = useApiClient();
6
+ const { data } = useQuery({
7
+ queryKey: ['chat', '/me/direct_message_affiliations'],
8
+ queryFn: () => apiClient.chat.get({
9
+ url: '/me/direct_message_affiliations',
10
+ data: {
11
+ fields: { DirectMessageAffiliations: ['groups', 'teams'] },
12
+ },
13
+ }),
14
+ staleTime: 5 * 60 * 1000,
15
+ });
16
+ const groups = useMemo(() => new Map(Object.entries(data?.data?.groups ?? {}).map(([id, name]) => [+id, name])), [data]);
17
+ const teams = useMemo(() => new Map(Object.entries(data?.data?.teams ?? {}).map(([id, name]) => [+id, name])), [data]);
18
+ return { groups, teams };
19
+ }
20
+ //# sourceMappingURL=use_direct_message_affiliations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_affiliations.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_affiliations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,UAAU,4BAA4B;IAC1C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,iCAAiC,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,GAAG,EAAE,iCAAiC;YACtC,IAAI,EAAE;gBACJ,MAAM,EAAE,EAAE,yBAAyB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;aAC3D;SACF,CAA4D;QAC/D,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;KACzB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,IAAI,GAAG,CACL,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAC1E,EACH,CAAC,IAAI,CAAC,CACP,CAAA;IAED,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CACH,IAAI,GAAG,CACL,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CACzE,EACH,CAAC,IAAI,CAAC,CACP,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { ApiResource } from '../../types'\nimport { DirectMessageAffiliationsResource } from '../../types/resources/direct_message_affiliations'\nimport { useApiClient } from '../use_api_client'\n\nexport function useDirectMessageAffiliations() {\n const apiClient = useApiClient()\n\n const { data } = useQuery({\n queryKey: ['chat', '/me/direct_message_affiliations'],\n queryFn: () =>\n apiClient.chat.get({\n url: '/me/direct_message_affiliations',\n data: {\n fields: { DirectMessageAffiliations: ['groups', 'teams'] },\n },\n }) as Promise<ApiResource<DirectMessageAffiliationsResource>>,\n staleTime: 5 * 60 * 1000,\n })\n\n const groups = useMemo(\n () =>\n new Map<number, string>(\n Object.entries(data?.data?.groups ?? {}).map(([id, name]) => [+id, name])\n ),\n [data]\n )\n\n const teams = useMemo(\n () =>\n new Map<number, string>(\n Object.entries(data?.data?.teams ?? {}).map(([id, name]) => [+id, name])\n ),\n [data]\n )\n\n return { groups, teams }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { ApiCollection } from '../../types';
2
+ import { DirectMessageCandidateResource } from '../../types/resources/direct_message_candidate';
3
+ export declare function useDirectMessageCandidates(term: string): import("@tanstack/react-query").UseQueryResult<ApiCollection<DirectMessageCandidateResource>, Error>;
4
+ //# sourceMappingURL=use_direct_message_candidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_candidates.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_candidates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,gDAAgD,CAAA;AAG/F,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,wGAwBtD"}
@@ -0,0 +1,27 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useApiClient } from '../use_api_client';
3
+ export function useDirectMessageCandidates(term) {
4
+ const apiClient = useApiClient();
5
+ return useQuery({
6
+ queryKey: ['chat', '/me/direct_message_candidates', term],
7
+ queryFn: () => apiClient.chat.get({
8
+ url: '/me/direct_message_candidates',
9
+ data: {
10
+ q: term,
11
+ fields: {
12
+ DirectMessageCandidate: [
13
+ 'name',
14
+ 'avatar',
15
+ 'groups',
16
+ 'teams',
17
+ 'under_18',
18
+ 'direct_messages_disabled',
19
+ ],
20
+ },
21
+ },
22
+ }),
23
+ enabled: term.length >= 1,
24
+ staleTime: 1000 * 60,
25
+ });
26
+ }
27
+ //# sourceMappingURL=use_direct_message_candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_candidates.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,CAAC,MAAM,EAAE,+BAA+B,EAAE,IAAI,CAAC;QACzD,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,GAAG,EAAE,+BAA+B;YACpC,IAAI,EAAE;gBACJ,CAAC,EAAE,IAAI;gBACP,MAAM,EAAE;oBACN,sBAAsB,EAAE;wBACtB,MAAM;wBACN,QAAQ;wBACR,QAAQ;wBACR,OAAO;wBACP,UAAU;wBACV,0BAA0B;qBAC3B;iBACF;aACF;SACF,CAA2D;QAC9D,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;QACzB,SAAS,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiCollection } from '../../types'\nimport { DirectMessageCandidateResource } from '../../types/resources/direct_message_candidate'\nimport { useApiClient } from '../use_api_client'\n\nexport function useDirectMessageCandidates(term: string) {\n const apiClient = useApiClient()\n return useQuery({\n queryKey: ['chat', '/me/direct_message_candidates', term],\n queryFn: () =>\n apiClient.chat.get({\n url: '/me/direct_message_candidates',\n data: {\n q: term,\n fields: {\n DirectMessageCandidate: [\n 'name',\n 'avatar',\n 'groups',\n 'teams',\n 'under_18',\n 'direct_messages_disabled',\n ],\n },\n },\n }) as Promise<ApiCollection<DirectMessageCandidateResource>>,\n enabled: term.length >= 1,\n staleTime: 1000 * 60,\n })\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { ConversationWarning } from '../../types';
2
+ interface Props {
3
+ recipientIds: string[];
4
+ enabled?: boolean;
5
+ }
6
+ export declare function useDirectMessageConversationValidate({ recipientIds, enabled }: Props): {
7
+ warnings: ConversationWarning[];
8
+ validationPending: boolean;
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=use_direct_message_conversation_validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_conversation_validate.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_conversation_validate.ts"],"names":[],"mappings":"AACA,OAAO,EAA6C,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAG5F,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,oCAAoC,CAAC,EAAE,YAAY,EAAE,OAAc,EAAE,EAAE,KAAK;;;EAyB3F"}
@@ -0,0 +1,25 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useApiClient } from '../use_api_client';
3
+ export function useDirectMessageConversationValidate({ recipientIds, enabled = true }) {
4
+ const apiClient = useApiClient();
5
+ const { data, isLoading } = useQuery({
6
+ queryKey: ['chat', '/me/conversation_validate', { recipient_ids: recipientIds }],
7
+ queryFn: () => apiClient.chat.post({
8
+ url: '/me/conversation_validate',
9
+ data: {
10
+ data: {
11
+ type: 'ConversationValidate',
12
+ attributes: { recipient_ids: recipientIds },
13
+ },
14
+ },
15
+ }),
16
+ enabled: enabled && recipientIds.length > 0,
17
+ retry: false,
18
+ });
19
+ const warnings = data?.data.warnings ?? [];
20
+ return {
21
+ warnings,
22
+ validationPending: enabled && recipientIds.length > 0 && isLoading,
23
+ };
24
+ }
25
+ //# sourceMappingURL=use_direct_message_conversation_validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_direct_message_conversation_validate.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_direct_message_conversation_validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAOhD,MAAM,UAAU,oCAAoC,CAAC,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,EAAS;IAC1F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,2BAA2B,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QAChF,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,IAAI,CAAC,IAAI,CAA4C;YAC7D,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE;gBACJ,IAAI,EAAE;oBACJ,IAAI,EAAE,sBAAsB;oBAC5B,UAAU,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE;iBAC5C;aACF;SACF,CAAC;QACJ,OAAO,EAAE,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAC3C,KAAK,EAAE,KAAK;KACb,CAAC,CAAA;IAEF,MAAM,QAAQ,GAA0B,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;IAEjE,OAAO;QACL,QAAQ;QACR,iBAAiB,EAAE,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS;KACnE,CAAA;AACH,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { ApiResource, ConversationValidateResource, ConversationWarning } from '../../types'\nimport { useApiClient } from '../use_api_client'\n\ninterface Props {\n recipientIds: string[]\n enabled?: boolean\n}\n\nexport function useDirectMessageConversationValidate({ recipientIds, enabled = true }: Props) {\n const apiClient = useApiClient()\n\n const { data, isLoading } = useQuery({\n queryKey: ['chat', '/me/conversation_validate', { recipient_ids: recipientIds }],\n queryFn: () =>\n apiClient.chat.post<ApiResource<ConversationValidateResource>>({\n url: '/me/conversation_validate',\n data: {\n data: {\n type: 'ConversationValidate',\n attributes: { recipient_ids: recipientIds },\n },\n },\n }),\n enabled: enabled && recipientIds.length > 0,\n retry: false,\n })\n\n const warnings: ConversationWarning[] = data?.data.warnings ?? []\n\n return {\n warnings,\n validationPending: enabled && recipientIds.length > 0 && isLoading,\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { ConversationResource } from '../../types';
2
+ interface Props {
3
+ recipientIds: string[];
4
+ onSuccess: (conversationId: ConversationResource['id']) => void;
5
+ }
6
+ export declare function useFindOrCreateDirectMessageConversation({ recipientIds, onSuccess }: Props): {
7
+ findOrCreateConversation: (participantIds: string[]) => Promise<void>;
8
+ directMessageExists: boolean;
9
+ isFinding: boolean;
10
+ isError: boolean;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=use_find_or_create_direct_message_conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_find_or_create_direct_message_conversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_find_or_create_direct_message_conversation.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAwB9E,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,CAAC,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;CAChE;AAED,wBAAgB,wCAAwC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,KAAK;+CAchE,MAAM,EAAE;;;;EAoBlC"}
@@ -0,0 +1,51 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useState, useCallback } from 'react';
3
+ import { useApiClient } from '../use_api_client';
4
+ const findDirectMessageConversation = (apiClient, participantIds) => apiClient.chat.get({
5
+ url: '/me/conversations',
6
+ data: {
7
+ fields: { Conversation: ['title'] },
8
+ filter: 'with_exact_direct_message_participants',
9
+ participant_ids: participantIds.join(','),
10
+ },
11
+ });
12
+ const createDirectMessageConversation = (apiClient, ids) => apiClient.chat.post({
13
+ url: '/me/direct_messages',
14
+ data: {
15
+ data: {
16
+ type: 'DirectMessage',
17
+ attributes: { recipients: ids },
18
+ },
19
+ },
20
+ });
21
+ export function useFindOrCreateDirectMessageConversation({ recipientIds, onSuccess }) {
22
+ const apiClient = useApiClient();
23
+ const [isFinding, setIsFinding] = useState(false);
24
+ const [isError, setIsError] = useState(false);
25
+ const { data } = useQuery({
26
+ queryKey: ['chat', '/me/conversations', 'with_exact_direct_message_participants', recipientIds],
27
+ queryFn: () => findDirectMessageConversation(apiClient, recipientIds),
28
+ enabled: recipientIds.length > 0,
29
+ });
30
+ const directMessageExists = (data?.data.length ?? 0) > 0;
31
+ const findOrCreateConversation = useCallback(async (participantIds) => {
32
+ setIsFinding(true);
33
+ setIsError(false);
34
+ try {
35
+ const findResponse = await findDirectMessageConversation(apiClient, participantIds);
36
+ if (findResponse.data.length > 0) {
37
+ onSuccess(findResponse.data[0].id);
38
+ }
39
+ else {
40
+ const createResponse = await createDirectMessageConversation(apiClient, participantIds);
41
+ onSuccess(createResponse.data.id);
42
+ }
43
+ }
44
+ catch {
45
+ setIsError(true);
46
+ setIsFinding(false);
47
+ }
48
+ }, [apiClient, onSuccess]);
49
+ return { findOrCreateConversation, directMessageExists, isFinding, isError };
50
+ }
51
+ //# sourceMappingURL=use_find_or_create_direct_message_conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_find_or_create_direct_message_conversation.js","sourceRoot":"","sources":["../../../src/hooks/direct_messages/use_find_or_create_direct_message_conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAE7C,OAAO,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE3D,MAAM,6BAA6B,GAAG,CAAC,SAAoB,EAAE,cAAwB,EAAE,EAAE,CACvF,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IACjB,GAAG,EAAE,mBAAmB;IACxB,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE;QACnC,MAAM,EAAE,wCAAwC;QAChD,eAAe,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;KAC1C;CACF,CAAiD,CAAA;AAEpD,MAAM,+BAA+B,GAAG,CAAC,SAAoB,EAAE,GAAa,EAAE,EAAE,CAC9E,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAClB,GAAG,EAAE,qBAAqB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,IAAI,EAAE,eAAe;YACrB,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;SAChC;KACF;CACF,CAA+C,CAAA;AAOlD,MAAM,UAAU,wCAAwC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAS;IACzF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,wCAAwC,EAAE,YAAY,CAAC;QAC/F,OAAO,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,SAAS,EAAE,YAAY,CAAC;QACrE,OAAO,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;KACjC,CAAC,CAAA;IAEF,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAExD,MAAM,wBAAwB,GAAG,WAAW,CAC1C,KAAK,EAAE,cAAwB,EAAE,EAAE;QACjC,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,UAAU,CAAC,KAAK,CAAC,CAAA;QACjB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,6BAA6B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;YACnF,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,MAAM,+BAA+B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;gBACvF,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAA;IAED,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC9E,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { useState, useCallback } from 'react'\nimport { ApiCollection, ApiResource, ConversationResource } from '../../types'\nimport { ApiClient, useApiClient } from '../use_api_client'\n\nconst findDirectMessageConversation = (apiClient: ApiClient, participantIds: string[]) =>\n apiClient.chat.get({\n url: '/me/conversations',\n data: {\n fields: { Conversation: ['title'] },\n filter: 'with_exact_direct_message_participants',\n participant_ids: participantIds.join(','),\n },\n }) as Promise<ApiCollection<ConversationResource>>\n\nconst createDirectMessageConversation = (apiClient: ApiClient, ids: string[]) =>\n apiClient.chat.post({\n url: '/me/direct_messages',\n data: {\n data: {\n type: 'DirectMessage',\n attributes: { recipients: ids },\n },\n },\n }) as Promise<ApiResource<ConversationResource>>\n\ninterface Props {\n recipientIds: string[]\n onSuccess: (conversationId: ConversationResource['id']) => void\n}\n\nexport function useFindOrCreateDirectMessageConversation({ recipientIds, onSuccess }: Props) {\n const apiClient = useApiClient()\n const [isFinding, setIsFinding] = useState(false)\n const [isError, setIsError] = useState(false)\n\n const { data } = useQuery({\n queryKey: ['chat', '/me/conversations', 'with_exact_direct_message_participants', recipientIds],\n queryFn: () => findDirectMessageConversation(apiClient, recipientIds),\n enabled: recipientIds.length > 0,\n })\n\n const directMessageExists = (data?.data.length ?? 0) > 0\n\n const findOrCreateConversation = useCallback(\n async (participantIds: string[]) => {\n setIsFinding(true)\n setIsError(false)\n try {\n const findResponse = await findDirectMessageConversation(apiClient, participantIds)\n if (findResponse.data.length > 0) {\n onSuccess(findResponse.data[0].id)\n } else {\n const createResponse = await createDirectMessageConversation(apiClient, participantIds)\n onSuccess(createResponse.data.id)\n }\n } catch {\n setIsError(true)\n setIsFinding(false)\n }\n },\n [apiClient, onSuccess]\n )\n\n return { findOrCreateConversation, directMessageExists, isFinding, isError }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { ResourceObject } from '../api_primitives';
2
+ export interface DirectMessageAffiliationsResource extends ResourceObject {
3
+ type: 'DirectMessageAffiliations';
4
+ id: string;
5
+ groups: Record<string, string>;
6
+ teams: Record<string, string>;
7
+ }
8
+ //# sourceMappingURL=direct_message_affiliations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct_message_affiliations.d.ts","sourceRoot":"","sources":["../../../src/types/resources/direct_message_affiliations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,WAAW,iCAAkC,SAAQ,cAAc;IACvE,IAAI,EAAE,2BAA2B,CAAA;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=direct_message_affiliations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct_message_affiliations.js","sourceRoot":"","sources":["../../../src/types/resources/direct_message_affiliations.ts"],"names":[],"mappings":"","sourcesContent":["import { ResourceObject } from '../api_primitives'\n\nexport interface DirectMessageAffiliationsResource extends ResourceObject {\n type: 'DirectMessageAffiliations'\n id: string\n groups: Record<string, string>\n teams: Record<string, string>\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { ResourceObject } from '../api_primitives';
2
+ export interface DirectMessageCandidateResource extends ResourceObject {
3
+ type: 'DirectMessageCandidate';
4
+ id: string;
5
+ name: string;
6
+ avatar: string;
7
+ groups: number[];
8
+ teams: number[];
9
+ under_18: boolean;
10
+ directMessagesDisabled: boolean;
11
+ }
12
+ //# sourceMappingURL=direct_message_candidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct_message_candidate.d.ts","sourceRoot":"","sources":["../../../src/types/resources/direct_message_candidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,WAAW,8BAA+B,SAAQ,cAAc;IACpE,IAAI,EAAE,wBAAwB,CAAA;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,sBAAsB,EAAE,OAAO,CAAA;CAChC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=direct_message_candidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct_message_candidate.js","sourceRoot":"","sources":["../../../src/types/resources/direct_message_candidate.ts"],"names":[],"mappings":"","sourcesContent":["import { ResourceObject } from '../api_primitives'\n\nexport interface DirectMessageCandidateResource extends ResourceObject {\n type: 'DirectMessageCandidate'\n id: string\n name: string\n avatar: string\n groups: number[]\n teams: number[]\n under_18: boolean\n directMessagesDisabled: boolean\n}\n"]}
@@ -1,4 +1,6 @@
1
1
  export * from './analytics_metadata';
2
+ export * from './direct_message_affiliations';
3
+ export * from './direct_message_candidate';
2
4
  export * from './conversation';
3
5
  export * from './conversation_membership';
4
6
  export * from './conversation_validate';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
@@ -1,4 +1,6 @@
1
1
  export * from './analytics_metadata';
2
+ export * from './direct_message_affiliations';
3
+ export * from './direct_message_candidate';
2
4
  export * from './conversation';
3
5
  export * from './conversation_membership';
4
6
  export * from './conversation_validate';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA","sourcesContent":["export * from './analytics_metadata'\nexport * from './conversation'\nexport * from './conversation_membership'\nexport * from './conversation_validate'\nexport * from './member'\nexport * from './message'\nexport * from './oauth_token'\nexport * from './person'\nexport * from './groups'\nexport * from './app_grant'\nexport * from './services'\nexport * from './organization'\nexport * from './group_membership'\nexport * from './group_resource'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/resources/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA","sourcesContent":["export * from './analytics_metadata'\nexport * from './direct_message_affiliations'\nexport * from './direct_message_candidate'\nexport * from './conversation'\nexport * from './conversation_membership'\nexport * from './conversation_validate'\nexport * from './member'\nexport * from './message'\nexport * from './oauth_token'\nexport * from './person'\nexport * from './groups'\nexport * from './app_grant'\nexport * from './services'\nexport * from './organization'\nexport * from './group_membership'\nexport * from './group_resource'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "3.39.0-rc.0",
3
+ "version": "3.39.0-rc.1",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "react-native": "./src/index.tsx",
@@ -72,5 +72,5 @@
72
72
  "react-native-url-polyfill": "^2.0.0",
73
73
  "typescript": "~5.9.2"
74
74
  },
75
- "gitHead": "698101c907dc57af0ca09aa2427328ab23a28431"
75
+ "gitHead": "03a375a045ff2ae572627318c41bfc6cdcf1bc74"
76
76
  }
@@ -0,0 +1,39 @@
1
+ import { useQuery } from '@tanstack/react-query'
2
+ import { useMemo } from 'react'
3
+ import { ApiResource } from '../../types'
4
+ import { DirectMessageAffiliationsResource } from '../../types/resources/direct_message_affiliations'
5
+ import { useApiClient } from '../use_api_client'
6
+
7
+ export function useDirectMessageAffiliations() {
8
+ const apiClient = useApiClient()
9
+
10
+ const { data } = useQuery({
11
+ queryKey: ['chat', '/me/direct_message_affiliations'],
12
+ queryFn: () =>
13
+ apiClient.chat.get({
14
+ url: '/me/direct_message_affiliations',
15
+ data: {
16
+ fields: { DirectMessageAffiliations: ['groups', 'teams'] },
17
+ },
18
+ }) as Promise<ApiResource<DirectMessageAffiliationsResource>>,
19
+ staleTime: 5 * 60 * 1000,
20
+ })
21
+
22
+ const groups = useMemo(
23
+ () =>
24
+ new Map<number, string>(
25
+ Object.entries(data?.data?.groups ?? {}).map(([id, name]) => [+id, name])
26
+ ),
27
+ [data]
28
+ )
29
+
30
+ const teams = useMemo(
31
+ () =>
32
+ new Map<number, string>(
33
+ Object.entries(data?.data?.teams ?? {}).map(([id, name]) => [+id, name])
34
+ ),
35
+ [data]
36
+ )
37
+
38
+ return { groups, teams }
39
+ }
@@ -0,0 +1,30 @@
1
+ import { useQuery } from '@tanstack/react-query'
2
+ import { ApiCollection } from '../../types'
3
+ import { DirectMessageCandidateResource } from '../../types/resources/direct_message_candidate'
4
+ import { useApiClient } from '../use_api_client'
5
+
6
+ export function useDirectMessageCandidates(term: string) {
7
+ const apiClient = useApiClient()
8
+ return useQuery({
9
+ queryKey: ['chat', '/me/direct_message_candidates', term],
10
+ queryFn: () =>
11
+ apiClient.chat.get({
12
+ url: '/me/direct_message_candidates',
13
+ data: {
14
+ q: term,
15
+ fields: {
16
+ DirectMessageCandidate: [
17
+ 'name',
18
+ 'avatar',
19
+ 'groups',
20
+ 'teams',
21
+ 'under_18',
22
+ 'direct_messages_disabled',
23
+ ],
24
+ },
25
+ },
26
+ }) as Promise<ApiCollection<DirectMessageCandidateResource>>,
27
+ enabled: term.length >= 1,
28
+ staleTime: 1000 * 60,
29
+ })
30
+ }
@@ -0,0 +1,35 @@
1
+ import { useQuery } from '@tanstack/react-query'
2
+ import { ApiResource, ConversationValidateResource, ConversationWarning } from '../../types'
3
+ import { useApiClient } from '../use_api_client'
4
+
5
+ interface Props {
6
+ recipientIds: string[]
7
+ enabled?: boolean
8
+ }
9
+
10
+ export function useDirectMessageConversationValidate({ recipientIds, enabled = true }: Props) {
11
+ const apiClient = useApiClient()
12
+
13
+ const { data, isLoading } = useQuery({
14
+ queryKey: ['chat', '/me/conversation_validate', { recipient_ids: recipientIds }],
15
+ queryFn: () =>
16
+ apiClient.chat.post<ApiResource<ConversationValidateResource>>({
17
+ url: '/me/conversation_validate',
18
+ data: {
19
+ data: {
20
+ type: 'ConversationValidate',
21
+ attributes: { recipient_ids: recipientIds },
22
+ },
23
+ },
24
+ }),
25
+ enabled: enabled && recipientIds.length > 0,
26
+ retry: false,
27
+ })
28
+
29
+ const warnings: ConversationWarning[] = data?.data.warnings ?? []
30
+
31
+ return {
32
+ warnings,
33
+ validationPending: enabled && recipientIds.length > 0 && isLoading,
34
+ }
35
+ }
@@ -0,0 +1,66 @@
1
+ import { useQuery } from '@tanstack/react-query'
2
+ import { useState, useCallback } from 'react'
3
+ import { ApiCollection, ApiResource, ConversationResource } from '../../types'
4
+ import { ApiClient, useApiClient } from '../use_api_client'
5
+
6
+ const findDirectMessageConversation = (apiClient: ApiClient, participantIds: string[]) =>
7
+ apiClient.chat.get({
8
+ url: '/me/conversations',
9
+ data: {
10
+ fields: { Conversation: ['title'] },
11
+ filter: 'with_exact_direct_message_participants',
12
+ participant_ids: participantIds.join(','),
13
+ },
14
+ }) as Promise<ApiCollection<ConversationResource>>
15
+
16
+ const createDirectMessageConversation = (apiClient: ApiClient, ids: string[]) =>
17
+ apiClient.chat.post({
18
+ url: '/me/direct_messages',
19
+ data: {
20
+ data: {
21
+ type: 'DirectMessage',
22
+ attributes: { recipients: ids },
23
+ },
24
+ },
25
+ }) as Promise<ApiResource<ConversationResource>>
26
+
27
+ interface Props {
28
+ recipientIds: string[]
29
+ onSuccess: (conversationId: ConversationResource['id']) => void
30
+ }
31
+
32
+ export function useFindOrCreateDirectMessageConversation({ recipientIds, onSuccess }: Props) {
33
+ const apiClient = useApiClient()
34
+ const [isFinding, setIsFinding] = useState(false)
35
+ const [isError, setIsError] = useState(false)
36
+
37
+ const { data } = useQuery({
38
+ queryKey: ['chat', '/me/conversations', 'with_exact_direct_message_participants', recipientIds],
39
+ queryFn: () => findDirectMessageConversation(apiClient, recipientIds),
40
+ enabled: recipientIds.length > 0,
41
+ })
42
+
43
+ const directMessageExists = (data?.data.length ?? 0) > 0
44
+
45
+ const findOrCreateConversation = useCallback(
46
+ async (participantIds: string[]) => {
47
+ setIsFinding(true)
48
+ setIsError(false)
49
+ try {
50
+ const findResponse = await findDirectMessageConversation(apiClient, participantIds)
51
+ if (findResponse.data.length > 0) {
52
+ onSuccess(findResponse.data[0].id)
53
+ } else {
54
+ const createResponse = await createDirectMessageConversation(apiClient, participantIds)
55
+ onSuccess(createResponse.data.id)
56
+ }
57
+ } catch {
58
+ setIsError(true)
59
+ setIsFinding(false)
60
+ }
61
+ },
62
+ [apiClient, onSuccess]
63
+ )
64
+
65
+ return { findOrCreateConversation, directMessageExists, isFinding, isError }
66
+ }
@@ -0,0 +1,8 @@
1
+ import { ResourceObject } from '../api_primitives'
2
+
3
+ export interface DirectMessageAffiliationsResource extends ResourceObject {
4
+ type: 'DirectMessageAffiliations'
5
+ id: string
6
+ groups: Record<string, string>
7
+ teams: Record<string, string>
8
+ }
@@ -0,0 +1,12 @@
1
+ import { ResourceObject } from '../api_primitives'
2
+
3
+ export interface DirectMessageCandidateResource extends ResourceObject {
4
+ type: 'DirectMessageCandidate'
5
+ id: string
6
+ name: string
7
+ avatar: string
8
+ groups: number[]
9
+ teams: number[]
10
+ under_18: boolean
11
+ directMessagesDisabled: boolean
12
+ }
@@ -1,4 +1,6 @@
1
1
  export * from './analytics_metadata'
2
+ export * from './direct_message_affiliations'
3
+ export * from './direct_message_candidate'
2
4
  export * from './conversation'
3
5
  export * from './conversation_membership'
4
6
  export * from './conversation_validate'