uniapp-app/store.js
2025-09-16 16:19:29 +08:00

9235 lines
294 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { makeAutoObservable } from 'mobx'
import { logDebug, EventTracking } from '@xkit-yx/utils'
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
var __assign = function () {
__assign =
Object.assign ||
function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i]
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]
}
return t
}
return __assign.apply(this, arguments)
}
function __rest(s, e) {
var t = {}
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p]
if (s != null && typeof Object.getOwnPropertySymbols === 'function')
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (
e.indexOf(p[i]) < 0 &&
Object.prototype.propertyIsEnumerable.call(s, p[i])
)
t[p[i]] = s[p[i]]
}
return t
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value)
})
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value))
} catch (e) {
reject(e)
}
}
function rejected(value) {
try {
step(generator['throw'](value))
} catch (e) {
reject(e)
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected)
}
step((generator = generator.apply(thisArg, _arguments || [])).next())
})
}
function __generator(thisArg, body) {
var _ = {
label: 0,
sent: function () {
if (t[0] & 1) throw t[1]
return t[1]
},
trys: [],
ops: [],
},
f,
y,
t,
g
return (
(g = { next: verb(0), throw: verb(1), return: verb(2) }),
typeof Symbol === 'function' &&
(g[Symbol.iterator] = function () {
return this
}),
g
)
function verb(n) {
return function (v) {
return step([n, v])
}
}
function step(op) {
if (f) throw new TypeError('Generator is already executing.')
while ((g && ((g = 0), op[0] && (_ = 0)), _))
try {
if (
((f = 1),
y &&
(t =
op[0] & 2
? y['return']
: op[0]
? y['throw'] || ((t = y['return']) && t.call(y), 0)
: y.next) &&
!(t = t.call(y, op[1])).done)
)
return t
if (((y = 0), t)) op = [op[0] & 2, t.value]
switch (op[0]) {
case 0:
case 1:
t = op
break
case 4:
_.label++
return { value: op[1], done: false }
case 5:
_.label++
y = op[1]
op = [0]
continue
case 7:
op = _.ops.pop()
_.trys.pop()
continue
default:
if (
!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
(op[0] === 6 || op[0] === 2)
) {
_ = 0
continue
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1]
break
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1]
t = op
break
}
if (t && _.label < t[2]) {
_.label = t[2]
_.ops.push(op)
break
}
if (t[2]) _.ops.pop()
_.trys.pop()
continue
}
op = body.call(thisArg, _)
} catch (e) {
op = [6, e]
y = 0
} finally {
f = t = 0
}
if (op[0] & 5) throw op[1]
return { value: op[0] ? op[1] : void 0, done: true }
}
}
function __values(o) {
var s = typeof Symbol === 'function' && Symbol.iterator,
m = s && o[s],
i = 0
if (m) return m.call(o)
if (o && typeof o.length === 'number')
return {
next: function () {
if (o && i >= o.length) o = void 0
return { value: o && o[i++], done: !o }
},
}
throw new TypeError(
s ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'
)
}
function __read(o, n) {
var m = typeof Symbol === 'function' && o[Symbol.iterator]
if (!m) return o
var i = m.call(o),
r,
ar = [],
e
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value)
} catch (error) {
e = { error: error }
} finally {
try {
if (r && !r.done && (m = i['return'])) m.call(i)
} finally {
if (e) throw e.error
}
}
return ar
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i)
ar[i] = from[i]
}
}
return to.concat(ar || Array.prototype.slice.call(from))
}
typeof SuppressedError === 'function'
? SuppressedError
: function (error, suppressed, message) {
var e = new Error(message)
return (
(e.name = 'SuppressedError'),
(e.error = error),
(e.suppressed = suppressed),
e
)
}
/**Mobx 可观察对象,负责连接的子 store */
var ConnectStore = /** @class */ (function () {
function ConnectStore(rootStore, nim, localOptions) {
this.rootStore = rootStore
this.nim = nim
this.localOptions = localOptions
this.connectStatus = 3
this.loginStatus = 0
this.logger = null
makeAutoObservable(this)
this._onLoginStatus = this._onLoginStatus.bind(this)
this._onLoginFailed = this._onLoginFailed.bind(this)
this._onKickedOffline = this._onKickedOffline.bind(this)
this._onLoginClientChanged = this._onLoginClientChanged.bind(this)
this._onConnectStatus = this._onConnectStatus.bind(this)
this._onDisconnected = this._onDisconnected.bind(this)
this._onConnectFailed = this._onConnectFailed.bind(this)
this._onDataSync = this._onDataSync.bind(this)
this.logger = rootStore.logger
/** 登录状态变化 */
nim.V2NIMLoginService.on('onLoginStatus', this._onLoginStatus)
/** 登录失败 */
nim.V2NIMLoginService.on('onLoginFailed', this._onLoginFailed)
/** 被踢下线 */
nim.V2NIMLoginService.on('onKickedOffline', this._onKickedOffline)
/** 多端登录回调 */
nim.V2NIMLoginService.on('onLoginClientChanged', this._onLoginClientChanged)
/** 连接状态变化 */
nim.V2NIMLoginService.on('onConnectStatus', this._onConnectStatus)
/** 登录连接断开 */
nim.V2NIMLoginService.on('onDisconnected', this._onDisconnected)
/** 登录连接失败 */
nim.V2NIMLoginService.on('onConnectFailed', this._onConnectFailed)
/** 数据同步 */
nim.V2NIMLoginService.on('onDataSync', this._onDataSync)
}
/** 销毁 ConnectStore并取消相关的监听 */
ConnectStore.prototype.destroy = function () {
this.nim.V2NIMLoginService.off('onLoginStatus', this._onLoginStatus)
this.nim.V2NIMLoginService.off('onLoginFailed', this._onLoginFailed)
this.nim.V2NIMLoginService.off('onKickedOffline', this._onKickedOffline)
this.nim.V2NIMLoginService.off(
'onLoginClientChanged',
this._onLoginClientChanged
)
this.nim.V2NIMLoginService.off('onConnectStatus', this._onConnectStatus)
this.nim.V2NIMLoginService.off('onDisconnected', this._onDisconnected)
this.nim.V2NIMLoginService.off('onConnectFailed', this._onConnectFailed)
this.nim.V2NIMLoginService.off('onDataSync', this._onDataSync)
}
ConnectStore.prototype._onLoginStatus = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onLoginStatus', e)
this.loginStatus = e
}
ConnectStore.prototype._onLoginFailed = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onLoginFailed', e)
}
ConnectStore.prototype._onKickedOffline = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onKickedOffline', e)
}
ConnectStore.prototype._onLoginClientChanged = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onLoginClientChanged', e)
}
ConnectStore.prototype._onConnectStatus = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onConnectStatus', e)
this.connectStatus = e
// SDK 暂不支持自定义推送相关
// if (e === V2NIMConnectStatus.V2NIM_CONNECT_STATUS_CONNECTED) {
// // 重连时需要重置其他人的登录状态
// this.rootStore.eventStore.stateMap.clear()
// }
// 同步完成之前需先清理下上次的在线离线状态,避免断开网络 好友退出登录 联网查看好友状态不对。只有在线离线需要处理,因为其他的都会在断网重连后触发其他事件,就在线离线不会触发
// 注意这里必须同步前重置,否则会导致数据同步时的状态丢失
if (
e === 1 /* V2NIMConst.V2NIMConnectStatus.V2NIM_CONNECT_STATUS_CONNECTED */
) {
this.rootStore.subscriptionStore.resetState()
}
}
ConnectStore.prototype._onDisconnected = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onDisconnected', e)
}
ConnectStore.prototype._onConnectFailed = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onConnectFailed', e)
}
ConnectStore.prototype._onDataSync = function (type, V2NIMDataSyncState) {
var _a, _b, _c, _d
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onDataSync', type, V2NIMDataSyncState)
// 获取个人信息
this.rootStore.userStore.getMyUserInfoActive()
// 获取黑名单列表
this.rootStore.relationStore.getBlockListActive()
// 获取P2P免打扰列表
this.rootStore.relationStore.getP2PMuteListActive()
if (
(_b = this.rootStore.sdkOptions) === null || _b === void 0
? void 0
: _b.enableV2CloudConversation
) {
// 获取云端会话列表
;(_c = this.rootStore.conversationStore) === null || _c === void 0
? void 0
: _c.getConversationListActive(
0,
this.localOptions.conversationLimit || 100
)
} else {
// 获取本地会话列表
;(_d = this.rootStore.localConversationStore) === null || _d === void 0
? void 0
: _d.getConversationListActive(
0,
this.localOptions.conversationLimit || 100
)
}
// 获取群组
this.rootStore.teamStore.getJoinedTeamListActive()
// 获取好友列表
this.rootStore.friendStore.getFriendListActive()
// 获取好友申请先拉一页100条
this.rootStore.friendStore.getAddApplicationListActive({
status: [],
offset: 0,
limit: 100,
})
// 获取群组申请先拉一页100条
this.rootStore.teamStore.getTeamJoinActionInfoListActive({
offset: 0,
limit: 100,
})
// 获取 AI 机器人
if (this.localOptions.aiVisible) {
this.rootStore.aiUserStore.getAIUserListActive()
}
}
return ConnectStore
})()
/**Mobx 可观察对象,负责管理好友信息的子 store */
var FriendStore = /** @class */ (function () {
function FriendStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.friends = new Map()
this.logger = null
makeAutoObservable(this)
this._onFriendAdded = this._onFriendAdded.bind(this)
this._onFriendDeleted = this._onFriendDeleted.bind(this)
this._onFriendAddApplication = this._onFriendAddApplication.bind(this)
this._onFriendAddRejected = this._onFriendAddRejected.bind(this)
this._onFriendInfoChanged = this._onFriendInfoChanged.bind(this)
this.logger = rootStore.logger
nim.V2NIMFriendService.on('onFriendAdded', this._onFriendAdded)
nim.V2NIMFriendService.on('onFriendDeleted', this._onFriendDeleted)
/** 申请添加好友的相关信息,其他端向本端发送好友申请,会触发该事件,多端登录情况下也会触发 */
nim.V2NIMFriendService.on(
'onFriendAddApplication',
this._onFriendAddApplication
)
/** 对端拒绝本端好友申请,本端会触发该事件 */
nim.V2NIMFriendService.on('onFriendAddRejected', this._onFriendAddRejected)
/** 好友信息更新回调,返回变更的好友信息,包括本端直接更新的好友信息和其他端同步更新的好友信息 */
nim.V2NIMFriendService.on('onFriendInfoChanged', this._onFriendInfoChanged)
}
FriendStore.prototype.resetState = function () {
this.friends.clear()
}
/**
* 销毁FriendStore会取消好友事件监听
*/
FriendStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMFriendService.off('onFriendAdded', this._onFriendAdded)
this.nim.V2NIMFriendService.off('onFriendDeleted', this._onFriendDeleted)
this.nim.V2NIMFriendService.off(
'onFriendAddApplication',
this._onFriendAddApplication
)
this.nim.V2NIMFriendService.off(
'onFriendAddRejected',
this._onFriendAddRejected
)
this.nim.V2NIMFriendService.off(
'onFriendInfoChanged',
this._onFriendInfoChanged
)
}
/**
* 查询好友列表
*/
FriendStore.prototype.getFriendListActive = function () {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var friends, error_1
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getFriendListActive')
return [4 /*yield*/, this.nim.V2NIMFriendService.getFriendList()]
case 1:
friends = _d.sent()
this.addFriend(friends)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getFriendListActive success', friends)
return [2 /*return*/, friends]
case 2:
error_1 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getFriendListActive failed: ', error_1)
throw error_1
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 根据Id 查询好友信息
*/
FriendStore.prototype.getFriendByIdsActive = function (ids) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var friends, error_2
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getFriendByIdsActive', ids)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.getFriendByIds(ids),
]
case 1:
friends = _d.sent()
this.addFriend(friends)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getFriendByIdsActive success', friends)
return [2 /*return*/, friends]
case 2:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getFriendByIdsActive failed: ', error_2)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取申请添加好友列表通知
* @param options V2NIMFriendAddApplicationQueryOption
*/
FriendStore.prototype.getAddApplicationListActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_3
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getAddApplicationListActive')
return [
4 /*yield*/,
this.nim.V2NIMFriendService.getAddApplicationList(options),
]
case 1:
res = _d.sent()
this.rootStore.sysMsgStore.addFriendApplyMsg(res.infos)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getAddApplicationListActive success', res)
return [2 /*return*/, res]
case 2:
error_3 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getAddApplicationListActive failed: ', error_3)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 添加好友申请
* @param accountId 账号
* @param params 添加好友的配置参数
*/
FriendStore.prototype.addFriendActive = function (accountId, params) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('addFriendActive', accountId)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.addFriend(accountId, params),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('addFriendActive success', accountId, params)
return [3 /*break*/, 3]
case 2:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('addFriendActive failed: ', accountId, params, error_4)
throw error_4
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 接受好友申请
* @param application 申请添加好友的相关信息
*/
FriendStore.prototype.acceptAddApplicationActive = function (application) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('acceptAddApplicationActive', application)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.acceptAddApplication(application),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('acceptAddApplicationActive success', application)
return [3 /*break*/, 3]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'acceptAddApplicationActive failed: ',
application,
error_5
)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 拒绝好友申请
* @param application 申请添加好友的相关信息
* @param postscript 拒绝好友申请的附言
*/
FriendStore.prototype.rejectAddApplicationActive = function (
application,
postscript
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_6
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('rejectAddApplicationActive', application, postscript)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.rejectAddApplication(
application,
postscript
),
// this.rootStore.sysMsgStore.updateFriendApplyMsg([
// {
// ...application,
// status:
// V2NIMConst.V2NIMFriendAddApplicationStatus
// .V2NIM_FRIEND_ADD_APPLICATION_STATUS_REJECTED,
// isRead: true,
// },
// ])
]
case 1:
_d.sent()
// this.rootStore.sysMsgStore.updateFriendApplyMsg([
// {
// ...application,
// status:
// V2NIMConst.V2NIMFriendAddApplicationStatus
// .V2NIM_FRIEND_ADD_APPLICATION_STATUS_REJECTED,
// isRead: true,
// },
// ])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'rejectFriendApplyActive success',
application,
postscript
)
return [3 /*break*/, 3]
case 2:
error_6 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'rejectFriendApplyActive failed: ',
application,
postscript,
error_6
)
throw error_6
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 删除好友
* @param accountId 账号
*/
FriendStore.prototype.deleteFriendActive = function (accountId) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_7
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('deleteFriendActive', accountId)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.deleteFriend(accountId, {
deleteAlias: true,
}),
]
case 1:
_d.sent()
this.removeFriend([accountId])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('deleteFriendActive success', accountId)
return [3 /*break*/, 3]
case 2:
error_7 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('deleteFriendActive failed: ', accountId, error_7)
throw error_7
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 更新好友信息
* @param accountId 账号
* @param params 设置好友信息的配置参数。
*/
FriendStore.prototype.setFriendInfoActive = function (accountId, params) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_8
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('setFriendInfoActive', accountId, params)
return [
4 /*yield*/,
this.nim.V2NIMFriendService.setFriendInfo(accountId, params),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('setFriendInfoActive success', accountId, params)
return [3 /*break*/, 3]
case 2:
error_8 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'setFriendInfoActive failed: ',
accountId,
params,
error_8
)
throw error_8
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 内存中增加好友
* @param data - 好友数组
*/
FriendStore.prototype.addFriend = function (data) {
var _this = this
data
.filter(function (item) {
return !!item.accountId
})
.forEach(function (item) {
var oldFriend = _this.friends.get(item.accountId)
if (!oldFriend) {
_this.friends.set(
item.accountId,
__assign(__assign({}, item), item.userProfile)
)
// 这里不用再去获取用户信息sdk返回的好友信息的userProfile 已经包含用户信息了 此时再去拉取用户信息会有性能问题
// this.rootStore.userStore.getUserActive(item.accountId)
} else {
_this.friends.set(
item.accountId,
__assign(__assign(__assign({}, oldFriend), item), item.userProfile)
)
}
})
this.rootStore.userStore.addUsers(
data.map(function (item) {
return __assign(__assign({}, item), item.userProfile)
})
)
}
/**
* 内存中删除好友
* @param data - 好友数组
*/
FriendStore.prototype.removeFriend = function (accounts) {
var _this = this
accounts.forEach(function (item) {
_this.friends.delete(item)
})
}
/**
* 监听添加好友
*/
FriendStore.prototype._onFriendAdded = function (friend) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onFriendAdded', friend)
this.addFriend([friend])
// 如果存在系统消息,则更新系统消息,这里只能自己是被申请者
this.rootStore.sysMsgStore.updateFriendApplyMsg([
{
operatorAccountId: this.rootStore.userStore.myUserInfo.accountId,
applicantAccountId: friend.accountId,
recipientAccountId: this.rootStore.userStore.myUserInfo.accountId,
timestamp: Date.now(),
status: 1 /* V2NIMConst.V2NIMFriendAddApplicationStatus
.V2NIM_FRIEND_ADD_APPLICATION_STATUS_AGREED */,
isRead: true,
read: true,
},
])
}
/**
* 监听删除好友
*/
FriendStore.prototype._onFriendDeleted = function (accountId) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onFriendDeleted', accountId)
if (accountId) {
this.removeFriend([accountId])
}
}
/**
* 申请添加好友的相关信息,其他端向本端发送好友申请,会触发该事件
*/
FriendStore.prototype._onFriendAddApplication = function (application) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onFriendAddApplication', application)
// 多端登录时,本端发送好友申请,多端登录另一端会收到该事件,此时需要过滤,多端登录另一端不需要提醒
if (
application.applicantAccountId !==
this.rootStore.userStore.myUserInfo.accountId
) {
this.rootStore.sysMsgStore.addFriendApplyMsg([application])
}
}
/**
* 对端拒绝本端好友申请,本端会触发该事件
*/
FriendStore.prototype._onFriendAddRejected = function (rejection) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onFriendAddRejected', rejection)
// 如果存在系统消息,则更新系统消息
this.rootStore.sysMsgStore.addFriendApplyMsg([
__assign(__assign({}, rejection), { isRead: true }),
])
}
/**
* 好友信息更新回调,返回变更的好友信息,包括本端直接更新的好友信息和其他端同步更新的好友信息
*/
FriendStore.prototype._onFriendInfoChanged = function (friend) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onFriendInfoChanged', friend)
this.addFriend([friend])
}
return FriendStore
})()
var AT_ALL_ACCOUNT = 'ait_all'
var BE_MENTIONED = 'beMentioned'
var AT_ALL_ACCOUNT_TOSDK = '#%@all@%#'
var HISTORY_LIMIT = 20
var PIN_CONVERSATION_LIMIT = 20
var RECALL_TIME = 2 * 60 * 1000
var AI_MESSAGE_LIMIT = 30
var constant = /*#__PURE__*/ Object.freeze({
__proto__: null,
AT_ALL_ACCOUNT: AT_ALL_ACCOUNT,
BE_MENTIONED: BE_MENTIONED,
AT_ALL_ACCOUNT_TOSDK: AT_ALL_ACCOUNT_TOSDK,
HISTORY_LIMIT: HISTORY_LIMIT,
PIN_CONVERSATION_LIMIT: PIN_CONVERSATION_LIMIT,
RECALL_TIME: RECALL_TIME,
AI_MESSAGE_LIMIT: AI_MESSAGE_LIMIT,
})
var name$1 = '@xkit-yx/im-store-v2'
var version$1 = '0.8.2'
var description$1 = '云信即时通讯 store V2 版本'
var license$1 = 'MIT'
var main$1 = 'dist/index.cjs.js'
var module = 'dist/index.esm.js'
var typings = 'dist/types/index.d.ts'
var publishConfig = {
access: 'public',
}
var scripts$1 = {
dev: 'rollup -c --environment DEV',
build: 'rollup -c --environment PROD',
}
var files$1 = ['dist']
var author$1 = ''
var devDependencies$1 = {
'@rollup/plugin-commonjs': '^17.1.0',
'@rollup/plugin-json': '^4.1.0',
'@rollup/plugin-node-resolve': '^11.2.0',
del: '^6.0.0',
gulp: '^4.0.2',
'gulp-less': '^5.0.0',
'gulp-rename': '^2.0.0',
'gulp-typescript': '^6.0.0-alpha.1',
less: '^4.1.1',
'less-plugin-npm-import': '^2.1.0',
'nim-web-sdk-ng': '10.9.10',
postcss: '^8.3.5',
'postcss-nested': '^5.0.5',
rollup: '^2.39.0',
'rollup-plugin-postcss': '^4.0.0',
'rollup-plugin-terser': '^7.0.2',
'rollup-plugin-typescript2': '^0.31.0',
tslib: '^2.5.0',
typescript: '^4.6.4',
}
var peerDependencies = {
'nim-web-sdk-ng': '^10.x',
}
var dependencies = {
'@xkit-yx/utils': '^0.7.1',
mobx: '^6.6.1',
}
var packageJson = {
name: name$1,
version: version$1,
description: description$1,
license: license$1,
main: main$1,
module: module,
typings: typings,
publishConfig: publishConfig,
scripts: scripts$1,
files: files$1,
author: author$1,
devDependencies: devDependencies$1,
peerDependencies: peerDependencies,
dependencies: dependencies,
}
var logger = logDebug({
level: 'debug',
version: packageJson.version,
appName: packageJson.name,
needStringify: false,
})
var frequencyControl = function (fn, delay, limit) {
var promiseQueue = []
var requesting = false
var timer
return function (args) {
var _this = this
return new Promise(function (resolve, reject) {
var p = promiseQueue.find(function (item) {
return item.args === args
})
if (p) {
p.queue.push({ resolve: resolve, reject: reject })
} else {
promiseQueue.push({
args: args,
queue: [{ resolve: resolve, reject: reject }],
})
}
if (requesting) {
return
}
var handler = function (pq) {
if (!pq.length) {
return
}
requesting = true
fn.call(
// @ts-ignore
_this,
pq.map(function (item) {
return item.args
})
)
.then(function (res) {
var _loop_1 = function () {
var p_1 = pq.shift()
if (p_1) {
var _1 = res.find(function (j) {
return j.accountId === p_1.args
})
p_1.queue.forEach(function (j) {
return j.resolve(_1)
})
}
}
while (pq.length) {
_loop_1()
}
})
.catch(function (err) {
while (pq.length) {
var p_2 = pq.shift()
if (p_2) {
p_2.queue.forEach(function (item) {
return item.reject(err)
})
}
}
})
.finally(function () {
requesting = false
if (promiseQueue.length) {
handler(promiseQueue.splice(0, limit))
}
})
}
// 如果参数数量到达 limit立即执行
if (promiseQueue.length >= limit) {
clearTimeout(timer)
handler(promiseQueue.splice(0, limit))
} else {
clearTimeout(timer)
timer = setTimeout(function () {
handler(promiseQueue.splice(0, limit))
}, delay)
}
})
}
}
/**
* 过滤消息,处理了撤回消息的过滤
*/
var getFilterMsgs = function (msgs, filterFn) {
var filterMsgs = __spreadArray([], __read(msgs), false)
if (filterFn) {
filterMsgs = filterMsgs.filter(filterFn)
}
var res = []
var filterRecallMsg = []
var startWithoutRecallMsg
filterMsgs.forEach(function (item) {
// 找到第一条不是撤回消息的消息,记录时间
if (
!(
item.messageType ===
100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */ &&
['beReCallMsg', 'reCallMsg'].includes(item.recallType || '')
) &&
startWithoutRecallMsg === void 0
) {
startWithoutRecallMsg = item.createTime
}
// 不在上述时间范围内的撤回消息过滤掉不显示
if (
item.messageType ===
100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */ &&
['beReCallMsg', 'reCallMsg'].includes(item.recallType || '')
) {
if (
startWithoutRecallMsg !== void 0 &&
item.createTime >= startWithoutRecallMsg
) {
res.push(item)
} else {
filterRecallMsg.push(item)
}
} else {
res.push(item)
}
})
// 如果当前只有撤回消息,则需要显示
if (!res.length && filterRecallMsg.length) {
return filterRecallMsg
}
return res
}
var batchRequest = function (fn, max) {
return function (params) {
var args = []
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i]
}
return __awaiter(this, void 0, void 0, function () {
var batches, i, batches_1, batches_1_1, batch, e_1_1
var e_1, _a
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (!!params.length) return [3 /*break*/, 2]
// @ts-ignore
return [4 /*yield*/, fn.apply(this, [params].concat(args))]
case 1:
// @ts-ignore
_b.sent()
_b.label = 2
case 2:
batches = []
for (i = 0; i < params.length; i += max) {
batches.push(params.slice(i, i + max))
}
_b.label = 3
case 3:
_b.trys.push([3, 8, 9, 10])
;(batches_1 = __values(batches)), (batches_1_1 = batches_1.next())
_b.label = 4
case 4:
if (!!batches_1_1.done) return [3 /*break*/, 7]
batch = batches_1_1.value
// @ts-ignore
return [4 /*yield*/, fn.apply(this, [batch].concat(args))]
case 5:
// @ts-ignore
_b.sent()
_b.label = 6
case 6:
batches_1_1 = batches_1.next()
return [3 /*break*/, 4]
case 7:
return [3 /*break*/, 10]
case 8:
e_1_1 = _b.sent()
e_1 = { error: e_1_1 }
return [3 /*break*/, 10]
case 9:
try {
if (batches_1_1 && !batches_1_1.done && (_a = batches_1.return))
_a.call(batches_1)
} finally {
if (e_1) throw e_1.error
}
return [7 /*endfinally*/]
case 10:
return [2 /*return*/]
}
})
})
}
}
var utils = /*#__PURE__*/ Object.freeze({
__proto__: null,
logDebug: logDebug,
logger: logger,
frequencyControl: frequencyControl,
getFilterMsgs: getFilterMsgs,
batchRequest: batchRequest,
})
var Queue = /** @class */ (function () {
/**
* @param itemLength 队列长度
* @param flow 队列方向
*/
function Queue(itemLength, flow) {
if (itemLength === void 0) {
itemLength = 20
}
if (flow === void 0) {
flow = 'rightToLeft'
}
this.itemLength = itemLength
this.flow = flow
this.queue = []
makeAutoObservable(this)
}
Queue.prototype.push = function (item, noLimit) {
this.queue.push(item)
this._handle(noLimit)
}
Queue.prototype.unshift = function (item, noLimit) {
this.queue.unshift(item)
this._handle(noLimit)
}
Queue.prototype.pop = function () {
return this.queue.pop()
}
Queue.prototype.shift = function () {
return this.queue.shift()
}
Queue.prototype.resetLimitState = function () {
this._handle()
}
Queue.prototype.clear = function () {
this.queue.length = 0
}
Queue.prototype.get = function () {
return this.queue
}
Queue.prototype.set = function (value, noLimit) {
this.queue = value
this._handle(noLimit)
}
Object.defineProperty(Queue.prototype, 'length', {
get: function () {
return this.queue.length
},
enumerable: false,
configurable: true,
})
Queue.prototype._handle = function (noLimit) {
if (noLimit === void 0) {
noLimit = false
}
if (this.queue.length > this.itemLength && !noLimit) {
if (this.flow === 'leftToRight') {
this.queue.splice(this.itemLength, this.queue.length - this.itemLength)
} else {
this.queue.splice(0, this.queue.length - this.itemLength)
}
}
}
return Queue
})()
var QueueMap = /** @class */ (function () {
function QueueMap(itemLength, flow) {
if (itemLength === void 0) {
itemLength = 20
}
if (flow === void 0) {
flow = 'rightToLeft'
}
this.itemLength = itemLength
this.flow = flow
this.map = new Map()
makeAutoObservable(this)
}
QueueMap.prototype.get = function (key) {
var _a
return (_a = this.map.get(key)) === null || _a === void 0
? void 0
: _a.get()
}
QueueMap.prototype.set = function (key, value, noLimit) {
var queue = new Queue(this.itemLength, this.flow)
queue.set(value, noLimit)
this.map.set(key, queue)
}
QueueMap.prototype.delete = function (key) {
var _a
;(_a = this.map.get(key)) === null || _a === void 0 ? void 0 : _a.clear()
return this.map.delete(key)
}
QueueMap.prototype.resetLimitState = function () {
this.map.forEach(function (item) {
return item.resetLimitState()
})
}
QueueMap.prototype.clear = function () {
this.map.forEach(function (item) {
return item.clear()
})
this.map.clear()
}
QueueMap.prototype.values = function () {
return __spreadArray([], __read(this.map.values()), false)
.map(function (item) {
return item.get()
})
.flat()
}
return QueueMap
})()
var PinMsgsMap = /** @class */ (function () {
function PinMsgsMap(limit) {
if (limit === void 0) {
limit = PIN_CONVERSATION_LIMIT
}
this.map = new Map()
this.pinConversationLimit = PIN_CONVERSATION_LIMIT
this.pinConversationLimit = limit
makeAutoObservable(this)
}
PinMsgsMap.prototype.set = function (conversationId, pinInfos) {
var map = this.map.get(conversationId) || new Map()
if (this.map.has(conversationId)) {
// 更新 LRU 队列
this.map.delete(conversationId)
}
pinInfos.forEach(function (pinInfo) {
if (pinInfo.pinState !== 0) {
map.set(pinInfo.messageRefer.messageClientId, pinInfo)
} else {
// map 里面不维护 pinState 为 0 的 pin
map.delete(pinInfo.messageRefer.messageClientId)
}
})
this.map.set(conversationId, map)
if (this.map.size > this.pinConversationLimit) {
var val = this.map.keys().next().value
// 最近最少用的出队
if (val) this.map.delete(val)
}
}
PinMsgsMap.prototype.get = function (conversationId) {
var map = this.map.get(conversationId)
if (map) {
// 更新 LRU 队列
this.map.delete(conversationId)
this.map.set(conversationId, map)
return map
} else {
return null
}
}
PinMsgsMap.prototype.delete = function (conversationId, messageClientIds) {
var curMap = this.map.get(conversationId)
if (curMap) {
// 更新 LRU 队列
this.map.delete(conversationId)
messageClientIds.forEach(function (messageClientId) {
curMap.delete(messageClientId)
})
this.map.set(conversationId, curMap)
}
}
PinMsgsMap.prototype.clear = function () {
if (this.map) {
this.map.forEach(function (map) {
map.clear()
})
this.map.clear()
}
}
return PinMsgsMap
})()
var PinMsgsMap$1 = PinMsgsMap
/**Mobx 可观察对象,负责管理会话消息的子 store */
var MsgStore = /** @class */ (function () {
function MsgStore(rootStore, nim, localOptions) {
this.rootStore = rootStore
this.nim = nim
this.localOptions = localOptions
this.msgs = new QueueMap(HISTORY_LIMIT, 'rightToLeft')
/** 回复消息 */
this.replyMsgs = new Map()
this.logger = null
/** pin 消息 */
this.pinMsgs = new PinMsgsMap$1()
/** 收藏消息 */
this.collectionMsgs = new Map()
makeAutoObservable(this)
this.logger = rootStore.logger
this._onReceiveMessages = this._onReceiveMessages.bind(this)
this._onClearHistoryNotifications =
this._onClearHistoryNotifications.bind(this)
this._onMessageDeletedNotifications =
this._onMessageDeletedNotifications.bind(this)
this._onMessagePinNotification = this._onMessagePinNotification.bind(this)
this._onMessageQuickCommentNotification =
this._onMessageQuickCommentNotification.bind(this)
this._onMessageRevokeNotifications =
this._onMessageRevokeNotifications.bind(this)
this._onReceiveP2PMessageReadReceipts =
this._onReceiveP2PMessageReadReceipts.bind(this)
this._onReceiveTeamMessageReadReceipts =
this._onReceiveTeamMessageReadReceipts.bind(this)
this._onReceiveMessagesModified = this._onReceiveMessagesModified.bind(this)
this.getTeamMsgReadsActive = batchRequest(this.getTeamMsgReadsActive, 50)
/** 收到消息 */
nim.V2NIMMessageService.on('onReceiveMessages', this._onReceiveMessages)
/** 清空会话历史消息通知 */
nim.V2NIMMessageService.on(
'onClearHistoryNotifications',
this._onClearHistoryNotifications
)
/** 消息被删除通知 */
nim.V2NIMMessageService.on(
'onMessageDeletedNotifications',
this._onMessageDeletedNotifications
)
/** 收到消息 pin 状态更新 */
nim.V2NIMMessageService.on(
'onMessagePinNotification',
this._onMessagePinNotification
)
/** 收到消息快捷评论更新 */
nim.V2NIMMessageService.on(
'onMessageQuickCommentNotification',
this._onMessageQuickCommentNotification
)
/** 收到消息撤回通知 消息 */
nim.V2NIMMessageService.on(
'onMessageRevokeNotifications',
this._onMessageRevokeNotifications
)
/** 收到点对点消息的已读回执 */
nim.V2NIMMessageService.on(
'onReceiveP2PMessageReadReceipts',
this._onReceiveP2PMessageReadReceipts
)
/** 收到群消息的已读回执 */
nim.V2NIMMessageService.on(
'onReceiveTeamMessageReadReceipts',
this._onReceiveTeamMessageReadReceipts
)
/**
* 收到消息更新事件
*
* 1. 收到更新消息在线同步通知
* 2. 收到更新消息多端同步通知
* 3. 收到更新消息漫游通知
*/
nim.V2NIMMessageService.on(
'onReceiveMessagesModified',
this._onReceiveMessagesModified
)
}
MsgStore.prototype.resetState = function () {
this.msgs.clear()
this.replyMsgs.clear()
this.pinMsgs.clear()
}
/**
* 销毁MsgStore会取消消息相关事件监听
*/
MsgStore.prototype.destroy = function () {
var _this = this
this.resetState()
this.nim.V2NIMMessageService.off(
'onReceiveMessages',
this._onReceiveMessages
)
this.nim.V2NIMMessageService.off(
'onClearHistoryNotifications',
this._onClearHistoryNotifications
)
this.nim.V2NIMMessageService.off(
'onMessageDeletedNotifications',
this._onMessageDeletedNotifications
)
this.nim.V2NIMMessageService.off(
'onMessagePinNotification',
this._onMessagePinNotification
)
this.nim.V2NIMMessageService.off(
'onMessageQuickCommentNotification',
this._onMessageQuickCommentNotification
)
this.nim.V2NIMMessageService.off(
'onMessageRevokeNotifications',
this._onMessageRevokeNotifications
)
this.nim.V2NIMMessageService.off(
'onReceiveP2PMessageReadReceipts',
this._onReceiveP2PMessageReadReceipts
)
this.nim.V2NIMMessageService.off(
'onReceiveTeamMessageReadReceipts',
this._onReceiveTeamMessageReadReceipts
)
this.getMsg().forEach(function (msg) {
_this._handleClearMsgTimer(msg)
})
}
/**
* 回复消息
* @param msg 消息对象
*/
MsgStore.prototype.replyMsgActive = function (msg) {
if (msg === null || msg === void 0 ? void 0 : msg.conversationId) {
this.replyMsgs.set(msg.conversationId, msg)
}
}
/**
* 回复消息
* @param msg 消息对象
*/
MsgStore.prototype.removeReplyMsgActive = function (conversationId) {
this.replyMsgs.delete(conversationId)
}
/**
* 获取回复消息
* @param conversationId
* @returns
*/
MsgStore.prototype.getReplyMsgActive = function (conversationId) {
var msg = this.replyMsgs.get(conversationId)
if (msg) {
return this.handleMsgForSDK(msg)
}
}
/**
* 撤回消息
* @param msg 消息对象
*/
MsgStore.prototype.reCallMsgActive = function (msg) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var recallMsg, error_1
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('reCallMsgActive', msg)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.revokeMessage(
this.handleMsgForSDK(msg)
),
]
case 1:
_d.sent()
this.removeMsg(msg.conversationId, [msg.messageClientId])
recallMsg = this._createReCallMsg(msg)
this.addMsg(recallMsg.conversationId, [recallMsg])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('reCallMsgActive success', msg)
return [3 /*break*/, 3]
case 2:
error_1 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('reCallMsgActive failed: ', msg, error_1)
throw error_1
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 单向删除消息
* @param msgs 消息对象数组
*/
MsgStore.prototype.deleteMsgActive = function (msgs) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var conversationId, messageClientIds, error_2
var _this = this
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('deleteMsgActive', msgs)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.deleteMessages(
msgs.map(function (item) {
return _this.handleMsgForSDK(item)
})
),
]
case 1:
_d.sent()
conversationId = msgs[0].conversationId
if (conversationId) {
messageClientIds = msgs.map(function (item) {
return item.messageClientId
})
this.removeMsg(conversationId, messageClientIds)
}
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('deleteMsgActive success', msgs)
return [3 /*break*/, 3]
case 2:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.warn(
'deleteMsgActive failed, but delete msgs from memory: ',
msgs,
error_2
)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 回复消息
* @param msgs 消息对象
* @param repliedMessages 被回复的消息对象
* @param conversationId 会话id
*/
MsgStore.prototype.replyMessageByThreadActive = function (
message,
repliedMessage,
conversationId,
params
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var result, error_3
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('replyMessageByThreadActive', message, repliedMessage)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.replyMessage(
message,
repliedMessage,
params
),
]
case 1:
result = _d.sent()
this.removeReplyMsgActive(conversationId)
this._handleSendMsgSuccess(result.message)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'replyMessageByThreadActive success',
{ message: message, repliedMessage: repliedMessage },
result
)
return [3 /*break*/, 3]
case 2:
error_3 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'replyMessageByThreadActive fail',
message,
repliedMessage
)
message.threadReply = repliedMessage
this._handleSendMsgSuccess(message)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 发送消息
* @param __namedParameters.msg - 消息对象
* @param __namedParameters.conversationId - 会话id
* @param __namedParameters.conversationType - 会话类型
* @param __namedParameters.progress - progress 进度回调
* @param __namedParameters.sendBefore - sendBefore 进度回调
* @param __namedParameters.serverExtension - 扩展字段
* @param __namedParameters.previewImg - 预览图片,一般用于发送图片和视频消息
* @param __namedParameters.onAISend - AI 单聊或 at AI 发送成功后的回调
*/
MsgStore.prototype.sendMessageActive = function (params) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j
return __awaiter(this, void 0, void 0, function () {
var msg,
conversationId,
conversationType,
progress,
sendBefore,
serverExtension,
previewImg,
onAISend,
newMsg,
finalServerExtension,
sendMsgParams,
aiConfig,
finalAIConfig,
finalParams,
replyMsg,
message,
error_4
var _this = this
return __generator(this, function (_k) {
switch (_k.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('sendMessageActive', params)
;(msg = params.msg),
(conversationId = params.conversationId),
(conversationType = params.conversationType),
(progress = params.progress),
(sendBefore = params.sendBefore),
(serverExtension = params.serverExtension),
(previewImg = params.previewImg),
(onAISend = params.onAISend)
newMsg = __assign({}, msg)
finalServerExtension = {}
// @ts-ignore 发送回复消息旧模式使用ext实现有一系列缺点
if (
(_b = this.localOptions) === null || _b === void 0
? void 0
: _b.sendReplyMsgByExt
) {
finalServerExtension = this._formatExtField(
conversationId,
serverExtension || JSON.parse(newMsg.serverExtension || '{}')
)
} else {
finalServerExtension =
serverExtension || JSON.parse(newMsg.serverExtension || '{}')
}
newMsg.serverExtension = Object.keys(finalServerExtension).length
? JSON.stringify(finalServerExtension)
: void 0
newMsg.senderId = this.rootStore.userStore.myUserInfo.accountId
newMsg.receiverId =
this.nim.V2NIMConversationIdUtil.parseConversationTargetId(
conversationId
)
newMsg.conversationId = conversationId
if (conversationType !== void 0) {
newMsg.conversationType = conversationType
}
newMsg.sendingState = 3 /* V2NIMConst.V2NIMMessageSendingState.V2NIM_MESSAGE_SENDING_STATE_SENDING */
if (previewImg) {
newMsg.previewImg = previewImg
}
if (progress) {
newMsg.uploadProgress = 0
}
_k.label = 1
case 1:
_k.trys.push([1, 6, , 7])
return [
4 /*yield*/,
(_d = (_c = this.localOptions).sendMsgBefore) === null ||
_d === void 0
? void 0
: _d.call(_c, params),
]
case 2:
sendMsgParams = _k.sent()
if (sendMsgParams === false) {
;(_e = this.logger) === null || _e === void 0
? void 0
: _e.log('sendMessageActive cancel', params, sendMsgParams)
return [2 /*return*/]
}
aiConfig = this._getAIConfig(newMsg)
// 先插入这条消息,快速让消息上屏
this.addMsg(newMsg.conversationId, [newMsg])
sendBefore === null || sendBefore === void 0
? void 0
: sendBefore(newMsg)
finalAIConfig =
aiConfig ||
(sendMsgParams === null || sendMsgParams === void 0
? void 0
: sendMsgParams.aiConfig)
? __assign(
__assign({}, aiConfig),
sendMsgParams === null || sendMsgParams === void 0
? void 0
: sendMsgParams.aiConfig
)
: void 0
finalParams = __assign(__assign({}, sendMsgParams), {
pushConfig:
(sendMsgParams === null || sendMsgParams === void 0
? void 0
: sendMsgParams.pushConfig) ||
((
finalServerExtension === null ||
finalServerExtension === void 0
? void 0
: finalServerExtension.yxAitMsg
)
? this._formatExtAitToPushInfo(
finalServerExtension.yxAitMsg,
newMsg.text || ''
)
: void 0),
messageConfig: __assign(
{
// 需要开启已读回执
readReceiptEnabled: true,
},
sendMsgParams === null || sendMsgParams === void 0
? void 0
: sendMsgParams.messageConfig
),
aiConfig: finalAIConfig,
})
;(_f = this.logger) === null || _f === void 0
? void 0
: _f.log(
'sendMessageActive finalParams: ',
newMsg,
conversationId,
finalParams
)
replyMsg = this.getReplyMsgActive(conversationId)
if (
!(
replyMsg &&
!((_g = this.localOptions) === null || _g === void 0
? void 0
: _g.sendReplyMsgByExt)
)
)
return [3 /*break*/, 4]
newMsg.serverExtension = Object.keys(finalServerExtension).length
? JSON.stringify(finalServerExtension)
: void 0
return [
4 /*yield*/,
this.replyMessageByThreadActive(
newMsg,
replyMsg,
conversationId,
finalParams
),
]
case 3:
_k.sent()
sendBefore === null || sendBefore === void 0
? void 0
: sendBefore(newMsg)
return [2 /*return*/]
case 4:
return [
4 /*yield*/,
this.nim.V2NIMMessageService.sendMessage(
newMsg,
conversationId,
finalParams,
function (percentage) {
var shouldContinue =
progress === null || progress === void 0
? void 0
: progress(percentage)
if (shouldContinue) {
var _msg = _this.getMsg(conversationId, [
newMsg.messageClientId,
])[0]
if (_msg) {
_this.addMsg(conversationId, [
__assign(__assign({}, _msg), {
uploadProgress: percentage,
}),
])
}
}
}
),
]
case 5:
message = _k.sent().message
if (finalAIConfig) {
onAISend === null || onAISend === void 0
? void 0
: onAISend(message, finalAIConfig)
}
//uploadProgress 为UI层需要的字段当sendMessage返回时uploadProgress必为100
if (
msg.messageType ===
6 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_FILE */ ||
msg.messageType ===
1 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_IMAGE */ ||
msg.messageType ===
3 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_VIDEO */
) {
// @ts-expect-error
message.uploadProgress = 100
}
this._handleSendMsgSuccess(message)
;(_h = this.logger) === null || _h === void 0
? void 0
: _h.log('sendMessageActive success', message)
if (
newMsg.messageType ===
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */
) {
this.removeReplyMsgActive(conversationId)
}
return [2 /*return*/, message]
case 6:
error_4 = _k.sent()
;(_j = this.logger) === null || _j === void 0
? void 0
: _j.error(
'sendMessageActive failed: ',
error_4.toString(),
newMsg
)
// 手动取消上传
if (error_4.code === 191002) {
this.removeMsg(conversationId, [newMsg.messageClientId])
} else {
this._handleSendMsgFail(newMsg, error_4.code)
}
if (
newMsg.messageType ===
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */
) {
this.removeReplyMsgActive(conversationId)
}
throw error_4
case 7:
return [2 /*return*/]
}
})
})
}
/**
* 取消上传
* @param msg 消息对象
*/
MsgStore.prototype.cancelMessageAttachmentUploadActive = function (msg) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('cancelMessageAttachmentUploadActive', msg)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.cancelMessageAttachmentUpload(
this.handleMsgForSDK(msg)
),
]
case 1:
_d.sent()
this.removeMsg(msg.conversationId, [msg.messageClientId])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('cancelMessageAttachmentUploadActive success', msg)
return [3 /*break*/, 3]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'cancelMessageAttachmentUploadActive failed: ',
msg,
error_5
)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 发送 p2p 消息已读回执
* @param msg 消息对象
*/
MsgStore.prototype.sendMsgReceiptActive = function (msg) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_6
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('sendMsgReceiptActive', msg)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.sendP2PMessageReceipt(
this.handleMsgForSDK(msg)
),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('sendMsgReceiptActive success', msg)
return [3 /*break*/, 3]
case 2:
error_6 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'sendMsgReceiptActive failed: ',
msg,
error_6.toString()
)
throw error_6
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 添加一个收藏
* @param params 添加收藏的相关参数
*/
MsgStore.prototype.addCollectionActive = function (params) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_7
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('addCollectionActive', params)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.addCollection(params),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('addCollectionActive success', params)
return [3 /*break*/, 3]
case 2:
error_7 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'addCollectionActive failed: ',
params,
error_7.toString()
)
throw error_7
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 移除相关收藏
* @param collections 需要移除的相关收藏
*/
MsgStore.prototype.removeCollectionsActive = function (collections) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_8
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('removeCollectionsActive', collections)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.removeCollections(collections),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('removeCollectionsActive success', collections)
return [3 /*break*/, 3]
case 2:
error_8 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'removeCollectionsActive failed: ',
collections,
error_8.toString()
)
throw error_8
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取收藏列表
* @param option 查询参数
*/
MsgStore.prototype.getCollectionListByOptionActive = function (option) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_9
var _this = this
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
res = []
_d.label = 1
case 1:
_d.trys.push([1, 3, , 4])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getCollectionListByOptionActive', option)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getCollectionListByOption(option),
]
case 2:
res = _d.sent()
res.forEach(function (item) {
var collectionData = JSON.parse(item.collectionData)
// 反序列化
var msg = _this.nim.V2NIMMessageConverter.messageDeserialization(
collectionData.message
)
if (msg) {
_this.collectionMsgs.set(msg.messageClientId, msg)
}
})
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getCollectionListByOptionActive success', option)
return [3 /*break*/, 4]
case 3:
error_9 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getCollectionListByOptionActive failed: ',
option,
error_9.toString()
)
throw error_9
case 4:
return [2 /*return*/, res]
}
})
})
}
/**
* 发送群组消息已读回执
* @param msgs 消息数组
*/
MsgStore.prototype.sendTeamMsgReceiptActive = function (msgs) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var finalMsgs, error_10
var _this = this
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 3, , 4])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('sendTeamMsgReceiptActive', msgs)
if (!msgs.length) return [3 /*break*/, 2]
finalMsgs = msgs.map(function (item) {
return _this.handleMsgForSDK(item)
})
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('sendTeamMsgReceiptActive finalParams: ', finalMsgs)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.sendTeamMessageReceipts(finalMsgs),
]
case 1:
_e.sent()
_e.label = 2
case 2:
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('sendTeamMsgReceiptActive success', msgs)
return [3 /*break*/, 4]
case 3:
error_10 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error(
'sendTeamMsgReceiptActive failed: ',
msgs,
error_10.toString()
)
throw error_10
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 获取群消息已读未读详情
* @param message 消息
*/
MsgStore.prototype.getTeamMessageReceiptDetailsActive = function (
message,
memberAccountIds
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_11
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'getTeamMessageReceiptDetailsActive',
message,
memberAccountIds
)
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getTeamMessageReceiptDetail(
message,
memberAccountIds
),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'getTeamMessageReceiptDetailsActive success:',
message,
memberAccountIds,
res
)
return [2 /*return*/, res]
case 2:
error_11 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getTeamMessageReceiptDetailsActive failed: ',
message,
memberAccountIds,
error_11.toString()
)
throw error_11
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取历史消息
* @param options.conversationId - 消息所属的会话的ID
* @param options.endTime - 结束时间戳, 精确到 ms, 默认为服务器的当前时间
* @param options.lastMsgId - 上次查询的最后一条消息的 messageServerId, 第一次不填
* @param options.limit - 本次查询的消息数量限制, 最多 100 条, 默认 100 条
*/
MsgStore.prototype.getHistoryMsgActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var conversationId,
endTime,
lastMsgId,
_d,
limit,
conversationType,
finalParams,
anchorMessage,
msgs,
myMsgs,
error_12
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 4, , 5])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getHistoryMsgActive', options)
;(conversationId = options.conversationId),
(endTime = options.endTime),
(lastMsgId = options.lastMsgId),
(_d = options.limit),
(limit = _d === void 0 ? 100 : _d)
conversationType =
this.nim.V2NIMConversationIdUtil.parseConversationType(
conversationId
)
finalParams = {
conversationId: conversationId,
endTime: endTime,
limit: limit,
}
if (lastMsgId) {
anchorMessage = this.getMsg(conversationId, [lastMsgId])[0]
if (anchorMessage) {
finalParams.anchorMessage = anchorMessage
}
}
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getMessageList(finalParams),
]
case 1:
msgs = _e.sent()
this.addMsg(conversationId, msgs)
if (
!(
conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ &&
this.rootStore.localOptions.teamMsgReceiptVisible
)
)
return [3 /*break*/, 3]
myMsgs = msgs
.filter(function (item) {
return item.isSelf
})
.filter(function (item) {
return ![
5 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_NOTIFICATION */,
10 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TIPS */,
].includes(item.messageType)
})
return [
4 /*yield*/,
this.getTeamMsgReadsActive(myMsgs, conversationId),
]
case 2:
_e.sent()
_e.label = 3
case 3:
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'getHistoryMsgActive success',
options,
finalParams,
msgs
)
return [2 /*return*/, msgs]
case 4:
error_12 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getHistoryMsgActive failed: ',
options,
error_12.toString()
)
throw error_12
case 5:
return [2 /*return*/]
}
})
})
}
/**
* 转发消息
* @param msg - 消息对象
* @param conversationId - 会话id
* @param comment - 评论
*/
MsgStore.prototype.forwardMsgActive = function (
msg,
conversationId,
comment
) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var serverExtension, deleteKeys, finalMsg, forwardMsg, textMsg, error_13
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 5, , 6])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('forwardMsgActive', msg, conversationId, comment)
serverExtension =
msg === null || msg === void 0 ? void 0 : msg.serverExtension
if (serverExtension) {
try {
serverExtension = JSON.parse(serverExtension)
// @ts-ignore
delete serverExtension.yxReplyMsg
// @ts-ignore
delete serverExtension.yxAitMsg
serverExtension = JSON.stringify(serverExtension)
} catch (error) {
//
}
}
deleteKeys = ['canRecall', 'reCallTimer', 'yxUnread', 'yxRead']
deleteKeys.forEach(function (key) {
delete msg[key]
})
// 之前 IM2 sdk 有问题,这边先保留
if (
((_b = msg.pushConfig) === null || _b === void 0
? void 0
: _b.pushContent) === ''
) {
delete msg.pushConfig.pushContent
}
finalMsg = this.handleMsgForSDK(
__assign(__assign({}, msg), { serverExtension: serverExtension })
)
forwardMsg =
this.nim.V2NIMMessageCreator.createForwardMessage(finalMsg)
if (!forwardMsg) return [3 /*break*/, 2]
return [
4 /*yield*/,
this.sendMessageActive({
msg: forwardMsg,
conversationId: conversationId,
}),
]
case 1:
_e.sent()
_e.label = 2
case 2:
if (!comment) return [3 /*break*/, 4]
textMsg = this.nim.V2NIMMessageCreator.createTextMessage(comment)
return [
4 /*yield*/,
this.sendMessageActive({
msg: textMsg,
conversationId: conversationId,
}),
]
case 3:
_e.sent()
_e.label = 4
case 4:
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('forwardMsgActive success', msg, conversationId, comment)
return [3 /*break*/, 6]
case 5:
error_13 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error('forwardMsgActive failed: ', error_13)
throw error_13
case 6:
return [2 /*return*/]
}
})
})
}
/**
* 获取群组消息已读未读数
* @param msgs 消息数组
* @param conversationId 会话id
*/
MsgStore.prototype.getTeamMsgReadsActive = function (msgs, conversationId) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var res, error_14, newMsgs
var _this = this
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamMsgReadsActive', msgs, conversationId)
res = []
if (!msgs.length) return [3 /*break*/, 4]
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getTeamMessageReceipts(
msgs.map(function (item) {
return _this.handleMsgForSDK(item)
})
),
]
case 2:
res = _c.sent()
return [3 /*break*/, 4]
case 3:
error_14 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'getTeamMsgReadsActive failed but continue: ',
error_14.toString()
)
return [3 /*break*/, 4]
case 4:
newMsgs = msgs
.filter(function (msg) {
return res.some(function (status) {
return msg.messageClientId === status.messageClientId
})
})
.map(function (item) {
var teamMsgReceipt = res.find(function (j) {
return j.messageClientId === item.messageClientId
})
if (teamMsgReceipt) {
return _this._updateReceiptMsg(item, {
unread: teamMsgReceipt.unreadCount,
read: teamMsgReceipt.readCount,
})
}
return item
})
this.addMsg(conversationId, newMsgs)
return [2 /*return*/]
}
})
})
}
/**
* pin 一条消息
* @param message 需要被 pin 的消息体
* @param serverExtension 扩展字段
*/
MsgStore.prototype.pinMessageActive = function (message, serverExtension) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var error_15
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('pinMessageActive', message, serverExtension)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.pinMessage(message, serverExtension),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
error_15 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'pinMessageActive failed but continue: ',
error_15.toString()
)
// 这里需要把错误抛出去,让 ui 层感知到
throw error_15
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 取消一条Pin消息
* @param messageRefer 需要被取消 pin 的消息摘要
* @param serverExtension 扩展字段
*/
MsgStore.prototype.unpinMessageActive = function (
messageRefer,
serverExtension
) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var error_16
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('uppinMessageActive', messageRefer, serverExtension)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.unpinMessage(
messageRefer,
serverExtension
),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
error_16 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'uppinMessageActive failed but continue: ',
error_16.toString()
)
// 这里需要把错误抛出去,让 ui 层感知到
throw error_16
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 取消一条Pin消息
* @param messageRefer 需要被取消 pin 的消息摘要
* @param serverExtension 扩展字段
*/
MsgStore.prototype.updatePinMessageActive = function (
message,
serverExtension
) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var error_17
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('updatePinMessageActive', message, serverExtension)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.updatePinMessage(
message,
serverExtension
),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
error_17 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'updatePinMessageActive failed but continue: ',
error_17.toString()
)
// 这里需要把错误抛出去,让 ui 层感知到
throw error_17
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 获取 pin 消息列表
* @param conversationId 会话id
*/
MsgStore.prototype.getPinnedMessageListActive = function (conversationId) {
return __awaiter(this, void 0, void 0, function () {
var curPinMsgsMap, pinInfos
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
curPinMsgsMap = this.pinMsgs.get(conversationId)
pinInfos = []
if (!curPinMsgsMap) return [3 /*break*/, 1]
// 如果内存里面有,从内存里面获取
pinInfos = __spreadArray([], __read(curPinMsgsMap.values()), false)
return [3 /*break*/, 3]
case 1:
return [
4 /*yield*/,
this._getPinnedMessageListByServer(conversationId),
]
case 2:
// 这里不做 try catch底层方法已处理
// 如果内存里面没有,那么像服务器获取
pinInfos = _a.sent()
_a.label = 3
case 3:
return [
4 /*yield*/,
this.completePinnedMessageList(conversationId, pinInfos),
// 这里
]
case 4:
// 这里不做 try catch底层方法已处理
// 补全 pinInfos message 信息
pinInfos = _a.sent()
// 这里
pinInfos = pinInfos
.filter(function (pinInfo) {
return pinInfo.pinState > 0 && pinInfo.message
})
.sort(function (a, b) {
return b.message.createTime - a.message.createTime
})
return [2 /*return*/, pinInfos]
}
})
})
}
/**
* 停止流式输出
* @param message 消息体
* @param params 停止模式等入参
*/
MsgStore.prototype.stopAIStreamMessageActive = function (message, params) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var error_18
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('stopAIStreamMessageActive', message)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.stopAIStreamMessage(message, params),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
error_18 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.error(
'stopAIStreamMessageActive failed ',
error_18.toString()
)
throw error_18
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 重新生成 ai 消息
*
* 注: 若是流式消息, 必须等到流式分片输出完毕, 才允许调用此 API
*
* 此外他支持两种配置
*
* 1. 更新,新消息覆盖老消息---只允许更新3天内的消息
* 2. 新消息,产生一条新消息
*
* @param message 需要重新输出的原始数字人消息
* @param params 确定重新输出的操作类型
*/
MsgStore.prototype.regenAIMessageActive = function (message, params) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var error_19
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('regenAIMessageActive', message)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.regenAIMessage(message, params),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
error_19 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.error('regenAIMessageActive failed ', error_19.toString())
throw error_19
case 4:
return [2 /*return*/]
}
})
})
}
MsgStore.prototype.voiceToTextActive = function (message) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var text, error_20
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
// 已经有转过的消息不要再次转
if (message.textOfVoice) return [2 /*return*/]
// 判定如果没有附件, 或者附件不是语音类型的, 也 return
if (!message.attachment) return [2 /*return*/]
// 类型保护, 判定一定是音视频才能走入这段逻辑
if (!('url' in message.attachment)) return [2 /*return*/]
// 经过了上面的类型保护后, 这一段直接访问 message.attachment.url 才不会 ts 提示说不存在
if (!message.attachment.url) return [2 /*return*/]
if (!('duration' in message.attachment)) return [2 /*return*/]
if (!message.attachment.duration) return [2 /*return*/]
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('voiceToTextActive', message)
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.voiceToText({
voiceUrl: message.attachment.url,
duration: message.attachment.duration,
sceneName: message.attachment.sceneName,
// 在群里与产品孙有军交流, 得知可以写死 aac 和 16000
mimeType: 'aac',
sampleRate: '16000',
}),
]
case 2:
text = _c.sent()
if (!text) throw new Error('voiceToText empty')
this.updateMsg(message.conversationId, message.messageClientId, {
textOfVoice: text,
})
return [3 /*break*/, 4]
case 3:
error_20 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn('voiceToTextActive failed: ', error_20.toString())
// 这里需要把错误抛出去,让 ui 层感知到
throw error_20
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 往内存中添加消息
* @param conversationId - 消息所属的会话的ID
* @param msgs- 消息对象数组
*/
MsgStore.prototype.addMsg = function (conversationId, msgs) {
var _this = this
var sortFunc = function (a, b) {
return a.createTime - b.createTime
}
var _msgs = this.msgs.get(conversationId) || []
// 获取当前会话的 pinMsgsMap
var curPinMsgsMap = this.pinMsgs.get(conversationId)
msgs
.filter(function (item) {
return !!item.messageClientId
})
.map(function (item) {
// 这里做消息处理
item = _this.handleReceiveAIMsg(item)
if (curPinMsgsMap) item = _this.handleMsgPinState(item, curPinMsgsMap)
return item
})
.forEach(function (item) {
var newMsg = __assign({}, item)
var _msg = _msgs.find(function (msg) {
return msg.messageClientId === newMsg.messageClientId
})
// SDK 可能会返回多条 messageClientId 相同的数据,此时取 createTime 最新的
if (_msg) {
if (
_msg.createTime <= newMsg.createTime ||
_msg.sendingState === 3 /* V2NIMConst.V2NIMMessageSendingState
.V2NIM_MESSAGE_SENDING_STATE_SENDING */
) {
// 如果之前的消息有撤回相关字段,则更新时保留
if (_msg.canRecall !== void 0 && _msg.reCallTimer !== void 0) {
newMsg.canRecall = _msg.canRecall
newMsg.reCallTimer = _msg.reCallTimer
}
// 如果之前已经请求过 voiceToText 语音转文字的结果, 那么更新时保留
if (_msg.textOfVoice) {
newMsg.textOfVoice = _msg.textOfVoice
}
_msgs.splice(_msgs.indexOf(_msg), 1, newMsg)
}
} else {
_msgs.push(item)
}
})
this.msgs.set(
conversationId,
__spreadArray([], __read(_msgs), false).sort(sortFunc),
this.rootStore.uiStore.selectedConversation === conversationId
)
}
/**
* 从内存中删除消息
* @param conversationId - 消息所属的会话的ID
* @param idClients - 端测生成的消息id数组
*/
MsgStore.prototype.removeMsg = function (conversationId, idClients) {
var _this = this
if (!conversationId) {
this.getMsg().forEach(function (item) {
_this._handleClearMsgTimer(item)
})
this.msgs.clear()
return
}
var msgs = this.msgs.get(conversationId)
if (!msgs) {
return
}
if (!idClients || !idClients.length) {
msgs.forEach(function (item) {
_this._handleClearMsgTimer(item)
})
this.msgs.delete(conversationId)
return
}
this.msgs.set(
conversationId,
msgs.filter(function (msg) {
var isDelete =
idClients.includes(msg.messageClientId) &&
// 无法删除撤回消息
!(
msg.messageType ===
100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */ &&
msg.recallType === 'beReCallMsg'
)
if (isDelete) {
_this._handleClearMsgTimer(msg)
}
return !isDelete
}),
this.rootStore.uiStore.selectedConversation === conversationId
)
}
MsgStore.prototype.deletePinInfoByMessageClientId = function (
conversationId,
messageClientIds
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'deletePinInfoByMessageClientId',
conversationId,
messageClientIds
)
this.pinMsgs.delete(conversationId, messageClientIds)
}
/**
* 从内存中获取消息
* @param conversationId - 消息所属的会话的ID
* @param idClients - 端测生成的消息id数组
*/
MsgStore.prototype.getMsg = function (conversationId, idClients) {
if (!conversationId) {
return this.msgs.values()
}
var msgs = this.msgs.get(conversationId) || []
if (!idClients || !idClients.length) {
return msgs
}
// 如果有 idClients只返回 idClients 中的消息,新数组
return msgs.filter(function (item) {
return idClients.includes(item.messageClientId)
})
}
MsgStore.prototype.updateMsg = function (
conversationId,
idClient,
updateParam
) {
var msgs = this.msgs.get(conversationId)
if (!msgs) return
var msg = msgs.findIndex(function (item) {
return item.messageClientId === idClient
})
if (!msg) return
this.msgs.set(
conversationId,
msgs.map(function (msg) {
if (msg.messageClientId === idClient) {
msg = __assign(__assign({}, msg), updateParam)
}
return msg
}),
this.rootStore.uiStore.selectedConversation === conversationId
)
}
MsgStore.prototype.handleReceiveAIMsg = function (msg) {
var myAccountId = this.rootStore.userStore.myUserInfo.accountId
var aiConfig = msg.aiConfig
var senderId = aiConfig
? aiConfig.aiStatus === 2
? aiConfig.accountId
: msg.senderId
: msg.senderId
var isSelf = senderId === myAccountId
return __assign(__assign({}, msg), {
__kit__isSelf: msg.isSelf,
__kit__senderId: msg.senderId,
isSelf: isSelf,
})
}
/** 处理消息的 pinState */
MsgStore.prototype.handleMsgPinState = function (msg, curPinMsgsMap) {
var pinInfo = curPinMsgsMap.get(msg.messageClientId)
if (pinInfo) {
msg.pinState = pinInfo.pinState
msg.operatorId = pinInfo.operatorId
}
return msg
}
MsgStore.prototype.handleMsgForSDK = function (msg) {
var __kit__isSelf = msg.__kit__isSelf,
__kit__senderId = msg.__kit__senderId,
rest = __rest(msg, ['__kit__isSelf', '__kit__senderId'])
var senderId = msg.senderId,
isSelf = msg.isSelf
if (__kit__isSelf) {
isSelf = __kit__isSelf
}
if (__kit__senderId) {
senderId = __kit__senderId
}
return __assign(__assign({}, rest), { senderId: senderId, isSelf: isSelf })
}
MsgStore.prototype._getMessageListByRefer = function (messageRefers) {
var _a
return __awaiter(this, void 0, void 0, function () {
var res, error_21
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
res = []
_b.label = 1
case 1:
_b.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getMessageListByRefers(
messageRefers
),
]
case 2:
res = _b.sent()
return [3 /*break*/, 4]
case 3:
error_21 = _b.sent()
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.warn(
'_getMessageListByRefer failed but continue: ',
error_21.toString()
)
return [3 /*break*/, 4]
case 4:
return [2 /*return*/, res]
}
})
})
}
/** 从服务器拉 pin 消息列表 */
MsgStore.prototype._getPinnedMessageListByServer = function (conversationId) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var res, pinInfos, error_22
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_getPinnedMessageListByServer', conversationId)
res = []
pinInfos = []
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.nim.V2NIMMessageService.getPinnedMessageList(conversationId),
]
case 2:
res = _c.sent()
return [3 /*break*/, 4]
case 3:
error_22 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'_getPinnedMessageListByServer failed but continue: ',
error_22.toString()
)
return [3 /*break*/, 4]
case 4:
res.forEach(function (pin) {
pinInfos.push(__assign({ pinState: 1 }, pin))
})
this.pinMsgs.set(conversationId, pinInfos)
if (pinInfos.length) {
// 主动获取 pin 消息时需要更新 msg 的 pin 状态
this._updateMsgsPinState(conversationId, pinInfos)
}
return [2 /*return*/, pinInfos]
}
})
})
}
/** 补全被 pin 的消息 */
MsgStore.prototype.completePinnedMessageList = function (
conversationId,
pinInfos
) {
return __awaiter(this, void 0, void 0, function () {
var res, messageRefers
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
res = []
if (!pinInfos.length) return [2 /*return*/, pinInfos]
messageRefers = []
// 找出缺少 message 的 pinInfo说明这个 pinInfo 没有补全消息
pinInfos.forEach(function (pinInfo) {
if (!pinInfo.message) {
messageRefers.push(pinInfo.messageRefer)
}
})
if (!messageRefers.length)
return [
2 /*return*/,
pinInfos,
// 这里不做 try catch因为 _getMessageListByRefer 已经处理了
// 这里全都从服务器获取补全的消息,不从内存中获取已有的补全消息
]
return [4 /*yield*/, this._getMessageListByRefer(messageRefers)]
case 1:
// 这里不做 try catch因为 _getMessageListByRefer 已经处理了
// 这里全都从服务器获取补全的消息,不从内存中获取已有的补全消息
res = _a.sent()
if (res.length) {
pinInfos = pinInfos.map(function (pinInfo) {
var msg = res.find(function (item) {
return (
item.messageClientId ===
pinInfo.messageRefer.messageClientId
)
})
if (msg) {
pinInfo = __assign(__assign({}, pinInfo), { message: msg })
}
return pinInfo
})
this.pinMsgs.set(conversationId, pinInfos)
}
return [2 /*return*/, pinInfos]
}
})
})
}
MsgStore.prototype._handleSendMsgSuccess = function (msg) {
if (msg && msg.conversationId) {
// const canRecallMsg: V2NIMMessageForUI = {
// ...msg,
// canRecall: true,
// reCallTimer: setTimeout(() => {
// // 从内存中取最新的,因为中间可能有其他更新
// const _msg = this.getMsg(msg.conversationId, [msg.messageClientId])[0]
// if (_msg) {
// delete _msg.canRecall
// delete _msg.reCallTimer
// this.addMsg(msg.conversationId, [_msg])
// }
// }, RECALL_TIME) as unknown as number,
// }
// delete canRecallMsg.uploadProgress
// delete canRecallMsg.previewImg
// delete canRecallMsg.errorCode
this.addMsg(msg.conversationId, [msg])
}
}
MsgStore.prototype._handleSendMsgFail = function (msg, errorCode) {
// 发送失败,拉黑的情况不能撤回、可以删除;网络情况不能撤回、不能删除
// 因此删除那边做一下 try catch 处理,忽略错误消息
// 先清除老消息的定时器,再更新消息
if (msg && msg.conversationId) {
var oldMsg = this.getMsg(msg.conversationId, [msg.messageClientId])[0]
this._handleClearMsgTimer(oldMsg)
this.addMsg(msg.conversationId, [
__assign(__assign(__assign({}, oldMsg), msg), {
messageStatus: {
errorCode: errorCode,
},
uploadProgress: void 0,
sendingState: 2 /* V2NIMConst.V2NIMMessageSendingState
.V2NIM_MESSAGE_SENDING_STATE_FAILED */,
errorCode: errorCode,
}),
])
}
}
MsgStore.prototype._handleClearMsgTimer = function (msg) {
if (msg) {
clearTimeout(msg.canEditTimer)
clearTimeout(msg.reCallTimer)
}
}
MsgStore.prototype._onReceiveMessages = function (data) {
var _this = this
var _a, _b, _c, _d
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onReceiveMessages: ', data)
data.forEach(function (item) {
_this.addMsg(item.conversationId, [item])
})
if (
(_b = this.rootStore.sdkOptions) === null || _b === void 0
? void 0
: _b.enableV2CloudConversation
) {
;(_c = this.rootStore.conversationStore) === null || _c === void 0
? void 0
: _c.handleConversationWithAit(data)
} else {
;(_d = this.rootStore.localConversationStore) === null || _d === void 0
? void 0
: _d.handleConversationWithAit(data)
}
}
MsgStore.prototype._onReceiveMessagesModified = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onReceiveMessagesModified: ', data)
data.forEach(function (item) {
_this.addMsg(item.conversationId, [item])
})
}
MsgStore.prototype._onClearHistoryNotifications = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onClearHistory: ', data)
data.forEach(function (item) {
_this.removeMsg(item.conversationId)
})
}
MsgStore.prototype._onMessageDeletedNotifications = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onMessageDeletedNotifications: ', data)
var res = {}
data.forEach(function (item) {
var conversationId = item.messageRefer.conversationId
if (res[conversationId]) {
res[conversationId].push(item)
} else {
res[conversationId] = [item]
}
})
Object.keys(res).forEach(function (conversationId) {
var messageClientIds = res[conversationId].map(function (item) {
return item.messageRefer.messageClientId
})
_this.removeMsg(conversationId, messageClientIds)
_this.deletePinInfoByMessageClientId(conversationId, messageClientIds)
})
}
MsgStore.prototype._onMessagePinNotification = function (data) {
var _this = this
var _a = data.pin,
operatorId = _a.operatorId,
messageRefer = _a.messageRefer,
serverExtension = _a.serverExtension,
createTime = _a.createTime,
updateTime = _a.updateTime
var curPinMsgsMap = this.pinMsgs.get(messageRefer.conversationId)
// 如果内存里面没有当前会话的 pin map直接返回等主动调用了 getPinnedMessageListActive 内存才会有 pin map才处理相应的 _onMessagePinNotification
if (!curPinMsgsMap) return
var pinState = data.pinState
var pinInfo =
curPinMsgsMap === null || curPinMsgsMap === void 0
? void 0
: curPinMsgsMap.get(messageRefer.messageClientId)
var newPinInfo = [
{
pinState: pinState,
messageRefer: messageRefer,
operatorId: operatorId,
serverExtension: serverExtension,
// @ts-ignore
createTime:
(pinInfo === null || pinInfo === void 0
? void 0
: pinInfo.createTime) || createTime,
updateTime: updateTime,
},
]
// 补全 message。咨询过产品nim.V2NIMMessageService.getMessageListByRefers 这个接口不会有频控的问题一个人1分钟可以调用几百次。所以这里可以实时补全 message
this.completePinnedMessageList(
messageRefer.conversationId,
newPinInfo
).then(function (pinInfo) {
_this._updateMsgsPinState(messageRefer.conversationId, pinInfo)
})
}
MsgStore.prototype._updateMsgsPinState = function (conversationId, pinInfos) {
// 获取会话内存中维护的所有消息
var _msgs = this.getMsg(conversationId) || []
var hasChange = false
pinInfos.forEach(function (pinInfo) {
// 找到需要更新 pin 状态的 msg
var msg = _msgs.find(function (msg) {
return msg.messageClientId === pinInfo.messageRefer.messageClientId
})
// 如果内存里有对应的消息,再更新 pin 状态;没有,会在之后拉取到对应消息再更新
if (msg && msg.pinState !== pinInfo.pinState) {
var newMsg = __assign({}, msg)
newMsg.pinState = pinInfo.pinState
newMsg.operatorId = pinInfo.operatorId
_msgs.splice(_msgs.indexOf(msg), 1, newMsg)
hasChange = true
}
})
if (hasChange) {
this.msgs.set(
conversationId,
_msgs,
this.rootStore.uiStore.selectedConversation === conversationId
)
}
}
MsgStore.prototype._onMessageQuickCommentNotification = function () {
// 暂不支持
}
MsgStore.prototype._onMessageRevokeNotifications = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var _this = this
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onMessageRevokeNotifications: ', data)
data.forEach(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var oldMsg,
conversationId,
messageClientIds,
msg,
conversation,
aitMsgs,
messageClientId_1
var _a, _b, _c, _d, _e, _f
return __generator(this, function (_g) {
oldMsg = this.getMsg(item.messageRefer.conversationId, [
item.messageRefer.messageClientId,
])[0]
// 这里只处理新的撤回消息,老的表示是自己主动撤回的,不处理。
if (oldMsg && oldMsg.recallType) {
return [2 /*return*/]
}
conversationId = item.messageRefer.conversationId
messageClientIds = [item.messageRefer.messageClientId]
this.removeMsg(conversationId, messageClientIds)
this.deletePinInfoByMessageClientId(
conversationId,
messageClientIds
)
msg = this._createBeReCallMsg(item)
this.addMsg(msg.conversationId, [msg])
if (
item.messageRefer.conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */
) {
conversation = (
(_a = this.rootStore.sdkOptions) === null || _a === void 0
? void 0
: _a.enableV2CloudConversation
)
? (_b = this.rootStore.conversationStore) === null ||
_b === void 0
? void 0
: _b.conversations.get(conversationId)
: (_c = this.rootStore.localConversationStore) === null ||
_c === void 0
? void 0
: _c.conversations.get(conversationId)
if (conversation) {
aitMsgs = conversation.aitMsgs || []
messageClientId_1 = item.messageRefer.messageClientId
if (aitMsgs.includes(messageClientId_1)) {
aitMsgs = aitMsgs.filter(function (item) {
return item !== messageClientId_1
})
if (
(_d = this.rootStore.sdkOptions) === null || _d === void 0
? void 0
: _d.enableV2CloudConversation
) {
;(_e = this.rootStore.conversationStore) === null ||
_e === void 0
? void 0
: _e.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: aitMsgs,
}),
])
} else {
;(_f = this.rootStore.localConversationStore) === null ||
_f === void 0
? void 0
: _f.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: aitMsgs,
}),
])
}
}
}
}
return [2 /*return*/]
})
})
})
return [2 /*return*/]
})
})
}
MsgStore.prototype._onReceiveP2PMessageReadReceipts = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onReceiveP2PMessageReadReceipts: ', data)
data.forEach(function (item) {
var _a, _b, _c, _d, _e, _f
var oldConversation = (
(_a = _this.rootStore.sdkOptions) === null || _a === void 0
? void 0
: _a.enableV2CloudConversation
)
? (_b = _this.rootStore.conversationStore) === null || _b === void 0
? void 0
: _b.conversations.get(item.conversationId)
: (_c = _this.rootStore.localConversationStore) === null ||
_c === void 0
? void 0
: _c.conversations.get(item.conversationId)
if (
oldConversation &&
item.timestamp > (oldConversation.msgReceiptTime || 0)
) {
if (
(_d = _this.rootStore.sdkOptions) === null || _d === void 0
? void 0
: _d.enableV2CloudConversation
) {
;(_e = _this.rootStore.conversationStore) === null || _e === void 0
? void 0
: _e.updateConversation([
__assign(__assign({}, oldConversation), {
msgReceiptTime: item.timestamp,
}),
])
} else {
;(_f = _this.rootStore.localConversationStore) === null ||
_f === void 0
? void 0
: _f.updateConversation([
__assign(__assign({}, oldConversation), {
msgReceiptTime: item.timestamp,
}),
])
}
}
})
}
MsgStore.prototype._onReceiveTeamMessageReadReceipts = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onReceiveTeamMessageReadReceipts: ', data)
// 群消息中,同一条消息可能收到多条消息的回执,需要按照已读数量排序,服务端下发可能顺序不一致,端上排序,保证最后的已读未读情况覆盖之前的
data.sort(function (a, b) {
return a.readCount - b.readCount
})
data.forEach(function (msgReadReceipt) {
var conversationId = msgReadReceipt.conversationId
var msg = _this.getMsg(conversationId, [
msgReadReceipt.messageClientId,
])[0]
if (msg) {
var newMsg = _this._updateReceiptMsg(msg, {
unread: msgReadReceipt.unreadCount,
read: msgReadReceipt.readCount,
})
_this.addMsg(conversationId, [newMsg])
}
})
}
MsgStore.prototype._formatExtField = function (
conversationId,
serverExtension
) {
var extObj = serverExtension || {}
// 有回复消息的情况,需要把回复消息的信息放到 serverExtension 中
var replyMsg = this.getReplyMsgActive(conversationId)
if (replyMsg) {
extObj.yxReplyMsg = {
idClient: replyMsg.messageClientId,
scene: replyMsg.conversationType,
from: replyMsg.senderId,
receiverId: replyMsg.receiverId,
to: replyMsg.conversationId,
idServer: replyMsg.messageServerId,
time: replyMsg.createTime,
}
}
return extObj
}
MsgStore.prototype._updateReceiptMsg = function (originMsg, data) {
return __assign(__assign({}, originMsg), {
yxUnread: Number(data.unread),
yxRead: Number(data.read),
})
}
MsgStore.prototype._formatExtAitToPushInfo = function (yxAitMsg, content) {
function getForcePushIDsList(obj) {
return Object.keys(obj).includes(AT_ALL_ACCOUNT)
? void 0
: Object.keys(obj)
}
var pushInfo = {
forcePushAccountIds: getForcePushIDsList(yxAitMsg),
forcePush: true,
forcePushContent: content,
}
return pushInfo
}
MsgStore.prototype._createReCallMsg = function (msg) {
var _this = this
var recallMsg = __assign(__assign({}, msg), {
isSelf: true,
sendingState: 1 /* V2NIMConst.V2NIMMessageSendingState
.V2NIM_MESSAGE_SENDING_STATE_SUCCEEDED */,
messageType: 100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */,
recallType: 'reCallMsg',
messageClientId: 'recall-'.concat(msg.messageClientId),
})
// 只有 type 为 custom 和 text 的消息可以被重新编辑
if (
[
100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */,
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */,
].includes(msg.messageType)
) {
recallMsg.oldText = msg.text
recallMsg.canEdit = true
recallMsg.isRecallMsg = true
recallMsg.canEditTimer = setTimeout(function () {
var newMsg = _this.getMsg(recallMsg.conversationId, [
recallMsg.messageClientId,
])[0]
if (newMsg) {
_this.addMsg(newMsg.conversationId, [
__assign(__assign({}, newMsg), { canEdit: false }),
])
}
}, RECALL_TIME)
}
return recallMsg
}
MsgStore.prototype._createBeReCallMsg = function (data) {
// @ts-ignore
return __assign(__assign({}, data.messageRefer), {
isSelf:
data.messageRefer.senderId ===
this.rootStore.userStore.myUserInfo.accountId,
sendingState: 1 /* V2NIMConst.V2NIMMessageSendingState
.V2NIM_MESSAGE_SENDING_STATE_SUCCEEDED */,
messageType: 100 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_CUSTOM */,
recallType: 'beReCallMsg',
messageClientId: 'recall-'.concat(data.messageRefer.messageClientId),
})
}
MsgStore.prototype._getAIConfig = function (msg) {
var _this = this
var _a
var serverExtension = msg.serverExtension,
conversationId = msg.conversationId,
receiverId = msg.receiverId,
messageType = msg.messageType,
_b = msg.text,
text = _b === void 0 ? '' : _b
var serverExt
try {
serverExt = JSON.parse(serverExtension || '{}')
} catch (error) {
serverExt = {}
}
// at 消息
var yxAitMsg = serverExt.yxAitMsg || {}
// 回复消息
var replyMsg = this.getReplyMsgActive(conversationId)
var relation = this.rootStore.uiStore.getRelation(receiverId).relation
var myAccountId = this.rootStore.userStore.myUserInfo.accountId
var aiConfig = void 0
if (relation === 'ai') {
if (
messageType ===
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */
) {
// 取最近的30条文本会话
var _msgs = (this.msgs.get(conversationId) || [])
.slice(-AI_MESSAGE_LIMIT)
.filter(function (item) {
return (
item.messageType ===
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */
)
})
// 找到第一条自己发的消息,从此时开始作为真正的上下文
var myIndex = _msgs.findIndex(function (item) {
return item.senderId === myAccountId
})
_msgs = myIndex === -1 ? [] : _msgs.slice(myIndex)
aiConfig = {
accountId: receiverId,
content: { msg: text, type: 0 },
// 取最后30条消息作为上下文
messages: _msgs.map(function (item) {
var role = item.senderId === myAccountId ? 'user' : 'assistant'
return {
role: role,
msg: item.text || '',
type: 0,
}
}),
}
} else {
aiConfig = {
accountId: receiverId,
}
}
}
// 只保留 at 数字人的 yxAitMsg
var newYxAitMsg = {}
Object.keys(yxAitMsg).forEach(function (account) {
if (_this.rootStore.aiUserStore.aiUsers.has(account)) {
newYxAitMsg[account] = yxAitMsg[account]
}
})
// 找到最早的 at 数字人
var aiAtAccount = this._findMinStart(newYxAitMsg)
var aiAtMember = this.rootStore.aiUserStore.aiUsers.get(aiAtAccount || '')
// 表示 at 数字人
if (aiAtMember) {
aiConfig = {
accountId: aiAtMember.accountId,
content: { msg: text, type: 0 },
}
}
// 表示此时有回复消息
if (replyMsg && aiConfig) {
// 只有回复的是文本消息需要带上下文,其他类型消息不用带上下文
if (
replyMsg.messageType ===
0 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT */
) {
aiConfig.messages = [
{
role: 'user',
msg: replyMsg.text || '',
type: 0,
},
]
} else {
aiConfig.messages = void 0
}
}
//@ts-ignore
aiConfig === null || aiConfig === void 0
? void 0
: (aiConfig.aiStream =
(_a = this.localOptions) === null || _a === void 0
? void 0
: _a.aiStream)
return aiConfig
}
MsgStore.prototype._findMinStart = function (data) {
var e_1, _a
var minStart = Number.MAX_VALUE
var minStartKey = void 0
for (var key in data) {
var segments = data[key].segments
try {
for (
var segments_1 = ((e_1 = void 0), __values(segments)),
segments_1_1 = segments_1.next();
!segments_1_1.done;
segments_1_1 = segments_1.next()
) {
var segment = segments_1_1.value
if (segment.start < minStart) {
minStart = segment.start
minStartKey = key
}
}
} catch (e_1_1) {
e_1 = { error: e_1_1 }
} finally {
try {
if (segments_1_1 && !segments_1_1.done && (_a = segments_1.return))
_a.call(segments_1)
} finally {
if (e_1) throw e_1.error
}
}
}
return minStartKey
}
return MsgStore
})()
/**Mobx 可观察对象负责管理黑名单和静音列表的子store */
var RelationStore = /** @class */ (function () {
function RelationStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.blacklist = []
this.mutes = []
this.logger = null
makeAutoObservable(this)
this.logger = rootStore.logger
this._onBlockListAdded = this._onBlockListAdded.bind(this)
this._onBlockListRemoved = this._onBlockListRemoved.bind(this)
this._onP2PMessageMuteModeChanged =
this._onP2PMessageMuteModeChanged.bind(this)
/** 黑名单新增用户回调,返回新加入黑名单的用户列表。当客户端本端添加用户到黑名单,或者其他端同步添加用户到黑名单时触发该回调 */
nim.V2NIMUserService.on('onBlockListAdded', this._onBlockListAdded)
/** 黑名单移除用户回调,返回移出黑名单的用户列表。当客户端本端从黑名单移除用户,或者其他端同步从黑名单移除用户时触发该回调 */
nim.V2NIMUserService.on('onBlockListRemoved', this._onBlockListRemoved)
/** 单聊消息免打扰模式变更事件 */
nim.V2NIMSettingService.on(
'onP2PMessageMuteModeChanged',
this._onP2PMessageMuteModeChanged
)
}
RelationStore.prototype.resetState = function () {
this.blacklist = []
this.mutes = []
}
/**
* 销毁RelationStore会取消相关事件监听
*/
RelationStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMUserService.off('onBlockListAdded', this._onBlockListAdded)
this.nim.V2NIMUserService.off(
'onBlockListRemoved',
this._onBlockListRemoved
)
this.nim.V2NIMSettingService.off(
'onP2PMessageMuteModeChanged',
this._onP2PMessageMuteModeChanged
)
}
/**
* 内存中增加黑名单列表
* @param accounts - 账号数组
*/
RelationStore.prototype.addBlacklist = function (accounts) {
this.blacklist = __spreadArray(
[],
__read(new Set(this.blacklist.concat(accounts))),
false
)
}
/**
* 内存中删除黑名单列表
* @param accounts - 账号数组
*/
RelationStore.prototype.removeBlacklist = function (accounts) {
this.blacklist = this.blacklist.filter(function (i) {
return accounts.every(function (j) {
return i !== j
})
})
}
/**
* 是否在黑名单列表
*/
RelationStore.prototype.isInBlacklist = function (account) {
return this.blacklist.includes(account)
}
/**
* 内存中增加静音列表
* @param accounts - 账号数组
*/
RelationStore.prototype.addMutes = function (accounts) {
this.mutes = __spreadArray(
[],
__read(new Set(this.mutes.concat(accounts))),
false
)
}
/**
* 内存中删除静音列表
* @param accounts - 账号数组
*/
RelationStore.prototype.removeMutes = function (accounts) {
this.mutes = this.mutes.filter(function (i) {
return accounts.every(function (j) {
return i !== j
})
})
}
// 获取黑名单列表
RelationStore.prototype.getBlockListActive = function () {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var res, error_1
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_c.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getBlockListActive')
return [4 /*yield*/, this.nim.V2NIMUserService.getBlockList()]
case 1:
res = _c.sent()
this.addBlacklist(res)
return [2 /*return*/, res]
case 2:
error_1 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.error('getBlockListActive failed: ', error_1)
throw error_1
case 3:
return [2 /*return*/]
}
})
})
}
// 获取P2P消息免打扰列表
RelationStore.prototype.getP2PMuteListActive = function () {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var res, error_2
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_c.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getP2PMuteListActive')
return [
4 /*yield*/,
this.nim.V2NIMSettingService.getP2PMessageMuteList(),
]
case 1:
res = _c.sent()
this.addMutes(res)
return [2 /*return*/, res]
case 2:
error_2 = _c.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.error('getP2PMuteListActive failed: ', error_2)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 加入 黑名单
* @param accountId 账号
*/
RelationStore.prototype.addUserToBlockListActive = function (accountId) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_3
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('addUserToBlockListActive', accountId)
return [
4 /*yield*/,
this.nim.V2NIMUserService.addUserToBlockList(accountId),
]
case 1:
_d.sent()
this.addBlacklist([accountId])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('addUserToBlockListActive success', accountId)
return [3 /*break*/, 3]
case 2:
error_3 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'addUserToBlockListActive failed: ',
accountId,
error_3
)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 移除 黑名单
* @param accountId 账号
*/
RelationStore.prototype.removeUserFromBlockListActive = function (accountId) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('removeUserFromBlockListActive', accountId)
return [
4 /*yield*/,
this.nim.V2NIMUserService.removeUserFromBlockList(accountId),
]
case 1:
_d.sent()
this.removeBlacklist([accountId])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('removeUserFromBlockListActive success', accountId)
return [3 /*break*/, 3]
case 2:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'removeUserFromBlockListActive failed: ',
accountId,
error_4
)
throw error_4
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 设置/取消 单聊(点对点)消息免打扰模式
* @param accountId 账号
* @param muteMode 消息免打扰模式:免打扰开启或免打扰关闭
*/
RelationStore.prototype.setP2PMessageMuteModeActive = function (
accountId,
muteMode
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('setP2PMessageMuteModeActive', accountId, muteMode)
return [
4 /*yield*/,
this.nim.V2NIMSettingService.setP2PMessageMuteMode(
accountId,
muteMode
),
]
case 1:
_d.sent()
if (
muteMode ===
1 /* V2NIMConst.V2NIMP2PMessageMuteMode.V2NIM_P2P_MESSAGE_MUTE_MODE_ON */
) {
this.addMutes([accountId])
} else if (
muteMode ===
0 /* V2NIMConst.V2NIMP2PMessageMuteMode.V2NIM_P2P_MESSAGE_MUTE_MODE_OFF */
) {
this.removeMutes([accountId])
}
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('setP2PMessageMuteModeActive success', {
accountId: accountId,
muteMode: muteMode,
})
return [3 /*break*/, 3]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'setP2PMessageMuteModeActive failed: ',
{ accountId: accountId, muteMode: muteMode },
error_5
)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 黑名单新增用户回调,返回新加入黑名单的用户列表。当客户端本端添加用户到黑名单,或者其他端同步添加用户到黑名单时触发该回调
*/
RelationStore.prototype._onBlockListAdded = function (user) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onBlockListAdded', user)
this.addBlacklist([user.accountId])
}
/**
* 黑名单移除用户回调,返回移出黑名单的用户列表。当客户端本端从黑名单移除用户,或者其他端同步从黑名单移除用户时触发该回调。
*/
RelationStore.prototype._onBlockListRemoved = function (accountId) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onBlockListRemoved', accountId)
this.removeBlacklist([accountId])
}
/**
* 单聊消息免打扰模式变更事件
*/
RelationStore.prototype._onP2PMessageMuteModeChanged = function (
accountId,
muteMode
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onP2PMessageMuteModeChanged', accountId, muteMode)
if (
muteMode ===
1 /* V2NIMConst.V2NIMP2PMessageMuteMode.V2NIM_P2P_MESSAGE_MUTE_MODE_ON */
) {
this.addMutes([accountId])
} else if (
muteMode ===
0 /* V2NIMConst.V2NIMP2PMessageMuteMode.V2NIM_P2P_MESSAGE_MUTE_MODE_OFF */
) {
this.removeMutes([accountId])
}
}
return RelationStore
})()
/**Mobx 可观察对象,负责管理会话列表的子 store */
var ConversationStore = /** @class */ (function () {
function ConversationStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.conversations = new Map()
this.totalUnreadCount = 0
this.logger = null
makeAutoObservable(this)
this._onSyncStarted = this._onSyncStarted.bind(this)
this._onSyncFinished = this._onSyncFinished.bind(this)
this._onSyncFailed = this._onSyncFailed.bind(this)
this._onConversationCreated = this._onConversationCreated.bind(this)
this._onConversationDeleted = this._onConversationDeleted.bind(this)
this._onConversationChanged = this._onConversationChanged.bind(this)
this._onTotalUnreadCountChanged = this._onTotalUnreadCountChanged.bind(this)
this.logger = rootStore.logger
/** 数据同步开始 */
nim.V2NIMConversationService.on('onSyncStarted', this._onSyncStarted)
/** 数据同步结束 */
nim.V2NIMConversationService.on('onSyncFinished', this._onSyncFinished)
/** 数据同步失败 */
nim.V2NIMConversationService.on('onSyncFailed', this._onSyncFailed)
/** 会话创建 */
nim.V2NIMConversationService.on(
'onConversationCreated',
this._onConversationCreated
)
/** 会话删除 */
nim.V2NIMConversationService.on(
'onConversationDeleted',
this._onConversationDeleted
)
/** 会话更新 */
nim.V2NIMConversationService.on(
'onConversationChanged',
this._onConversationChanged
)
/** 会话总未读数变化 */
nim.V2NIMConversationService.on(
'onTotalUnreadCountChanged',
this._onTotalUnreadCountChanged
)
}
ConversationStore.prototype.resetState = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('Conversation resetState')
this.conversations.clear()
this.totalUnreadCount = 0
}
/**
* 销毁
*/
ConversationStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMConversationService.off('onSyncStarted', this._onSyncStarted)
this.nim.V2NIMConversationService.off(
'onSyncFinished',
this._onSyncFinished
)
this.nim.V2NIMConversationService.off('onSyncFailed', this._onSyncFailed)
this.nim.V2NIMConversationService.off(
'onConversationCreated',
this._onConversationCreated
)
this.nim.V2NIMConversationService.off(
'onConversationDeleted',
this._onConversationDeleted
)
this.nim.V2NIMConversationService.off(
'onConversationChanged',
this._onConversationChanged
)
this.nim.V2NIMConversationService.off(
'onTotalUnreadCountChanged',
this._onTotalUnreadCountChanged
)
}
/**
* 添加内存中的会话
* @param conversations 会话数组
*/
ConversationStore.prototype.addConversation = function (conversations) {
var _this = this
conversations
.filter(function (item) {
return !!item.conversationId
})
// 暂时仅支持 p2p 和 team
.filter(function (item) {
return [
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */,
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */,
].includes(item.type)
})
.forEach(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var oldConversation
return __generator(this, function (_a) {
oldConversation = this.conversations.get(item.conversationId)
// 先更新一次
this.conversations.set(
item.conversationId,
__assign(__assign({}, oldConversation), item)
)
return [2 /*return*/]
})
})
})
}
/**
* 更新内存中的会话
* @param conversations 会话数组
*/
ConversationStore.prototype.updateConversation = function (conversations) {
var _this = this
conversations
.filter(function (item) {
return !!item.conversationId
})
// 暂时仅支持 p2p 和 team
.filter(function (item) {
return [
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */,
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */,
].includes(item.type)
})
.forEach(function (item) {
var oldConversation = _this.conversations.get(item.conversationId)
_this.conversations.set(
item.conversationId,
__assign(__assign({}, oldConversation), item)
)
})
}
/**
* 移除内存中的会话
* @param conversationId 会话ID
*/
ConversationStore.prototype.removeConversation = function (conversationIds) {
var _this = this
conversationIds.forEach(function (item) {
_this.conversations.delete(item)
if (_this.rootStore.uiStore.selectedConversation === item) {
_this.rootStore.uiStore.unselectConversation()
}
})
}
/**
* 重置会话未读数
* @param conversationId - 消息所属的会话的ID
*/
ConversationStore.prototype.resetConversation = function (conversationId) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var conversation, error_1
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('resetConversation', conversationId)
conversation = this.conversations.get(conversationId)
if (!conversation) {
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'resetConversation: conversation is not found.',
conversationId
)
return [2 /*return*/]
}
_e.label = 1
case 1:
_e.trys.push([1, 4, , 5])
if (!conversation.unreadCount) return [3 /*break*/, 3]
// 请求前也清理一次会话未读数fix http://jira.netease.com/browse/YYTX-34326
this._resetMemoryConversationUnreadCount(conversation)
return [
4 /*yield*/,
this.nim.V2NIMConversationService.clearUnreadCountByIds([
conversation.conversationId,
]),
]
case 2:
_e.sent()
this._resetMemoryConversationUnreadCount(conversation)
_e.label = 3
case 3:
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('resetConversation success')
return [3 /*break*/, 5]
case 4:
error_1 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error('resetConversation failed: ', error_1)
throw error_1
case 5:
return [2 /*return*/]
}
})
})
}
/**
* 插入一条会话记录
* @param conversationType
* @param receiverId - 接收方, 对方帐号或者群id
* @param isSelected - 是否选中
*/
ConversationStore.prototype.insertConversationActive = function (
conversationType,
receiverId,
isSelected
) {
var _a, _b, _c
if (isSelected === void 0) {
isSelected = true
}
return __awaiter(this, void 0, void 0, function () {
var conversationId, conversation, error_2
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 5, , 6])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('insertConversationActive', {
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
})
conversationId = ''
if (
conversationType ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
) {
conversationId =
this.nim.V2NIMConversationIdUtil.p2pConversationId(receiverId)
} else if (
conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */
) {
conversationId =
this.nim.V2NIMConversationIdUtil.teamConversationId(receiverId)
} else {
throw new Error('Unsupported conversation type')
}
if (!!this.conversations.has(conversationId))
return [3 /*break*/, 2]
return [
4 /*yield*/,
this.nim.V2NIMConversationService.createConversation(
conversationId
),
]
case 1:
conversation = _d.sent()
this.addConversation([conversation])
_d.label = 2
case 2:
if (!isSelected) return [3 /*break*/, 4]
return [
4 /*yield*/,
this.rootStore.uiStore.selectConversation(conversationId),
]
case 3:
_d.sent()
_d.label = 4
case 4:
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('insertConversationActive success', {
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
})
return [3 /*break*/, 6]
case 5:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'insertConversationActive failed: ',
{
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
},
error_2
)
throw error_2
case 6:
return [2 /*return*/]
}
})
})
}
/**
* 删除会话记录
* @param conversationId - 消息所属的会话的ID
*/
ConversationStore.prototype.deleteConversationActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 6, , 7])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('deleteConversationActive', conversationId)
_d.label = 1
case 1:
_d.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.stickTopConversationActive(conversationId, false),
]
case 2:
_d.sent()
return [3 /*break*/, 4]
case 3:
_d.sent()
return [3 /*break*/, 4]
case 4:
// 先删除内存,防止删除失败导致一些问题
this.removeConversation([conversationId])
// 不删除历史消息,让表现跟线上一致,后续可根据需求调整
return [
4 /*yield*/,
this.nim.V2NIMConversationService.deleteConversation(
conversationId,
false
),
]
case 5:
// 不删除历史消息,让表现跟线上一致,后续可根据需求调整
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('deleteConversationActive success')
return [3 /*break*/, 7]
case 6:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.warn(
'deleteConversationActive failed but continue: ',
error_4
)
return [3 /*break*/, 7]
case 7:
return [2 /*return*/]
}
})
})
}
/**
* 新增会话置顶
* @param conversationId - 消息所属的会话的ID
* @param stickTop - 是否置顶
*/
ConversationStore.prototype.stickTopConversationActive = function (
conversationId,
stickTop
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('stickTopConversationActive', conversationId, stickTop)
return [
4 /*yield*/,
this.nim.V2NIMConversationService.stickTopConversation(
conversationId,
stickTop
),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('stickTopConversationActive success')
return [3 /*break*/, 3]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('stickTopConversationActive failed: ', error_5)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取会话列表
* @param offset 分页偏移量
* @param limit 分页拉取数量
*/
ConversationStore.prototype.getConversationListActive = function (
offset,
limit
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_6
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 3, , 4])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getConversationListActive', offset, limit)
return [
4 /*yield*/,
this.nim.V2NIMConversationService.getConversationList(
offset,
limit
),
]
case 1:
res = _d.sent()
this.addConversation(res.conversationList)
return [
4 /*yield*/,
this.getP2PMessageReceipt(
res.conversationList
.filter(function (item) {
return (
item.type ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
)
})
.map(function (item) {
return item.conversationId
})
),
]
case 2:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getConversationListActive success', offset, limit, res)
return [2 /*return*/, res]
case 3:
error_6 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getConversationListActive failed: ',
error_6,
offset,
limit
)
throw error_6
case 4:
return [2 /*return*/]
}
})
})
}
ConversationStore.prototype.getP2PMessageReceipt = function (
conversationIds
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, conversations, error_7
var _this = this
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getP2PMessageReceipt', conversationIds)
return [
4 /*yield*/,
Promise.all(
conversationIds.map(function (item) {
return _this.nim.V2NIMMessageService.getP2PMessageReceipt(
item
)
})
),
]
case 1:
res = _d.sent()
conversations = res
.map(function (item) {
var conversation = _this.conversations.get(item.conversationId)
if (conversation) {
return __assign(__assign({}, conversation), {
msgReceiptTime: item.timestamp,
})
}
})
.filter(function (item) {
return !!item
})
this.updateConversation(conversations)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getP2PMessageReceipt success', conversationIds, res)
return [2 /*return*/, res]
case 2:
error_7 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getP2PMessageReceipt failed: ',
error_7,
conversationIds
)
throw error_7
case 3:
return [2 /*return*/]
}
})
})
}
ConversationStore.prototype._resetMemoryConversationUnreadCount = function (
conversation
) {
var newConversation = this.conversations.get(conversation.conversationId)
if (newConversation) {
this.updateConversation([
__assign(__assign({}, newConversation), { unreadCount: 0 }),
])
}
}
/**
* 获取会话已读时间戳。该时间包含多端已读时间戳
*/
ConversationStore.prototype.getConversationReadTimeActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_8
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getConversationReadTimeActive', conversationId)
return [
4 /*yield*/,
this.nim.V2NIMConversationService.getConversationReadTime(
conversationId
),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'getConversationReadTimeActive success',
conversationId,
res
)
return [2 /*return*/, res]
case 2:
error_8 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getConversationReadTimeActive failed: ',
error_8,
conversationId
)
throw error_8
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 标记会话已读时间戳
*
* 注: 当该方法调用后SDK 可能给多端账户抛出以下的事件
*
* {@link V2NIMConversationListener.onConversationReadTimeUpdated | V2NIMConversationListener.onConversationReadTimeUpdated} <br/>
*
*/
ConversationStore.prototype.markConversationReadActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_9
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('markConversationReadActive', conversationId)
return [
4 /*yield*/,
this.nim.V2NIMConversationService.markConversationRead(
conversationId
),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'markConversationReadActive success',
conversationId,
res
)
return [2 /*return*/, res]
case 2:
error_9 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'markConversationReadActive failed: ',
error_9,
conversationId
)
throw error_9
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 处理会话中的@ 消息
*/
ConversationStore.prototype.handleConversationWithAit = function (msgs) {
var _this = this
msgs.map(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var hasAitMsg,
conversationReadTime,
isCurConversation,
isSendFromMe,
conversation,
aitMsgs
var _a
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (
!(
(
item.conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ ||
item.conversationType === 3
) /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_SUPER_TEAM */
)
)
return [3 /*break*/, 2]
if (
!(item === null || item === void 0
? void 0
: item.serverExtension)
)
return [3 /*break*/, 2]
hasAitMsg = this.hasAitMsg([item.serverExtension])
return [
4 /*yield*/,
this.getConversationReadTimeActive(item.conversationId),
]
case 1:
conversationReadTime = _b.sent()
isCurConversation =
item.conversationId ==
this.rootStore.uiStore.selectedConversation
isSendFromMe =
item.senderId ===
((_a = this.rootStore.userStore.myUserInfo) === null ||
_a === void 0
? void 0
: _a.accountId)
// 当前通过_onReceiveMessages获取的新消息时间戳大于会话的最后已读时间戳且有@消息,且没有选中当前该会话,则标记为已读
if (
item.createTime > conversationReadTime &&
hasAitMsg &&
!isCurConversation &&
!isSendFromMe
) {
conversation = this.conversations.get(item.conversationId)
// 如果此时conversation为空则可能的情况为该用户删除了该会话后又收到了@消息onReceiveMessages会先于onConversationCreated触发此时需要在onConversationCreated处理@消息相关
if (conversation) {
aitMsgs = conversation.aitMsgs || []
if (aitMsgs.length === 0) {
this.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: [item.messageClientId],
}),
])
} else {
this.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: __spreadArray(
__spreadArray([], __read(aitMsgs), false),
[item.messageClientId],
false
),
}),
])
}
}
}
_b.label = 2
case 2:
return [2 /*return*/]
}
})
})
})
}
/**
* 重置会话中的@ 消息
*/
ConversationStore.prototype.resetConversationAit = function (conversationId) {
var conversation = this.conversations.get(conversationId)
if (
(conversation === null || conversation === void 0
? void 0
: conversation.type) ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ ||
(conversation === null || conversation === void 0
? void 0
: conversation.type) ===
3 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_SUPER_TEAM */
) {
this.updateConversation([
__assign(__assign({}, conversation), { aitMsgs: [] }),
])
}
}
ConversationStore.prototype.hasAitMsg = function (serverExtensions) {
var _this = this
var flag = false
if (
serverExtensions === null || serverExtensions === void 0
? void 0
: serverExtensions.length
) {
serverExtensions === null || serverExtensions === void 0
? void 0
: serverExtensions.forEach(function (item) {
var _a, _b
try {
var extObj = JSON.parse(item || '{}')
var yxAitMsg = extObj.yxAitMsg
var account_1 = _this.rootStore.userStore.myUserInfo.accountId
if (yxAitMsg) {
;(_a = Object.keys(yxAitMsg)) === null || _a === void 0
? void 0
: _a.forEach(function (key) {
if (key === account_1 || key === AT_ALL_ACCOUNT) {
flag = true
}
})
}
} catch (_c) {
;(_b = _this.logger) === null || _b === void 0
? void 0
: _b.error('parse serverExtension failed: ', item)
}
})
}
return flag
}
ConversationStore.prototype._onSyncStarted = function () {
var _a, _b, _c
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onSyncStarted')
// 获取会话列表
;(_b = this.rootStore.conversationStore) === null || _b === void 0
? void 0
: _b.getConversationListActive(
0,
this.rootStore.localOptions.conversationLimit || 100
)
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('_onSyncFinished')
}
ConversationStore.prototype._onSyncFinished = function () {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_c) {
// 获取会话列表
;(_a = this.rootStore.conversationStore) === null || _a === void 0
? void 0
: _a.getConversationListActive(
0,
this.rootStore.localOptions.conversationLimit || 100
)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('_onSyncFinished')
return [2 /*return*/]
})
})
}
ConversationStore.prototype._onSyncFailed = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onSyncFailed', e)
}
ConversationStore.prototype._onConversationCreated = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onConversationCreated', data)
// 如果是创群此时_onConversationCreated 返回的data可能没有avatar和name需要getConversation
if (
data.type ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */
) {
this.nim.V2NIMConversationService.getConversation(
data.conversationId
).then(function (conversation) {
_this.addConversation([conversation])
// 处理@消息 情况为
if (conversation.lastMessage) {
_this.handleConversationWithAit([
__assign(
__assign({}, conversation.lastMessage),
conversation.lastMessage.messageRefer
),
])
}
})
} else {
this.addConversation([data])
// 会话创建的时候,获取一下当前会话的最后已读时间,便于展示消息已读未读
if (
data.type ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
) {
var conversationId_1 = data.conversationId
this.nim.V2NIMMessageService.getP2PMessageReceipt(
conversationId_1
).then(function (res) {
var conversation = _this.conversations.get(conversationId_1)
if (conversation) {
_this.updateConversation([
__assign(__assign({}, conversation), {
msgReceiptTime: res.timestamp,
}),
])
}
})
}
}
}
ConversationStore.prototype._onConversationDeleted = function (
conversationIds
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onConversationDeleted', conversationIds)
this.removeConversation(conversationIds)
}
ConversationStore.prototype._onConversationChanged = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var _this = this
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onConversationChanged', data)
this.addConversation(data)
data.forEach(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var attachment, type
var _a, _b, _c, _d
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
attachment =
(_a = item.lastMessage) === null || _a === void 0
? void 0
: _a.attachment
type =
attachment === null || attachment === void 0
? void 0
: attachment.type
if (
!(
((_b = item.lastMessage) === null || _b === void 0
? void 0
: _b.messageType) ===
5 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_NOTIFICATION */ &&
((type === 1 /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_KICK */ &&
((_c =
attachment === null || attachment === void 0
? void 0
: attachment.targetIds) === null || _c === void 0
? void 0
: _c.includes(
this.rootStore.userStore.myUserInfo.accountId
))) ||
(type === 2 /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_LEAVE */ &&
((_d = item.lastMessage) === null || _d === void 0
? void 0
: _d.messageRefer.senderId) ===
this.rootStore.userStore.myUserInfo.accountId) ||
type === 4) /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_DISMISS */
)
)
return [3 /*break*/, 2]
return [
4 /*yield*/,
this.deleteConversationActive(item.conversationId),
]
case 1:
_e.sent()
return [3 /*break*/, 4]
case 2:
if (
!(
this.rootStore.uiStore.selectedConversation ===
item.conversationId
)
)
return [3 /*break*/, 4]
return [
4 /*yield*/,
this.resetConversation(item.conversationId),
]
case 3:
_e.sent()
_e.label = 4
case 4:
if (
item.type ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ &&
item.unreadCount == 0
) {
this.resetConversationAit(item.conversationId)
}
return [2 /*return*/]
}
})
})
})
return [2 /*return*/]
})
})
}
ConversationStore.prototype._onTotalUnreadCountChanged = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onTotalUnreadCountChanged', data)
this.totalUnreadCount = data
}
return ConversationStore
})()
/**Mobx 可观察对象,负责管理群组的子 store */
var TeamStore = /** @class */ (function () {
function TeamStore(rootStore, nim, localOptions) {
this.rootStore = rootStore
this.nim = nim
this.localOptions = localOptions
this.teams = new Map()
this.logger = null
makeAutoObservable(this)
this.logger = rootStore.logger
this._onReceiveTeamJoinActionInfo =
this._onReceiveTeamJoinActionInfo.bind(this)
this._onSyncFailed = this._onSyncFailed.bind(this)
this._onSyncFinished = this._onSyncFinished.bind(this)
this._onSyncStarted = this._onSyncStarted.bind(this)
this._onTeamCreated = this._onTeamCreated.bind(this)
this._onTeamDismissed = this._onTeamDismissed.bind(this)
this._onTeamInfoUpdated = this._onTeamInfoUpdated.bind(this)
this._onTeamJoined = this._onTeamJoined.bind(this)
this._onTeamLeft = this._onTeamLeft.bind(this)
this._onTeamMemberInfoUpdated = this._onTeamMemberInfoUpdated.bind(this)
this._onTeamMemberJoined = this._onTeamMemberJoined.bind(this)
this._onTeamMemberKicked = this._onTeamMemberKicked.bind(this)
this._onTeamMemberLeft = this._onTeamMemberLeft.bind(this)
/** 群组申请动作回调 */
nim.V2NIMTeamService.on(
'onReceiveTeamJoinActionInfo',
this._onReceiveTeamJoinActionInfo
)
/** 群组信息数据同步失败 */
nim.V2NIMTeamService.on('onSyncFailed', this._onSyncFailed)
/** 群组信息数据同步完成 */
nim.V2NIMTeamService.on('onSyncFinished', this._onSyncFinished)
/** 群组信息数据同步开始 */
nim.V2NIMTeamService.on('onSyncStarted', this._onSyncStarted)
/** 创建群组回调 */
nim.V2NIMTeamService.on('onTeamCreated', this._onTeamCreated)
/** 解散群组回调 */
nim.V2NIMTeamService.on('onTeamDismissed', this._onTeamDismissed)
/** 更新群组信息回调 */
nim.V2NIMTeamService.on('onTeamInfoUpdated', this._onTeamInfoUpdated)
/** 自己被邀请后接受邀请, 或申请通过,或直接被拉入群组回调 */
nim.V2NIMTeamService.on('onTeamJoined', this._onTeamJoined)
/** 自己主动离开群组或被管理员踢出回调 */
nim.V2NIMTeamService.on('onTeamLeft', this._onTeamLeft)
/** 群组成员信息更新回调 */
nim.V2NIMTeamService.on(
'onTeamMemberInfoUpdated',
this._onTeamMemberInfoUpdated
)
/** 群组成员加入回调(非自己) */
nim.V2NIMTeamService.on('onTeamMemberJoined', this._onTeamMemberJoined)
/** 群组成员被踢回调(非自己) */
nim.V2NIMTeamService.on('onTeamMemberKicked', this._onTeamMemberKicked)
/** 群组成员离开回调(非自己) */
nim.V2NIMTeamService.on('onTeamMemberLeft', this._onTeamMemberLeft)
/** 监听群消息免打扰模式变更事件 */
nim.V2NIMSettingService.on(
'onTeamMessageMuteModeChanged',
this._onTeamMessageMuteModeChanged
)
}
TeamStore.prototype.resetState = function () {
this.teams.clear()
}
/**
* 销毁TeamStore会取消群组相关事件监听
*/
TeamStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMTeamService.off(
'onReceiveTeamJoinActionInfo',
this._onReceiveTeamJoinActionInfo
)
this.nim.V2NIMTeamService.off('onSyncFailed', this._onSyncFailed)
this.nim.V2NIMTeamService.off('onSyncFinished', this._onSyncFinished)
this.nim.V2NIMTeamService.off('onSyncStarted', this._onSyncStarted)
this.nim.V2NIMTeamService.off('onTeamCreated', this._onTeamCreated)
this.nim.V2NIMTeamService.off('onTeamDismissed', this._onTeamDismissed)
this.nim.V2NIMTeamService.off('onTeamInfoUpdated', this._onTeamInfoUpdated)
this.nim.V2NIMTeamService.off('onTeamJoined', this._onTeamJoined)
this.nim.V2NIMTeamService.off('onTeamLeft', this._onTeamLeft)
this.nim.V2NIMTeamService.off(
'onTeamMemberInfoUpdated',
this._onTeamMemberInfoUpdated
)
this.nim.V2NIMTeamService.off(
'onTeamMemberJoined',
this._onTeamMemberJoined
)
this.nim.V2NIMTeamService.off(
'onTeamMemberKicked',
this._onTeamMemberKicked
)
this.nim.V2NIMTeamService.off('onTeamMemberLeft', this._onTeamMemberLeft)
this.nim.V2NIMSettingService.off(
'onTeamMessageMuteModeChanged',
this._onTeamMessageMuteModeChanged
)
}
/**
* TeamStore 内存中增加群组
* @param teams - 群组
*/
TeamStore.prototype.addTeam = function (teams) {
var _this = this
teams
.filter(function (item) {
return !!item.isValidTeam
})
.filter(function (item) {
return !!item.teamId
})
.forEach(function (item) {
_this.teams.set(item.teamId, item)
})
}
/**
* TeamStore 内存中移除群组
* @param teamIds - 群id数组
*/
TeamStore.prototype.removeTeam = function (teamIds) {
var _this = this
teamIds.forEach(function (item) {
_this.teams.delete(item)
})
}
/**
* TeamStore 内存中更新群组
* @param data - 群组信息
*/
TeamStore.prototype.updateTeam = function (data) {
var _this = this
data
.filter(function (item) {
return !!item.teamId
})
.forEach(function (item) {
var oldTeam = _this.teams.get(item.teamId)
if (oldTeam) {
var newTeam = __assign(__assign({}, oldTeam), item)
_this.teams.set(item.teamId, newTeam)
}
})
}
/**
* 创建群
* @param __namedParameters.accounts - 要拉进群的成员的帐号列表
* @param __namedParameters.type - 群类型,默认高级群
* @param __namedParameters.avatar - 群头像
* @param __namedParameters.name - 群名称
* @param __namedParameters.intro - 群简介
* @param __namedParameters.serverExtension - 群扩展字段
*/
TeamStore.prototype.createTeamActive = function (_a) {
var _b, _c, _d
var accounts = _a.accounts,
_e = _a.type,
type =
_e === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _e,
avatar = _a.avatar,
name = _a.name,
intro = _a.intro,
serverExtension = _a.serverExtension,
joinMode = _a.joinMode,
agreeMode = _a.agreeMode,
inviteMode = _a.inviteMode,
updateInfoMode = _a.updateInfoMode,
updateExtensionMode = _a.updateExtensionMode
return __awaiter(this, void 0, void 0, function () {
var team, error_1
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
_f.trys.push([0, 2, , 3])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('createTeamActive', {
accounts: accounts,
type: type,
avatar: avatar,
name: name,
intro: intro,
serverExtension: serverExtension,
})
return [
4 /*yield*/,
this.nim.V2NIMTeamService.createTeam(
{
avatar: avatar,
teamType: type,
joinMode: joinMode || this.localOptions.teamJoinMode,
agreeMode: agreeMode || this.localOptions.teamAgreeMode,
inviteMode: inviteMode || this.localOptions.teamInviteMode,
updateInfoMode:
updateInfoMode || this.localOptions.teamUpdateTeamMode,
updateExtensionMode:
updateExtensionMode || this.localOptions.teamUpdateExtMode,
name: name,
intro: intro,
serverExtension: serverExtension,
},
accounts,
''
),
]
case 1:
team = _f.sent().team
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('createTeamActive success', team)
return [2 /*return*/, team]
case 2:
error_1 = _f.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error(
'createTeamActive failed: ',
{
accounts: accounts,
type: type,
avatar: avatar,
name: name,
intro: intro,
serverExtension: serverExtension,
},
error_1,
error_1.code,
error_1.detail
)
throw error_1
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 申请入群
* @param teamId - 群id
* @param type - 群类型,默认高级群
*/
TeamStore.prototype.applyTeamActive = function (teamId, type) {
var _a, _b, _c
if (type === void 0) {
type = 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
}
return __awaiter(this, void 0, void 0, function () {
var team, error_2
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('applyTeamActive', teamId)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.applyJoinTeam(teamId, type),
]
case 1:
team = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('applyTeamActive success', teamId)
return [2 /*return*/, team]
case 2:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('applyTeamActive failed: ', teamId, error_2)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 主动退群
* @param teamId - 群id
* @param type - 群类型,默认高级群
*/
TeamStore.prototype.leaveTeamActive = function (teamId, type) {
var _a, _b, _c
if (type === void 0) {
type = 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
}
return __awaiter(this, void 0, void 0, function () {
var error_3
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('leaveTeamActive', teamId)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.leaveTeam(teamId, type),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('leaveTeamActive success', teamId)
return [3 /*break*/, 3]
case 2:
error_3 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('leaveTeamActive failed: ', teamId, error_3)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 解散群
* @param teamId - 群id
* @param type - 群类型,默认高级群
*/
TeamStore.prototype.dismissTeamActive = function (teamId, type) {
var _a, _b, _c
if (type === void 0) {
type = 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
}
return __awaiter(this, void 0, void 0, function () {
var error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('dismissTeamActive', teamId)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.dismissTeam(teamId, type),
// 会收到一条 onDissmiss 事件
]
case 1:
_d.sent()
// 会收到一条 onDissmiss 事件
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('dismissTeamActive success', teamId)
return [3 /*break*/, 3]
case 2:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('dismissTeamActive failed: ', teamId, error_4)
throw error_4
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 转让群主
* @param teamId - 群id
* @param type - 群类型,默认高级群
* @param account - 新群主帐号
* @param leave - 是否同时退出群聊,默认 false
*/
TeamStore.prototype.transferTeamActive = function (_a) {
var _b, _c, _d
var teamId = _a.teamId,
_e = _a.type,
type =
_e === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _e,
account = _a.account,
leave = _a.leave
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
_f.trys.push([0, 2, , 3])
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('transferTeamActive', {
teamId: teamId,
type: type,
account: account,
leave: leave,
})
return [
4 /*yield*/,
this.nim.V2NIMTeamService.transferTeamOwner(
teamId,
type,
account,
leave !== null && leave !== void 0
? leave
: this.localOptions.leaveOnTransfer
),
]
case 1:
_f.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('transferTeamActive success', {
teamId: teamId,
type: type,
account: account,
leave: leave,
})
return [3 /*break*/, 3]
case 2:
error_5 = _f.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error(
'transferTeamActive failed: ',
{
teamId: teamId,
type: type,
account: account,
leave: leave,
},
error_5
)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 群禁言
* @param options
* options.teamId - 群id <br>
* options.type - 群类型,默认高级群 <br>
* options.chatBannedMode - 禁言模式
*/
TeamStore.prototype.setTeamChatBannedActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_6
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('muteTeamActive', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.setTeamChatBannedMode(
options.teamId,
options.type ||
1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */,
options.chatBannedMode
),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('muteTeamActive success', options)
return [3 /*break*/, 3]
case 2:
error_6 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('muteTeamActive failed: ', options, error_6)
throw error_6
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 更新群
* @param options
* options.teamId - 群id <br>
* options.type - 群类型,默认高级群 <br>
* options.info - 群信息 <br>
*/
TeamStore.prototype.updateTeamActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, _d, type, info, error_7
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('updateTeamActive', options)
;(teamId = options.teamId),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d),
(info = options.info)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.updateTeamInfo(teamId, type, info),
// 后续在事件中处理
]
case 1:
_e.sent()
// 后续在事件中处理
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('updateTeamActive success', options)
return [3 /*break*/, 3]
case 2:
error_7 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('updateTeamActive failed: ', options, error_7)
throw error_7
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 从内存中获取群信息
* @param teamId - 群id
* @param type - 群类型,默认高级群
*/
TeamStore.prototype.getTeamActive = function (teamId, type) {
var _a
if (type === void 0) {
type = 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
}
return __awaiter(this, void 0, void 0, function () {
var team
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamActive: ', teamId)
team = this.teams.get(teamId)
if (team) {
return [2 /*return*/, team]
}
return [4 /*yield*/, this.getTeamForceActive(teamId, type)]
case 1:
team = _b.sent()
this.addTeam([team])
return [2 /*return*/, team]
}
})
})
}
/**
* 从服务端获取群信息
* @param teamId - 群id
* @param type - 群类型,默认高级群
*/
TeamStore.prototype.getTeamForceActive = function (teamId, type) {
var _a, _b, _c
if (type === void 0) {
type = 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
}
return __awaiter(this, void 0, void 0, function () {
var res, error_8
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamForceActive: ', teamId)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.getTeamInfo(teamId, type),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getTeamForceActive success', res)
// 这里不能存入 teamStore因为 teamStore 只有在群中的内容
return [2 /*return*/, res]
case 2:
error_8 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getTeamForceActive failed: ', teamId, error_8)
throw error_8
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 设置群消息免打扰
* @param teamId - 群id
* @param teamType - 群类型,默认高级群
* @param muteMode - 消息免打扰模式
*/
TeamStore.prototype.setTeamMessageMuteModeActive = function (
teamId,
teamType,
muteMode
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_9
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('setTeamMessageMuteModeActive', {
teamId: teamId,
teamType: teamType,
muteMode: muteMode,
})
return [
4 /*yield*/,
this.nim.V2NIMSettingService.setTeamMessageMuteMode(
teamId,
teamType,
muteMode
),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('setTeamMessageMuteModeActive success', {
teamId: teamId,
teamType: teamType,
muteMode: muteMode,
})
return [3 /*break*/, 3]
case 2:
error_9 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'setTeamMessageMuteModeActive failed: ',
{ teamId: teamId, teamType: teamType, muteMode: muteMode },
error_9
)
throw error_9
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 被邀请者接受入群邀请
* @param options V2NIMTeamJoinActionInfo
*/
TeamStore.prototype.acceptTeamInviteActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_10
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('acceptTeamInviteActive: ', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.acceptInvitation(options),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('acceptTeamInviteActive success', options)
return [3 /*break*/, 3]
case 2:
error_10 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('acceptTeamInviteActive failed: ', options, error_10)
throw error_10
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 被邀请者拒绝入群邀请
* @param options V2NIMTeamJoinActionInfo
*/
TeamStore.prototype.rejectTeamInviteActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_11
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('rejectTeamInviteActive: ', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.rejectInvitation(options),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('rejectTeamInviteActive success', options)
return [3 /*break*/, 3]
case 2:
error_11 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('rejectTeamInviteActive failed: ', options, error_11)
throw error_11
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 管理员通过入群申请
* @param options V2NIMTeamJoinActionInfo
*/
TeamStore.prototype.acceptJoinApplicationActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_12
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('acceptJoinApplicationActive: ', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.acceptJoinApplication(options),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('acceptJoinApplicationActive success', options)
return [3 /*break*/, 3]
case 2:
error_12 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'acceptJoinApplicationActive failed: ',
options,
error_12
)
throw error_12
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 管理员拒绝入群申请
* @param options V2NIMTeamJoinActionInfo
*/
TeamStore.prototype.rejectTeamApplyActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_13
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('rejectTeamApplyActive: ', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.rejectJoinApplication(options),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('rejectTeamApplyActive success', options)
return [3 /*break*/, 3]
case 2:
error_13 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('rejectTeamApplyActive failed: ', options, error_13)
throw error_13
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 设置成员角色
* @param options
* options.teamId - 群id <br>
* options.type - 群类型,默认高级群 <br>
* options.accounts - 群管理员 accid
* options.role - 角色
*/
TeamStore.prototype.updateTeamMemberRoleActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, _d, type, accounts, role, error_14
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('addTeamManagersActive: ', options)
;(teamId = options.teamId),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d),
(accounts = options.accounts),
(role = options.role)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.updateTeamMemberRole(
teamId,
type,
accounts,
role
),
]
case 1:
_e.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('addTeamManagersActive success', options)
return [3 /*break*/, 3]
case 2:
error_14 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('addTeamManagersActive failed: ', options, error_14)
throw error_14
case 3:
return [2 /*return*/]
}
})
})
}
/** 获取群组申请动作信息 */
TeamStore.prototype.getTeamJoinActionInfoListActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_15
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamJoinActionInfoListActive: ', options)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.getTeamJoinActionInfoList(options),
]
case 1:
res = _d.sent()
this.rootStore.sysMsgStore.addTeamJoinActionMsg(res.infos)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getTeamJoinActionInfoListActive success', res)
return [2 /*return*/, res]
case 2:
error_15 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getTeamJoinActionInfoListActive failed: ',
options,
error_15
)
throw error_15
case 3:
return [2 /*return*/]
}
})
})
}
/** 获取已加入的群组列表 */
TeamStore.prototype.getJoinedTeamListActive = function () {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teams, error_16
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getJoinedTeamListActive')
return [
4 /*yield*/,
this.nim.V2NIMTeamService.getJoinedTeamList([1]),
]
case 1:
teams = _d.sent()
this.addTeam(teams)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getJoinedTeamListActive success', teams)
return [2 /*return*/, teams]
case 2:
error_16 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getJoinedTeamListActive failed: ', error_16)
throw error_16
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取群消息免打扰状态
* @param teamId - 群id <br>
* @param teamType - 群组类型,包括高级群和超大群。 <br>
*/
TeamStore.prototype.getTeamMessageMuteModeActive = function (
teamId,
teamType
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var muteMode, error_17
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamMessageMuteModeActive', teamId, teamType)
return [
4 /*yield*/,
this.nim.V2NIMSettingService.getTeamMessageMuteMode(
teamId,
teamType
),
]
case 1:
muteMode = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getTeamMessageMuteModeActive success', teamId, teamType)
return [2 /*return*/, muteMode]
case 2:
error_17 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getTeamMessageMuteModeActive failed: ',
teamId,
teamType,
error_17
)
throw error_17
case 3:
return [2 /*return*/]
}
})
})
}
TeamStore.prototype._onReceiveTeamJoinActionInfo = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onReceiveTeamJoinActionInfo: ', data)
this.rootStore.sysMsgStore.addTeamJoinActionMsg([data])
}
TeamStore.prototype._onSyncFailed = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onSyncFailed: ', data)
}
TeamStore.prototype._onSyncFinished = function () {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_c) {
// 获取会话列表
;(_a = this.rootStore.conversationStore) === null || _a === void 0
? void 0
: _a.getConversationListActive(
0,
this.rootStore.localOptions.conversationLimit || 100
)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('V2NIMTeamService _onSyncFinished')
return [2 /*return*/]
})
})
}
TeamStore.prototype._onSyncStarted = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onSyncStarted')
}
TeamStore.prototype._onTeamCreated = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamCreated: ', data)
this.addTeam([data])
// 不用自己插入会话了,因为 SDK 会有会话创建回调
}
TeamStore.prototype._onTeamDismissed = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamDismissed: ', data)
this._handleRemoveTeam(data.teamId)
}
TeamStore.prototype._onTeamInfoUpdated = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamInfoUpdated: ', data)
this.updateTeam([data])
}
TeamStore.prototype._onTeamJoined = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamJoined: ', data)
this.addTeam([data])
// 不用自己插入会话了,因为 SDK 会有会话创建回调
}
TeamStore.prototype._onTeamLeft = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamLeft: ', data)
this._handleRemoveTeam(data.teamId)
return [2 /*return*/]
})
})
}
TeamStore.prototype._onTeamMemberInfoUpdated = function (data) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamMemberInfoUpdated: ', data)
var teamId = data[0].teamId
this.rootStore.teamMemberStore.updateTeamMember(teamId, data)
}
TeamStore.prototype._onTeamMemberJoined = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var teamId
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamMemberJoined: ', data)
teamId = data[0].teamId
this.rootStore.teamMemberStore.addTeamMember(teamId, data)
return [2 /*return*/]
})
})
}
TeamStore.prototype._onTeamMemberKicked = function (opeartorId, data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var teamId
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamMemberKicked: ', opeartorId, data)
teamId = data[0].teamId
this.rootStore.teamMemberStore.removeTeamMember(
teamId,
data.map(function (item) {
return item.accountId
})
)
return [2 /*return*/]
})
})
}
TeamStore.prototype._onTeamMemberLeft = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var teamId
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('V2NIMTeamService _onTeamMemberLeft: ', data)
teamId = data[0].teamId
this.rootStore.teamMemberStore.removeTeamMember(
teamId,
data.map(function (item) {
return item.accountId
})
)
return [2 /*return*/]
})
})
}
TeamStore.prototype._handleRemoveTeam = function (teamId) {
this.removeTeam([teamId])
// 手动释放内存
this.rootStore.teamMemberStore.removeTeamMember(teamId)
}
TeamStore.prototype._onTeamMessageMuteModeChanged = function (
teamId,
teamType,
muteMode
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'V2NIMTeamService _onTeamMessageMuteModeChanged: ',
teamId,
teamType,
muteMode
)
}
return TeamStore
})()
/**Mobx 可观察对象,负责管理群组成员的子 store*/
var TeamMemberStore = /** @class */ (function () {
function TeamMemberStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.teamMembers = new Map()
this.logger = null
makeAutoObservable(this)
this.logger = rootStore.logger
}
TeamMemberStore.prototype.resetState = function () {
this.teamMembers.clear()
}
/**
* 销毁TeamMemberStore会取消相关事件监听
*/
TeamMemberStore.prototype.destroy = function () {
this.resetState()
}
/**
* 拉人入群
* @param options
* options.teamId - 群id <br>
* options.type - 群类型, 默认高级群 <br>
* options.accounts - 要拉进群的成员的帐号列表 <br>
* options.ps - 邀请附言 <br>
*/
TeamMemberStore.prototype.addTeamMemberActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, _d, type, accounts, ps, error_1
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('addTeamMemberActive', options)
;(teamId = options.teamId),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d),
(accounts = options.accounts),
(ps = options.ps)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.inviteMember(
teamId,
type,
accounts,
ps
),
// 事件中处理
]
case 1:
_e.sent()
// 事件中处理
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('addTeamMemberActive success', options)
return [3 /*break*/, 3]
case 2:
error_1 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('addTeamMemberActive failed: ', options, error_1)
throw error_1
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 踢人出群
* @param options
* options.teamId - 群id <br>
* options.type - 群类型, 默认高级群 <br>
* options.accounts - 要拉进群的成员的帐号列表 <br>
*/
TeamMemberStore.prototype.removeTeamMemberActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, _d, type, accounts, error_2
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('removeTeamMemberActive', options)
;(teamId = options.teamId),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d),
(accounts = options.accounts)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.kickMember(teamId, type, accounts),
// 事件中处理
]
case 1:
_e.sent()
// 事件中处理
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('removeTeamMemberActive success', options)
return [3 /*break*/, 3]
case 2:
error_2 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('removeTeamMemberActive failed: ', options, error_2)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取群成员
* @param options
* options.teamId - 群id <br>
* options.queryOption - 查询选项 <br>
* options.type - 群类型, 默认高级群 <br>
*/
TeamMemberStore.prototype.getTeamMemberActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, queryOption, _d, type, res, error_3
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getTeamMemberActive', options)
;(teamId = options.teamId),
(queryOption = options.queryOption),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.getTeamMemberList(
teamId,
type,
queryOption
),
]
case 1:
res = _e.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'getTeamMemberActive success: ',
teamId,
type,
queryOption,
res
)
this.setTeamMembers(teamId, res.memberList)
return [2 /*return*/, res]
case 2:
error_3 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getTeamMemberActive failed: ', options, error_3)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 更新我在群中的信息
* @param options
* options.teamId - 群id <br>
* options.type - 群类型, 默认高级群 <br>
* options.memberInfo - 更新的信息 <br>
*/
TeamMemberStore.prototype.updateMyMemberInfoActive = function (options) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var teamId, _d, type, memberInfo, error_4
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('updateMyMemberInfo', options)
;(teamId = options.teamId),
(_d = options.type),
(type =
_d === void 0
? 1 /* V2NIMConst.V2NIMTeamType.V2NIM_TEAM_TYPE_ADVANCED */
: _d),
(memberInfo = options.memberInfo)
return [
4 /*yield*/,
this.nim.V2NIMTeamService.updateSelfTeamMemberInfo(
teamId,
type,
memberInfo
),
]
case 1:
_e.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('updateMyMemberInfo success: ', options)
return [3 /*break*/, 3]
case 2:
error_4 = _e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('updateMyMemberInfo failed: ', options, error_4)
throw error_4
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 内存中设置群成员,会覆盖原有的成员
* @param teamId - 群id
* @param members - 群成员
*/
TeamMemberStore.prototype.setTeamMembers = function (teamId, members) {
var teamMembers = new Map()
members.forEach(function (item) {
teamMembers.set(item.accountId, item)
})
this.teamMembers.set(teamId, teamMembers)
}
/**
* 内存中添加群成员
* @param teamId - 群id
* @param members - 群成员
*/
TeamMemberStore.prototype.addTeamMember = function (teamId, members) {
var teamMembers = this.teamMembers.get(teamId)
if (!teamMembers) {
teamMembers = new Map()
}
members
.filter(function (item) {
return !!item.inTeam
})
.filter(function (item) {
return !!item.accountId
})
.forEach(function (item) {
teamMembers.set(item.accountId, item)
})
this.teamMembers.set(teamId, teamMembers)
}
/**
* 内存中移除群成员
* @param teamId - 群id
* @param accounts - 群成员数组
*/
TeamMemberStore.prototype.removeTeamMember = function (teamId, accounts) {
if (!accounts || !accounts.length) {
this.teamMembers.delete(teamId)
return
}
var teamMembers = this.teamMembers.get(teamId)
if (!teamMembers) {
return
}
accounts.forEach(function (item) {
teamMembers.delete(item)
})
this.teamMembers.set(teamId, teamMembers)
}
/**
* 内存中更新群成员处理函数
* @param teamId - 群id
* @param members - 群成员
*/
TeamMemberStore.prototype.updateTeamMember = function (teamId, members) {
var teamMembers = this.teamMembers.get(teamId)
if (!teamMembers) {
return
}
members.forEach(function (item) {
var m = teamMembers.get(item.accountId)
if (m) {
m = __assign(__assign({}, m), item)
teamMembers.set(item.accountId, m)
}
})
this.teamMembers.set(teamId, teamMembers)
}
/**
* 从内存中获取群成员信息
* @param teamId - 群id
* @param accounts - 群成员数组
*/
TeamMemberStore.prototype.getTeamMember = function (teamId, accounts) {
var _a
var teamMembers = __spreadArray(
[],
__read(
((_a = this.teamMembers.get(teamId)) === null || _a === void 0
? void 0
: _a.values()) || []
),
false
)
if (!accounts || !accounts.length) {
return teamMembers
}
return teamMembers.filter(function (item) {
return accounts.some(function (j) {
return j === item.accountId
})
})
}
return TeamMemberStore
})()
/**Mobx 可观察对象,负责管理系统消息的子 store */
var SysMsgStore = /** @class */ (function () {
function SysMsgStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
/** 好友申请消息 */
this.friendApplyMsg = new Map()
this.teamJoinActionMsg = new Map()
this.logger = null
makeAutoObservable(this)
this.logger = rootStore.logger
}
SysMsgStore.prototype.resetState = function () {
this.friendApplyMsg.clear()
this.teamJoinActionMsg.clear()
}
/**
* 销毁SysMsgStore会取消系统消息事件监听
*/
SysMsgStore.prototype.destroy = function () {
this.resetState()
}
Object.defineProperty(SysMsgStore.prototype, 'friendApplyMsgs', {
get: function () {
return Array.from(this.friendApplyMsg.values()).sort(function (a, b) {
return b.timestamp - a.timestamp
})
},
enumerable: false,
configurable: true,
})
Object.defineProperty(SysMsgStore.prototype, 'teamJoinActionMsgs', {
get: function () {
return Array.from(this.teamJoinActionMsg.values()).sort(function (a, b) {
return b.timestamp - a.timestamp
})
},
enumerable: false,
configurable: true,
})
/**
* 增加内存中的好友申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.addFriendApplyMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createFriendApplyMsgKey(msg)
_this.friendApplyMsg.set(key, msg)
})
}
/**
* 删除内存中的好友申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.deleteFriendApplyMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createFriendApplyMsgKey(msg)
_this.friendApplyMsg.delete(key)
})
}
/**
* 更新内存中的好友申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.updateFriendApplyMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createFriendApplyMsgKey(msg)
var oldMsg = _this.friendApplyMsg.get(key)
if (oldMsg) {
_this.friendApplyMsg.set(key, __assign(__assign({}, oldMsg), msg))
}
})
}
/**
* 增加内存中的入群申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.addTeamJoinActionMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createTeamJoinActionMsgKey(msg)
_this.teamJoinActionMsg.set(key, msg)
})
}
/**
* 删除内存中的入群申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.deleteTeamJoinActionMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createTeamJoinActionMsgKey(msg)
_this.teamJoinActionMsg.delete(key)
})
}
/**
* 更新内存中的入群申请消息
* @param msgs 系统消息对象数组
*/
SysMsgStore.prototype.updateTeamJoinActionMsg = function (msgs) {
var _this = this
msgs.forEach(function (msg) {
var key = _this.createTeamJoinActionMsgKey(msg)
var oldMsg = _this.teamJoinActionMsg.get(key)
var newMsg = __assign(__assign({}, oldMsg), msg)
_this.teamJoinActionMsg.set(key, newMsg)
})
}
/** 获取未读好友申请消息数量 */
SysMsgStore.prototype.getUnreadFriendApplyMsgsCount = function () {
return this.friendApplyMsgs.filter(function (msg) {
return !msg.isRead
}).length
}
/** 获取未读入群申请消息数量 */
SysMsgStore.prototype.getUnreadTeamJoinActionMsgsCount = function () {
return this.teamJoinActionMsgs.filter(function (msg) {
return !msg.isRead
}).length
}
/** 获取未读消息总数 */
SysMsgStore.prototype.getTotalUnreadMsgsCount = function () {
return (
this.getUnreadFriendApplyMsgsCount() +
this.getUnreadTeamJoinActionMsgsCount()
)
}
/** 设置所有申请消息为已读 */
SysMsgStore.prototype.setAllApplyMsgRead = function () {
this.updateFriendApplyMsg(
this.friendApplyMsgs.map(function (msg) {
return __assign(__assign({}, msg), { isRead: true })
})
)
this.updateTeamJoinActionMsg(
this.teamJoinActionMsgs.map(function (msg) {
return __assign(__assign({}, msg), { isRead: true })
})
)
}
/** 创建群组申请消息的 key */
SysMsgStore.prototype.createTeamJoinActionMsgKey = function (msg) {
return ''
.concat(msg.teamId, '_')
.concat(msg.operatorAccountId, '_')
.concat(msg.actionType)
}
/** 创建好友申请消息的 key */
SysMsgStore.prototype.createFriendApplyMsgKey = function (msg) {
return ''.concat(msg.applicantAccountId, '_').concat(msg.recipientAccountId)
}
return SysMsgStore
})()
/**Mobx 可观察对象,负责管理用户信息(包含陌生人)的子 store */
var UserStore = /** @class */ (function () {
function UserStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.users = new Map()
this.myUserInfo = {
accountId: this.nim.V2NIMLoginService.getLoginUser(),
name: '',
createTime: Date.now(),
updateTime: Date.now(),
}
this.logger = null
this._getUserInfo = frequencyControl(this._getUserInfos, 1000, 100)
makeAutoObservable(this)
this._onUserProfileChanged = this._onUserProfileChanged.bind(this)
this.logger = rootStore.logger
// 用户资料变更回调,返回变更的用户资料列表
nim.V2NIMUserService.on('onUserProfileChanged', this._onUserProfileChanged)
}
UserStore.prototype.resetState = function () {
this.users.clear()
this.myUserInfo = {
accountId: this.nim.V2NIMLoginService.getLoginUser(),
name: '',
createTime: Date.now(),
updateTime: Date.now(),
}
}
/**
* 销毁UserStore会取消相关事件监听
*/
UserStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMUserService.off(
'onUserProfileChanged',
this._onUserProfileChanged
)
}
/**
* 内存中增加users
* @param users - users数组
*/
UserStore.prototype.addUsers = function (users) {
var _this = this
users
.filter(function (item) {
return !!item.accountId
})
.forEach(function (item) {
_this.users.set(item.accountId, item)
})
}
/**
* 内存中删除users
* @param users - users数组
*/
UserStore.prototype.removeUsers = function (accounts) {
var _this = this
accounts.forEach(function (item) {
_this.users.delete(item)
})
}
/**
* 获取我自己的 serverExtension 字段
*/
UserStore.prototype.getMyUserServerExt = function () {
var _a
var serverExt = {}
try {
serverExt = JSON.parse(
((_a = this.myUserInfo) === null || _a === void 0
? void 0
: _a.serverExtension) || '{}'
)
} catch (error) {
//
}
return serverExt
}
/**
* 更新自己的用户资料
* @param updateParams
* updateParams.nick - 昵称 <br>
* updateParams.avatar - 头像 <br>
* updateParams.sign - 签名 <br>
* updateParams.gender - 性别 <br>
* updateParams.email - 邮箱 <br>
* updateParams.birth - 生日 <br>
* updateParams.tel - 手机号 <br>
* updateParams.serverExtension - 扩展字段 <br>
*
* @param fileObj - 头像文件对象、或者在小程序中,文件路径
*/
UserStore.prototype.updateSelfUserProfileActive = function (
updateParams,
fileObj
) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var task, avatarUrl, error_1, error_2
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 6, , 7])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('updateSelfUserProfileActive', updateParams, fileObj)
if (!fileObj) return [3 /*break*/, 4]
_e.label = 1
case 1:
_e.trys.push([1, 3, , 4])
task = this.nim.V2NIMStorageService.createUploadFileTask({
fileObj: fileObj,
})
return [
4 /*yield*/,
this.nim.V2NIMStorageService.uploadFile(task, function () {
/**/
}),
]
case 2:
avatarUrl = _e.sent()
updateParams.avatar = avatarUrl
return [3 /*break*/, 4]
case 3:
error_1 = _e.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn('upload avatar error and save continue.', error_1)
return [3 /*break*/, 4]
case 4:
return [
4 /*yield*/,
this.nim.V2NIMUserService.updateSelfUserProfile(updateParams),
]
case 5:
_e.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log(
'updateSelfUserProfileActive success',
updateParams,
fileObj
)
return [3 /*break*/, 7]
case 6:
error_2 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error(
'updateSelfUserProfileActive failed:',
updateParams,
error_2,
fileObj
)
throw error_2
case 7:
return [2 /*return*/]
}
})
})
}
/**
* 获取用户最新信息(如果内存中存在,就不去服务器取最新的了)
* @param accountIds - 账号id数组
*/
UserStore.prototype.getUserActive = function (accountId) {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
var user
return __generator(this, function (_c) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getUserListActive', accountId)
user = this.users.get(accountId)
if (user) {
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getUserListActive success', user, accountId)
return [2 /*return*/, user]
}
return [2 /*return*/, this.getUserForceActive(accountId)]
})
})
}
/**
* 获取用户最新信息
* @param accountIds - 账号id数组
*/
UserStore.prototype.getUserForceActive = function (accountId) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var user, error_3
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getUserForceActive', accountId)
return [4 /*yield*/, this._getUserInfo(accountId)]
case 1:
user = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getUserForceActive success', user, accountId)
return [2 /*return*/, user]
case 2:
error_3 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getUserForceActive failed: ', accountId, error_3)
throw error_3
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取用户最新信息(始终从服务器取最新的,用于点开用户头像时)
* @param accountIds - 账号id数组
*/
UserStore.prototype.getUserListFromCloudActive = function (accountIds) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var users, error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getUserListFromCloudActive', accountIds)
return [
4 /*yield*/,
this.nim.V2NIMUserService.getUserListFromCloud(accountIds),
]
case 1:
users = _d.sent()
this.addUsers(users)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getUserListFromCloudActive success', users, accountIds)
return [2 /*return*/, users]
case 2:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'getUserListFromCloudActive failed: ',
accountIds,
error_4
)
throw error_4
case 3:
return [2 /*return*/]
}
})
})
}
// 获取自己的用户信息
UserStore.prototype.getMyUserInfoActive = function () {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var myUserInfo, error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getMyUserInfoActive')
return [
4 /*yield*/,
this.nim.V2NIMUserService.getUserList([
this.nim.V2NIMLoginService.getLoginUser(),
]),
]
case 1:
myUserInfo = _d.sent()
this.myUserInfo = myUserInfo[0]
this.addUsers(myUserInfo)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getMyUserInfoActive success', myUserInfo)
return [2 /*return*/, myUserInfo[0]]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('getMyUserInfoActive failed: ', error_5)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
UserStore.prototype._getUserInfos = function (accountIds) {
return __awaiter(this, void 0, void 0, function () {
var users
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
return [
4 /*yield*/,
this.nim.V2NIMUserService.getUserList(accountIds),
]
case 1:
users = _a.sent()
this.addUsers(users)
return [2 /*return*/, users]
}
})
})
}
UserStore.prototype._onUserProfileChanged = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onUserProfileChanged: ', data)
data.forEach(function (item) {
if (item.accountId === _this.myUserInfo.accountId) {
_this.myUserInfo = item
}
})
this.addUsers(data)
}
return UserStore
})()
var AIUserStore = /** @class */ (function () {
function AIUserStore(rootStore, nim, localOptions) {
this.rootStore = rootStore
this.nim = nim
this.localOptions = localOptions
this.aiUsers = new Map()
this.aiReqMsgs = []
this.aiResMsgs = []
this.logger = null
this.onSendAIProxyErrorHandler = function () {
//
}
this.requestIds = []
this.proxyAccountId = ''
makeAutoObservable(this)
this.logger = rootStore.logger
this._onProxyAIModelCall = this._onProxyAIModelCall.bind(this)
this.nim.V2NIMAIService.on('onProxyAIModelCall', this._onProxyAIModelCall)
}
Object.defineProperty(AIUserStore.prototype, 'aiProxying', {
get: function () {
return this.aiReqMsgs.length > this.aiResMsgs.length
},
enumerable: false,
configurable: true,
})
AIUserStore.prototype.resetState = function () {
this.aiUsers.clear()
this.aiReqMsgs = []
this.aiResMsgs = []
}
/**
* 销毁 AIUserStore会取消相关事件监听
*/
AIUserStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMAIService.off('onProxyAIModelCall', this._onProxyAIModelCall)
}
/** 内存中增加 AIUsers */
AIUserStore.prototype.addAIUsers = function (aiUsers) {
var _this = this
aiUsers
.filter(function (item) {
return !!item.accountId
})
.forEach(function (item) {
_this.aiUsers.set(item.accountId, item)
})
}
/** 内存中删除 AIUsers */
AIUserStore.prototype.removeAIUsers = function (accounts) {
var _this = this
accounts.forEach(function (item) {
_this.aiUsers.delete(item)
})
}
/**
* 获取 AIUsers
*/
AIUserStore.prototype.getAIUserList = function (accountIds) {
var aiUsers = __spreadArray([], __read(this.aiUsers.values()), false)
var sortHandler = function (a, b) {
return b.createTime - a.createTime
}
if (accountIds && accountIds.length) {
return aiUsers
.filter(function (item) {
return accountIds.includes(item.accountId)
})
.sort(sortHandler)
}
return aiUsers.sort(sortHandler)
}
/**
* 获取 AI 划词数字人
*/
AIUserStore.prototype.getAISearchUser = function () {
var _a, _b
var aiUsers = this.getAIUserList()
return (_b =
(_a = this.localOptions.aiUserAgentProvider) === null || _a === void 0
? void 0
: _a.getAISearchUser) === null || _b === void 0
? void 0
: _b.call(_a, aiUsers)
}
/**
* 获取 AI 翻译数字人
*/
AIUserStore.prototype.getAITranslateUser = function () {
var _a, _b
var aiUsers = this.getAIUserList()
return (_b =
(_a = this.localOptions.aiUserAgentProvider) === null || _a === void 0
? void 0
: _a.getAITranslateUser) === null || _b === void 0
? void 0
: _b.call(_a, aiUsers)
}
/**
* 获取 AI 翻译语言
*/
AIUserStore.prototype.getAITranslateLangs = function () {
var _a, _b
var aiUsers = this.getAIUserList()
return (
((_b =
(_a = this.localOptions.aiUserAgentProvider) === null || _a === void 0
? void 0
: _a.getAITranslateLangs) === null || _b === void 0
? void 0
: _b.call(_a, aiUsers)) || []
)
}
/**
* 获取 AI 数字人的 serverExtension
*/
AIUserStore.prototype.getAIUserServerExt = function (accountId) {
var aiUser = this.aiUsers.get(accountId)
if (!aiUser) {
return {}
}
try {
return JSON.parse(aiUser.serverExtension || '{}')
} catch (error) {
return {}
}
}
/**
* 获取 AI 聊数字人AI 聊是指可以被 @ 的数字人
*/
AIUserStore.prototype.getAIChatUser = function () {
var _this = this
var aiUsers = this.getAIUserList()
return aiUsers.filter(function (item) {
var serverExt = _this.getAIUserServerExt(item.accountId)
return serverExt.aiChat === 1
})
}
/**
* 获取配置过默认置顶的数字人,仅代表配置过,不代表当前置顶
*/
AIUserStore.prototype.getAIPinDefaultUser = function () {
var _this = this
var aiUsers = this.getAIUserList()
return aiUsers.filter(function (item) {
var serverExt = _this.getAIUserServerExt(item.accountId)
return serverExt.pinDefault === 1
})
}
/**
* 获取当前置顶的数字人
*/
AIUserStore.prototype.getAIPinUser = function () {
var myUserServerExt = this.rootStore.userStore.getMyUserServerExt()
return this.getAIPinDefaultUser().filter(function (item) {
var _a
return !((_a = myUserServerExt.unpinAIUsers) === null || _a === void 0
? void 0
: _a.includes(item.accountId))
})
}
/**
* 判断一个数字人是否 pin 置顶
*/
AIUserStore.prototype.isAIPinUser = function (accountId) {
return this.getAIPinUser().some(function (item) {
return item.accountId === accountId
})
}
/**
* 判断是否正在 AI 划词中
*/
AIUserStore.prototype.isAISearching = function () {
var _a
return (
this.proxyAccountId ===
((_a = this.getAISearchUser()) === null || _a === void 0
? void 0
: _a.accountId)
)
}
/**
* 判断是否正在 AI 翻译中
*/
AIUserStore.prototype.isAITranslating = function () {
var _a
return (
this.proxyAccountId ===
((_a = this.getAITranslateUser()) === null || _a === void 0
? void 0
: _a.accountId)
)
}
/**
* 判断是否AI数字人
*/
AIUserStore.prototype.isAIUser = function (accountId) {
return this.aiUsers.has(accountId)
}
/**
* 重置 AI 代理状态
*/
AIUserStore.prototype.resetAIProxy = function () {
this.requestIds = []
this.aiReqMsgs = []
this.aiResMsgs = []
this.proxyAccountId = ''
this.onSendAIProxyErrorHandler = function () {
//
}
}
/**
* 从 sdk 获取 AI 数字人列表并维护到内存中
*/
AIUserStore.prototype.getAIUserListActive = function () {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var aiUsers, error_1
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('getAIUserListActive')
return [4 /*yield*/, this.nim.V2NIMAIService.getAIUserList()]
case 1:
aiUsers = _d.sent()
this.addAIUsers(aiUsers)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('getAIUserListActive success:', aiUsers)
return [3 /*break*/, 3]
case 2:
error_1 = _d.sent()
// 未开通ai聊功能的 此处不需要报错
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('getAIUserListActive failed:', error_1)
return [3 /*break*/, 3]
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 发送 AI 代理请求
* @params requestId 请求 ID用于区分不同的请求传就表示新的请求不传表示继续上次的请求
*/
AIUserStore.prototype.sendAIProxyActive = function (params) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var finalParams, error_2
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('sendAIProxyActive', params)
finalParams = __assign({}, params)
// 表示新的请求,重置 requestId、aiResMsgs、proxyAccountId
if (params.requestId) {
this.resetAIProxy()
this.requestIds.push(params.requestId)
this.proxyAccountId = params.accountId
} else {
finalParams.requestId = Math.random().toString(36).slice(2)
this.requestIds.push(finalParams.requestId)
}
if (params.onSendAIProxyErrorHandler) {
this.onSendAIProxyErrorHandler = params.onSendAIProxyErrorHandler
}
return [
4 /*yield*/,
this.nim.V2NIMAIService.proxyAIModelCall(finalParams),
]
case 1:
_d.sent()
this.aiReqMsgs.push(params.content)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('sendAIProxyActive success:', params)
return [3 /*break*/, 3]
case 2:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error('sendAIProxyActive failed:', error_2.toString())
this.onSendAIProxyErrorHandler(error_2.code)
throw error_2
case 3:
return [2 /*return*/]
}
})
})
}
AIUserStore.prototype._onProxyAIModelCall = function (res) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('_onProxyAIModelCall', res)
if (this.requestIds.includes(res.requestId)) {
if (res.code === 200) {
this.aiResMsgs.push(res.content.msg)
} else {
this.aiReqMsgs.pop()
this.onSendAIProxyErrorHandler(res.code)
}
}
}
return AIUserStore
})()
/** Mobx 可观察对象,负责 UI 会用到的属性的子 store */
var UiStore = /** @class */ (function () {
function UiStore(rootStore) {
this.rootStore = rootStore
// 这边使用 undefined 会导致无法被注册成 observable但是 demo 上没问题,不知道是为什么,很懵逼,但是先把这边附上默认值就可以解决
this.selectedContactType = ''
/**
* 当前选中的会话
*/
this.selectedConversation = ''
this.logger = null
makeAutoObservable(this)
this.logger = rootStore.logger
}
/**
* 重置状态
*/
UiStore.prototype.resetState = function () {
this.selectedContactType = ''
this.selectedConversation = ''
}
/**
* 销毁UiStore使UI重置
*/
UiStore.prototype.destroy = function () {
this.resetState()
}
/**
* 通讯录选中类型
* @param contactType - 导航类型
*/
UiStore.prototype.selectContactType = function (contactType) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('selectContactType: ', contactType)
this.selectedContactType = contactType
}
/**
* 取消通讯录选中
*/
UiStore.prototype.unselectContactType = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('unselectContactType')
this.selectedContactType = ''
}
/**
* 切换会话
* @param conversationId - 会话ID
*/
UiStore.prototype.selectConversation = function (conversationId) {
var _a, _b, _c, _d, _e, _f
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_g) {
switch (_g.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('selectConversation: ', conversationId)
if (conversationId === this.selectedConversation) {
return [2 /*return*/]
}
this.rootStore.msgStore.msgs.resetLimitState()
this.selectedConversation = conversationId
if (!conversationId) return [3 /*break*/, 4]
if (
!((_b = this.rootStore.sdkOptions) === null || _b === void 0
? void 0
: _b.enableV2CloudConversation)
)
return [3 /*break*/, 2]
;(_c = this.rootStore.conversationStore) === null || _c === void 0
? void 0
: _c.resetConversationAit(conversationId)
return [
4 /*yield*/,
(_d = this.rootStore.conversationStore) === null || _d === void 0
? void 0
: _d.resetConversation(conversationId),
]
case 1:
_g.sent()
return [3 /*break*/, 4]
case 2:
;(_e = this.rootStore.localConversationStore) === null ||
_e === void 0
? void 0
: _e.resetConversationAit(conversationId)
return [
4 /*yield*/,
(_f = this.rootStore.localConversationStore) === null ||
_f === void 0
? void 0
: _f.resetConversation(conversationId),
]
case 3:
_g.sent()
_g.label = 4
case 4:
return [2 /*return*/]
}
})
})
}
/**
* 取消选中会话
*/
UiStore.prototype.unselectConversation = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('unselectConversation')
this.selectedConversation = ''
this.rootStore.msgStore.msgs.resetLimitState()
}
/**
* 获取用户关系
* @param account - 账号
*/
UiStore.prototype.getRelation = function (account) {
var res = 'stranger'
if (this.rootStore.userStore.myUserInfo.accountId === account) {
res = 'myself'
} else if (this.rootStore.aiUserStore.aiUsers.has(account)) {
res = 'ai'
} else if (this.rootStore.friendStore.friends.has(account)) {
res = 'friend'
} else {
res = 'stranger'
}
// this.logger?.log('getRelation success', account, res)
return {
relation: res,
isInBlacklist: this.rootStore.relationStore.isInBlacklist(account),
}
}
/**
* 获取好友名片
* * @param account - 账号
*/
UiStore.prototype.getFriendWithUserNameCard = function (account) {
var friend = this.rootStore.friendStore.friends.get(account) || {
accountId: '',
serverExtension: '',
customerExtension: '',
}
var userCard = this.rootStore.userStore.users.get(account) || {
accountId: '',
name: '',
createTime: Date.now(),
}
return __assign(__assign({}, friend), userCard)
}
/**
* 查询用户称谓
* 优先级按照 备注 > 群昵称 > 好友昵称 > 消息上的昵称 > 好友账号 返回,如果是机器人则优先返回机器人名字
* * @param account - 账号
* * @param teamId - 群号
* * @param ignoreAlias - 是否忽略好友备注
* * @param nickFromMsg - 消息上的昵称
*/
UiStore.prototype.getAppellation = function (_a) {
var _b
var account = _a.account,
_c = _a.teamId,
teamId = _c === void 0 ? '' : _c,
_d = _a.ignoreAlias,
ignoreAlias = _d === void 0 ? false : _d,
_e = _a.nickFromMsg,
nickFromMsg = _e === void 0 ? '' : _e
var aiUser = this.rootStore.aiUserStore.aiUsers.get(account)
if (aiUser) {
return aiUser.name || account
}
var friend = this.rootStore.friendStore.friends.get(account)
var user = this.rootStore.userStore.users.get(account)
var teamMember =
(_b = this.rootStore.teamMemberStore.teamMembers.get(teamId)) === null ||
_b === void 0
? void 0
: _b.get(account)
return (
(!ignoreAlias &&
(friend === null || friend === void 0 ? void 0 : friend.alias)) ||
(teamMember === null || teamMember === void 0
? void 0
: teamMember.teamNick) ||
(user === null || user === void 0 ? void 0 : user.name) ||
nickFromMsg ||
account
)
}
Object.defineProperty(UiStore.prototype, 'friends', {
get: function () {
return __spreadArray(
[],
__read(this.rootStore.friendStore.friends.values()),
false
)
},
enumerable: false,
configurable: true,
})
Object.defineProperty(UiStore.prototype, 'conversations', {
get: function () {
var _a
return (
(_a = this.rootStore.conversationStore) === null || _a === void 0
? void 0
: _a.conversations.values()
)
? __spreadArray(
[],
__read(this.rootStore.conversationStore.conversations.values()),
false
)
: []
},
enumerable: false,
configurable: true,
})
Object.defineProperty(UiStore.prototype, 'localConversations', {
get: function () {
var _a
return (
(_a = this.rootStore.localConversationStore) === null || _a === void 0
? void 0
: _a.conversations.values()
)
? __spreadArray(
[],
__read(
this.rootStore.localConversationStore.conversations.values()
),
false
)
: []
},
enumerable: false,
configurable: true,
})
Object.defineProperty(UiStore.prototype, 'users', {
get: function () {
return __spreadArray(
[],
__read(this.rootStore.userStore.users.values()),
false
)
},
enumerable: false,
configurable: true,
})
Object.defineProperty(UiStore.prototype, 'teamList', {
get: function () {
var teams = __spreadArray(
[],
__read(this.rootStore.teamStore.teams.values()),
false
)
return teams
.filter(function (item) {
return item.isValidTeam
})
.sort(function (a, b) {
return b.createTime - a.createTime
})
},
enumerable: false,
configurable: true,
})
Object.defineProperty(UiStore.prototype, 'applyMsgs', {
get: function () {
return __spreadArray(
[],
__read(this.rootStore.sysMsgStore.friendApplyMsg.values()),
false
)
},
enumerable: false,
configurable: true,
})
return UiStore
})()
/**Mobx 可观察对象,负责管理文件存储的子 store */
var StorageStore = /** @class */ (function () {
function StorageStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
makeAutoObservable(this)
}
/**
* 上传文件
* @param fileObj - 文件对象或文件路径
*/
StorageStore.prototype.uploadFileActive = function (fileObj) {
return __awaiter(this, void 0, void 0, function () {
var errorContent, avatarUrl, task, error_1
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
logger.log('uploadFileActive', fileObj)
if (!fileObj) {
errorContent = 'upload avatar error, no file or filepath'
logger.warn(errorContent)
throw new Error(errorContent)
}
avatarUrl = ''
_a.label = 1
case 1:
_a.trys.push([1, 3, , 4])
task = this.nim.V2NIMStorageService.createUploadFileTask({
fileObj: fileObj,
})
return [
4 /*yield*/,
this.nim.V2NIMStorageService.uploadFile(task, function () {
/**/
}),
]
case 2:
avatarUrl = _a.sent()
return [3 /*break*/, 4]
case 3:
error_1 = _a.sent()
logger.warn('upload avatar error ', error_1)
throw error_1
case 4:
return [2 /*return*/, avatarUrl]
}
})
})
}
return StorageStore
})()
var name = 'nim-web-sdk-ng'
var version = '10.9.10'
var sdk = {
version: 100910,
versionFormat: '10.9.10',
}
var description = 'Yunxin IM SDK next generation'
var main = './dist/v2/NIM_BROWSER_SDK.js'
var types = './dist/v2/NIM_BROWSER_SDK/index.d.ts'
var scripts = {
test: 'jest --maxWorkers 1 --silent',
lint: 'npx eslint ./src',
dev: 'cd pages/ && npm run dev',
clean: 'rm -rf ./dist',
emitTypes:
'tsc --emitDeclarationOnly --declaration --declarationDir temp/types',
'build:esm': 'npm run emitTypes && rollup --config ./build/esm.config.js',
build:
'npm run clean && npm run emitTypes && node script/copyPlugin.js && rollup --config ./build/v1.config.js && rollup --config ./build/v2.config.js && rollup --config ./build/esm.config.js',
analyze:
'npm run clean && npx rollup --config ./build/analyze.config.js && ls -lhR dist | grep ".js"',
'pages:build':
'cd pages/ && npm install && npm run build && cp -rf dist/ ../dist/',
api: 'npm run translate && node script/buildApi.js',
translate:
'rm -rf ./apidocs && multilingual-tool convert --indir=src/typings --outdir=apidocs --includes=ts',
'api-diff':
'multilingual-tool diff --dir=src/typings --receiver=3070898 --exclude=DS_Store',
updateVerInNdp: 'node ./script/updateVerInNdp.js',
}
var repository = {
type: 'git',
url: 'ssh://git@g.hz.netease.com:22222/yunxin/im/sdk.git',
}
var keywords = ['im', 'sdk']
var author = 'yunxin'
var license = 'ISC'
var eslintIgnore = ['dist/']
var files = [
'README.md',
'CHANGELOG.md',
'dist/v1/NIM*',
'dist/v1/CHATROOM*',
'dist/v1/QCHAT*',
'dist/v2/NIM*',
'dist/v2/CHATROOM*',
'dist/esm/*',
]
var devDependencies = {
'@babel/core': '^7.13.15',
'@babel/plugin-proposal-class-properties': '^7.13.0',
'@babel/plugin-transform-block-scoping': '^7.23.4',
'@babel/plugin-transform-runtime': '^7.13.15',
'@babel/preset-env': '^7.13.15',
'@babel/preset-typescript': '^7.13.0',
'@babel/runtime': '^7.13.10',
'@babel/runtime-corejs3': '^7.13.10',
'@microsoft/api-extractor': '^7.19.4',
'@rollup/plugin-babel': '^5.3.0',
'@rollup/plugin-commonjs': '^18.0.0',
'@rollup/plugin-json': '^4.1.0',
'@rollup/plugin-node-resolve': '^11.2.1',
'@rollup/plugin-replace': '^3.0.0',
'@rollup/plugin-typescript': '^8.3.0',
'@types/backo2': '^1.0.1',
'@types/jest': '^27.4.1',
'@types/lodash': '^4.14.177',
'@types/platform': '^1.3.3',
'@typescript-eslint/eslint-plugin': '^5.12.0',
'@typescript-eslint/parser': '^5.12.0',
'@yxfe/multilingual-tool': '^1.0.30',
'@yxfe/nim-log-reporter': '^1.0.6',
'@yxfe/nos-uploader': '^1.0.28',
'@yxfe/request': '^0.2.12',
backo2: '^1.0.2',
'browser-md5-file': '^1.1.1',
'core-js': '^3.10.1',
'cross-env': '^7.0.3',
eslint: '^8.9.0',
'eslint-config-prettier': '^8.5.0',
'eslint-plugin-prettier': '^4.0.0',
eventemitter3: '^4.0.7',
husky: '^7.0.4',
jest: '^27.5.1',
'lodash-es': '^4.17.21',
'neroom-web-sdk': '1.7.0',
platform: '^1.3.6',
'pre-commit': '^1.2.2',
prettier: '^2.6.1',
'react-native': '^0.75.2',
rollup: '^2.45.2',
'rollup-plugin-banner': '^0.2.1',
'rollup-plugin-banner2': '^1.2.2',
'rollup-plugin-copy': '^3.4.0',
'rollup-plugin-insert': '^1.3.2',
'rollup-plugin-terser': '^7.0.2',
'rollup-plugin-visualizer': '^5.12.0',
'ts-jest': '^27.1.4',
tslib: '^2.3.1',
typedoc: '^0.22.11',
typescript: '^4.5.4',
}
var sdkPkg = {
name: name,
version: version,
sdk: sdk,
description: description,
main: main,
types: types,
scripts: scripts,
repository: repository,
keywords: keywords,
author: author,
license: license,
eslintIgnore: eslintIgnore,
files: files,
devDependencies: devDependencies,
}
/**Mobx 可观察对象,负责管理本地会话列表的子 store */
var LocalConversationStore = /** @class */ (function () {
function LocalConversationStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.conversations = new Map()
this.totalUnreadCount = 0
this.logger = null
makeAutoObservable(this)
this._onSyncStarted = this._onSyncStarted.bind(this)
this._onSyncFinished = this._onSyncFinished.bind(this)
this._onSyncFailed = this._onSyncFailed.bind(this)
this._onConversationCreated = this._onConversationCreated.bind(this)
this._onConversationDeleted = this._onConversationDeleted.bind(this)
this._onConversationChanged = this._onConversationChanged.bind(this)
this._onTotalUnreadCountChanged = this._onTotalUnreadCountChanged.bind(this)
this.logger = rootStore.logger
/** 数据同步开始 */
nim.V2NIMLocalConversationService.on('onSyncStarted', this._onSyncStarted)
/** 数据同步结束 */
nim.V2NIMLocalConversationService.on('onSyncFinished', this._onSyncFinished)
/** 数据同步失败 */
nim.V2NIMLocalConversationService.on('onSyncFailed', this._onSyncFailed)
/** 会话创建 */
nim.V2NIMLocalConversationService.on(
'onConversationCreated',
this._onConversationCreated
)
/** 会话删除 */
nim.V2NIMLocalConversationService.on(
'onConversationDeleted',
this._onConversationDeleted
)
/** 会话更新 */
nim.V2NIMLocalConversationService.on(
'onConversationChanged',
this._onConversationChanged
)
/** 会话总未读数变化 */
nim.V2NIMLocalConversationService.on(
'onTotalUnreadCountChanged',
this._onTotalUnreadCountChanged
)
}
LocalConversationStore.prototype.resetState = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore Conversation resetState')
this.conversations.clear()
this.totalUnreadCount = 0
}
/**
* 销毁
*/
LocalConversationStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMLocalConversationService.off(
'onSyncStarted',
this._onSyncStarted
)
this.nim.V2NIMLocalConversationService.off(
'onSyncFinished',
this._onSyncFinished
)
this.nim.V2NIMLocalConversationService.off(
'onSyncFailed',
this._onSyncFailed
)
this.nim.V2NIMLocalConversationService.off(
'onConversationCreated',
this._onConversationCreated
)
this.nim.V2NIMLocalConversationService.off(
'onConversationDeleted',
this._onConversationDeleted
)
this.nim.V2NIMLocalConversationService.off(
'onConversationChanged',
this._onConversationChanged
)
this.nim.V2NIMLocalConversationService.off(
'onTotalUnreadCountChanged',
this._onTotalUnreadCountChanged
)
}
/**
* 添加内存中的会话
* @param conversations 会话数组
*/
LocalConversationStore.prototype.addConversation = function (conversations) {
var _this = this
conversations
.filter(function (item) {
return !!item.conversationId
})
// 暂时仅支持 p2p 和 team
.filter(function (item) {
return [
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */,
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */,
].includes(item.type)
})
.forEach(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var oldConversation
return __generator(this, function (_a) {
oldConversation = this.conversations.get(item.conversationId)
// 先更新一次
this.conversations.set(
item.conversationId,
__assign(__assign({}, oldConversation), item)
)
return [2 /*return*/]
})
})
})
}
/**
* 更新内存中的会话
* @param conversations 会话数组
*/
LocalConversationStore.prototype.updateConversation = function (
conversations
) {
var _this = this
conversations
.filter(function (item) {
return !!item.conversationId
})
// 暂时仅支持 p2p 和 team
.filter(function (item) {
return [
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */,
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */,
].includes(item.type)
})
.forEach(function (item) {
var oldConversation = _this.conversations.get(item.conversationId)
_this.conversations.set(
item.conversationId,
__assign(__assign({}, oldConversation), item)
)
})
}
/**
* 移除内存中的会话
* @param conversationId 会话ID
*/
LocalConversationStore.prototype.removeConversation = function (
conversationIds
) {
var _this = this
conversationIds.forEach(function (item) {
_this.conversations.delete(item)
if (_this.rootStore.uiStore.selectedConversation === item) {
_this.rootStore.uiStore.unselectConversation()
}
})
}
/**
* 重置会话未读数
* @param conversationId - 消息所属的会话的ID
*/
LocalConversationStore.prototype.resetConversation = function (
conversationId
) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var conversation, error_1
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore resetConversation',
conversationId
)
conversation = this.conversations.get(conversationId)
if (!conversation) {
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'LocalConversationStore resetConversation: conversation is not found.',
conversationId
)
return [2 /*return*/]
}
_e.label = 1
case 1:
_e.trys.push([1, 4, , 5])
if (!conversation.unreadCount) return [3 /*break*/, 3]
// 请求前也清理一次会话未读数fix http://jira.netease.com/browse/YYTX-34326
this._resetMemoryConversationUnreadCount(conversation)
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.clearUnreadCountByIds([
conversation.conversationId,
]),
]
case 2:
_e.sent()
this._resetMemoryConversationUnreadCount(conversation)
_e.label = 3
case 3:
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('LocalConversationStore resetConversation success')
return [3 /*break*/, 5]
case 4:
error_1 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error(
'LocalConversationStore resetConversation failed: ',
error_1
)
throw error_1
case 5:
return [2 /*return*/]
}
})
})
}
/**
* 插入一条会话记录
* @param conversationType
* @param receiverId - 接收方, 对方帐号或者群id
* @param isSelected - 是否选中
*/
LocalConversationStore.prototype.insertConversationActive = function (
conversationType,
receiverId,
isSelected
) {
var _a, _b, _c
if (isSelected === void 0) {
isSelected = true
}
return __awaiter(this, void 0, void 0, function () {
var conversationId, conversation, error_2
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 5, , 6])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore insertConversationActive', {
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
})
conversationId = ''
if (
conversationType ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
) {
conversationId =
this.nim.V2NIMConversationIdUtil.p2pConversationId(receiverId)
} else if (
conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */
) {
conversationId =
this.nim.V2NIMConversationIdUtil.teamConversationId(receiverId)
} else {
throw new Error('Unsupported conversation type')
}
if (!!this.conversations.has(conversationId))
return [3 /*break*/, 2]
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.createConversation(
conversationId
),
]
case 1:
conversation = _d.sent()
this.addConversation([conversation])
_d.label = 2
case 2:
if (!isSelected) return [3 /*break*/, 4]
return [
4 /*yield*/,
this.rootStore.uiStore.selectConversation(conversationId),
]
case 3:
_d.sent()
_d.label = 4
case 4:
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore insertConversationActive success',
{
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
}
)
return [3 /*break*/, 6]
case 5:
error_2 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore insertConversationActive failed: ',
{
conversationType: conversationType,
receiverId: receiverId,
isSelected: isSelected,
},
error_2
)
throw error_2
case 6:
return [2 /*return*/]
}
})
})
}
/**
* 删除会话记录
* @param conversationId - 消息所属的会话的ID
*/
LocalConversationStore.prototype.deleteConversationActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_4
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 6, , 7])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore deleteConversationActive',
conversationId
)
_d.label = 1
case 1:
_d.trys.push([1, 3, , 4])
return [
4 /*yield*/,
this.stickTopConversationActive(conversationId, false),
]
case 2:
_d.sent()
return [3 /*break*/, 4]
case 3:
_d.sent()
return [3 /*break*/, 4]
case 4:
// 先删除内存,防止删除失败导致一些问题
this.removeConversation([conversationId])
// 不删除历史消息,让表现跟线上一致,后续可根据需求调整
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.deleteConversation(
conversationId,
false
),
]
case 5:
// 不删除历史消息,让表现跟线上一致,后续可根据需求调整
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore deleteConversationActive success'
)
return [3 /*break*/, 7]
case 6:
error_4 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.warn(
'LocalConversationStore deleteConversationActive failed but continue: ',
error_4
)
return [3 /*break*/, 7]
case 7:
return [2 /*return*/]
}
})
})
}
/**
* 新增会话置顶
* @param conversationId - 消息所属的会话的ID
* @param stickTop - 是否置顶
*/
LocalConversationStore.prototype.stickTopConversationActive = function (
conversationId,
stickTop
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var error_5
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore stickTopConversationActive',
conversationId,
stickTop
)
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.stickTopConversation(
conversationId,
stickTop
),
]
case 1:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore stickTopConversationActive success'
)
return [3 /*break*/, 3]
case 2:
error_5 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore stickTopConversationActive failed: ',
error_5
)
throw error_5
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 获取会话列表
* @param offset 分页偏移量
* @param limit 分页拉取数量
*/
LocalConversationStore.prototype.getConversationListActive = function (
offset,
limit
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_6
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 3, , 4])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore getConversationListActive',
offset,
limit
)
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.getConversationList(
offset,
limit
),
]
case 1:
res = _d.sent()
this.addConversation(res.conversationList)
return [
4 /*yield*/,
this.getP2PMessageReceipt(
res.conversationList
.filter(function (item) {
return (
item.type ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
)
})
.map(function (item) {
return item.conversationId
})
),
]
case 2:
_d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore getConversationListActive success',
offset,
limit,
res
)
return [2 /*return*/, res]
case 3:
error_6 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore getConversationListActive failed: ',
error_6,
offset,
limit
)
throw error_6
case 4:
return [2 /*return*/]
}
})
})
}
LocalConversationStore.prototype.getP2PMessageReceipt = function (
conversationIds
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, conversations, error_7
var _this = this
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore getP2PMessageReceipt',
conversationIds
)
return [
4 /*yield*/,
Promise.all(
conversationIds.map(function (item) {
return _this.nim.V2NIMMessageService.getP2PMessageReceipt(
item
)
})
),
]
case 1:
res = _d.sent()
conversations = res
.map(function (item) {
var conversation = _this.conversations.get(item.conversationId)
if (conversation) {
return __assign(__assign({}, conversation), {
msgReceiptTime: item.timestamp,
})
}
})
.filter(function (item) {
return !!item
})
this.updateConversation(conversations)
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore getP2PMessageReceipt success',
conversationIds,
res
)
return [2 /*return*/, res]
case 2:
error_7 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore getP2PMessageReceipt failed: ',
error_7,
conversationIds
)
throw error_7
case 3:
return [2 /*return*/]
}
})
})
}
LocalConversationStore.prototype._resetMemoryConversationUnreadCount =
function (conversation) {
var newConversation = this.conversations.get(conversation.conversationId)
if (newConversation) {
this.updateConversation([
__assign(__assign({}, newConversation), { unreadCount: 0 }),
])
}
}
/**
* 获取会话已读时间戳。该时间包含多端已读时间戳
*/
LocalConversationStore.prototype.getConversationReadTimeActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_8
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore getConversationReadTimeActive',
conversationId
)
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.getConversationReadTime(
conversationId
),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore getConversationReadTimeActive success',
conversationId,
res
)
return [2 /*return*/, res]
case 2:
error_8 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore getConversationReadTimeActive failed: ',
error_8,
conversationId
)
throw error_8
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 标记会话已读时间戳
*
* 注: 当该方法调用后SDK 可能给多端账户抛出以下的事件
*
* {@link V2NIMConversationListener.onConversationReadTimeUpdated | V2NIMConversationListener.onConversationReadTimeUpdated} <br/>
*
*/
LocalConversationStore.prototype.markConversationReadActive = function (
conversationId
) {
var _a, _b, _c
return __awaiter(this, void 0, void 0, function () {
var res, error_9
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_d.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log(
'LocalConversationStore markConversationReadActive',
conversationId
)
return [
4 /*yield*/,
this.nim.V2NIMLocalConversationService.markConversationRead(
conversationId
),
]
case 1:
res = _d.sent()
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log(
'LocalConversationStore markConversationReadActive success',
conversationId,
res
)
return [2 /*return*/, res]
case 2:
error_9 = _d.sent()
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.error(
'LocalConversationStore markConversationReadActive failed: ',
error_9,
conversationId
)
throw error_9
case 3:
return [2 /*return*/]
}
})
})
}
LocalConversationStore.prototype.handleConversationWithAit = function (msgs) {
var _this = this
msgs.map(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var hasAitMsg,
conversationReadTime,
isCurConversation,
isSendFromMe,
conversation,
aitMsgs
var _a
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (
!(
(
item.conversationType ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ ||
item.conversationType === 3
) /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_SUPER_TEAM */
)
)
return [3 /*break*/, 2]
if (
!(item === null || item === void 0
? void 0
: item.serverExtension)
)
return [3 /*break*/, 2]
hasAitMsg = this.hasAitMsg([item.serverExtension])
return [
4 /*yield*/,
this.getConversationReadTimeActive(item.conversationId),
]
case 1:
conversationReadTime = _b.sent()
isCurConversation =
item.conversationId ==
this.rootStore.uiStore.selectedConversation
isSendFromMe =
item.senderId ===
((_a = this.rootStore.userStore.myUserInfo) === null ||
_a === void 0
? void 0
: _a.accountId)
// 当前通过_onReceiveMessages获取的新消息时间戳大于会话的最后已读时间戳且有@消息,且没有选中当前该会话,则标记为已读
if (
item.createTime > conversationReadTime &&
hasAitMsg &&
!isCurConversation &&
!isSendFromMe
) {
conversation = this.conversations.get(item.conversationId)
// 如果此时conversation为空则可能的情况为:
// 1.该用户删除了该会话后,又收到了 @消息onReceiveMessages会先于onConversationCreated触发此时需要在onConversationCreated处理 @消息相关
// 2.im sdk初始化过程中onReceiveMessages 会先于onSyncFinished因为实在onSyncFinished中拉取会话列表 触发此时由于会话列表为空上面的if判断会为false则在else中先在内存中构造一个会话带上aitMsg后等会话列表拉取完成进行合并
if (conversation) {
aitMsgs = conversation.aitMsgs || []
if (aitMsgs.length === 0) {
this.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: [item.messageClientId],
}),
])
} else {
this.updateConversation([
__assign(__assign({}, conversation), {
aitMsgs: __spreadArray(
__spreadArray([], __read(aitMsgs), false),
[item.messageClientId],
false
),
}),
])
}
} else {
this.addConversation([
//@ts-ignore
{
conversationId: item.conversationId,
type: item.conversationType,
aitMsgs: [item.messageClientId],
},
])
}
}
_b.label = 2
case 2:
return [2 /*return*/]
}
})
})
})
}
LocalConversationStore.prototype.resetConversationAit = function (
conversationId
) {
var conversation = this.conversations.get(conversationId)
if (
(conversation === null || conversation === void 0
? void 0
: conversation.type) ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ ||
(conversation === null || conversation === void 0
? void 0
: conversation.type) ===
3 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_SUPER_TEAM */
) {
this.updateConversation([
__assign(__assign({}, conversation), { aitMsgs: [] }),
])
}
}
LocalConversationStore.prototype.hasAitMsg = function (serverExtensions) {
var _this = this
var flag = false
if (
serverExtensions === null || serverExtensions === void 0
? void 0
: serverExtensions.length
) {
serverExtensions === null || serverExtensions === void 0
? void 0
: serverExtensions.forEach(function (item) {
var _a, _b
try {
var extObj = JSON.parse(item || '{}')
var yxAitMsg = extObj.yxAitMsg
var account_1 = _this.rootStore.userStore.myUserInfo.accountId
if (yxAitMsg) {
;(_a = Object.keys(yxAitMsg)) === null || _a === void 0
? void 0
: _a.forEach(function (key) {
if (key === account_1 || key === AT_ALL_ACCOUNT) {
flag = true
}
})
}
} catch (_c) {
;(_b = _this.logger) === null || _b === void 0
? void 0
: _b.error(
'LocalConversationStore parse serverExtension failed: ',
item
)
}
})
}
return flag
}
LocalConversationStore.prototype._onSyncStarted = function () {
var _a, _b
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onSyncStarted')
// 获取会话列表
;(_b = this.rootStore.localConversationStore) === null || _b === void 0
? void 0
: _b.getConversationListActive(
0,
this.rootStore.localOptions.conversationLimit || 100
)
}
LocalConversationStore.prototype._onSyncFinished = function () {
var _a, _b
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_c) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onSyncFinished')
// 获取会话列表
;(_b = this.rootStore.localConversationStore) === null || _b === void 0
? void 0
: _b.getConversationListActive(
0,
this.rootStore.localOptions.conversationLimit || 100
)
return [2 /*return*/]
})
})
}
LocalConversationStore.prototype._onSyncFailed = function (e) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onSyncFailed', e)
}
LocalConversationStore.prototype._onConversationCreated = function (data) {
var _this = this
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onConversationCreated', data)
// 如果是创群此时_onConversationCreated 返回的data可能没有avatar和name需要getConversation
if (
data.type ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */
) {
this.nim.V2NIMLocalConversationService.getConversation(
data.conversationId
).then(function (conversation) {
_this.addConversation([conversation])
// 处理@消息 情况为
if (conversation.lastMessage) {
_this.handleConversationWithAit([
__assign(
__assign({}, conversation.lastMessage),
conversation.lastMessage.messageRefer
),
])
}
})
} else {
this.addConversation([data])
// 会话创建的时候,获取一下当前会话的最后已读时间,便于展示消息已读未读
if (
data.type ===
1 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P */
) {
var conversationId_1 = data.conversationId
this.nim.V2NIMMessageService.getP2PMessageReceipt(
conversationId_1
).then(function (res) {
var conversation = _this.conversations.get(conversationId_1)
if (conversation) {
_this.updateConversation([
__assign(__assign({}, conversation), {
msgReceiptTime: res.timestamp,
}),
])
}
})
}
}
}
LocalConversationStore.prototype._onConversationDeleted = function (
conversationIds
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onConversationDeleted', conversationIds)
this.removeConversation(conversationIds)
}
LocalConversationStore.prototype._onConversationChanged = function (data) {
var _a
return __awaiter(this, void 0, void 0, function () {
var _this = this
return __generator(this, function (_b) {
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onConversationChanged', data)
this.addConversation(data)
data.forEach(function (item) {
return __awaiter(_this, void 0, void 0, function () {
var attachment, type
var _a, _b, _c, _d
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
attachment =
(_a = item.lastMessage) === null || _a === void 0
? void 0
: _a.attachment
type =
attachment === null || attachment === void 0
? void 0
: attachment.type
if (
!(
((_b = item.lastMessage) === null || _b === void 0
? void 0
: _b.messageType) ===
5 /* V2NIMConst.V2NIMMessageType.V2NIM_MESSAGE_TYPE_NOTIFICATION */ &&
((type === 1 /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_KICK */ &&
((_c =
attachment === null || attachment === void 0
? void 0
: attachment.targetIds) === null || _c === void 0
? void 0
: _c.includes(
this.rootStore.userStore.myUserInfo.accountId
))) ||
(type === 2 /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_LEAVE */ &&
((_d = item.lastMessage) === null || _d === void 0
? void 0
: _d.messageRefer.senderId) ===
this.rootStore.userStore.myUserInfo.accountId) ||
type === 4) /* V2NIMConst.V2NIMMessageNotificationType
.V2NIM_MESSAGE_NOTIFICATION_TYPE_TEAM_DISMISS */
)
)
return [3 /*break*/, 2]
return [
4 /*yield*/,
this.deleteConversationActive(item.conversationId),
]
case 1:
_e.sent()
return [3 /*break*/, 4]
case 2:
if (
!(
this.rootStore.uiStore.selectedConversation ===
item.conversationId
)
)
return [3 /*break*/, 4]
return [
4 /*yield*/,
this.resetConversation(item.conversationId),
]
case 3:
_e.sent()
_e.label = 4
case 4:
if (
item.type ===
2 /* V2NIMConst.V2NIMConversationType.V2NIM_CONVERSATION_TYPE_TEAM */ &&
item.unreadCount == 0
) {
this.resetConversationAit(item.conversationId)
}
return [2 /*return*/]
}
})
})
})
return [2 /*return*/]
})
})
}
LocalConversationStore.prototype._onTotalUnreadCountChanged = function (
data
) {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('LocalConversationStore _onTotalUnreadCountChanged', data)
this.totalUnreadCount = data
}
return LocalConversationStore
})()
/**Mobx 可观察对象负责管理在线离线等事件订阅的子store */
var SubscriptionStore = /** @class */ (function () {
function SubscriptionStore(rootStore, nim) {
this.rootStore = rootStore
this.nim = nim
this.stateMap = new Map()
this.logger = null
makeAutoObservable(this)
this._onUserStatusChanged = this._onUserStatusChanged.bind(this)
this.nim.V2NIMSubscriptionService.on(
'onUserStatusChanged',
this._onUserStatusChanged
)
this.logger = rootStore.logger
}
SubscriptionStore.prototype.resetState = function () {
var _a
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('SubscriptionStore resetState')
this.stateMap.clear()
}
/**
* 销毁SubscriptionStore会取消相关事件监听
*/
SubscriptionStore.prototype.destroy = function () {
this.resetState()
this.nim.V2NIMSubscriptionService.off(
'onUserStatusChanged',
this._onUserStatusChanged
)
}
/** 获取当前用户在线离线状态
* @param accountId 用户ID
**/
SubscriptionStore.prototype.getUserStatus = function (accountId) {
return this.stateMap.get(accountId)
}
/** 获取当前所有用户在线离线状态
**/
SubscriptionStore.prototype.getUserStatusList = function () {
return __spreadArray([], __read(this.stateMap.values()), false)
}
/**
* 订阅用户状态,包括在线状态或用户自定义的状态。
* 成功订阅用户状态后,当订阅的用户状态有变更时,会触发 onUserStatusChanged 回调。
* @param accountIds 要订阅的用户 ID 列表。
*/
SubscriptionStore.prototype.subscribeUserStatusActive = function (
accountIds
) {
var _a, _b, _c, _d
return __awaiter(this, void 0, void 0, function () {
var failedAccounts, err_1
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3])
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('subscribeUserStatusActive', accountIds)
return [
4 /*yield*/,
this.nim.V2NIMSubscriptionService.subscribeUserStatus({
accountIds: accountIds,
duration: 3600 * 24 * 7,
immediateSync: true,
}),
]
case 1:
failedAccounts = _e.sent()
if (failedAccounts.length > 0) {
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.warn(
'subscribeUserStatusActive failed accounts',
failedAccounts
)
return [2 /*return*/, failedAccounts]
}
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('subscribeUserStatusActive success')
return [3 /*break*/, 3]
case 2:
err_1 = _e.sent()
;(_d = this.logger) === null || _d === void 0
? void 0
: _d.error('subscribeUserStatusActive err', err_1)
return [3 /*break*/, 3]
case 3:
return [2 /*return*/]
}
})
})
}
/**
* 注册用户状态订阅相关监听。
*/
SubscriptionStore.prototype._onUserStatusChanged = function (userStatusList) {
var e_1, _a
var _b
;(_b = this.logger) === null || _b === void 0
? void 0
: _b.log('_onUserStatusChanged', userStatusList)
try {
for (
var userStatusList_1 = __values(userStatusList),
userStatusList_1_1 = userStatusList_1.next();
!userStatusList_1_1.done;
userStatusList_1_1 = userStatusList_1.next()
) {
var userStatus = userStatusList_1_1.value
this.stateMap.set(userStatus.accountId, userStatus)
}
} catch (e_1_1) {
e_1 = { error: e_1_1 }
} finally {
try {
if (
userStatusList_1_1 &&
!userStatusList_1_1.done &&
(_a = userStatusList_1.return)
)
_a.call(userStatusList_1)
} finally {
if (e_1) throw e_1.error
}
}
}
return SubscriptionStore
})()
var RootStore = /** @class */ (function () {
function RootStore(nim, localOptions, platform) {
if (platform === void 0) {
platform = 'Web'
}
var _this = this
var _a, _b, _c, _d, _e
this.localOptions = {
addFriendNeedVerify: true,
teamJoinMode: 0 /* V2NIMConst.V2NIMTeamJoinMode.V2NIM_TEAM_JOIN_MODE_FREE */,
teamAgreeMode: 1 /* V2NIMConst.V2NIMTeamAgreeMode.V2NIM_TEAM_AGREE_MODE_NO_AUTH */,
teamInviteMode: 0 /* V2NIMConst.V2NIMTeamInviteMode.V2NIM_TEAM_INVITE_MODE_MANAGER */,
teamUpdateTeamMode: 0 /* V2NIMConst.V2NIMTeamUpdateInfoMode.V2NIM_TEAM_UPDATE_INFO_MODE_MANAGER */,
teamUpdateExtMode: 1 /* V2NIMConst.V2NIMTeamUpdateExtensionMode
.V2NIM_TEAM_UPDATE_EXTENSION_MODE_ALL */,
enableTeam: true,
enableChangeTeamJoinMode: true,
enableChangeTeamAgreeMode: true,
leaveOnTransfer: false,
needMention: true,
p2pMsgReceiptVisible: false,
teamMsgReceiptVisible: false,
loginStateVisible: false,
allowTransferTeamOwner: false,
teamManagerVisible: false,
aiVisible: true,
teamManagerLimit: 10,
sendMsgBefore: function (options) {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, options]
})
})
},
aiUserAgentProvider: {},
conversationLimit: 100,
debug: 'debug',
aiStream: true,
iconfontUrl: [],
}
this.sdkOptions = {}
this.conversationStore = null
this.localConversationStore = null
this.logger = null
makeAutoObservable(this)
this.nim = nim
this.localOptions = __assign(__assign({}, this.localOptions), localOptions)
this.logger =
((_a = this.localOptions) === null || _a === void 0
? void 0
: _a.debug) == 'off'
? null
: logDebug({
level:
(_b = this.localOptions) === null || _b === void 0
? void 0
: _b.debug,
version: packageJson.version,
appName: packageJson.name,
needStringify: false,
})
;(_c = this.logger) === null || _c === void 0
? void 0
: _c.log('store init', {
localOptions: this.localOptions,
})
this.sdkOptions = __assign(
{},
(_d = this.nim) === null || _d === void 0 ? void 0 : _d.getOptions()
)
this.connectStore = new ConnectStore(this, nim, this.localOptions)
this.friendStore = new FriendStore(this, nim)
this.msgStore = new MsgStore(this, nim, this.localOptions)
this.relationStore = new RelationStore(this, nim)
// 区分是本地会话还是云端会话
if (
(_e = this.sdkOptions) === null || _e === void 0
? void 0
: _e.enableV2CloudConversation
) {
this.conversationStore = new ConversationStore(this, nim)
} else {
this.localConversationStore = new LocalConversationStore(this, nim)
}
this.teamStore = new TeamStore(this, nim, this.localOptions)
this.teamMemberStore = new TeamMemberStore(this, nim)
this.sysMsgStore = new SysMsgStore(this, nim)
this.userStore = new UserStore(this, nim)
this.aiUserStore = new AIUserStore(this, nim, this.localOptions)
this.uiStore = new UiStore(this)
this.storageStore = new StorageStore(this, nim)
this.subscriptionStore = new SubscriptionStore(this, nim)
// 埋点上报
var reportComponents = [
'ContactKit',
'ConversationKit',
'ChatKit',
'SearchKit',
]
reportComponents.forEach(function (item) {
var eventTracking = new EventTracking({
appKey: _this.nim.options.appkey,
version: '10.0.0',
component: item,
imVersion: sdkPkg.version,
platform: platform,
})
eventTracking.track('init', '')
})
}
RootStore.prototype.resetState = function () {
var _a, _b, _c, _d
;(_a = this.logger) === null || _a === void 0
? void 0
: _a.log('store resetState')
this.friendStore.resetState()
this.msgStore.resetState()
this.relationStore.resetState()
if (
(_b = this.sdkOptions) === null || _b === void 0
? void 0
: _b.enableV2CloudConversation
) {
;(_c = this.conversationStore) === null || _c === void 0
? void 0
: _c.resetState()
} else {
;(_d = this.localConversationStore) === null || _d === void 0
? void 0
: _d.resetState()
}
this.teamStore.resetState()
this.teamMemberStore.resetState()
this.sysMsgStore.resetState()
this.userStore.resetState()
this.aiUserStore.resetState()
this.uiStore.resetState()
this.subscriptionStore.resetState()
}
/**
* 销毁根store实例
*/
RootStore.prototype.destroy = function () {
var _a, _b, _c
logger.log('store destroyed')
this.connectStore.destroy()
this.friendStore.destroy()
this.msgStore.destroy()
this.relationStore.destroy()
if (
(_a = this.sdkOptions) === null || _a === void 0
? void 0
: _a.enableV2CloudConversation
) {
;(_b = this.conversationStore) === null || _b === void 0
? void 0
: _b.destroy()
} else {
;(_c = this.localConversationStore) === null || _c === void 0
? void 0
: _c.destroy()
}
this.teamStore.destroy()
this.teamMemberStore.destroy()
this.sysMsgStore.destroy()
this.userStore.destroy()
this.aiUserStore.destroy()
this.uiStore.destroy()
this.subscriptionStore.destroy()
}
/**
* 获取根store实例
* @param nim NIM SDK 实例
* @param t 国际化函数
*/
RootStore.getInstance = function (nim, localOptions, platform) {
if (platform === void 0) {
platform = 'Web'
}
if (!this.ins) {
this.ins = new RootStore(nim, localOptions, platform)
}
return this.ins
}
return RootStore
})()
// export * as V2NIM from 'nim-web-sdk-ng/dist/esm/nim'
export {
AIUserStore,
ConnectStore,
ConversationStore,
FriendStore,
LocalConversationStore,
MsgStore,
RelationStore,
RootStore,
StorageStore,
SubscriptionStore,
SysMsgStore,
TeamMemberStore,
TeamStore,
UiStore,
UserStore,
RootStore as default,
constant as storeConstants,
utils as storeUtils,
}