@droppii-org/chat-mobile 0.2.67 → 0.2.69

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 (79) hide show
  1. package/lib/module/components/GroupItem/index.js +154 -0
  2. package/lib/module/components/GroupItem/index.js.map +1 -0
  3. package/lib/module/core/useChatListener.js +34 -2
  4. package/lib/module/core/useChatListener.js.map +1 -1
  5. package/lib/module/hooks/groups/useFetchPublicGroup.js +39 -0
  6. package/lib/module/hooks/groups/useFetchPublicGroup.js.map +1 -0
  7. package/lib/module/hooks/groups/useJoinGroup.js +42 -0
  8. package/lib/module/hooks/groups/useJoinGroup.js.map +1 -0
  9. package/lib/module/hooks/message/usePinMessage.js +4 -2
  10. package/lib/module/hooks/message/usePinMessage.js.map +1 -1
  11. package/lib/module/hooks/message/useSendMessage.js +7 -12
  12. package/lib/module/hooks/message/useSendMessage.js.map +1 -1
  13. package/lib/module/hooks/query-keys.js +6 -0
  14. package/lib/module/hooks/query-keys.js.map +1 -1
  15. package/lib/module/hooks/useGroupPermission.js +34 -0
  16. package/lib/module/hooks/useGroupPermission.js.map +1 -0
  17. package/lib/module/index.js +1 -1
  18. package/lib/module/index.js.map +1 -1
  19. package/lib/module/screens/SearchConversation/TabResult.js +1 -1
  20. package/lib/module/screens/SearchConversation/TabResult.js.map +1 -1
  21. package/lib/module/screens/chat-detail/ChatComposer.js +35 -14
  22. package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -1
  23. package/lib/module/screens/chat-detail/ChatDetail.js +20 -2
  24. package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -1
  25. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js +5 -0
  26. package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js.map +1 -1
  27. package/lib/module/screens/chat-detail/types.js.map +1 -1
  28. package/lib/module/screens/inbox/CommunityTab.js +55 -0
  29. package/lib/module/screens/inbox/CommunityTab.js.map +1 -0
  30. package/lib/module/screens/inbox/Inbox.js +51 -40
  31. package/lib/module/screens/inbox/Inbox.js.map +1 -1
  32. package/lib/module/translation/resources/i18n.js +9 -1
  33. package/lib/module/translation/resources/i18n.js.map +1 -1
  34. package/lib/typescript/src/components/GroupItem/index.d.ts +8 -0
  35. package/lib/typescript/src/components/GroupItem/index.d.ts.map +1 -0
  36. package/lib/typescript/src/core/useChatListener.d.ts.map +1 -1
  37. package/lib/typescript/src/hooks/groups/useFetchPublicGroup.d.ts +213 -0
  38. package/lib/typescript/src/hooks/groups/useFetchPublicGroup.d.ts.map +1 -0
  39. package/lib/typescript/src/hooks/groups/useJoinGroup.d.ts +5 -0
  40. package/lib/typescript/src/hooks/groups/useJoinGroup.d.ts.map +1 -0
  41. package/lib/typescript/src/hooks/message/usePinMessage.d.ts.map +1 -1
  42. package/lib/typescript/src/hooks/message/useSendMessage.d.ts.map +1 -1
  43. package/lib/typescript/src/hooks/query-keys.d.ts +6 -0
  44. package/lib/typescript/src/hooks/query-keys.d.ts.map +1 -1
  45. package/lib/typescript/src/hooks/useGroupPermission.d.ts +6 -0
  46. package/lib/typescript/src/hooks/useGroupPermission.d.ts.map +1 -0
  47. package/lib/typescript/src/index.d.ts +1 -1
  48. package/lib/typescript/src/index.d.ts.map +1 -1
  49. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts +3 -1
  50. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -1
  51. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts +1 -1
  52. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -1
  53. package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.d.ts +1 -1
  54. package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.d.ts.map +1 -1
  55. package/lib/typescript/src/screens/chat-detail/types.d.ts +2 -1
  56. package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -1
  57. package/lib/typescript/src/screens/inbox/CommunityTab.d.ts +6 -0
  58. package/lib/typescript/src/screens/inbox/CommunityTab.d.ts.map +1 -0
  59. package/lib/typescript/src/screens/inbox/Inbox.d.ts +2 -1
  60. package/lib/typescript/src/screens/inbox/Inbox.d.ts.map +1 -1
  61. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/components/GroupItem/index.tsx +170 -0
  64. package/src/core/useChatListener.ts +54 -1
  65. package/src/hooks/groups/useFetchPublicGroup.ts +43 -0
  66. package/src/hooks/groups/useJoinGroup.ts +46 -0
  67. package/src/hooks/message/usePinMessage.ts +8 -2
  68. package/src/hooks/message/useSendMessage.ts +11 -15
  69. package/src/hooks/query-keys.ts +8 -0
  70. package/src/hooks/useGroupPermission.ts +43 -0
  71. package/src/index.tsx +5 -1
  72. package/src/screens/SearchConversation/TabResult.tsx +1 -1
  73. package/src/screens/chat-detail/ChatComposer.tsx +50 -27
  74. package/src/screens/chat-detail/ChatDetail.tsx +25 -1
  75. package/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.tsx +8 -1
  76. package/src/screens/chat-detail/types.ts +5 -1
  77. package/src/screens/inbox/CommunityTab.tsx +65 -0
  78. package/src/screens/inbox/Inbox.tsx +51 -39
  79. package/src/translation/resources/i18n.ts +8 -0
@@ -1,7 +1,7 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { MediaItem } from '../../hooks/useMediaViewer';
3
3
  import type { MeasuredRect } from './messageToolbox/types';
4
- import type { MessageItem } from '@droppii/openim-rn-client-sdk';
4
+ import type { GroupJoinSource, MessageItem } from '@droppii/openim-rn-client-sdk';
5
5
  export type DChatActionIconProvider = 'MaterialCommunityIcons' | 'DroppiiNew';
6
6
  export declare enum DChatPannelActionItemType {
7
7
  Gallery = "Gallery",
@@ -85,5 +85,6 @@ export interface ChatDetailProps extends Omit<ChatDetailHeaderProps, 'showAddMem
85
85
  onPressUrl?: (url: string) => void;
86
86
  customMessageItemFactory?: (item: MessageItem) => ReactNode;
87
87
  pannelActions?: DChatPannelAction[];
88
+ groupJoinSource?: GroupJoinSource;
88
89
  }
89
90
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/screens/chat-detail/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/screens/chat-detail/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface CommunityTabProps {
2
+ onPressGroup?: (groupId: string) => void;
3
+ }
4
+ export declare const CommunityTab: import("react").MemoExoticComponent<({ onPressGroup }: CommunityTabProps) => import("react").JSX.Element>;
5
+ export {};
6
+ //# sourceMappingURL=CommunityTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommunityTab.d.ts","sourceRoot":"","sources":["../../../../../src/screens/inbox/CommunityTab.tsx"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AACD,eAAO,MAAM,YAAY,yDAA2B,iBAAiB,iCAgDnE,CAAC"}
@@ -3,7 +3,8 @@ interface InboxProps {
3
3
  onPressSearch?: () => void;
4
4
  onPressEdit?: () => void;
5
5
  onPressContact?: () => void;
6
+ onPressGroup?: (groupId: string) => void;
6
7
  }
7
- declare const Inbox: import("react").MemoExoticComponent<({ onPressThread, onPressSearch, onPressEdit, onPressContact, }: InboxProps) => import("react").JSX.Element>;
8
+ declare const Inbox: import("react").MemoExoticComponent<({ onPressThread, onPressSearch, onPressEdit, onPressContact, onPressGroup, }: InboxProps) => import("react").JSX.Element>;
8
9
  export default Inbox;
9
10
  //# sourceMappingURL=Inbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Inbox.d.ts","sourceRoot":"","sources":["../../../../../src/screens/inbox/Inbox.tsx"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAID,QAAA,MAAM,KAAK,uGAMN,UAAU,iCA0Gd,CAAC;AAIF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Inbox.d.ts","sourceRoot":"","sources":["../../../../../src/screens/inbox/Inbox.tsx"],"names":[],"mappings":"AAeA,UAAU,UAAU;IAClB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AASD,QAAA,MAAM,KAAK,qHAON,UAAU,iCAmGd,CAAC;AAIF,eAAe,KAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;AAwKA,wBAEE"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;AAgLA,wBAEE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@droppii-org/chat-mobile",
3
- "version": "0.2.67",
3
+ "version": "0.2.69",
4
4
  "description": "Droppii chat mobile",
5
5
  "keywords": [
6
6
  "react-native",
@@ -0,0 +1,170 @@
1
+ import {
2
+ KButton,
3
+ KColors,
4
+ KContainer,
5
+ KLabel,
6
+ KSpacingValue,
7
+ } from '@droppii/libs';
8
+ import {
9
+ GroupJoinSource,
10
+ type SearchPublicGroupInfo,
11
+ type SearchPublicGroupMemberInfo,
12
+ } from '@droppii/openim-rn-client-sdk';
13
+ import { memo, useCallback, useMemo } from 'react';
14
+ import { StyleSheet } from 'react-native';
15
+ import { Avatar } from '../Avatar';
16
+ import type { AvatarProps } from '../Avatar/Avatar.types';
17
+ import { trans } from '../../translation';
18
+ import { useJoinGroup } from '../../hooks/groups/useJoinGroup';
19
+
20
+ interface IGroupItemProps {
21
+ item: SearchPublicGroupInfo;
22
+ onPress?: (groupId: string) => void;
23
+ }
24
+
25
+ const buildAvatarProps = (
26
+ faceURL: string,
27
+ groupName: string,
28
+ members: SearchPublicGroupMemberInfo[]
29
+ ): Pick<
30
+ AvatarProps,
31
+ | 'type'
32
+ | 'source'
33
+ | 'secondarySource'
34
+ | 'tertiarySource'
35
+ | 'remainingCount'
36
+ | 'fullName'
37
+ | 'secondaryFullName'
38
+ | 'tertiaryFullName'
39
+ > => {
40
+ if (faceURL) {
41
+ return { type: 'single', source: faceURL, fullName: groupName };
42
+ }
43
+ const [m0, m1, m2] = members;
44
+ if (members.length >= 4) {
45
+ return {
46
+ type: 'quad',
47
+ source: m0?.faceURL,
48
+ secondarySource: m1?.faceURL,
49
+ tertiarySource: m2?.faceURL,
50
+ remainingCount: members.length - 3,
51
+ fullName: m0?.nickname,
52
+ secondaryFullName: m1?.nickname,
53
+ tertiaryFullName: m2?.nickname,
54
+ };
55
+ }
56
+ if (members.length === 3) {
57
+ return {
58
+ type: 'triple',
59
+ source: m0?.faceURL,
60
+ secondarySource: m1?.faceURL,
61
+ tertiarySource: m2?.faceURL,
62
+ fullName: m0?.nickname,
63
+ secondaryFullName: m1?.nickname,
64
+ tertiaryFullName: m2?.nickname,
65
+ };
66
+ }
67
+ if (members.length === 2) {
68
+ return {
69
+ type: 'double',
70
+ source: m0?.faceURL,
71
+ secondarySource: m1?.faceURL,
72
+ fullName: m0?.nickname,
73
+ secondaryFullName: m1?.nickname,
74
+ };
75
+ }
76
+ return { type: 'single', source: faceURL, fullName: groupName };
77
+ };
78
+
79
+ export const GroupItem = memo((props: IGroupItemProps) => {
80
+ const { item, onPress } = props || {};
81
+ const {
82
+ groupID,
83
+ groupName = '',
84
+ memberCount = 0,
85
+ introduction = '',
86
+ faceURL = '',
87
+ isJoined = false,
88
+ members = [],
89
+ } = item || {};
90
+
91
+ const { mutate: joinGroup, isPending } = useJoinGroup();
92
+
93
+ const avatarProps = useMemo(
94
+ () => buildAvatarProps(faceURL, groupName, members),
95
+ [faceURL, groupName, members]
96
+ );
97
+
98
+ const handleActionPress = useCallback(() => {
99
+ if (isJoined) {
100
+ onPress?.(groupID);
101
+ return;
102
+ }
103
+ joinGroup(
104
+ { groupID, reqMsg: '', joinSource: GroupJoinSource.Search, groupName },
105
+ { onSuccess: () => onPress?.(groupID) }
106
+ );
107
+ }, [isJoined, groupID, joinGroup, onPress, groupName]);
108
+
109
+ return (
110
+ <KContainer.Touchable
111
+ style={styles.item}
112
+ onPress={() => onPress?.(groupID)}
113
+ >
114
+ <Avatar size="md" {...avatarProps} />
115
+ <KContainer.View style={styles.itemContent}>
116
+ <KLabel.Text typo="TextMdMedium" numberOfLines={1}>
117
+ {groupName}
118
+ </KLabel.Text>
119
+ <KContainer.View style={styles.itemDescription}>
120
+ <KContainer.View flex>
121
+ <KLabel.Text
122
+ typo="TextNmNormal"
123
+ numberOfLines={1}
124
+ color={KColors.gray.normal}
125
+ >
126
+ {trans('group:member_count', { count: memberCount })}
127
+ </KLabel.Text>
128
+ <KContainer.VisibleView visible={!!introduction}>
129
+ <KLabel.Text
130
+ typo="TextNmNormal"
131
+ numberOfLines={1}
132
+ color={KColors.gray.normal}
133
+ >
134
+ {introduction}
135
+ </KLabel.Text>
136
+ </KContainer.VisibleView>
137
+ </KContainer.View>
138
+ <KButton.Solid
139
+ label={trans(isJoined ? 'group:access' : 'group:join')}
140
+ onPress={handleActionPress}
141
+ size="xs"
142
+ isLightSolid
143
+ kind={isJoined ? 'light' : 'primary'}
144
+ loading={isPending}
145
+ />
146
+ </KContainer.View>
147
+ </KContainer.View>
148
+ </KContainer.Touchable>
149
+ );
150
+ });
151
+
152
+ const styles = StyleSheet.create({
153
+ item: {
154
+ paddingVertical: KSpacingValue['0.5rem'],
155
+ flexDirection: 'row',
156
+ alignItems: 'center',
157
+ gap: KSpacingValue['0.5rem'],
158
+ borderBottomWidth: 1,
159
+ borderBlockColor: KColors.border.light,
160
+ },
161
+ itemContent: {
162
+ flex: 1,
163
+ },
164
+ itemDescription: {
165
+ flexDirection: 'row',
166
+ alignItems: 'center',
167
+ gap: KSpacingValue['0.5rem'],
168
+ justifyContent: 'space-between',
169
+ },
170
+ });
@@ -4,6 +4,7 @@ import OpenIMSDK, {
4
4
  OpenIMEvent,
5
5
  SessionType,
6
6
  type ConversationItem,
7
+ type GroupApplicationItem,
7
8
  type GroupItem,
8
9
  type GroupMemberItem,
9
10
  type MessageItem,
@@ -24,7 +25,7 @@ import { belongsToConversation } from '../utils/message';
24
25
  import { getConversationID } from '../utils/conversation';
25
26
  import { DeviceEventEmitter } from 'react-native';
26
27
  import { ChatEvent } from '../types/events';
27
- import { conversationQueryKeys } from '../hooks/query-keys';
28
+ import { conversationQueryKeys, groupQueryKeys } from '../hooks/query-keys';
28
29
 
29
30
  export const useChatListener = () => {
30
31
  const updateOneMessage = useMessageStore((state) => state.updateOneMessage);
@@ -249,6 +250,7 @@ export const useChatListener = () => {
249
250
  // userID: member.userID,
250
251
  // groupID: member.groupID,
251
252
  // permissions: member.permissions,
253
+ // roleLevel: member.roleLevel,
252
254
  // });
253
255
  const conversation = useConversationStore
254
256
  .getState()
@@ -265,6 +267,48 @@ export const useChatListener = () => {
265
267
  [currentUserId]
266
268
  );
267
269
 
270
+ const markGroupJoined = useCallback(
271
+ (groupID: string) => {
272
+ queryClient.invalidateQueries({
273
+ queryKey: conversationQueryKeys.joinedGroup(groupID),
274
+ });
275
+
276
+ queryClient.setQueriesData<{
277
+ pages: {
278
+ total: number;
279
+ groups: { groupID: string; isJoined: boolean }[];
280
+ }[];
281
+ pageParams: unknown[];
282
+ }>({ queryKey: groupQueryKeys.public(), exact: false }, (old) => {
283
+ if (!old) return old;
284
+ return {
285
+ ...old,
286
+ pages: old.pages.map((page) => ({
287
+ ...page,
288
+ groups: page.groups.map((g) =>
289
+ g.groupID === groupID ? { ...g, isJoined: true } : g
290
+ ),
291
+ })),
292
+ };
293
+ });
294
+ },
295
+ [queryClient]
296
+ );
297
+
298
+ const onJoinedGroupAdded = useCallback(
299
+ (group: GroupItem) => {
300
+ markGroupJoined(group.groupID);
301
+ },
302
+ [markGroupJoined]
303
+ );
304
+
305
+ const onGroupApplicationAdded = useCallback(
306
+ (application: GroupApplicationItem) => {
307
+ markGroupJoined(application.groupID);
308
+ },
309
+ [markGroupJoined]
310
+ );
311
+
268
312
  const onMessageRevoked = useCallback((revokedInfo: RevokedInfo) => {
269
313
  markMessageRevoked(revokedInfo.clientMsgID);
270
314
  }, []);
@@ -326,6 +370,8 @@ export const useChatListener = () => {
326
370
  );
327
371
  OpenIMSDK.on(OpenIMEvent.OnJoinedGroupDeleted, onJoinedGroupDeleted);
328
372
  OpenIMSDK.on(OpenIMEvent.OnGroupDismissed, onGroupDismissed);
373
+ OpenIMSDK.on(OpenIMEvent.OnJoinedGroupAdded, onJoinedGroupAdded);
374
+ OpenIMSDK.on(OpenIMEvent.OnGroupApplicationAdded, onGroupApplicationAdded);
329
375
 
330
376
  // Message status
331
377
  OpenIMSDK.on(OpenIMEvent.SendMessageProgress, onSendMessageProgress);
@@ -352,6 +398,11 @@ export const useChatListener = () => {
352
398
  );
353
399
  OpenIMSDK.off(OpenIMEvent.OnJoinedGroupDeleted, onJoinedGroupDeleted);
354
400
  OpenIMSDK.off(OpenIMEvent.OnGroupDismissed, onGroupDismissed);
401
+ OpenIMSDK.off(OpenIMEvent.OnJoinedGroupAdded, onJoinedGroupAdded);
402
+ OpenIMSDK.off(
403
+ OpenIMEvent.OnGroupApplicationAdded,
404
+ onGroupApplicationAdded
405
+ );
355
406
 
356
407
  // Message status
357
408
  OpenIMSDK.off(OpenIMEvent.SendMessageProgress, onSendMessageProgress);
@@ -377,5 +428,7 @@ export const useChatListener = () => {
377
428
  OnGroupMemberInfoChanged,
378
429
  onJoinedGroupDeleted,
379
430
  onGroupDismissed,
431
+ onJoinedGroupAdded,
432
+ onGroupApplicationAdded,
380
433
  ]);
381
434
  };
@@ -0,0 +1,43 @@
1
+ import { useInfiniteQuery } from '@tanstack/react-query';
2
+ import { useMemo } from 'react';
3
+ import OpenIMSDK, {
4
+ PublicGroupJoinStatus,
5
+ type SearchPublicGroupInfo,
6
+ } from '@droppii/openim-rn-client-sdk';
7
+ import { PAGE_SIZE } from '../../constants';
8
+ import { groupQueryKeys } from '../query-keys';
9
+
10
+ export const useFetchPublicGroup = (keyword: string) => {
11
+ const { data, ...rest } = useInfiniteQuery({
12
+ queryKey: groupQueryKeys.publicSearch(keyword),
13
+ queryFn: ({ pageParam = 0 }) => {
14
+ return OpenIMSDK.searchPublicGroups(
15
+ keyword,
16
+ PublicGroupJoinStatus.All,
17
+ pageParam,
18
+ PAGE_SIZE
19
+ );
20
+ },
21
+ getNextPageParam: (lastPage, allPages) => {
22
+ const fetched = allPages.reduce((sum, p) => sum + p.groups.length, 0);
23
+ return fetched < lastPage.total ? fetched : undefined;
24
+ },
25
+ initialPageParam: 0,
26
+ maxPages: 1,
27
+ });
28
+
29
+ const dataFlatten: SearchPublicGroupInfo[] = useMemo(() => {
30
+ const seen = new Set<string>();
31
+ return (
32
+ data?.pages.flatMap((page) =>
33
+ page.groups.filter((g) => {
34
+ if (seen.has(g.groupID)) return false;
35
+ seen.add(g.groupID);
36
+ return true;
37
+ })
38
+ ) ?? []
39
+ );
40
+ }, [data]);
41
+
42
+ return { dataFlatten, ...rest };
43
+ };
@@ -0,0 +1,46 @@
1
+ import OpenIMSDK, { type JoinGroupParams } from '@droppii/openim-rn-client-sdk';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
+ import { useMutation } from '@tanstack/react-query';
4
+ import { conversationQueryKeys, groupQueryKeys } from '../query-keys';
5
+ import { UIUtils } from '../../utils/UIUtils';
6
+ import { trans } from '../../translation';
7
+
8
+ export const useJoinGroup = () => {
9
+ const queryClient = useQueryClient();
10
+
11
+ return useMutation({
12
+ mutationKey: groupQueryKeys.join(),
13
+ mutationFn: (params: JoinGroupParams & { groupName: string }) =>
14
+ OpenIMSDK.joinGroup(params),
15
+ onSuccess: (_data, params) => {
16
+ queryClient.invalidateQueries({
17
+ queryKey: conversationQueryKeys.joinedGroup(params.groupID),
18
+ });
19
+
20
+ queryClient.setQueriesData<{
21
+ pages: {
22
+ total: number;
23
+ groups: { groupID: string; isJoined: boolean }[];
24
+ }[];
25
+ pageParams: unknown[];
26
+ }>({ queryKey: groupQueryKeys.public(), exact: false }, (old) => {
27
+ if (!old) return old;
28
+ return {
29
+ ...old,
30
+ pages: old.pages.map((page) => ({
31
+ ...page,
32
+ groups: page.groups.map((g) =>
33
+ g.groupID === params.groupID ? { ...g, isJoined: true } : g
34
+ ),
35
+ })),
36
+ };
37
+ });
38
+
39
+ UIUtils.toast.open({
40
+ title: trans('group:joined_group', {
41
+ groupName: params?.groupName || '',
42
+ }),
43
+ });
44
+ },
45
+ });
46
+ };
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useEffect } from 'react';
2
- import OpenIMSDK from '@droppii/openim-rn-client-sdk';
2
+ import OpenIMSDK, { GroupPermission } from '@droppii/openim-rn-client-sdk';
3
3
  import type { MessageItem } from '@droppii/openim-rn-client-sdk';
4
4
  import { useConversationStore } from '../../store/conversation';
5
5
  import { useMessageStore } from '../../store/message';
@@ -7,6 +7,7 @@ import { usePinnedMessageStore } from '../../store/pinnedMessage';
7
7
  import { useUserStore } from '../../store/user';
8
8
  import { UIUtils } from '../../utils/UIUtils';
9
9
  import { trans } from '../../translation';
10
+ import { useGuardedAction } from '../useGroupPermission';
10
11
 
11
12
  const PINNED_MESSAGES_PAGE_SIZE = 5;
12
13
 
@@ -147,9 +148,14 @@ export const usePinMessage = (conversationID?: string) => {
147
148
  [conversationID, removeMessage]
148
149
  );
149
150
 
151
+ const pinMessageWithPermission = useGuardedAction(
152
+ GroupPermission.PinMessage,
153
+ pinMessage
154
+ );
155
+
150
156
  return {
151
157
  pinnedMessages,
152
- pinMessage,
158
+ pinMessage: pinMessageWithPermission,
153
159
  unpinMessage,
154
160
  };
155
161
  };
@@ -33,8 +33,8 @@ import type { StickerItem } from '../../types/sticker';
33
33
  import { useQueryClient } from '@tanstack/react-query';
34
34
  import { stickerQueryKeys } from '../query-keys';
35
35
  import { getMessagePreview } from '../../utils/messageUtils';
36
- import { UIUtils } from '../../utils/UIUtils';
37
36
  import { trans } from '../../translation';
37
+ import { useGuardedAction } from '../useGroupPermission';
38
38
 
39
39
  const buildSendParams = (
40
40
  message: MessageItem,
@@ -52,8 +52,7 @@ export const useSendMessage = () => {
52
52
  const applicationType = useChatContext().applicationType;
53
53
  const pushNewMessage = useMessageStore((state) => state.pushNewMessage);
54
54
  const updateOneMessage = useMessageStore((state) => state.updateOneMessage);
55
- const { quotedMessage, setQuotedMessage, groupPermissions } =
56
- useChatDetailContext();
55
+ const { quotedMessage, setQuotedMessage } = useChatDetailContext();
57
56
  const queryClient = useQueryClient();
58
57
 
59
58
  const dispatchSend = useCallback(
@@ -107,16 +106,6 @@ export const useSendMessage = () => {
107
106
  const recvID = currentConversation?.userID || targetUserId;
108
107
  const groupID = currentConversation?.groupID || targetGroupId;
109
108
  if (!recvID && !groupID) return;
110
- if (
111
- currentConversation?.conversationType === SessionType.Group &&
112
- !groupPermissions?.includes(GroupPermission.SendMessage)
113
- ) {
114
- UIUtils.toast.open({
115
- title: trans('chat:no_send_permission'),
116
- theme: 'info',
117
- });
118
- return;
119
- }
120
109
 
121
110
  const messageList: MessageItem[] = [];
122
111
 
@@ -192,7 +181,6 @@ export const useSendMessage = () => {
192
181
  quotedMessage,
193
182
  setQuotedMessage,
194
183
  queryClient,
195
- groupPermissions,
196
184
  ]
197
185
  );
198
186
 
@@ -257,8 +245,16 @@ export const useSendMessage = () => {
257
245
  markMessageRevoked(message.clientMsgID);
258
246
  }, []);
259
247
 
260
- return {
248
+ const sendMessageWithPermission = useGuardedAction(
249
+ GroupPermission.SendMessage,
261
250
  sendMessage,
251
+ {
252
+ deniedMessage: trans('chat:no_send_permission'),
253
+ }
254
+ );
255
+
256
+ return {
257
+ sendMessage: sendMessageWithPermission,
262
258
  retryMessage,
263
259
  revokeMessage,
264
260
  };
@@ -61,3 +61,11 @@ export const messageQueryKeys = {
61
61
  search: (query: string, conversationId?: string) =>
62
62
  [...messageQueryKeys.all, 'search', query, conversationId] as const,
63
63
  };
64
+
65
+ export const groupQueryKeys = {
66
+ all: ['groups'] as const,
67
+ public: () => [...groupQueryKeys.all, 'public'] as const,
68
+ publicSearch: (keyword: string) =>
69
+ [...groupQueryKeys.public(), keyword] as const,
70
+ join: () => [...groupQueryKeys.all, 'join'] as const,
71
+ };
@@ -0,0 +1,43 @@
1
+ import { PeerType, type GroupPermission } from '@droppii/openim-rn-client-sdk';
2
+ import { useChatDetailContext } from '../context';
3
+ import { useCallback, useMemo } from 'react';
4
+ import { trans } from '../translation';
5
+ import { UIUtils } from '../utils/UIUtils';
6
+
7
+ export const useHasGroupPermission = (
8
+ permission: GroupPermission | GroupPermission[],
9
+ mode: 'every' | 'some' = 'every'
10
+ ): boolean => {
11
+ const { conversation, groupPermissions } = useChatDetailContext();
12
+ const isNotGroup = conversation?.peerType !== PeerType.Group;
13
+ const required = Array.isArray(permission) ? permission : [permission];
14
+
15
+ return useMemo(() => {
16
+ if (isNotGroup) return true;
17
+ return mode === 'every'
18
+ ? required.every((p) => groupPermissions?.includes(p))
19
+ : required.some((p) => groupPermissions?.includes(p));
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
21
+ }, [groupPermissions, isNotGroup, mode]);
22
+ };
23
+
24
+ export const useGuardedAction = <T extends (...args: any[]) => any>(
25
+ permission: GroupPermission,
26
+ action: T,
27
+ options?: { deniedMessage?: string }
28
+ ): T => {
29
+ const allowed = useHasGroupPermission(permission);
30
+ return useCallback(
31
+ (...args: Parameters<T>) => {
32
+ if (!allowed) {
33
+ UIUtils.toast.open({
34
+ title: options?.deniedMessage ?? trans('chat:no_permission'),
35
+ theme: 'info',
36
+ });
37
+ return;
38
+ }
39
+ return action(...args);
40
+ },
41
+ [allowed, action, options?.deniedMessage]
42
+ ) as T;
43
+ };
package/src/index.tsx CHANGED
@@ -40,7 +40,11 @@ export type {
40
40
  MessageItem,
41
41
  ConversationItem,
42
42
  } from '@droppii/openim-rn-client-sdk';
43
- export { LoginStatus, MessageType } from '@droppii/openim-rn-client-sdk';
43
+ export {
44
+ LoginStatus,
45
+ MessageType,
46
+ GroupJoinSource,
47
+ } from '@droppii/openim-rn-client-sdk';
44
48
  export * from './screens/chat-detail';
45
49
  export type {
46
50
  DChatActionItem,
@@ -122,7 +122,7 @@ const styles = StyleSheet.create({
122
122
  tabRow: {
123
123
  flexDirection: 'row',
124
124
  borderBottomWidth: 1,
125
- borderBottomColor: KColors.border.normal,
125
+ borderBottomColor: KColors.border.light,
126
126
  },
127
127
  tabItem: {
128
128
  paddingVertical: KSpacingValue['0.5rem'],