352 lines
11 KiB
JavaScript
352 lines
11 KiB
JavaScript
import { generateNewId } from 'oak-domain/lib/utils/uuid';
|
||
import { DATA_SUBSCRIBER_KEYS } from '../../../config/constants';
|
||
import { getConfig } from '../../../utils/getContextConfig';
|
||
export default OakComponent({
|
||
entity: 'sessionMessage',
|
||
projection: {
|
||
id: 1,
|
||
text: 1,
|
||
type: 1,
|
||
userId: 1,
|
||
wechatUserId: 1,
|
||
applicationId: 1,
|
||
createTime: 1,
|
||
$$createAt$$: 1,
|
||
aaoe: 1,
|
||
extraFile$entity: {
|
||
$entity: 'extraFile',
|
||
data: {
|
||
id: 1,
|
||
tag1: 1,
|
||
origin: 1,
|
||
bucket: 1,
|
||
objectId: 1,
|
||
filename: 1,
|
||
extra1: 1,
|
||
extension: 1,
|
||
type: 1,
|
||
entity: 1,
|
||
entityId: 1,
|
||
},
|
||
// filter: {
|
||
// tag1: {
|
||
// $in: ['image'],
|
||
// },
|
||
// },
|
||
},
|
||
sessionId: 1,
|
||
session: {
|
||
id: 1,
|
||
entity: 1,
|
||
entityId: 1,
|
||
},
|
||
},
|
||
isList: true,
|
||
lifetimes: {
|
||
async ready() {
|
||
const { sessionId } = this.props;
|
||
this.subData([
|
||
{
|
||
entity: 'sessionMessage',
|
||
filter: {
|
||
sessionId: sessionId,
|
||
},
|
||
id: `${DATA_SUBSCRIBER_KEYS.sessionMessageList}-${sessionId}`,
|
||
},
|
||
], async () => {
|
||
await this.pageScroll('comment');
|
||
});
|
||
this.createItem();
|
||
this.getConversationInfo();
|
||
},
|
||
detached() {
|
||
if (this.timer) {
|
||
clearInterval(this.timer);
|
||
}
|
||
const { sessionId } = this.props;
|
||
this.unSubData([
|
||
`${DATA_SUBSCRIBER_KEYS.sessionMessageList}-${sessionId}`,
|
||
]);
|
||
},
|
||
},
|
||
listeners: {
|
||
num(prev, next) {
|
||
if (prev.num !== next.num) {
|
||
this.pageScroll('comment');
|
||
}
|
||
},
|
||
sessionId(prev, next) {
|
||
if (this.state.oakFullpath) {
|
||
if (prev.sessionId !== next.sessionId) {
|
||
if (next.sessionId) {
|
||
const { sessionMessageId } = this.state;
|
||
this.getConversationInfo();
|
||
// 如果sessionId变了需要重新刷新下
|
||
this.refresh();
|
||
this.removeItem(sessionMessageId);
|
||
this.setState({
|
||
text: '',
|
||
});
|
||
this.createItem();
|
||
this.pageScroll('comment');
|
||
}
|
||
}
|
||
}
|
||
},
|
||
},
|
||
formData({ data: sessionMessageList = [], features }) {
|
||
const sessionMessageType = sessionMessageList?.find((ele) => ele.$$createAt$$ === 1)?.type;
|
||
this.getUserLastMessage();
|
||
return {
|
||
sessionMessageList: sessionMessageList?.filter((ele) => ele.$$createAt$$ !== 1),
|
||
num: sessionMessageList?.length,
|
||
sessionMessageType,
|
||
};
|
||
},
|
||
properties: {
|
||
sessionId: '',
|
||
isEntity: false,
|
||
dialog: false,
|
||
entity: '',
|
||
entityId: '',
|
||
entityDisplay: (data) => [],
|
||
entityProjection: {}, // user端,指示需要取哪些entity的属性来显示entityDisplay
|
||
},
|
||
filters: [
|
||
{
|
||
filter() {
|
||
const { sessionId } = this.props;
|
||
return {
|
||
sessionId,
|
||
};
|
||
},
|
||
},
|
||
],
|
||
sorters: [
|
||
{
|
||
sorter: {
|
||
$attr: {
|
||
$$createAt$$: 1,
|
||
},
|
||
$direction: 'desc',
|
||
},
|
||
},
|
||
],
|
||
data: {
|
||
content: '',
|
||
buttonHidden: true,
|
||
selectedTradeId: '',
|
||
newSessionId: '',
|
||
},
|
||
methods: {
|
||
getUserLastMessage() {
|
||
const { sessionId } = this.props;
|
||
const [lastMessage] = this.features.cache.get('sessionMessage', {
|
||
data: {
|
||
id: 1,
|
||
sessionId: 1,
|
||
text: 1,
|
||
type: 1,
|
||
userId: 1,
|
||
wechatUserId: 1,
|
||
applicationId: 1,
|
||
createTime: 1,
|
||
$$createAt$$: 1,
|
||
aaoe: 1,
|
||
},
|
||
filter: {
|
||
sessionId,
|
||
aaoe: false,
|
||
},
|
||
sorter: [
|
||
{
|
||
$attr: {
|
||
$$createAt$$: 1,
|
||
},
|
||
$direction: 'desc',
|
||
},
|
||
],
|
||
count: 1,
|
||
});
|
||
const isWeChat = !!lastMessage?.wechatUserId;
|
||
this.setState({ isWeChat });
|
||
},
|
||
setContent(text) {
|
||
const { sessionMessageId } = this.state;
|
||
this.setState({
|
||
text,
|
||
});
|
||
this.updateItem({
|
||
text,
|
||
type: 'text',
|
||
}, sessionMessageId);
|
||
},
|
||
setButtonHidden(isHidden) {
|
||
this.setState({
|
||
buttonHidden: isHidden,
|
||
});
|
||
},
|
||
async getConversationInfo() {
|
||
const { sessionId } = this.props;
|
||
if (!sessionId) {
|
||
return;
|
||
}
|
||
const { data: [session], } = await this.features.cache.refresh('session', {
|
||
data: {
|
||
id: 1,
|
||
entity: 1,
|
||
entityId: 1,
|
||
userId: 1,
|
||
user: {
|
||
id: 1,
|
||
name: 1,
|
||
nickname: 1,
|
||
mobile$user: {
|
||
$entity: 'mobile',
|
||
data: {
|
||
id: 1,
|
||
mobile: 1,
|
||
userId: 1,
|
||
},
|
||
},
|
||
extraFile$entity: {
|
||
$entity: 'extraFile',
|
||
data: {
|
||
id: 1,
|
||
tag1: 1,
|
||
origin: 1,
|
||
bucket: 1,
|
||
objectId: 1,
|
||
filename: 1,
|
||
extra1: 1,
|
||
extension: 1,
|
||
type: 1,
|
||
entity: 1,
|
||
entityId: 1,
|
||
},
|
||
filter: {
|
||
tag1: {
|
||
$in: ['avatar'],
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
filter: {
|
||
id: sessionId,
|
||
},
|
||
});
|
||
this.setState({
|
||
entity: session?.entity,
|
||
entityId: session?.entityId,
|
||
});
|
||
},
|
||
pageScroll(id) {
|
||
const doc = window.document.getElementById(id);
|
||
setTimeout(() => doc.scrollTo(0, 10000), 500);
|
||
},
|
||
async createItem() {
|
||
const { text, wechatUserId } = this.state;
|
||
const { sessionId, isEntity } = this.props;
|
||
const userId = this.features.token.getUserId();
|
||
const applicationId = this.features.application.getApplicationId();
|
||
const sessionMessageId = this.addItem({
|
||
applicationId,
|
||
userId,
|
||
wechatUserId,
|
||
sessionId: sessionId,
|
||
aaoe: isEntity,
|
||
});
|
||
this.setState({
|
||
sessionMessageId,
|
||
});
|
||
},
|
||
async createMessage() {
|
||
const { text, wechatUserId, newSessionId, sessionMessageId } = this.state;
|
||
const { sessionId, isEntity } = this.props;
|
||
const userId = this.features.token.getUserId();
|
||
const applicationId = this.features.application.getApplicationId();
|
||
if (!this.state.text) {
|
||
this.setMessage({
|
||
type: 'warning',
|
||
content: '请输入内容',
|
||
});
|
||
return;
|
||
}
|
||
// this.addItem({
|
||
// applicationId,
|
||
// text,
|
||
// userId,
|
||
// wechatUserId,
|
||
// sessionId: sessionId || newSessionId,
|
||
// type: 'text',
|
||
// createTime: Date.now(),
|
||
// aaoe: isEntity,
|
||
// } as EntityDict['sessionMessage']['CreateSingle']['data']);
|
||
this.updateItem({
|
||
createTime: Date.now(),
|
||
}, sessionMessageId);
|
||
await this.execute(undefined, false);
|
||
this.setState({
|
||
text: '',
|
||
});
|
||
this.pageScroll('comment');
|
||
this.createItem();
|
||
},
|
||
async customUpload(file) {
|
||
const { sessionId, isEntity } = this.props;
|
||
// TS 语法
|
||
// file 即选中的文件
|
||
const { name, size, type, originFileObj } = file;
|
||
const applicationId = this.features.application.getApplicationId();
|
||
const extension = name.substring(name.lastIndexOf('.') + 1);
|
||
const filename = name.substring(0, name.lastIndexOf('.'));
|
||
let bucket2 = '';
|
||
if (!bucket2) {
|
||
const context = this.features.cache.begin();
|
||
const { config } = getConfig(context, 'Cos', 'qiniu');
|
||
this.features.cache.commit();
|
||
const { defaultBucket } = config;
|
||
bucket2 = defaultBucket;
|
||
}
|
||
const extraFile = {
|
||
applicationId,
|
||
bucket: bucket2,
|
||
origin: 'qiniu',
|
||
type: 'image',
|
||
tag1: 'image',
|
||
filename,
|
||
fileType: type,
|
||
size,
|
||
extension,
|
||
entity: 'sessionMessage',
|
||
id: generateNewId(),
|
||
};
|
||
try {
|
||
const userId = this.features.token.getUserId();
|
||
this.addItem({
|
||
id: generateNewId(),
|
||
applicationId,
|
||
sessionId,
|
||
createTime: Date.now(),
|
||
aaoe: isEntity,
|
||
type: 'image',
|
||
extraFile$entity: [
|
||
{
|
||
id: generateNewId(),
|
||
action: 'create',
|
||
data: extraFile,
|
||
},
|
||
],
|
||
});
|
||
this.features.extraFile2.addLocalFile(extraFile?.id, originFileObj);
|
||
await this.execute(undefined, false);
|
||
this.features.extraFile2.upload(extraFile?.id);
|
||
}
|
||
catch (err) {
|
||
throw err;
|
||
}
|
||
},
|
||
},
|
||
});
|