im-ui-mobile 0.0.48 → 0.0.49

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.
@@ -26,11 +26,11 @@
26
26
 
27
27
  <script setup lang="ts">
28
28
  import ImHeadImage from '../im-head-image/im-head-image.vue'
29
- import datetime from '../../utils/datetime'
30
- import dom from '../../utils/dom'
31
- import messageType from '../../utils/messageType'
32
- import { MESSAGE_TYPE } from '../../utils/enums'
33
- import emoji from '../../utils/emoji';
29
+ import datetime from '../../types/utils/datetime'
30
+ import dom from '../../types/utils/dom'
31
+ import messageType from '../../types/utils/messageType'
32
+ import { MESSAGE_TYPE } from '../../types/utils/enums'
33
+ import emoji from '../../types/utils/emoji';
34
34
 
35
35
  interface Props {
36
36
  chat?: any;
@@ -83,7 +83,7 @@
83
83
  </view>
84
84
  </view>
85
85
  </view>
86
- <im-chat-group-readed ref="chatGroupReaded" :groupMembers="groupMembers" :msgInfo="msgInfo" />
86
+ <im-chat-group-readed ref="chatGroupReaded" :groupMembers="groupMembers as any[]" :msgInfo="msgInfo" />
87
87
  </view>
88
88
  </template>
89
89
 
@@ -91,12 +91,12 @@
91
91
  import ImHeadImage from '../im-head-image/im-head-image.vue'
92
92
  import ImChatGroupReaded from '../im-chat-group-readed/im-chat-group-readed.vue'
93
93
  import ImLongPressMenu from '../im-long-press-menu/im-long-press-menu.vue'
94
- import { MESSAGE_TYPE, MESSAGE_STATUS, } from '../../utils/enums'
95
- import emoji from '../../utils/emoji';
96
- import url from '../../utils/url';
97
- import datetime from '../../utils/datetime';
98
- import messageType from '../../utils/messageType';
99
- import dom from '../../utils/dom';
94
+ import { MESSAGE_TYPE, MESSAGE_STATUS, } from '../../types/utils/enums'
95
+ import emoji from '../../types/utils/emoji';
96
+ import url from '../../types/utils/url';
97
+ import datetime from '../../types/utils/datetime';
98
+ import messageType from '../../types/utils/messageType';
99
+ import dom from '../../types/utils/dom';
100
100
 
101
101
  interface Props {
102
102
  avatar?: string;
@@ -26,8 +26,8 @@
26
26
  </template>
27
27
 
28
28
  <script setup lang="ts">
29
- import recorderApp from '../../utils/recorderApp';
30
- import recorderH5 from '../../utils/recorderH5';
29
+ import recorderApp from '../../types/utils/recorderApp';
30
+ import recorderH5 from '../../types/utils/recorderH5';
31
31
 
32
32
  const recording = ref(false);
33
33
  const moveToCancel = ref(false);
package/libs/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { RTC_STATE, MESSAGE_TYPE } from '../utils/enums'
1
+ import type { RTC_STATE, MESSAGE_TYPE } from '../types/utils/enums'
2
2
 
3
3
 
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "im-ui-mobile",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "description": "A Vue3.0 + typescript instant messaging component library for Uniapp",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/types/index.d.ts CHANGED
@@ -14,11 +14,6 @@ import Requester from "./utils/requester";
14
14
  import * as url from "./utils/url";
15
15
  import { useDynamicRefs } from "./utils/useDynamicRefs";
16
16
  import webSocketManager from "./utils/websocket";
17
- import {
18
- // 枚举类型
19
- RTC_STATE,
20
- MESSAGE_TYPE,
21
- } from './libs';
22
17
  import type {
23
18
  // 类型常量
24
19
  RtcMode,
package/utils/auth.ts DELETED
@@ -1,32 +0,0 @@
1
- export const setToken = (value: string) => {
2
- uni.setStorageSync("accessToken", value);
3
- };
4
-
5
- export const getToken = (): string => {
6
- return uni.getStorageSync("accessToken") || "";
7
- };
8
-
9
- export const setRefreshToken = (value: string) => {
10
- uni.setStorageSync("refreshToken", value);
11
- };
12
-
13
- export const getRefreshToken = (): string => {
14
- return uni.getStorageSync("refreshToken") || "";
15
- };
16
-
17
- export const clearToken = () => {
18
- uni.removeStorageSync("accessToken");
19
- uni.removeStorageSync("refreshToken");
20
- };
21
-
22
- export const setAuth = (data: any) => {
23
- setToken(data.accessToken)
24
- setRefreshToken(data.refreshToken)
25
- uni.setStorageSync('expired', +new Date() + Number(data.expiresIn) * 60 * 60)
26
- }
27
-
28
- export const isAuthed = () => {
29
- const expired = uni.getStorageSync('expired')
30
- const token = getToken()
31
- return !(!expired || expired < +new Date() || !token)
32
- }
package/utils/datetime.ts DELETED
@@ -1,153 +0,0 @@
1
- // 日期时间工具函数
2
-
3
- /**
4
- * 将时间戳转换为相对时间文本
5
- * @param timeStamp - 时间戳
6
- * @param simple - 是否使用简单格式
7
- * @returns 格式化后的时间文本
8
- */
9
- const toTimeText = (timeStamp: number | string | Date, simple?: boolean): string => {
10
- const dateTime = new Date(timeStamp);
11
- const currentTime = Date.now(); // 当前时间戳
12
- const timeDiff = currentTime - dateTime.getTime(); // 与当前时间误差
13
- let timeText = '';
14
-
15
- if (timeDiff <= 60000) { // 一分钟内
16
- timeText = '刚刚';
17
- } else if (timeDiff > 60000 && timeDiff < 3600000) {
18
- // 1小时内
19
- timeText = Math.floor(timeDiff / 60000) + '分钟前';
20
- } else if (timeDiff >= 3600000 && timeDiff < 86400000 && !isYestday(dateTime)) {
21
- // 今日
22
- timeText = formatDateTime(dateTime).substr(11, 5);
23
- } else if (isYestday(dateTime)) {
24
- // 昨天
25
- timeText = '昨天' + formatDateTime(dateTime).substr(11, 5);
26
- } else if (isYear(dateTime)) {
27
- // 今年
28
- timeText = formatDateTime(dateTime).substr(5, simple ? 5 : 14);
29
- } else {
30
- // 不属于今年
31
- timeText = formatDateTime(dateTime);
32
- if (simple) {
33
- timeText = timeText.substr(2, 8);
34
- }
35
- }
36
- return timeText;
37
- }
38
-
39
- /**
40
- * 判断日期是否是昨天
41
- * @param date - 日期对象
42
- * @returns 是否是昨天
43
- */
44
- const isYestday = (date: Date): boolean => {
45
- const yesterday = new Date(Date.now() - 1000 * 60 * 60 * 24);
46
- return yesterday.getFullYear() === date.getFullYear() &&
47
- yesterday.getMonth() === date.getMonth() &&
48
- yesterday.getDate() === date.getDate();
49
- }
50
-
51
- /**
52
- * 判断日期是否在今年
53
- * @param date - 日期对象
54
- * @returns 是否在今年
55
- */
56
- const isYear = (date: Date): boolean => {
57
- return date.getFullYear() === new Date().getFullYear();
58
- }
59
-
60
- /**
61
- * 格式化日期时间为字符串
62
- * @param date - 日期对象或字符串
63
- * @returns 格式化后的日期时间字符串
64
- */
65
- const formatDateTime = (date: string | Date): string => {
66
- if (date === '' || !date) {
67
- return '';
68
- }
69
-
70
- const dateObject = new Date(date);
71
-
72
- // 检查日期是否有效
73
- if (isNaN(dateObject.getTime())) {
74
- return '';
75
- }
76
-
77
- const y = dateObject.getFullYear();
78
- const m = dateObject.getMonth() + 1;
79
- const month = m < 10 ? ('0' + m) : m;
80
- const d = dateObject.getDate();
81
- const day = d < 10 ? ('0' + d) : d;
82
- const h = dateObject.getHours();
83
- const hour = h < 10 ? ('0' + h) : h;
84
- const minute = dateObject.getMinutes();
85
- const min = minute < 10 ? ('0' + minute) : minute;
86
- const second = dateObject.getSeconds();
87
- const sec = second < 10 ? ('0' + second) : second;
88
-
89
- return `${y}/${month}/${day} ${hour}:${min}:${sec}`;
90
- }
91
-
92
- /**
93
- * 获取更精确的相对时间描述
94
- * @param timeStamp - 时间戳
95
- * @returns 精确的相对时间文本
96
- */
97
- const toPreciseTimeText = (timeStamp: number | string | Date): string => {
98
- const dateTime = new Date(timeStamp);
99
- const currentTime = Date.now();
100
- const timeDiff = currentTime - dateTime.getTime();
101
-
102
- if (timeDiff < 60000) {
103
- return `${Math.floor(timeDiff / 1000)}秒前`;
104
- } else if (timeDiff < 3600000) {
105
- const minutes = Math.floor(timeDiff / 60000);
106
- return `${minutes}分钟前`;
107
- } else if (timeDiff < 86400000) {
108
- const hours = Math.floor(timeDiff / 3600000);
109
- return `${hours}小时前`;
110
- } else if (timeDiff < 604800000) {
111
- const days = Math.floor(timeDiff / 86400000);
112
- return `${days}天前`;
113
- } else {
114
- return formatDateTime(dateTime);
115
- }
116
- }
117
-
118
- /**
119
- * 获取聊天界面常用的时间显示格式
120
- * @param timeStamp - 时间戳
121
- * @returns 聊天时间显示文本
122
- */
123
- const toChatTimeText = (timeStamp: number | string | Date): string => {
124
- const dateTime = new Date(timeStamp);
125
- const currentTime = Date.now();
126
- const timeDiff = currentTime - dateTime.getTime();
127
-
128
- // 今天内的消息
129
- if (timeDiff < 86400000 && !isYestday(dateTime)) {
130
- return formatDateTime(dateTime).substr(11, 5);
131
- }
132
- // 昨天的消息
133
- else if (isYestday(dateTime)) {
134
- return '昨天 ' + formatDateTime(dateTime).substr(11, 5);
135
- }
136
- // 今年内的消息
137
- else if (isYear(dateTime)) {
138
- return formatDateTime(dateTime).substr(5, 5); // MM/dd
139
- }
140
- // 往年的消息
141
- else {
142
- return formatDateTime(dateTime).substr(2, 8); // yy/MM/dd
143
- }
144
- }
145
-
146
- export default {
147
- toTimeText,
148
- toPreciseTimeText,
149
- toChatTimeText,
150
- isYestday,
151
- isYear,
152
- formatDateTime
153
- };
package/utils/dom.ts DELETED
@@ -1,148 +0,0 @@
1
- // HTML 转义工具函数
2
-
3
- /**
4
- * HTML 特殊字符转义映射
5
- */
6
- const HTML_ESCAPE_MAP: { [key: string]: string } = {
7
- '<': '&lt;',
8
- '>': '&gt;',
9
- '&': '&amp;',
10
- '"': '&quot;',
11
- "'": '&#39;',
12
- '`': '&#96;'
13
- };
14
-
15
- /**
16
- * 反转的 HTML 转义映射(用于反转义)
17
- */
18
- const HTML_UNESCAPE_MAP: { [key: string]: string } = {
19
- '&lt;': '<',
20
- '&gt;': '>',
21
- '&amp;': '&',
22
- '&quot;': '"',
23
- '&#39;': "'",
24
- '&#96;': '`'
25
- };
26
-
27
- /**
28
- * 将 HTML 特殊字符转义为实体
29
- * @param text - 原始文本
30
- * @returns 转义后的文本
31
- */
32
- const html2Escape = (text: string): string => {
33
- if (!text) return '';
34
-
35
- return text.replace(/[<>&"']/g, (char: string): string => {
36
- return HTML_ESCAPE_MAP[char] || char;
37
- });
38
- }
39
-
40
- /**
41
- * 更全面的 HTML 转义函数(包含更多特殊字符)
42
- * @param text - 原始文本
43
- * @returns 转义后的文本
44
- */
45
- const htmlEscape = (text: string): string => {
46
- if (!text) return '';
47
-
48
- const escapeRegex = /[<>&"'`]/g;
49
- return text.replace(escapeRegex, (char: string): string => {
50
- return HTML_ESCAPE_MAP[char] || char;
51
- });
52
- }
53
-
54
- /**
55
- * 将 HTML 实体反转义为特殊字符
56
- * @param text - 转义后的文本
57
- * @returns 原始文本
58
- */
59
- const htmlUnescape = (text: string): string => {
60
- if (!text) return '';
61
-
62
- const unescapeRegex = /&(lt|gt|amp|quot|#39|#96);/g;
63
- return text.replace(unescapeRegex, (entity: string): string => {
64
- return HTML_UNESCAPE_MAP[entity] || entity;
65
- });
66
- }
67
-
68
- /**
69
- * 转义 HTML 属性值
70
- * @param value - 属性值
71
- * @returns 转义后的属性值
72
- */
73
- const escapeAttribute = (value: string): string => {
74
- if (!value) return '';
75
-
76
- return value
77
- .replace(/"/g, '&quot;')
78
- .replace(/'/g, '&#39;')
79
- .replace(/</g, '&lt;')
80
- .replace(/>/g, '&gt;');
81
- }
82
-
83
- /**
84
- * 转义 HTML 文本内容(不转义单引号)
85
- * @param text - 文本内容
86
- * @returns 转义后的文本内容
87
- */
88
- const escapeTextContent = (text: string): string => {
89
- if (!text) return '';
90
-
91
- return text
92
- .replace(/&/g, '&amp;')
93
- .replace(/</g, '&lt;')
94
- .replace(/>/g, '&gt;')
95
- .replace(/"/g, '&quot;');
96
- }
97
-
98
- /**
99
- * 检查文本是否包含需要转义的 HTML 特殊字符
100
- * @param text - 要检查的文本
101
- * @returns 是否包含特殊字符
102
- */
103
- const hasHtmlSpecialChars = (text: string): boolean => {
104
- if (!text) return false;
105
-
106
- return /[<>&"']/.test(text);
107
- }
108
-
109
- /**
110
- * 安全的设置 innerHTML(自动转义)
111
- * @param element - DOM 元素
112
- * @param html - HTML 内容
113
- */
114
- const setSafeHTML = (element: HTMLElement, html: string): void => {
115
- if (!element) return;
116
-
117
- element.innerHTML = htmlEscape(html);
118
- }
119
-
120
- /**
121
- * 安全的创建 HTML 字符串
122
- * @param strings - 模板字符串数组
123
- * @param values - 插入值数组
124
- * @returns 安全的 HTML 字符串
125
- */
126
- const safeHTML = (strings: TemplateStringsArray, ...values: any[]): string => {
127
- let result = '';
128
-
129
- for (let i = 0; i < strings.length; i++) {
130
- result += strings[i];
131
- if (i < values.length) {
132
- result += htmlEscape(String(values[i]));
133
- }
134
- }
135
-
136
- return result;
137
- }
138
-
139
- export default {
140
- html2Escape,
141
- htmlEscape,
142
- htmlUnescape,
143
- escapeAttribute,
144
- escapeTextContent,
145
- hasHtmlSpecialChars,
146
- setSafeHTML,
147
- safeHTML
148
- };
package/utils/emoji.ts DELETED
@@ -1,99 +0,0 @@
1
- import env from './env'
2
-
3
- // 表情文本列表
4
- const emoTextList: string[] = [
5
- '憨笑', '媚眼', '开心', '坏笑', '可怜', '爱心', '笑哭', '拍手', '惊喜', '打气',
6
- '大哭', '流泪', '饥饿', '难受', '健身', '示爱', '色色', '眨眼', '暴怒', '惊恐',
7
- '思考', '头晕', '大吐', '酷笑', '翻滚', '享受', '鼻涕', '快乐', '雀跃', '微笑',
8
- '贪婪', '红心', '粉心', '星星', '大火', '眼睛', '音符', "叹号", "问号", "绿叶",
9
- "燃烧", "喇叭", "警告", "信封", "房子", "礼物", "点赞", "举手", "拍手", "点头",
10
- "摇头", "偷瞄", "庆祝", "疾跑", "打滚", "惊吓", "起跳"
11
- ];
12
-
13
- // 正则表达式匹配表情文本
14
- const regex: RegExp = /\#[\u4E00-\u9FA5]{1,3}\;/gi;
15
-
16
- /**
17
- * 检查内容是否包含表情符号
18
- * @param content - 要检查的文本内容
19
- * @returns 是否包含表情符号
20
- */
21
- const containEmoji = (content: string): boolean => {
22
- return regex.test(content);
23
- }
24
-
25
- /**
26
- * 将文本中的表情符号转换为图片标签
27
- * @param content - 要转换的文本内容
28
- * @param extClass - 图片的 CSS 类名
29
- * @returns 转换后的 HTML 字符串
30
- */
31
- const transform = (content: string, extClass: string = ''): string => {
32
- return content.replace(regex, (emoText: string): string => {
33
- // 将匹配结果替换表情图片
34
- const word: string = emoText.replace(/\#|\;/gi, '');
35
- const idx: number = emoTextList.indexOf(word);
36
-
37
- if (idx === -1) {
38
- return emoText;
39
- }
40
-
41
- const path: string = textToPath(emoText);
42
- const img: string = `<img src="${path}" class="${extClass}"/>`;
43
- return img;
44
- });
45
- }
46
-
47
- /**
48
- * 将表情文本转换为图片路径
49
- * @param emoText - 表情文本,格式如 "#开心;"
50
- * @returns 表情图片的完整路径
51
- */
52
- const textToPath = (emoText: string): string => {
53
- const word: string = emoText.replace(/\#|\;/gi, '');
54
- const idx: number = emoTextList.indexOf(word);
55
-
56
- // 如果找不到对应的表情,返回空字符串
57
- if (idx === -1) {
58
- return '';
59
- }
60
-
61
- return env.EmojiUrl + idx + ".gif";
62
- }
63
-
64
- /**
65
- * 将表情图片路径转换为表情文本
66
- * @param path - 表情图片路径
67
- * @returns 表情文本,格式如 "#开心;"
68
- */
69
- const pathToText = (path: string): string => {
70
- if (!path || !path.includes(env.EmojiUrl)) {
71
- return '';
72
- }
73
-
74
- try {
75
- // 从路径中提取表情索引
76
- const filename = path.replace(env.EmojiUrl, '').replace('.gif', '');
77
- const index = parseInt(filename);
78
-
79
- // 检查索引是否有效
80
- if (isNaN(index) || index < 0 || index >= emoTextList.length) {
81
- return '';
82
- }
83
-
84
- // 获取对应的表情文本
85
- const emojiText = emoTextList[index];
86
- return `#${emojiText};`;
87
- } catch (error) {
88
- console.error('转换表情路径失败:', error);
89
- return '';
90
- }
91
- }
92
-
93
- export default {
94
- containEmoji,
95
- emoTextList,
96
- transform,
97
- textToPath,
98
- pathToText
99
- }
package/utils/enums.ts DELETED
@@ -1,76 +0,0 @@
1
- /**
2
- * 消息类型枚举
3
- */
4
- export enum MESSAGE_TYPE {
5
- TEXT = 0,
6
- IMAGE = 1,
7
- FILE = 2,
8
- AUDIO = 3,
9
- VIDEO = 4,
10
- RECALL = 10,
11
- READED = 11,
12
- RECEIPT = 12,
13
- TIP_TIME = 20,
14
- TIP_TEXT = 21,
15
- LOADING = 30,
16
- ACT_RT_VOICE = 40,
17
- ACT_RT_VIDEO = 41,
18
- USER_BANNED = 50,
19
- FRIEND_NEW = 80,
20
- FRIEND_DEL = 81,
21
- FRIEND_DND = 82,
22
- GROUP_NEW = 90,
23
- GROUP_DEL = 91,
24
- GROUP_DND = 92,
25
- RTC_CALL_VOICE = 100,
26
- RTC_CALL_VIDEO = 101,
27
- RTC_ACCEPT = 102,
28
- RTC_REJECT = 103,
29
- RTC_CANCEL = 104,
30
- RTC_FAILED = 105,
31
- RTC_HANDUP = 106,
32
- RTC_CANDIDATE = 107,
33
- RTC_GROUP_SETUP = 200,
34
- RTC_GROUP_ACCEPT = 201,
35
- RTC_GROUP_REJECT = 202,
36
- RTC_GROUP_FAILED = 203,
37
- RTC_GROUP_CANCEL = 204,
38
- RTC_GROUP_QUIT = 205,
39
- RTC_GROUP_INVITE = 206,
40
- RTC_GROUP_JOIN = 207,
41
- RTC_GROUP_OFFER = 208,
42
- RTC_GROUP_ANSWER = 209,
43
- RTC_GROUP_CANDIDATE = 210,
44
- RTC_GROUP_DEVICE = 211,
45
- }
46
-
47
- /**
48
- * RTC 状态枚举
49
- */
50
- export enum RTC_STATE {
51
- FREE = 0, // 空闲,可以被呼叫
52
- WAIT_CALL = 1, // 呼叫后等待
53
- WAIT_ACCEPT = 2, // 被呼叫后等待
54
- ACCEPTED = 3, // 已接受聊天,等待建立连接
55
- CHATING = 4, // 聊天中
56
- }
57
-
58
- /**
59
- * 终端类型枚举
60
- */
61
- export enum TERMINAL_TYPE {
62
- WEB = 0,
63
- APP = 1,
64
- }
65
-
66
- /**
67
- * 消息状态枚举
68
- */
69
- export enum MESSAGE_STATUS {
70
- FAILED = -2, // 发送失败
71
- SENDING = -1, // 发送中(消息没到服务器)
72
- PENDING = 0, // 未送达(消息已到服务器,但对方没收到)
73
- DELIVERED = 1, // 已送达(对方已收到,但是未读消息)
74
- RECALL = 2, // 已撤回
75
- READED = 3, // 消息已读
76
- }
package/utils/env.ts DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * 环境变量类
3
- * Created by Joncky 2025.08.15
4
- */
5
-
6
- //设置环境(打包前修改此变量)
7
- const CurrentEnv = "Dev"; // 可选:Dev | Prod
8
-
9
- class Env {
10
- // 表情包路径
11
- static EmojiUrl = "/static/emoji/";
12
-
13
- static AuthApiUrl =
14
- CurrentEnv === "Dev" ? "http://192.168.31.33:5002" : "https://www.boxim.online/api";
15
-
16
- static BaseApiUrl =
17
- CurrentEnv === "Dev" ? "http://192.168.31.33:8888" : "https://www.boxim.online/api";
18
-
19
- static WebSocketUrl =
20
- CurrentEnv === "Dev" ? "ws://192.168.31.33:8878/im" : "wss://www.boxim.online/im";
21
- }
22
-
23
- export default Env;