This commit is contained in:
oneao committed 2025-06-10 21:27:20 +08:00
commit c570ec514c
550 files changed
+152597

No files matched your search

@@ -0,0 +1,130 @@
import { defineStore } from "pinia";
import { ref, computed } from "vue";
import { type EmailFolder, type EmailDetail } from "@/types/email";
function getEmailFolderLabel(key: string): string {
switch (key.toUpperCase()) {
case "INBOX":
return "收件箱";
case "SENT":
case "SENT ITEMS":
case "SENT MESSAGES":
return "已发送";
case "DRAFTS":
return "草稿箱";
case "TRASH":
case "DELETED":
case "DELETED ITEMS":
case "DELETED MESSAGES":
return "已删除";
case "JUNK":
case "SPAM":
return "垃圾邮件";
case "ARCHIVE":
return "归档";
default:
return key;
}
}
function getEmailFolderIcon(key: string): string {
switch (key.toUpperCase()) {
case "INBOX":
return "mdi:inbox";
case "SENT":
case "SENT ITEMS":
case "SENT MESSAGES":
return "mdi:send";
case "DRAFTS":
return "mdi:file-document-edit-outline";
case "TRASH":
case "DELETED":
case "DELETED ITEMS":
case "DELETED MESSAGES":
return "mdi:trash-can-outline";
case "JUNK":
case "SPAM":
return "mdi:alert-octagon-outline";
case "ARCHIVE":
return "mdi:archive-outline";
default:
return "mdi:folder-outline";
}
}
export const useEmailStore = defineStore("email", () => {
// 邮箱文件夹列表
const folderList = ref<EmailFolder[]>([]);
// 当前选中的文件夹
const currentFolder = ref<EmailFolder>({
id: "",
parentId: "",
name: "",
fullName: "",
type: 0,
category: "",
icon: "",
label: "",
children: []
});
const currentEmail = ref<EmailDetail>({
id: "",
content: "",
contentType: "",
subject: "",
createTime: "",
fromAddress: { id: "", addressName: "", address: "" },
toAddresses: [],
ccAddresses: [],
bccAddresses: [],
senderAddresses: [],
replyAddresses: [],
attachments: []
});
const selectedIds = ref<Set<string>>(new Set());
const isFolderSelected = computed(() => {
return !!currentFolder.value.id;
});
const isEmailSelected = computed(() => {
return !!currentEmail.value.id;
});
const isSelectedIds = computed(() => {
return selectedIds.value.size > 0;
});
function setFolderList(list: EmailFolder[]) {
function enrich(folders: EmailFolder[]): EmailFolder[] {
return folders.map((folder) => {
folder.icon = getEmailFolderIcon(folder.name);
folder.label = getEmailFolderLabel(folder.name);
if (folder.children && folder.children.length > 0) {
folder.children = enrich(folder.children);
}
return folder;
});
}
folderList.value = enrich(list);
}
function resetCurrentEmail() {
currentEmail.value.id = "";
}
return {
folderList,
setFolderList,
currentFolder,
currentEmail,
resetCurrentEmail,
isEmailSelected,
isFolderSelected,
selectedIds,
isSelectedIds
};
});
@@ -0,0 +1,26 @@
import { defineStore } from "pinia";
import { useRoute, useRouter, RouteLocationRaw } from "vue-router";
import { computed } from "vue";
export const useRouterStore = defineStore("router", () => {
const route = useRoute();
const router = useRouter();
const currentPath = computed(() => route.path);
const currentFullPath = computed(() => route.fullPath);
const navigateTo = (params: RouteLocationRaw) => {
router.push(params);
};
const isInHome = computed(() => {
return route.path === "/" || route.path === "/home";
});
return {
currentPath,
currentFullPath,
navigateTo,
route,
isInHome
};
});
@@ -0,0 +1,52 @@
import { defineStore } from "pinia";
import { computed, ref } from "vue";
type IUserInfo = {
id: string;
email: string;
displayName: string;
token: string;
};
const initState: IUserInfo = { id: "", email: "", displayName: "", token: "" };
export const useUserStore = defineStore(
"user",
() => {
const userInfo = ref<IUserInfo>({ ...initState });
const setUserInfo = (val: IUserInfo) => {
userInfo.value = val;
};
const clearUserInfo = () => {
userInfo.value.displayName = "";
userInfo.value.id = "";
userInfo.value.token = "";
};
const reset = () => {
userInfo.value = { ...initState }; // 使用initState确保一致性
};
// 判断是否已登录
const isLogined = computed(() => {
return !!(
userInfo.value.token && // 用户令牌
userInfo.value.id && // 用户ID
userInfo.value.email // 邮箱
);
});
return {
userInfo,
setUserInfo,
clearUserInfo,
isLogined,
reset
};
},
{
persist: true
}
);