121 lines
2.2 KiB
TypeScript
121 lines
2.2 KiB
TypeScript
![]() |
import { defineStore } from "pinia";
|
||
|
import { computed, ref } from "vue";
|
||
|
import type { Cs } from "../types";
|
||
|
import dayjs from "dayjs";
|
||
|
import { service, useStore } from "/@/cool";
|
||
|
import { last } from "lodash-es";
|
||
|
import { useSession } from "./session";
|
||
|
import { uuid } from "/@/cool/utils";
|
||
|
import { useScroller } from "./tools";
|
||
|
import { dateFormatter } from "../utils";
|
||
|
|
||
|
export const useMessage = defineStore("cs.message", () => {
|
||
|
const session = useSession();
|
||
|
const scroller = useScroller();
|
||
|
const { user } = useStore();
|
||
|
|
||
|
// 加载中
|
||
|
const loading = ref(false);
|
||
|
|
||
|
// 所有页
|
||
|
const data = ref<{ id: string; data: Cs.Msg[] }[]>([]);
|
||
|
|
||
|
// 列表
|
||
|
const list = computed(() => {
|
||
|
data.value.forEach((e) => {
|
||
|
if (e.data[0]) {
|
||
|
let date = e.data[0].createTime;
|
||
|
|
||
|
if (date) {
|
||
|
e.data.forEach((a, i) => {
|
||
|
const d = dateFormatter(a.createTime);
|
||
|
|
||
|
if (i == 0) {
|
||
|
a.date = d;
|
||
|
}
|
||
|
|
||
|
if (dayjs(a.createTime).subtract(10, "minute").isAfter(dayjs(date))) {
|
||
|
a.date = d;
|
||
|
date = a.createTime;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return data.value;
|
||
|
});
|
||
|
|
||
|
// 追加消息
|
||
|
function append(item: Cs.Msg) {
|
||
|
const list = last(data.value)?.data;
|
||
|
|
||
|
if (list) {
|
||
|
list.push({
|
||
|
sessionId: session.info?.id,
|
||
|
type: 0,
|
||
|
nickName: user.info?.nickName,
|
||
|
avatarUrl: user.info?.avatarUrl,
|
||
|
...item,
|
||
|
isAnimation: true,
|
||
|
});
|
||
|
|
||
|
scroller.scrollToBottom();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 清除消息
|
||
|
function clear() {
|
||
|
data.value = [];
|
||
|
}
|
||
|
|
||
|
// 读消息
|
||
|
function read(id: number) {
|
||
|
service.cs.msg.read({
|
||
|
msgIds: [id],
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 获取消息
|
||
|
async function refresh(params?: any) {
|
||
|
loading.value = true;
|
||
|
|
||
|
if (params.page == 1) {
|
||
|
data.value = [];
|
||
|
}
|
||
|
|
||
|
await service.cs.msg
|
||
|
.page({
|
||
|
sessionId: session.info?.id,
|
||
|
order: "createTime",
|
||
|
sort: "desc",
|
||
|
...params,
|
||
|
})
|
||
|
.then((res) => {
|
||
|
res.list.forEach((e) => {
|
||
|
if (e.type == 1) {
|
||
|
e.avatarUrl = e.adminUserHeadImg;
|
||
|
e.nickName = e.adminUserName;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
data.value.unshift({
|
||
|
id: uuid(),
|
||
|
data: res.list.reverse() as any[],
|
||
|
});
|
||
|
});
|
||
|
|
||
|
loading.value = false;
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
data,
|
||
|
list,
|
||
|
loading,
|
||
|
append,
|
||
|
clear,
|
||
|
read,
|
||
|
refresh,
|
||
|
};
|
||
|
});
|