gptbot/bingchat/components/chatbox/index.js
2023-04-06 18:57:54 +08:00

256 lines
6.4 KiB
JavaScript

const app = getApp()
import {
doRequest,
sid_prefix,
systemInfo
} from "../../config"
var closeShareOnCopy = false
try {
if (wx.getStorageSync("closeShareOnCopy")) {
closeShareOnCopy = true
}
} catch (e) {
closeShareOnCopy = false
}
Component({
options: {
addGlobalClass: true,
multipleSlots: true,
},
properties: {
chatType: {
type: String,
value: "bing"
}
},
pageLifetimes: {
show: function () {
//this.initMessageHistory()
},
},
lifetimes: {
attached() {
app.globalData.cht = this
this.initMessageHistory()
},
detached() {
try {} catch (error) {}
},
},
data: {
chatList: [],
receiveData: false,
autoIncrConversation: 1,
closeShareOnCopy: closeShareOnCopy,
showShare: false,
loadingData: false,
systemInfo: systemInfo,
height: systemInfo.windowHeight - parseInt(100 / 750 * systemInfo.windowWidth) - ((systemInfo.platform == "ios" || systemInfo.platform == "android") ? 22 : 5)
},
methods: {
bindscrolltoupper: function (e) {
var that = this
if (that.data.loadingData) {
return
}
that.setData({
loadingData: true
})
wx.showLoading({
title: "加载历史记录...",
})
app.getSid(sid => {
var page = 1
if (that.data.chatList.length > 0) {
page = Math.ceil((that.data.chatList.length + 1) / 10)
}
doRequest("/query", "GET", {
"sid": sid_prefix + sid,
"page": page,
"size": 10,
}).then(res => {
var data = res.data["data"]
data.reverse()
var oldData = that.data.chatList
var filterData = []
if (oldData.length > 0) {
data.forEach(k => {
if (k["dt"] < oldData[0]["dt"]) {
filterData.push(k)
}
})
} else {
filterData = data
}
var newData = filterData.concat(oldData)
that.setData({
chatList: newData,
loadingData: false
}, () => {
if (oldData.length < 10) {
wx.setStorage({
key: "chatList",
data: newData.slice(newData.length - 10),
})
}
if (filterData.length == 0 && e) {
setTimeout(() => {
wx.showToast({
title: "已全部加载完成"
})
}, 100)
} else {
setTimeout(() => {
wx.hideLoading()
}, 100)
}
})
}).catch(res => {
wx.hideLoading()
console.log(res)
})
})
},
initMessageHistory() {
var that = this
wx.getStorage({
key: "chatList",
success: function (res) {
var data = res.data
data = data ? data : []
if (data.length > 0) {
that.setData({
chatList: data,
})
} else {
that.bindscrolltoupper()
}
},
fail: function () {
that.bindscrolltoupper()
}
})
},
clearChat: function (e) {
var that = this
var index = e.currentTarget.dataset.index
var data = this.data.chatList
wx.showModal({
content: "是否删除该条聊天?",
complete: (res) => {
if (res.confirm) {
var deleteData = data[index]
data.splice(index, 1)
that.setData({
chatList: data,
})
app.getSid(sid => {
doRequest("/delete", "POST", {
"sid": sid_prefix + sid,
"conversation": deleteData
}).then(res => {
console.log(res)
wx.setStorage({
key: "chatList",
data: data.slice(data.length - 10),
})
})
})
}
},
})
},
copyContent: function (e) {
var index = e.currentTarget.dataset.index
var that = this
var content = this.data.chatList[index].originContent
wx.setClipboardData({
data: content,
success: function () {
wx.showToast({
title: "复制成功",
})
if (that.data.chatList[index]["type"] == "man" && !that.data.closeShareOnCopy) {
setTimeout(() => {
that.setData({
showShare: true
})
wx.setStorage({
key: "shareContent",
data: {
q: content,
validTime: new Date().getTime() + 300 * 1000
}
})
}, 1200)
}
}
})
},
renderMd: function (e) {
var index = e.currentTarget.dataset.index
var data = this.data.chatList[index]
var content = data.originContent
if (!this.data.chatList[index].content) {
var matches = content.match(/```markdown[\s\S]*```/g)
if (null == matches) {
matches = content.match(/```markdown[\s\S]*/g)
}
if (null != matches) {
matches.forEach(m => {
var m1 = m.replace("```markdown", "").trim()
if (m1.endsWith("```")) {
m1 = m1.substring(0, m1.length - 3)
}
content = content.replace(m, m1)
})
}
data.content = content
} else {
data.content = null
}
this.setData({
chatList: this.data.chatList
})
},
suggestSubmit: function (e) {
var suggest = e.currentTarget.dataset.suggest
this.triggerEvent(
"suggestSubmit", {
suggest,
}, {}
)
},
cancelReceive: function () {
this.triggerEvent(
"cancelReceive", {}, {}
)
},
showOriginContent: function (e) {
var index = e.currentTarget.dataset.index
var data = this.data.chatList[index]
if (data.showOrigin) {
data.showOrigin = null
} else {
data.showOrigin = true
}
this.setData({
chatList: this.data.chatList
})
},
onPopButtonClick: function (e) {
if (e.detail.t !== "confirm") {
wx.removeStorage({
key: "shareContent",
})
}
this.setData({
showShare: false
})
}
},
})