im-ui-mobile 0.0.98 → 0.0.99

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 (40) hide show
  1. package/components/im-avatar/im-avatar.vue +121 -121
  2. package/components/im-button/im-button.vue +630 -626
  3. package/components/im-cell/im-cell.vue +10 -15
  4. package/components/im-cell-group/im-cell-group.vue +16 -16
  5. package/components/im-chat-item/im-chat-item.vue +213 -213
  6. package/components/im-context-menu/im-context-menu.vue +138 -138
  7. package/components/im-file-upload/im-file-upload.vue +309 -309
  8. package/components/im-friend-item/im-friend-item.vue +82 -75
  9. package/components/im-group-item/im-group-item.vue +62 -62
  10. package/components/im-group-member-selector/im-group-member-selector.vue +202 -202
  11. package/components/im-group-rtc-join/im-group-rtc-join.vue +112 -112
  12. package/components/im-image-upload/im-image-upload.vue +94 -94
  13. package/components/im-loading/im-loading.vue +64 -64
  14. package/components/im-mention-picker/im-mention-picker.vue +191 -191
  15. package/components/im-message-item/im-message-item.vue +555 -555
  16. package/components/im-nav-bar/im-nav-bar.vue +98 -98
  17. package/components/im-read-receipt/im-read-receipt.vue +174 -174
  18. package/components/im-virtual-list/im-virtual-list.vue +51 -50
  19. package/components/im-voice-input/im-voice-input.vue +305 -305
  20. package/libs/index.ts +2 -3
  21. package/package.json +58 -58
  22. package/styles/button.scss +1 -1
  23. package/theme.scss +61 -62
  24. package/types/components.d.ts +0 -1
  25. package/types/index.d.ts +94 -94
  26. package/types/libs/index.d.ts +206 -204
  27. package/types/utils/datetime.d.ts +9 -9
  28. package/types/utils/dom.d.ts +11 -11
  29. package/types/utils/emoji.d.ts +8 -8
  30. package/types/utils/enums.d.ts +73 -73
  31. package/types/utils/messageType.d.ts +35 -35
  32. package/types/utils/recorderApp.d.ts +9 -9
  33. package/types/utils/recorderH5.d.ts +9 -9
  34. package/types/utils/requester.d.ts +15 -15
  35. package/types/utils/url.d.ts +5 -5
  36. package/types/utils/useDynamicRefs.d.ts +9 -9
  37. package/types/utils/websocket.d.ts +34 -34
  38. package/utils/enums.js +1 -1
  39. package/components/im-virtual-scroller/im-virtual-scroller.vue +0 -54
  40. package/types/components/virtual-scroller.d.ts +0 -20
@@ -1,192 +1,192 @@
1
- <template>
2
- <u-popup ref="popup" mode="bottom" @open="onChange" @close="onChange">
3
- <view class="mention-picker">
4
- <view class="chat-at-top">
5
- <view class="chat-at-tip"> 选择要提醒的人</view>
6
- <button class="chat-at-btn" size="mini" @click="onClean()">清空 </button>
7
- <button class="chat-at-btn" size="mini" @click="onOk()">确定({{ atUserIds.length }})
8
- </button>
9
- </view>
10
- <scroll-view v-show="atUserIds.length > 0" scroll-x="true" scroll-left="120">
11
- <view class="at-user-items">
12
- <view v-for="m in checkedMembers" class="at-user-item" :key="m.userId">
13
- <im-avatar :name="m.showNickName" :url="m.headImage" size="mini" />
14
- </view>
15
- </view>
16
- </scroll-view>
17
- <view class="search-bar">
18
- <u-search v-model="searchText" :show-action="false" shape="round" placeholder="搜索"></u-search>
19
- </view>
20
- <view class="member-items">
21
- <im-virtual-scroller :items="memberItems">
22
- <template v-slot="{ item }">
23
- <view class="member-item" @click="onSwitchChecked(item)">
24
- <im-avatar :name="item.showNickName" :online="item.online" :url="item.headImage"
25
- size="small" />
26
- <view class="member-name">{{ item.showNickName }}</view>
27
- <radio :checked="item.checked" :disabled="item.locked"
28
- @click.stop="onSwitchChecked(item)" />
29
- </view>
30
- </template>
31
- </im-virtual-scroller>
32
- </view>
33
- </view>
34
- </u-popup>
35
- </template>
36
-
37
- <script setup lang="ts">
38
- import { ref, computed } from 'vue'
39
- import ImAvatar from '../im-avatar/im-avatar.vue'
40
- import ImVirtualScroller from '../im-virtual-scroller/im-virtual-scroller.vue'
41
- import { GroupMember } from '../../libs';
42
-
43
- interface Props {
44
- ownerId?: number;
45
- members?: any[];
46
- }
47
-
48
- interface Emits {
49
- (e: 'complete', userIds: number[]): void;
50
- }
51
-
52
- const props = withDefaults(defineProps<Props>(), {
53
- ownerId: 0,
54
- members: () => []
55
- });
56
-
57
- const emit = defineEmits<Emits>();
58
-
59
- const searchText = ref("");
60
- const showMembers = ref<GroupMember[]>([]);
61
- const popup = ref()
62
-
63
- const init = (userId: number, atUserIds: number[]) => {
64
- showMembers.value = [];
65
- // const userId = useUserStore().userInfo.id;
66
-
67
- if (props.ownerId === userId) {
68
- showMembers.value.push({
69
- userId: -1,
70
- showNickName: "全体成员"
71
- });
72
- }
73
-
74
- props.members.forEach((m: GroupMember) => {
75
- if (!m.quit && m.userId !== userId) {
76
- m.checked = atUserIds.includes(m.userId);
77
- showMembers.value.push(m);
78
- }
79
- });
80
- };
81
-
82
- const open = () => {
83
- // 需要根据实际的 popup 引用调整
84
- popup.value.open();
85
- };
86
-
87
- const onSwitchChecked = (member: GroupMember) => {
88
- member.checked = !member.checked;
89
- };
90
-
91
- const onClean = () => {
92
- showMembers.value.forEach((m) => {
93
- m.checked = false;
94
- });
95
- };
96
-
97
- const onOk = () => {
98
- popup.value.close();
99
- };
100
-
101
- const onChange = (e: any) => {
102
- if (!e.show) {
103
- emit("complete", atUserIds.value);
104
- }
105
- };
106
-
107
- const atUserIds = computed(() => {
108
- return showMembers.value.filter(m => m.checked).map(m => m.userId);
109
- });
110
-
111
- const checkedMembers = computed(() => {
112
- return showMembers.value.filter(m => m.checked);
113
- });
114
-
115
- const memberItems = computed(() => {
116
- return showMembers.value.filter(m => m.showNickName.includes(searchText.value));
117
- });
118
-
119
- defineExpose({
120
- init,
121
- open
122
- })
123
- </script>
124
-
125
- <style lang="scss" scoped>
126
- .mention-picker {
127
- position: relative;
128
- display: flex;
129
- flex-direction: column;
130
- background-color: white;
131
- padding: 10rpx;
132
- //border-radius: 15rpx;
133
-
134
- .chat-at-top {
135
- display: flex;
136
- align-items: center;
137
- height: 70rpx;
138
- padding: 10rpx;
139
-
140
- .chat-at-tip {
141
- flex: 1;
142
- }
143
-
144
- .chat-at-btn {
145
- margin-left: 10rpx;
146
- }
147
- }
148
-
149
-
150
- .at-user-items {
151
- display: flex;
152
- align-items: center;
153
- height: 90rpx;
154
-
155
- .at-user-item {
156
- padding: 3rpx;
157
- }
158
- }
159
-
160
-
161
-
162
- .member-items {
163
- position: relative;
164
- flex: 1;
165
- overflow: hidden;
166
-
167
- .member-item {
168
- height: 110rpx;
169
- display: flex;
170
- position: relative;
171
- padding: 0 30rpx;
172
- align-items: center;
173
- background-color: white;
174
- white-space: nowrap;
175
- margin-bottom: 1px;
176
-
177
- &:hover {
178
- background-color: $im-bg-active;
179
- }
180
-
181
- .member-name {
182
- flex: 1;
183
- padding-left: 20rpx;
184
- font-size: $im-font-size;
185
- line-height: 60rpx;
186
- white-space: nowrap;
187
- overflow: hidden;
188
- }
189
- }
190
- }
191
- }
1
+ <template>
2
+ <u-popup ref="popup" mode="bottom" @open="onChange" @close="onChange">
3
+ <view class="mention-picker">
4
+ <view class="chat-at-top">
5
+ <view class="chat-at-tip"> 选择要提醒的人</view>
6
+ <button class="chat-at-btn" size="mini" @click="onClean()">清空 </button>
7
+ <button class="chat-at-btn" size="mini" @click="onOk()">确定({{ atUserIds.length }})
8
+ </button>
9
+ </view>
10
+ <scroll-view v-show="atUserIds.length > 0" scroll-x="true" scroll-left="120">
11
+ <view class="at-user-items">
12
+ <view v-for="m in checkedMembers" class="at-user-item" :key="m.userId">
13
+ <im-avatar :name="m.showNickName" :url="m.headImage" size="mini" />
14
+ </view>
15
+ </view>
16
+ </scroll-view>
17
+ <view class="search-bar">
18
+ <u-search v-model="searchText" :show-action="false" shape="round" placeholder="搜索"></u-search>
19
+ </view>
20
+ <view class="member-items">
21
+ <im-virtual-list :data="memberItems">
22
+ <template v-slot="{ item }">
23
+ <view class="member-item" @click="onSwitchChecked(item)">
24
+ <im-avatar :name="item.showNickName" :online="item.online" :url="item.headImage"
25
+ size="small" />
26
+ <view class="member-name">{{ item.showNickName }}</view>
27
+ <radio :checked="item.checked" :disabled="item.locked"
28
+ @click.stop="onSwitchChecked(item)" />
29
+ </view>
30
+ </template>
31
+ </im-virtual-list>
32
+ </view>
33
+ </view>
34
+ </u-popup>
35
+ </template>
36
+
37
+ <script setup lang="ts">
38
+ import { ref, computed } from 'vue'
39
+ import ImAvatar from '../im-avatar/im-avatar.vue'
40
+ import ImVirtualList from '../im-virtual-list/im-virtual-list.vue'
41
+ import { GroupMember } from '../../libs';
42
+
43
+ interface Props {
44
+ ownerId?: number;
45
+ members?: any[];
46
+ }
47
+
48
+ interface Emits {
49
+ (e: 'complete', userIds: number[]): void;
50
+ }
51
+
52
+ const props = withDefaults(defineProps<Props>(), {
53
+ ownerId: 0,
54
+ members: () => []
55
+ });
56
+
57
+ const emit = defineEmits<Emits>();
58
+
59
+ const searchText = ref("");
60
+ const showMembers = ref<GroupMember[]>([]);
61
+ const popup = ref()
62
+
63
+ const init = (userId: number, atUserIds: number[]) => {
64
+ showMembers.value = [];
65
+ // const userId = useUserStore().userInfo.id;
66
+
67
+ if (props.ownerId === userId) {
68
+ showMembers.value.push({
69
+ userId: -1,
70
+ showNickName: "全体成员"
71
+ });
72
+ }
73
+
74
+ props.members.forEach((m: GroupMember) => {
75
+ if (!m.quit && m.userId !== userId) {
76
+ m.checked = atUserIds.includes(m.userId);
77
+ showMembers.value.push(m);
78
+ }
79
+ });
80
+ };
81
+
82
+ const open = () => {
83
+ // 需要根据实际的 popup 引用调整
84
+ popup.value.open();
85
+ };
86
+
87
+ const onSwitchChecked = (member: GroupMember) => {
88
+ member.checked = !member.checked;
89
+ };
90
+
91
+ const onClean = () => {
92
+ showMembers.value.forEach((m) => {
93
+ m.checked = false;
94
+ });
95
+ };
96
+
97
+ const onOk = () => {
98
+ popup.value.close();
99
+ };
100
+
101
+ const onChange = (e: any) => {
102
+ if (!e.show) {
103
+ emit("complete", atUserIds.value);
104
+ }
105
+ };
106
+
107
+ const atUserIds = computed(() => {
108
+ return showMembers.value.filter(m => m.checked).map(m => m.userId);
109
+ });
110
+
111
+ const checkedMembers = computed(() => {
112
+ return showMembers.value.filter(m => m.checked);
113
+ });
114
+
115
+ const memberItems = computed(() => {
116
+ return showMembers.value.filter(m => m.showNickName.includes(searchText.value));
117
+ });
118
+
119
+ defineExpose({
120
+ init,
121
+ open
122
+ })
123
+ </script>
124
+
125
+ <style lang="scss" scoped>
126
+ .mention-picker {
127
+ position: relative;
128
+ display: flex;
129
+ flex-direction: column;
130
+ background-color: white;
131
+ padding: 10rpx;
132
+ //border-radius: 15rpx;
133
+
134
+ .chat-at-top {
135
+ display: flex;
136
+ align-items: center;
137
+ height: 70rpx;
138
+ padding: 10rpx;
139
+
140
+ .chat-at-tip {
141
+ flex: 1;
142
+ }
143
+
144
+ .chat-at-btn {
145
+ margin-left: 10rpx;
146
+ }
147
+ }
148
+
149
+
150
+ .at-user-items {
151
+ display: flex;
152
+ align-items: center;
153
+ height: 90rpx;
154
+
155
+ .at-user-item {
156
+ padding: 3rpx;
157
+ }
158
+ }
159
+
160
+
161
+
162
+ .member-items {
163
+ position: relative;
164
+ flex: 1;
165
+ overflow: hidden;
166
+
167
+ .member-item {
168
+ height: 110rpx;
169
+ display: flex;
170
+ position: relative;
171
+ padding: 0 30rpx;
172
+ align-items: center;
173
+ background-color: white;
174
+ white-space: nowrap;
175
+ margin-bottom: 1px;
176
+
177
+ &:hover {
178
+ background-color: $im-bg-active;
179
+ }
180
+
181
+ .member-name {
182
+ flex: 1;
183
+ padding-left: 20rpx;
184
+ font-size: $im-font-size;
185
+ line-height: 60rpx;
186
+ white-space: nowrap;
187
+ overflow: hidden;
188
+ }
189
+ }
190
+ }
191
+ }
192
192
  </style>