u
This commit is contained in:
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
|
||||
}
|
||||
);
|
||||
Reference in new issue
Block a user