chat_ui/mixins/replayMixin.js
2025-03-15 13:45:02 +03:30

363 lines
10 KiB
JavaScript

import chatApi from "~/apis/chatApi";
import repoApi from "~/apis/repoApi";
export default {
methods: {
// #region replays methods
closeReplays() {
this.showReplays = false;
this.resetReplayPagination();
this.replays = [];
this.replayFinishedTop = false;
this.replayFinishedBottom = false;
this.replayOverflow = false;
},
allReplayers(comment, replayUsers) {
let newUsers = [];
if (comment.replys)
comment.replys.users.forEach((user) => {
replayUsers.forEach((item) => {
if (user == item.user_id) newUsers.push(item);
});
});
return newUsers;
},
async getReplays(
fill_limit = false,
by_first_message = false,
seen_date = undefined,
page = undefined,
message_id = undefined
) {
// if (this.fetchinReplaygData) return;
// this.fetchinReplaygData = true;
let group_id = this.listGetter.id;
// groups,lobbies
let payload = {
group_id: group_id,
contact_id: undefined,
replyto: this.replayTo.id,
};
if (this.listGetter && this.listGetter?.is_group == 0){
payload.group_id = undefined
payload.contact_id = this.listGetter?.user;
}
if (seen_date == undefined) seen_date = this.replayPagination.seen_date;
//پیام منطبق با تاریخ درخواستی نیاید
if (!by_first_message && seen_date > 0) seen_date++;
if (page == undefined) page = this.replayPagination.page;
payload = {
...payload,
offset: 0,
limit: this.replayLimit,
seen_date: seen_date,
page: page,
message_id: message_id,
};
return await this.httpService
.postRequest("message/" + chatApi.messages.virtualList, payload)
.then((response) => {
// set replays for render on the left side.
let replays = undefined;
if (response.data && response.data.length) {
replays = structuredClone(response);
this.setUsers(replays.data, response.users);
}
// this.localComments = response.data;
// this.replays.forEach((item) => {
// item.user = response.users.find(
// (user) => user.user_id == item.user
// );
// if (item.replys)
// item.replys.users = this.allReplayers(item, response.users);
// });
this.replayPagination.total = response.pagination.total;
// this.replayPagination = {
// ...this.replayPagination,
// ...response.pagination,
// };
return replays;
})
.finally(() => {
// this.fetchinReplaygData = false;
});
},
saveReplay() {
if (this.savingReplay) return;
this.savingReplay = true;
let payload = {
text: this.replayText,
group_id: this.listGetter.id,
id: this.replayCommentor?.id ?? undefined,
contact_id: undefined,
replyto: this.replayTo?.id ?? undefined,
};
if (this.$route.name == "privates") {
payload = {
text: this.replayText,
id: this.replayCommentor?.id ?? undefined,
group_id: undefined,
contact_id: this.listGetter.user,
replyto: this.replayTo?.id ?? undefined,
};
}
let url = "message/" + chatApi.messages.create;
payload.text = this.replaceTextWithLink(payload.text);
this.httpService
.formDataRequest(url, payload)
.then((res) => {
// this.mySwalToast({
// html: res?.message ?? "",
// });
if (this.isReplayEditMode) {
this.replayCommentor = {};
}
this.replayText = null;
this.toReplayLastItem();
this.updateMessageCount(res);
// this.getReplays(
// ).then(() => {
// this.updateMessageCount();
// });
})
.finally(() => {
this.savingReplay = false;
this.isReplayEditMode = false;
this.replyComment = false;
});
},
// #endregion
async replaySaveFiles() {
let payload = {
text: this.uploadDescription,
group_id: this.listGetter.id,
id: this.mainCommentor?.id ?? undefined,
contact_id: undefined,
replyto: this.replayTo?.id ?? undefined,
};
if (this.$route.name == "privates") {
payload = {
text: this.uploadDescription,
id: this.replayTo?.id ?? undefined,
contact_id: this.listGetter.user,
};
}
let url = chatApi.messages.create;
// when screen shot paste, decide where to save it.(replay or message)
// if (
// payload.file.type == "" &&
// payload.file.name == "mp3" &&
// payload.file.size <= 20000
// ) {
// // 20KB
// this.mySwalToast({
// icon: "warn",
// text: "حداقل صوت قابل آپلود 20 کیلو بایت می باشد.",
// });
// } else
// 'Content-Type': 'application/x-www-form-urlencoded'
if (this.files.length > 1) {
this.files.forEach((fileItem) => {
payload.file = fileItem;
payload.length = fileItem.size;
this.fileUploadHttpService
.formDataRequest(url, payload)
.then((res) => {
this.replayText = null;
this.uploadDescription = null;
this.toReplayLastItem();
this.updateMessageCount(res);
})
.catch(() => {
this.mySwalToast({
html: "خطایی رخ داد.لطفا دوباره امتحان کنید.",
});
});
});
} else {
// 0: files, 1: image, 2:audio 3:video
// payload.file_type = this.getFileType(this.files[0].name);
payload.file = this.files[0];
payload.length = this.files[0].size;
return await this.fileUploadHttpService
.formDataRequest(url, payload)
.then((res) => {
this.closeDroppedList();
this.replayText = null;
this.uploadDescription = null;
this.toReplayLastItem();
this.updateMessageCount(res);
})
.catch(() => {
this.mySwalToast({
html: "خطایی رخ داد.لطفا دوباره امتحان کنید.",
});
});
}
},
replayToTop() {
if (this.replayFinishedTop) return;
--this.replayPagination.pageTop;
this.replayPagination.page = this.replayPagination.pageTop;
const vm = this;
this.getReplays().then((response) => {
if (!response?.data?.length) {
vm.replayFinishedTop = true;
vm.replayPagination.pageTop++;
vm.replayPagination.page = vm.replayPagination.pageTop;
return;
}
const vsl = vm.$refs.replayVsl;
let prev_size = vsl.getScrollSize();
vm.replays = response.data.concat(vm.replays);
vm.$nextTick(() => {
const offset = vsl.getScrollSize() - prev_size;
vm.replaySetVirtualListToOffset(offset);
});
});
},
replayToBottom() {
if (this.replayFirstLoad) {
this.replayFirstLoad = false;
return;
}
if (this.replayFinishedBottom) return;
++this.replayPagination.pageBottom;
this.replayPagination.page = this.replayPagination.pageBottom;
this.getReplays().then((response) => {
if (!response?.data?.length) {
this.replayFinishedBottom = true;
this.replayPagination.pageBottom--;
this.replayPagination.page = this.replayPagination.pageBottom;
return;
}
this.replays = [...this.replays, ...response.data];
this.$nextTick(() => {
const vsl = this.$refs.replayVsl;
const offset = vsl.getScrollSize();
this.replaySetVirtualListToOffset(offset);
this.fetchingData = false;
});
});
},
toReplayFirstItem() {
this.replayPagination.pageBottom = 1;
this.replayPagination.pageTop = 0;
this.replayPagination.page = 1;
this.replayPagination.seen_date = 0;
this.getReplays().then((response) => {
if (!response.data.length) {
return;
}
this.replays = response.data;
// const mids = this.getMids(response.data)
this.$nextTick(() => {
this.replayOffset = 0;
this.replaySetVirtualListToOffset(this.replayOffset);
this.fetchingData = false;
});
});
},
toReplayLastItem() {
this.replayPagination.pageBottom = 0;
this.replayPagination.pageTop = -1;
this.replayPagination.page = -1;
this.replayPagination.seen_date = -1;
this.getReplays().then((response) => {
if (!response.data.length) {
return;
}
this.replays = response.data;
// const mids = this.getMids(response.data)
this.$nextTick(() => {
const vsl = this.$refs.replayVsl;
this.offset = vsl.getScrollSize();
this.replaySetVirtualListToOffset(this.replayOffset);
this.fetchingData = false;
});
});
},
async replayOnResult(data) {
this.files = [];
this.files.push(new File([data], "mp3"));
// if (this.replayAbortRecord) return;
// this.replayAbortRecord = true;
this.replaySaveFiles().then(() => {
// this.replayRecording = false;
// this.replayAbortRecord = false;
});
},
showReplyComment() {
const myReply = document.getElementById("show_reply");
myReply.style.display = "none";
},
closeReplyComment(isEditModeName) {
this.replyComment = false;
this[isEditModeName] = false;
this.replayText = null;
// try {
// this.$refs.replays.style.removeProperty("height");
// this.$refs.replayTextRef.style.removeProperty("height");
// } catch (err) {
// this.$refs.replays.style.height = null;
// this.$refs.replayTextRef.style.height = null;
// }
},
resetReplayPagination() {
this.replayPagination = {
page: 0,
total: 0,
pageTop: 0,
pageBottom: 1,
seenDate: null,
};
},
},
};