@smart-link/rn-im 1.0.19 → 1.0.21

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.
@@ -54,6 +54,8 @@ const List = ({ navigation }) => {
54
54
  const [nativeEvent, setNativeEvent] = (0, react_1.useState)();
55
55
  const [popoverVisible, setPopoverVisible] = (0, react_1.useState)(false);
56
56
  const [conversation, setConversation] = (0, react_1.useState)();
57
+ const lastPressTime = (0, react_1.useRef)(0);
58
+ const flatListRef = (0, react_1.useRef)(null);
57
59
  (0, react_1.useEffect)(() => {
58
60
  let headerTitle = t('message');
59
61
  switch (connectStatus) {
@@ -115,6 +117,25 @@ const List = ({ navigation }) => {
115
117
  </rn_ui_1.Popover>),
116
118
  });
117
119
  }, [t, navigation, connectStatus]);
120
+ (0, react_1.useEffect)(() => {
121
+ return navigation.addListener('tabPress', (e) => {
122
+ const now = Date.now();
123
+ if (now - lastPressTime.current < 300) {
124
+ // 双击, 定位到第一个未读消息
125
+ conversations.find((item) => {
126
+ var _a;
127
+ if (item.unreadCount > 0 && item.enableNoDisturb === 'off') {
128
+ (_a = flatListRef.current) === null || _a === void 0 ? void 0 : _a.scrollToIndex({
129
+ index: conversations.indexOf(item),
130
+ animated: true,
131
+ });
132
+ return true;
133
+ }
134
+ });
135
+ }
136
+ lastPressTime.current = now;
137
+ });
138
+ }, [navigation, conversations]);
118
139
  const handleSearch = () => {
119
140
  navigation.navigate('Search');
120
141
  };
@@ -172,7 +193,7 @@ const List = ({ navigation }) => {
172
193
  index,
173
194
  });
174
195
  return (<react_native_1.View style={{ flex: 1 }}>
175
- <react_native_1.FlatList contentContainerStyle={styles.contentContainerStyle} keyboardShouldPersistTaps={'handled'} data={conversations} ListHeaderComponent={listHeaderComponent} ListFooterComponent={listFooterComponent} ItemSeparatorComponent={itemSeparatorComponent} getItemLayout={getItemLayout} renderItem={renderItem} numColumns={1} keyExtractor={keyExtractor}/>
196
+ <react_native_1.FlatList ref={flatListRef} contentContainerStyle={styles.contentContainerStyle} keyboardShouldPersistTaps={'handled'} data={conversations} ListHeaderComponent={listHeaderComponent} ListFooterComponent={listFooterComponent} ItemSeparatorComponent={itemSeparatorComponent} getItemLayout={getItemLayout} renderItem={renderItem} numColumns={1} keyExtractor={keyExtractor}/>
176
197
  <ConversationOption_1.default conversation={conversation} nativeEvent={nativeEvent} visible={popoverVisible} onClose={() => {
177
198
  setPopoverVisible(false);
178
199
  setConversation(undefined);
@@ -45,13 +45,12 @@ const react_1 = __importStar(require("react"));
45
45
  const react_native_1 = require("react-native");
46
46
  const GroupTransfer = ({ navigation }) => {
47
47
  const { t } = (0, useTranslation_1.default)();
48
- const { groupDetail } = (0, useImSelector_1.useChatGroup)();
49
- const { groupMemberList } = groupDetail;
48
+ const { allMembers } = (0, useImSelector_1.useConversation)();
50
49
  const [checkedMember, setCheckedMember] = (0, react_1.useState)(null);
51
50
  const [keyword, setKeyword] = (0, react_1.useState)('');
52
51
  const list = (0, react_1.useMemo)(() => {
53
- return groupMemberList === null || groupMemberList === void 0 ? void 0 : groupMemberList.filter(item => item.memberLevel !== 'owner');
54
- }, [groupMemberList]);
52
+ return allMembers === null || allMembers === void 0 ? void 0 : allMembers.filter(item => item.memberLevel !== 'owner');
53
+ }, [allMembers]);
55
54
  (0, react_1.useEffect)(() => {
56
55
  navigation.setOptions({
57
56
  title: t('chooseNewOwner'),
@@ -16,7 +16,7 @@ const { OWNER, MGR, } = im_base_1.MemberLevel;
16
16
  const OptionGroupMoreMember = (props) => {
17
17
  const { groupDetail } = (0, useImSelector_1.useChatGroup)();
18
18
  const { memberTotalCount } = groupDetail;
19
- const { allMembers } = (0, useImSelector_1.useMessage)();
19
+ const { allMembers } = (0, useImSelector_1.useConversation)();
20
20
  const [keyword, setKeyword] = (0, react_1.useState)('');
21
21
  const { t } = (0, useTranslation_1.default)();
22
22
  const navigation = (0, rn_ui_1.useNavigation)();
@@ -12,7 +12,6 @@ const OptionAvatars_1 = __importDefault(require("./OptionAvatars"));
12
12
  const OptionConversation_1 = __importDefault(require("./OptionConversation"));
13
13
  const common_action_sheet_1 = require("../../../utils/common-action-sheet");
14
14
  const init_1 = require("../../../init");
15
- const react_native_1 = require("react-native");
16
15
  const OptionGroup_1 = __importDefault(require("../../../pages/conversation/setting/OptionGroup"));
17
16
  const OptionCancelGroup_1 = __importDefault(require("../../../pages/conversation/setting/OptionCancelGroup"));
18
17
  const contact_slice_1 = require("../../../slice/contact/contact.slice");
@@ -22,13 +21,13 @@ const { LIAISON } = im_base_1.GroupType;
22
21
  // 最大显示人数
23
22
  const MAX_SHOW_MEMBER_COUNT = 23;
24
23
  const ConversationSetting = ({ navigation }) => {
25
- var _a;
26
24
  const { t } = (0, useTranslation_1.default)();
27
- const { allMembers } = (0, useImSelector_1.useMessage)();
25
+ // const {allMembers} = useMessage();
28
26
  const { currentConversation } = (0, useImSelector_1.useConversation)();
29
27
  const { groupDetail } = (0, useImSelector_1.useChatGroup)();
30
28
  const title = t('chatSetting');
31
- const { memberTotalCount = 0 } = groupDetail || {};
29
+ const memberTotalCount = (groupDetail === null || groupDetail === void 0 ? void 0 : groupDetail.memberTotalCount) || 0;
30
+ const groupMemberList = (groupDetail === null || groupDetail === void 0 ? void 0 : groupDetail.groupMemberList) || [];
32
31
  // 设置标题
33
32
  (0, react_1.useEffect)(() => {
34
33
  let newTitle = title;
@@ -60,7 +59,7 @@ const ConversationSetting = ({ navigation }) => {
60
59
  }, t);
61
60
  };
62
61
  const { id, type, name, avatars, enableNoDisturb = 'off', enableTop = 'off', notice = '', enableInviteValidate = 'off', memberLevel = MEMBER, groupType, } = currentConversation;
63
- console.log('type: ', type, '[memberLevel]', memberLevel);
62
+ // console.log('type: ', type , '[memberLevel]', memberLevel);
64
63
  const isMgr = memberLevel === MGR || memberLevel === OWNER;
65
64
  // 离开群组
66
65
  const leaveGroup = () => {
@@ -80,10 +79,10 @@ const ConversationSetting = ({ navigation }) => {
80
79
  const toEditGroupNameOrNotice = (type) => {
81
80
  navigation.navigate('OptionGroupNameOrNoticeEdit', { type });
82
81
  };
83
- // 群组转让
84
- const toGroupTransfer = () => {
85
- // navigation.navigate('OptionGroupTransferPage');
86
- };
82
+ // // 群组转让
83
+ // const toGroupTransfer = () => {
84
+ // // navigation.navigate('OptionGroupTransferPage');
85
+ // };
87
86
  // 群组管理
88
87
  const toGroupMgr = () => {
89
88
  navigation.navigate('OptionGroupManage');
@@ -136,7 +135,7 @@ const ConversationSetting = ({ navigation }) => {
136
135
  </>);
137
136
  break;
138
137
  case im_base_1.ConversationType.C2G:
139
- let avatarList = allMembers
138
+ let avatarList = groupMemberList
140
139
  .map(item => {
141
140
  var _a;
142
141
  return {
@@ -147,23 +146,6 @@ const ConversationSetting = ({ navigation }) => {
147
146
  };
148
147
  })
149
148
  .splice(0, MAX_SHOW_MEMBER_COUNT);
150
- let fMaster = allMembers.find(item => item.memberLevel === OWNER);
151
- // 假设 fMaster 是要插入的对象,且它有一个唯一标识,比如 userId
152
- if (fMaster) {
153
- const fMasterWithRequiredFields = {
154
- userId: fMaster.userId,
155
- userName: (_a = fMaster.memberName) !== null && _a !== void 0 ? _a : '',
156
- avatars: fMaster.memberAvatars,
157
- memberLevel: fMaster.memberLevel,
158
- };
159
- // 先移除已存在的群主
160
- const existingIndex = avatarList.findIndex(item => item.userId === (fMaster === null || fMaster === void 0 ? void 0 : fMaster.userId));
161
- if (existingIndex > -1) {
162
- avatarList.splice(existingIndex, 1);
163
- }
164
- // 插入群主
165
- avatarList.unshift(fMasterWithRequiredFields);
166
- }
167
149
  content = (<>
168
150
  <OptionAvatars_1.default list={avatarList} showTitle memberTotalCount={memberTotalCount} showAdd showMore={isMgr ? avatarList.length > 8 : avatarList.length > 9} isMgr={isMgr} addUser={() => {
169
151
  // 添加成员
@@ -194,9 +176,4 @@ const ConversationSetting = ({ navigation }) => {
194
176
  {content}
195
177
  </rn_ui_1.NavigationPage>);
196
178
  };
197
- const styles = react_native_1.StyleSheet.create({
198
- setting: {
199
- paddingVertical: (0, rn_ui_1.dp)(15),
200
- },
201
- });
202
179
  exports.default = ConversationSetting;
@@ -37,10 +37,11 @@ const im_base_1 = require("@smart-link/im-base");
37
37
  const init_1 = require("../../init");
38
38
  const ChooseMember = ({ navigation, route: { params } }) => {
39
39
  const { groupDetail } = (0, useImSelector_1.useChatGroup)();
40
+ const { allMembers } = (0, useImSelector_1.useConversation)();
40
41
  const [keyword, seKeyword] = (0, react_1.useState)('');
41
42
  const [checked, setChecked] = (0, react_1.useState)([]);
42
43
  const { t } = (0, useTranslation_1.default)();
43
- const { groupMemberList, memberLevel } = groupDetail;
44
+ const { memberLevel } = groupDetail;
44
45
  const imManager = (0, init_1.getImManager)();
45
46
  const list = (0, react_1.useMemo)(() => {
46
47
  if (params.atOther && ['owner', 'mgr'].includes(memberLevel)) {
@@ -49,12 +50,12 @@ const ChooseMember = ({ navigation, route: { params } }) => {
49
50
  userId: 'allMembers',
50
51
  memberName: t('allMembers'),
51
52
  },
52
- ].concat(groupMemberList.filter(item => item.userId !== imManager.user.userId && (keyword ? item.memberName.includes(keyword) : true)));
53
+ ].concat(allMembers.filter(item => item.userId !== imManager.user.userId && (keyword ? item.memberName.includes(keyword) : true)));
53
54
  }
54
55
  else {
55
- return groupMemberList.filter(item => item.userId !== imManager.user.userId && (keyword ? item.memberName.includes(keyword) : true));
56
+ return allMembers.filter(item => item.userId !== imManager.user.userId && (keyword ? item.memberName.includes(keyword) : true));
56
57
  }
57
- }, [params.atOther, groupMemberList, keyword]);
58
+ }, [params.atOther, allMembers, keyword]);
58
59
  (0, react_1.useEffect)(() => {
59
60
  navigation.setOptions({
60
61
  headerLeft({ tintColor }) {
@@ -7,6 +7,6 @@ export interface ContactState {
7
7
  currentRoot: 'organization' | 'role' | 'none';
8
8
  choosePurpose: 'createGroup' | 'contact' | 'addMember' | 'none';
9
9
  }
10
- export declare const setSelectUsers: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setSelectUsers">, setSelectGroups: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setSelectGroups">, setCurrentRoot: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setCurrentRoot">, onSelectUser: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/onSelectUser">, startCreateGroup: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startCreateGroup">, startAddMember: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startAddMember">, resetState: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/resetState">, startSendContact: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startSendContact">, onDefaultCheckedUser: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/onDefaultCheckedUser">;
11
- declare const _default: import("../../../node_modules/redux").Reducer<ContactState>;
10
+ export declare const setSelectUsers: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setSelectUsers">, setSelectGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setSelectGroups">, setCurrentRoot: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/setCurrentRoot">, onSelectUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/onSelectUser">, startCreateGroup: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startCreateGroup">, startAddMember: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startAddMember">, resetState: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/resetState">, startSendContact: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/contact/startSendContact">, onDefaultCheckedUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/contact/onDefaultCheckedUser">;
11
+ declare const _default: import("@reduxjs/toolkit").Reducer<ContactState>;
12
12
  export default _default;
@@ -2,7 +2,7 @@
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.onDefaultCheckedUser = exports.startSendContact = exports.resetState = exports.startAddMember = exports.startCreateGroup = exports.onSelectUser = exports.setCurrentRoot = exports.setSelectGroups = exports.setSelectUsers = void 0;
5
- const toolkit_1 = require("../../../node_modules/@reduxjs/toolkit");
5
+ const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const initialState = {
7
7
  selectUsers: {},
8
8
  selectGroups: {},
@@ -2,8 +2,8 @@ import { VideoState } from './video/video.slice';
2
2
  import { ContactState } from './contact/contact.slice';
3
3
  import { PanelState } from './panel/panel.slice';
4
4
  export declare const chatReducers: {
5
- 'chat/video': import("../../node_modules/redux").Reducer<VideoState>;
6
- 'chat/contact': import("../../node_modules/redux").Reducer<ContactState>;
7
- 'chat/panel': import("../../node_modules/redux").Reducer<PanelState>;
5
+ 'chat/video': import("@reduxjs/toolkit").Reducer<VideoState>;
6
+ 'chat/contact': import("@reduxjs/toolkit").Reducer<ContactState>;
7
+ 'chat/panel': import("@reduxjs/toolkit").Reducer<PanelState>;
8
8
  };
9
9
  export type { VideoState, ContactState, PanelState };
@@ -3,6 +3,6 @@ export interface PanelState {
3
3
  type: 'emoji' | 'option' | 'voice';
4
4
  messageBarHeight: number;
5
5
  }
6
- export declare const setMessageBarHeight: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/panel/setMessageBarHeight">;
7
- declare const _default: import("../../../node_modules/redux").Reducer<PanelState>;
6
+ export declare const setMessageBarHeight: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/panel/setMessageBarHeight">;
7
+ declare const _default: import("@reduxjs/toolkit").Reducer<PanelState>;
8
8
  export default _default;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.setMessageBarHeight = void 0;
4
- const toolkit_1 = require("../../../node_modules/@reduxjs/toolkit");
4
+ const toolkit_1 = require("@reduxjs/toolkit");
5
5
  const panelSlice = (0, toolkit_1.createSlice)({
6
6
  name: 'chat/panel',
7
7
  initialState: {
@@ -7,11 +7,11 @@ export type VideoState = {
7
7
  videoDownloadError: boolean;
8
8
  videoDownloadProgress: number;
9
9
  };
10
- export declare const showVideoPlayer: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<{
10
+ export declare const showVideoPlayer: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
11
11
  videoLocalPath: string;
12
12
  videoImagePath: string;
13
13
  videoImageHeight: number;
14
14
  videoImageWidth: number;
15
- }, "chat/video/showVideoPlayer">, cancelVideoPlayer: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/video/cancelVideoPlayer">, setVideoDownloadProgress: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/video/setVideoDownloadProgress">, setShowVideoPlay: import("../../../node_modules/@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/video/setShowVideoPlay">;
16
- declare const _default: import("../../../node_modules/redux").Reducer<VideoState>;
15
+ }, "chat/video/showVideoPlayer">, cancelVideoPlayer: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"chat/video/cancelVideoPlayer">, setVideoDownloadProgress: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/video/setVideoDownloadProgress">, setShowVideoPlay: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "chat/video/setShowVideoPlay">;
16
+ declare const _default: import("@reduxjs/toolkit").Reducer<VideoState>;
17
17
  export default _default;
@@ -2,7 +2,7 @@
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.setShowVideoPlay = exports.setVideoDownloadProgress = exports.cancelVideoPlayer = exports.showVideoPlayer = void 0;
5
- const toolkit_1 = require("../../../node_modules/@reduxjs/toolkit");
5
+ const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const videoSlice = (0, toolkit_1.createSlice)({
7
7
  name: 'chat/video',
8
8
  initialState: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-link/rn-im",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "dependencies": {
@@ -36,7 +36,6 @@
36
36
  "@react-navigation/native": "6.1.7",
37
37
  "@react-navigation/native-stack": "6.9.13",
38
38
  "@reduxjs/toolkit": "^1.5.0",
39
- "@smart-link/im-base": "^1.0.18",
40
39
  "ahooks": "^3.8.0",
41
40
  "axios": "^0.30.0",
42
41
  "dayjs": "^1.11.9",
@@ -64,7 +63,8 @@
64
63
  "react-redux": "^8.1.3",
65
64
  "redux": "^4.2.1",
66
65
  "redux-thunk": "^2.4.2",
67
- "@smart-link/rn-ui": "^1.0.6"
66
+ "@smart-link/rn-ui": "^1.0.6",
67
+ "@smart-link/im-base": "^1.0.21"
68
68
  },
69
69
  "files": [
70
70
  "dist/**",