import {
Channel,
ChannelTypePerson,
WKSDK,
Message,
MessageContentType,
ConversationAction,
ChannelTypeGroup,
ChannelInfo,
CMDContent,
MessageText,
} from "wukongimjssdk";
import React, { ElementType } from "react";
import { Howl, Howler } from "howler";
import WKApp, { FriendApply, FriendApplyState, ThemeMode } from "./App";
import ChannelQRCode from "./Components/ChannelQRCode";
import { ChannelSettingRouteData } from "./Components/ChannelSetting/context";
import { IndexTableItem } from "./Components/IndexTable";
import { InputEdit } from "./Components/InputEdit";
import {
ListItem,
ListItemButton,
ListItemButtonType,
ListItemIcon,
ListItemMuliteLine,
ListItemSwitch,
ListItemSwitchContext,
ListItemTip,
} from "./Components/ListItem";
import { Subscribers } from "./Components/Subscribers";
import UserSelect, { ContactsSelect } from "./Components/UserSelect";
import { Card, CardCell } from "./Messages/Card";
import { GifCell, GifContent } from "./Messages/Gif";
import { HistorySplitCell, HistorySplitContent } from "./Messages/HistorySplit";
import { ImageCell, ImageContent } from "./Messages/Image";
import {
SignalMessageCell,
SignalMessageContent,
} from "./Messages/SignalMessage/signalmessage";
import { SystemCell } from "./Messages/System";
import { TextCell } from "./Messages/Text";
import { TimeCell } from "./Messages/Time";
import { UnknownCell } from "./Messages/Unknown";
import { UnsupportCell, UnsupportContent } from "./Messages/Unsupport";
import {
ChannelTypeCustomerService,
EndpointCategory,
EndpointID,
GroupRole,
MessageContentTypeConst,
unsupportMessageTypes,
UserRelation,
} from "./Service/Const";
import RouteContext, {
FinishButtonContext,
RouteContextConfig,
} from "./Service/Context";
import { ChannelField } from "./Service/DataSource/DataSource";
import { IModule } from "./Service/Module";
import { Row, Section } from "./Service/Section";
import { VoiceCell, VoiceContent } from "./Messages/Voice";
import { VideoCell, VideoContent } from "./Messages/Video";
import { TypingCell } from "./Messages/Typing";
import { LottieSticker, LottieStickerCell } from "./Messages/LottieSticker";
import { LocationCell, LocationContent } from "./Messages/Location";
import { Toast } from "@douyinfe/semi-ui";
import { ChannelSettingManager } from "./Service/ChannelSetting";
import { DefaultEmojiService } from "./Service/EmojiService";
import IconClick from "./Components/IconClick";
import EmojiToolbar from "./Components/EmojiToolbar";
import MergeforwardContent, { MergeforwardCell } from "./Messages/Mergeforward";
import ChannelManagerList from "./Components/ChannelManagerList";
import ChannelBlacklist from "./Components/ChannelBlacklist";
import { UserInfoRouteData } from "./Components/UserInfo/vm";
import { IconAlertCircle } from "@douyinfe/semi-icons";
import { TypingManager } from "./Service/TypingManager";
import APIClient from "./Service/APIClient";
import { ChannelAvatar } from "./Components/ChannelAvatar";
import { ScreenshotCell, ScreenshotContent } from "./Messages/Screenshot";
import ImageToolbar from "./Components/ImageToolbar";
export default class BaseModule implements IModule {
messageTone?: Howl;
id(): string {
return "base";
}
init(): void {
APIClient.shared.logoutCallback = () => {
WKApp.shared.logout();
};
WKApp.endpointManager.setMethod(
EndpointID.emojiService,
() => DefaultEmojiService.shared
);
WKApp.messageManager.registerMessageFactor(
(contentType: number): ElementType | undefined => {
switch (contentType) {
case MessageContentType.text: // 文本消息
return TextCell;
case MessageContentType.image: // 图片消息
return ImageCell;
case MessageContentTypeConst.card: // 名片
return CardCell;
case MessageContentTypeConst.gif: // gif
return GifCell;
case MessageContentTypeConst.voice: // 语音
return VoiceCell;
case MessageContentTypeConst.mergeForward: // 合并转发
return MergeforwardCell;
case MessageContentTypeConst.smallVideo: // 小视频
return VideoCell;
case MessageContentTypeConst.historySplit: // 历史消息风格线
return HistorySplitCell;
case MessageContentTypeConst.time: // 时间消息
return TimeCell;
case MessageContentTypeConst.typing: // 输入中...
return TypingCell;
case MessageContentTypeConst.lottieSticker: // 动图
case MessageContentTypeConst.lottieEmojiSticker:
return LottieStickerCell;
case MessageContentTypeConst.location: // 定位
return LocationCell;
case MessageContentTypeConst.screenshot:
return ScreenshotCell;
case MessageContentType.signalMessage: // 端对端加密错误消息
case 98:
return SignalMessageCell;
default:
if (contentType <= 2000 && contentType >= 1000) {
return SystemCell;
}
}
}
);
WKSDK.shared().register(MessageContentType.image, () => new ImageContent()); // 图片
WKSDK.shared().register(MessageContentTypeConst.card, () => new Card()); // 名片
WKSDK.shared().register(
MessageContentTypeConst.gif,
() => new GifContent()
); // gif动图
WKSDK.shared().register(
MessageContentTypeConst.voice,
() => new VoiceContent()
); // 语音正文
WKSDK.shared().register(
MessageContentTypeConst.smallVideo,
() => new VideoContent()
); // 视频正文
WKSDK.shared().register(
MessageContentTypeConst.historySplit,
() => new HistorySplitContent()
); // 历史分割线
WKSDK.shared().register(
MessageContentTypeConst.location,
() => new LocationContent()
); // 定位
WKSDK.shared().register(
MessageContentTypeConst.lottieSticker,
() => new LottieSticker()
); // 动图
WKSDK.shared().register(
MessageContentTypeConst.lottieEmojiSticker,
() => new LottieSticker()
); // 动图
WKSDK.shared().register(
MessageContentTypeConst.mergeForward,
() => new MergeforwardContent()
); // 合并转发
WKSDK.shared().register(
MessageContentTypeConst.screenshot,
() => new ScreenshotContent()
);
// 未知消息
WKApp.messageManager.registerCell(
MessageContentType.unknown,
(): ElementType => {
return UnknownCell;
}
);
// 不支持的消息
for (const unsupportMessageType of unsupportMessageTypes) {
WKSDK.shared().register(
unsupportMessageType,
() => new UnsupportContent()
);
WKApp.messageManager.registerCell(
unsupportMessageType,
(): ElementType => {
return UnsupportCell;
}
);
}
WKSDK.shared().chatManager.addCMDListener((message: Message) => {
console.log("收到CMD->", message);
const cmdContent = message.content as CMDContent;
const param = cmdContent.param;
if (cmdContent.cmd === "channelUpdate") {
// 频道信息更新
WKSDK.shared().channelManager.fetchChannelInfo(
new Channel(param.channel_id, param.channel_type)
);
this.tipsAudio();
} else if (cmdContent.cmd === "typing") {
TypingManager.shared.addTyping(
new Channel(
cmdContent.param.channel_id,
cmdContent.param.channel_type
),
cmdContent.param.from_uid,
cmdContent.param.from_name
);
} else if (cmdContent.cmd === "groupAvatarUpdate") {
// 群头像更新
WKSDK.shared().channelManager.fetchChannelInfo(
new Channel(param.group_no, ChannelTypeGroup)
);
} else if (cmdContent.cmd === "unreadClear") {
// 清除最近会话未读数量
const channel = new Channel(param.channel_id, param.channel_type);
const conversation =
WKSDK.shared().conversationManager.findConversation(channel);
let unread = 0;
if (param.unread > 0) {
unread = param.unread;
}
if (conversation) {
conversation.unread = unread;
WKSDK.shared().conversationManager.notifyConversationListeners(
conversation,
ConversationAction.update
);
}
} else if (cmdContent.cmd === "conversationDeleted") {
// 最近会话删除
const channel = new Channel(param.channel_id, param.channel_type);
WKSDK.shared().conversationManager.removeConversation(channel);
} else if (cmdContent.cmd === "friendRequest") {
// 好友申请
const friendApply = new FriendApply();
friendApply.uid = param.apply_uid;
friendApply.to_name = param.apply_name;
friendApply.status = FriendApplyState.apply;
friendApply.remark = param.remark;
friendApply.token = param.token;
friendApply.unread = true;
friendApply.createdAt = message.timestamp;
WKApp.shared.addFriendApply(friendApply);
} else if (cmdContent.cmd === "friendAccept") {
// 接受好友申请
const toUID = param.to_uid;
if (!toUID || toUID === "") {
return;
}
if (param.from_uid) {
WKSDK.shared().channelManager.fetchChannelInfo(
new Channel(param.from_uid, ChannelTypePerson)
);
}
WKApp.dataSource.contactsSync(); // 同步联系人
const friendApplys = WKApp.shared.getFriendApplys();
if (friendApplys && friendApplys.length > 0) {
for (const friendApply of friendApplys) {
if (toUID === friendApply.uid) {
friendApply.unread = false;
friendApply.status = FriendApplyState.accepted;
WKApp.shared.updateFriendApply(friendApply);
WKApp.endpointManager.invokes(
EndpointCategory.friendApplyDataChange
);
break;
}
}
}
} else if (cmdContent.cmd === "friendDeleted") {
WKApp.dataSource.contactsSync(); // 同步联系人
} else if (cmdContent.cmd === "memberUpdate") {
// 成员更新
const channel = new Channel(
cmdContent.param.group_no,
ChannelTypeGroup
);
WKSDK.shared().channelManager.syncSubscribes(channel);
} else if (cmdContent.cmd === "onlineStatus") {
// 好友在线状态改变
const channel = new Channel(cmdContent.param.uid, ChannelTypePerson);
const online = param.online === 1;
const onlineChannelInfo =
WKSDK.shared().channelManager.getChannelInfo(channel);
if (onlineChannelInfo) {
onlineChannelInfo.online = online;
if (!online) {
onlineChannelInfo.lastOffline = new Date().getTime() / 1000;
}
WKSDK.shared().channelManager.notifyListeners(onlineChannelInfo);
} else {
WKSDK.shared().channelManager.fetchChannelInfo(channel);
}
} else if (cmdContent.cmd === "syncConversationExtra") {
// 同步最近会话扩展
WKSDK.shared().conversationManager.syncExtra();
} else if (cmdContent.cmd === "syncReminders") {
// 同步提醒项
WKSDK.shared().reminderManager.sync();
} else if (cmdContent.cmd === "messageRevoke") {
// 消息撤回
const channel = message.channel;
const messageID = param.message_id;
let conversation =
WKSDK.shared().conversationManager.findConversation(channel);
if (
conversation &&
conversation.lastMessage &&
conversation.lastMessage?.messageID === messageID
) {
conversation.lastMessage.remoteExtra.revoke = true;
conversation.lastMessage.remoteExtra.revoker = message.fromUID;
WKSDK.shared().conversationManager.notifyConversationListeners(
conversation,
ConversationAction.update
);
}
}
});
WKSDK.shared().chatManager.addMessageListener((message: Message) => {
console.log("收到消息->", message);
if (TypingManager.shared.hasTyping(message.channel)) {
TypingManager.shared.removeTyping(message.channel);
}
switch (message.contentType) {
case MessageContentTypeConst.channelUpdate:
WKSDK.shared().channelManager.fetchChannelInfo(message.channel);
break;
case MessageContentTypeConst.addMembers:
case MessageContentTypeConst.removeMembers:
WKSDK.shared().channelManager.syncSubscribes(message.channel);
break;
}
if (this.allowNotify(message)) {
let from = "";
if (message.channel.channelType === ChannelTypeGroup) {
const fromChannelInfo = WKSDK.shared().channelManager.getChannelInfo(
new Channel(message.fromUID, ChannelTypePerson)
);
if (fromChannelInfo) {
from = `${fromChannelInfo?.orgData.displayName}: `;
}
}
this.sendNotification(
message,
`${from}${message.content.conversationDigest}`
);
this.tipsAudio();
}
});
WKSDK.shared().channelManager.addListener((channelInfo: ChannelInfo) => {
if (channelInfo.channel.channelType === ChannelTypePerson) {
if (WKApp.loginInfo.uid === channelInfo.channel.channelID) {
WKApp.loginInfo.name = channelInfo.title;
WKApp.loginInfo.shortNo = channelInfo.orgData.short_no;
WKApp.loginInfo.sex = channelInfo.orgData.sex;
WKApp.loginInfo.save();
}
}
});
this.registerChatMenus(); // 注册开始菜单
this.registerUserInfo(); // 注册用户资料功能
this.registerChannelSettings(); // 注册频道设置功能
this.registerChannelManages(); // 注册频道管理功能
this.registerMessageContextMenus(); // 注册消息上下文菜单
this.registerChatToolbars(); // 注册聊天工具栏
this.tipsAudio();
}
tipsAudio() {
Howler.autoUnlock = false;
if (!this.messageTone) {
this.messageTone = new Howl({
src: require("./assets/msg-tip.mp3"),
});
this.messageTone.play();
} else {
this.messageTone.play();
}
}
allowNotify(message: Message) {
if (WKApp.shared.notificationIsClose) {
// 用户关闭了通知
return false;
}
if (WKSDK.shared().isSystemMessage(message.contentType)) {
// 系统消息不发通知
return false;
}
if (message.fromUID === WKApp.loginInfo.uid) {
// 自己发的消息不发通知
return false;
}
return true;
}
sendNotification(message: Message, description?: string) {
let channelInfo = WKSDK.shared().channelManager.getChannelInfo(
message.channel
);
if (channelInfo && channelInfo.mute) {
return;
}
if (!message.header.reddot) {
// 不显示红点的消息不发通知
return;
}
if (window.Notification && Notification.permission !== "denied") {
const notify = new Notification(
channelInfo ? channelInfo.orgData.displayName : "通知",
{
body: description,
icon: WKApp.shared.avatarChannel(message.channel),
lang: "zh-CN",
tag: "tag",
renotify: true,
}
);
notify.onclick = () => {
notify.close();
window.focus();
WKApp.endpoints.showConversation(message.channel);
};
notify.onshow = () => {
//5秒后关闭消息框
setTimeout(function () {
notify.close();
}, 5000);
};
notify.onclose = () => {
console.log("通知关闭");
};
}
}
registerChatToolbars() {
WKApp.endpoints.registerChatToolbar("chattoolbar.emoji", (ctx) => {
return (
);
});
WKApp.endpoints.registerChatToolbar("chattoolbar.mention", (ctx) => {
const channel = ctx.channel();
if (channel.channelType === ChannelTypePerson) {
return undefined;
}
return (
{
ctx.messageInputContext().insertText("@");
}}
>
);
});
WKApp.endpoints.registerChatToolbar("chattoolbar.screenshot", (ctx) => {
return (
{
if ((window as any).__POWERED_ELECTRON__) {
(window as any).ipc.send('screenshots-start', {})
} else {
window.open("https://www.snipaste.com");
}
}}
>
);
});
WKApp.endpoints.registerChatToolbar("chattoolbar.image", (ctx) => {
return (
);
});
}
registerChatMenus() {
WKApp.shared.chatMenusRegister("chatmenus.startchat", (param) => {
const isDark = WKApp.config.themeMode === ThemeMode.dark;
return {
title: "发起群聊",
icon: require(`${
isDark
? "./assets/popmenus_startchat_dark.png"
: "./assets/popmenus_startchat.png"
}`),
onClick: () => {
var selectItems: IndexTableItem[];
var finishButtonContext: FinishButtonContext;
WKApp.routeLeft.push(
{
finishButtonContext = context;
}}
onSelect={(items) => {
selectItems = items;
}}
showHeader={true}
onBack={() => {
WKApp.routeLeft.pop();
}}
onFinished={() => {
if (selectItems && selectItems.length > 0) {
finishButtonContext.loading(true);
WKApp.dataSource.channelDataSource
.createChannel(
selectItems.map((item) => {
return item.id;
})
)
.then(() => {
finishButtonContext.loading(false);
WKApp.routeLeft.pop();
})
.catch((err) => {
Toast.error(err.msg);
finishButtonContext.loading(false);
});
}
}}
>
);
},
};
});
}
registerMessageContextMenus() {
WKApp.endpoints.registerMessageContextMenus(
"contextmenus.copy",
(message) => {
if (message.contentType !== MessageContentType.text) {
return null;
}
return {
title: "复制",
onClick: () => {
(function (s) {
document.oncopy = function (e) {
e.clipboardData?.setData("text", s);
e.preventDefault();
document.oncopy = null;
};
})((message.content as MessageText).text || "");
document.execCommand("Copy");
},
};
},
1000
);
WKApp.endpoints.registerMessageContextMenus(
"contextmenus.forward",
(message, context) => {
if (WKApp.shared.notSupportForward.includes(message.contentType)) {
return null;
}
return {
title: "转发",
onClick: () => {
context.fowardMessageUI(message);
},
};
},
2000
);
WKApp.endpoints.registerMessageContextMenus(
"contextmenus.reply",
(message, context) => {
return {
title: "回复",
onClick: () => {
context.reply(message);
},
};
}
);
WKApp.endpoints.registerMessageContextMenus(
"contextmenus.muli",
(message, context) => {
return {
title: "多选",
onClick: () => {
context.setEditOn(true);
},
};
},
3000
);
WKApp.endpoints.registerMessageContextMenus(
"contextmenus.revoke",
(message, context) => {
if (message.messageID == "") {
return null;
}
let isManager = false;
if (message.channel.channelType == ChannelTypeGroup) {
const sub = WKSDK.shared().channelManager.getSubscribeOfMe(
message.channel
);
if (sub?.role == GroupRole.manager || sub?.role == GroupRole.owner) {
isManager = true;
}
}
if (!isManager) {
if (!message.send) {
return null;
}
let revokeSecond = WKApp.remoteConfig.revokeSecond;
if (revokeSecond > 0) {
const messageTime = new Date().getTime() / 1000 - message.timestamp;
if (messageTime > revokeSecond) {
// 超过两分钟则不显示撤回
return null;
}
}
}
return {
title: "撤回",
onClick: () => {
context.revokeMessage(message).catch((err) => {
Toast.error(err.msg);
});
},
};
},
4000
);
}
registerUserInfo() {
WKApp.shared.userInfoRegister(
"userinfo.remark",
(context: RouteContext) => {
const data = context.routeData();
const channelInfo = data.channelInfo;
const fromSubscriberOfUser = data.fromSubscriberOfUser;
if (data.isSelf) {
return;
}
const rows = new Array();
rows.push(
new Row({
cell: ListItem,
properties: {
title: "设置备注",
onClick: () => {
this.inputEditPush(
context,
channelInfo?.orgData?.remark,
async (value) => {
await WKApp.dataSource.commonDataSource
.userRemark(data.uid, value)
.catch((err) => {
Toast.error(err.msg);
});
return;
},
"设置备注"
);
},
},
})
);
if (fromSubscriberOfUser) {
let joinDesc = `${fromSubscriberOfUser.orgData.created_at.substr(
0,
10
)}`;
if (
fromSubscriberOfUser.orgData?.invite_uid &&
fromSubscriberOfUser.orgData?.invite_uid !== ""
) {
const inviterChannel = new Channel(
fromSubscriberOfUser.orgData?.invite_uid,
ChannelTypePerson
);
const inviteChannelInfo =
WKSDK.shared().channelManager.getChannelInfo(inviterChannel);
if (inviteChannelInfo) {
joinDesc += ` ${inviteChannelInfo.title}邀请入群`;
} else {
WKSDK.shared().channelManager.fetchChannelInfo(inviterChannel);
}
} else {
joinDesc += "加入群聊";
}
rows.push(
new Row({
cell: ListItem,
properties: {
title: "进群方式",
subTitle: joinDesc,
},
})
);
}
return new Section({
rows: rows,
});
}
);
WKApp.shared.userInfoRegister(
"userinfo.others",
(context: RouteContext) => {
const data = context.routeData();
const channelInfo = data.channelInfo;
const relation = channelInfo?.orgData?.follow;
const status = channelInfo?.orgData.status;
console.log("userInfoRegister---refresh.....");
if (data.isSelf) {
return;
}
console.log("userInfoRegister---refresh2.....", channelInfo);
const rows = new Array();
if (relation === UserRelation.friend) {
rows.push(
new Row({
cell: ListItem,
properties: {
title: "解除好友关系",
onClick: () => {
WKApp.shared.baseContext.showAlert({
content: `将联系人“${channelInfo?.orgData?.displayName}”删除,同时删除与该联系人的聊天记录`,
onOk: () => {
WKApp.dataSource.commonDataSource
.deleteFriend(data.uid)
.then(() => {
const channel = new Channel(
data.uid,
ChannelTypePerson
);
const conversation =
WKSDK.shared().conversationManager.findConversation(
channel
);
if (conversation) {
WKApp.conversationProvider.clearConversationMessages(
conversation
);
}
WKSDK.shared().conversationManager.removeConversation(
channel
);
WKApp.endpointManager.invoke(
EndpointID.clearChannelMessages,
channel
);
WKSDK.shared().channelManager.fetchChannelInfo(
new Channel(data.uid, ChannelTypePerson)
);
})
.catch((err) => {
Toast.error(err.msg);
});
},
});
},
},
})
);
}
rows.push(
new Row({
cell: ListItem,
properties: {
title:
status === UserRelation.blacklist ? "拉出黑名单" : "拉入黑名单",
onClick: () => {
if (status === UserRelation.blacklist) {
WKApp.dataSource.commonDataSource
.blacklistRemove(data.uid)
.then(() => {
WKApp.dataSource.contactsSync();
})
.catch((err) => {
Toast.error(err.msg);
});
} else {
WKApp.shared.baseContext.showAlert({
content: "加入黑名单,你将不再收到对方的消息。",
onOk: () => {
WKApp.dataSource.commonDataSource
.blacklistAdd(data.uid)
.then(() => {
WKApp.dataSource.contactsSync();
})
.catch((err) => {
Toast.error(err.msg);
});
},
});
}
},
},
})
);
// rows.push(new Row({
// cell: ListItem,
// properties: {
// title: "投诉",
// }
// }))
console.log("userInfoRegister---refresh3.....", rows);
return new Section({
rows: rows,
});
}
);
WKApp.shared.userInfoRegister(
"userinfo.source",
(context: RouteContext) => {
const data = context.routeData();
const channelInfo = data.channelInfo;
const relation = channelInfo?.orgData?.follow;
if (data.isSelf) {
return;
}
if (relation !== UserRelation.friend) {
return;
}
return new Section({
rows: [
new Row({
cell: ListItem,
properties: {
title: "来源",
subTitle: `${channelInfo?.orgData?.source_desc}`,
},
}),
],
});
}
);
WKApp.shared.userInfoRegister(
"userinfo.blacklist.tip",
(context: RouteContext) => {
const data = context.routeData();
const channelInfo = data.channelInfo;
const status = channelInfo?.orgData?.status;
if (data.isSelf) {
return;
}
if (status !== UserRelation.blacklist) {
return;
}
return new Section({
rows: [
new Row({
cell: ListItemTip,
properties: {
tip: (
已添加至黑名单,你将不再收到对方的消息
),
},
}),
],
});
},
99999
);
}
inputEditPush(
context: RouteContext,
defaultValue: string,
onFinish: (value: string) => Promise,
placeholder?: string,
maxCount?: number,
allowEmpty?: boolean,
allowWrap?: boolean
) {
let value: string;
let finishButtonContext: FinishButtonContext;
context.push(
{
value = v;
if (!allowEmpty && (!value || value === "")) {
finishButtonContext.disable(true);
} else {
finishButtonContext.disable(false);
}
if (exceeded) {
finishButtonContext.disable(true);
}
}}
maxCount={maxCount}
allowWrap={allowWrap}
>,
new RouteContextConfig({
showFinishButton: true,
onFinishContext: (finishBtnContext) => {
finishButtonContext = finishBtnContext;
finishBtnContext.disable(true);
},
onFinish: async () => {
finishButtonContext.loading(true);
await onFinish(value);
finishButtonContext.loading(false);
context.pop();
},
})
);
}
registerChannelSettings() {
WKApp.shared.channelSettingRegister("channel.subscribers", (context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channel = data.channel;
if (channel.channelType == ChannelTypeCustomerService) {
return;
}
let addFinishButtonContext: FinishButtonContext;
let removeFinishButtonContext: FinishButtonContext;
let addSelectItems: IndexTableItem[];
let removeSelectItems: IndexTableItem[];
const disableSelectList = data.subscribers.map((subscriber) => {
return subscriber.uid;
});
return new Section({
rows: [
new Row({
cell: Subscribers,
properties: {
context: context,
key: channel.getChannelKey(),
onAdd: () => {
context.push(
{
addSelectItems = items;
addFinishButtonContext.disable(items.length === 0);
}}
disableSelectList={disableSelectList}
>,
{
title: "联系人选择",
showFinishButton: true,
onFinish: async () => {
addFinishButtonContext.loading(true);
if (channel.channelType === ChannelTypePerson) {
const uids = new Array();
uids.push(WKApp.loginInfo.uid || "");
uids.push(channel.channelID);
for (const item of addSelectItems) {
uids.push(item.id);
}
const result = await WKApp.dataSource.channelDataSource
.createChannel(uids)
.catch((err) => {
Toast.error(err.msg);
});
if (result) {
WKApp.endpoints.showConversation(
new Channel(result.group_no, ChannelTypeGroup)
);
}
} else {
await WKApp.dataSource.channelDataSource.addSubscribers(
channel,
addSelectItems.map((item) => {
return item.id;
})
);
context.pop();
}
addFinishButtonContext.loading(false);
},
onFinishContext: (context) => {
console.log("onFinishContext------>", context);
addFinishButtonContext = context;
addFinishButtonContext.disable(true);
},
}
);
},
onRemove: () => {
context.push(
{
removeSelectItems = items;
removeFinishButtonContext.disable(items.length === 0);
}}
users={data.subscribers
.filter(
(subscriber) => subscriber.uid !== WKApp.loginInfo.uid
)
.map((item) => {
return new IndexTableItem(
item.uid,
item.name,
item.avatar
);
})}
>,
{
title: "删除群成员",
showFinishButton: true,
onFinish: async () => {
removeFinishButtonContext.loading(true);
await WKApp.dataSource.channelDataSource.removeSubscribers(
channel,
removeSelectItems.map((item) => {
return item.id;
})
);
removeFinishButtonContext.loading(false);
context.pop();
},
onFinishContext: (context) => {
removeFinishButtonContext = context;
removeFinishButtonContext.disable(true);
},
}
);
},
},
}),
],
});
});
WKApp.shared.channelSettingRegister(
"channel.base.setting",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channelInfo = data.channelInfo;
const channel = data.channel;
if (channel.channelType !== ChannelTypeGroup) {
return undefined;
}
const rows = new Array();
rows.push(
new Row({
cell: ListItem,
properties: {
title: "群聊名称",
subTitle: channelInfo?.title,
onClick: () => {
if (!data.isManagerOrCreatorOfMe) {
Toast.warning("只有管理者才能修改群名字");
return;
}
this.inputEditPush(
context,
channelInfo?.title || "",
(value: string) => {
return WKApp.dataSource.channelDataSource
.updateField(channel, ChannelField.channelName, value)
.catch((err) => {
Toast.error(err.msg);
});
},
"群名称",
20
);
},
},
})
);
rows.push(
new Row({
cell: ListItemIcon,
properties: {
title: "群头像",
icon: (
),
onClick: () => {
context.push(
,
{ title: "群头像" }
);
},
},
})
);
rows.push(
new Row({
cell: ListItemIcon,
properties: {
title: "群二维码",
icon: (
),
onClick: () => {
context.push(
,
new RouteContextConfig({
title: "群二维码名片",
})
);
},
},
})
);
rows.push(
new Row({
cell: ListItemMuliteLine,
properties: {
title: "群公告",
subTitle: channelInfo?.orgData?.notice,
onClick: () => {
if (!data.isManagerOrCreatorOfMe) {
Toast.warning("只有管理者才能修改群公告");
return;
}
this.inputEditPush(
context,
channelInfo?.orgData?.notice || "",
(value: string) => {
return WKApp.dataSource.channelDataSource
.updateField(channel, ChannelField.notice, value)
.catch((err) => {
Toast.error(err.msg);
});
},
"群公告",
400,
false,
true
);
},
},
})
);
return new Section({
rows: rows,
});
},
1000
);
WKApp.shared.channelSettingRegister(
"channel.base.setting2",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channelInfo = data.channelInfo;
const channel = data.channel;
const rows = new Array();
if (channel.channelType == ChannelTypeCustomerService) {
return;
}
rows.push(
new Row({
cell: ListItemSwitch,
properties: {
title: "消息免打扰",
checked: channelInfo?.mute,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.mute(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch(() => {
ctx.loading = false;
});
},
},
})
);
rows.push(
new Row({
cell: ListItemSwitch,
properties: {
title: "聊天置顶",
checked: channelInfo?.top,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.top(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch(() => {
ctx.loading = false;
});
},
},
})
);
if (channel.channelType == ChannelTypeGroup) {
rows.push(
new Row({
cell: ListItemSwitch,
properties: {
title: "保存到通讯录",
checked: channelInfo?.orgData.save === 1,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.save(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch(() => {
ctx.loading = false;
});
},
},
})
);
}
return new Section({
rows: rows,
});
},
3000
);
WKApp.shared.channelSettingRegister(
"channel.base.setting3",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
if (data.channel.channelType !== ChannelTypeGroup) {
return undefined;
}
let name = data.subscriberOfMe?.remark;
if (!name || name === "") {
name = data.subscriberOfMe?.name;
}
return new Section({
rows: [
new Row({
cell: ListItem,
properties: {
title: "我在本群的昵称",
subTitle: name,
onClick: () => {
this.inputEditPush(
context,
name || "",
(value: string) => {
return WKApp.dataSource.channelDataSource.subscriberAttrUpdate(
data.channel,
WKApp.loginInfo.uid || "",
{ remark: value }
);
},
"在这里可以设置你在这个群里的昵称。这个昵称只会在此群内显示。",
10,
true
);
},
},
}),
],
});
},
4000
);
// WKApp.shared.channelSettingRegister("channel.notify.setting.screen", (context) => {
// return new Section({
// subtitle: "在对话中的截屏,各方均会收到通知",
// rows: [
// new Row({
// cell: ListItemSwitch,
// properties: {
// title: "截屏通知",
// },
// }),
// ],
// })
// })
// WKApp.shared.channelSettingRegister("channel.notify.setting.revokemind", (context) => {
// return new Section({
// subtitle: "在对话中的消息撤回,各方均会收到通知",
// rows: [
// new Row({
// cell: ListItemSwitch,
// properties: {
// title: "撤回通知",
// },
// }),
// ],
// })
// })
// WKApp.shared.channelSettingRegister("channel.base.setting5", (context) => {
// return new Section({
// rows: [
// new Row({
// cell: ListItem,
// properties: {
// title: "投诉",
// },
// }),
// ],
// })
// })
WKApp.shared.channelSettingRegister(
"channel.base.setting6",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
if (data.channel.channelType !== ChannelTypeGroup) {
return undefined;
}
return new Section({
rows: [
new Row({
cell: ListItemButton,
properties: {
title: "清空聊天记录",
type: ListItemButtonType.warn,
onClick: () => {
WKApp.shared.baseContext.showAlert({
content: "是否清空此会话的所有消息?",
onOk: async () => {
const conversation =
WKSDK.shared().conversationManager.findConversation(
data.channel
);
if (!conversation) {
return;
}
await WKApp.conversationProvider.clearConversationMessages(
conversation
);
conversation.lastMessage = undefined;
WKApp.endpointManager.invoke(
EndpointID.clearChannelMessages,
data.channel
);
},
});
},
},
}),
new Row({
cell: ListItemButton,
properties: {
title: "删除并退出",
type: ListItemButtonType.warn,
onClick: () => {
WKApp.shared.baseContext.showAlert({
content:
"退出后不会通知群里其他成员,且不会再接收此群聊消息",
onOk: async () => {
WKApp.dataSource.channelDataSource
.exitChannel(data.channel)
.catch((err) => {
Toast.error(err.msg);
});
WKApp.conversationProvider.deleteConversation(
data.channel
);
},
});
},
},
}),
],
});
},
90000
);
}
registerChannelManages() {
WKApp.shared.channelManageRegister(
"channel.setting.manage.invite",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channel = data.channel;
const channelInfo = data.channelInfo;
return new Section({
subtitle:
"启用后,群成员需要群主或管理员确认才能邀请朋友进群。扫描二维码进群将同时停用。",
rows: [
new Row({
cell: ListItemSwitch,
properties: {
title: "群聊邀请确认",
checked: channelInfo?.orgData?.invite === 1,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.invite(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch((err) => {
ctx.loading = false;
});
},
},
}),
],
});
}
);
WKApp.shared.channelManageRegister(
"channel.setting.manage.transfer",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channel = data.channel;
const subscriberOfMe = data.subscriberOfMe;
if (!subscriberOfMe || subscriberOfMe.role !== GroupRole.owner) {
return;
}
return new Section({
rows: [
new Row({
cell: ListItem,
properties: {
title: "群主管理权转让",
onClick: () => {
context.push(
{
const item = items[0];
WKApp.shared.baseContext.showAlert({
content: "你将自动放弃群主身份",
onOk: () => {
WKApp.dataSource.channelDataSource
.channelTransferOwner(channel, item.id)
.then(() => {
context.popToRoot();
})
.catch((err) => {
Toast.error(err.msg);
});
},
});
}}
users={data.subscribers
.filter(
(subscriber) =>
!(
subscriber.uid === WKApp.loginInfo.uid ||
subscriber.uid === WKApp.config.fileHelperUID ||
subscriber.uid === WKApp.config.systemUID
)
)
.map((item) => {
return new IndexTableItem(
item.uid,
item.name,
item.avatar
);
})}
>,
{
title: "选择新的群主",
showFinishButton: false,
onFinish: async () => {
context.pop();
},
onFinishContext: (context) => {},
}
);
},
},
}),
],
});
}
);
WKApp.shared.channelManageRegister(
"channel.setting.manage.mute",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channel = data.channel;
const channelInfo = data.channelInfo;
return new Section({
title: "成员设置",
subtitle: "全员禁言启用后,只允许群主和管理员发言。",
rows: [
new Row({
cell: ListItemSwitch,
properties: {
title: "全员禁言",
checked: channelInfo?.orgData?.forbidden === 1,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.forbidden(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch((err) => {
ctx.loading = false;
});
},
},
}),
],
});
}
);
WKApp.shared.channelManageRegister(
"channel.setting.manage.prohibitAddFriend",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const channel = data.channel;
const channelInfo = data.channelInfo;
return new Section({
rows: [
new Row({
cell: ListItemSwitch,
properties: {
title: "禁止群成员互加好友",
checked: channelInfo?.orgData?.forbidden_add_friend === 1,
onCheck: (v: boolean, ctx: ListItemSwitchContext) => {
ctx.loading = true;
ChannelSettingManager.shared
.forbiddenAddFriend(v, channel)
.then(() => {
ctx.loading = false;
data.refresh();
})
.catch((err) => {
ctx.loading = false;
});
},
},
}),
],
});
}
);
WKApp.shared.channelManageRegister(
"channel.setting.manage.blacklist",
(context) => {
return new Section({
rows: [
new Row({
cell: ListItem,
properties: {
title: "群黑名单",
onClick: () => {
context.push(
,
{
title: "群黑名单",
}
);
},
},
}),
],
});
}
);
WKApp.shared.channelManageRegister(
"channel.setting.manage.managerlist",
(context) => {
const data = context.routeData() as ChannelSettingRouteData;
const subscriberOfMe = data.subscriberOfMe;
if (subscriberOfMe?.role !== GroupRole.owner) {
return;
}
return new Section({
title: "群主、管理员",
rows: [
new Row({
cell: ChannelManagerList,
properties: {
routeContext: context,
},
}),
],
});
}
);
}
}