mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-18 10:18:14 +08:00
♻️ showSnackbar重构
This commit is contained in:
@@ -98,7 +98,7 @@ let achiListener: UnlistenFn | null = null;
|
||||
async function switchHideFin() {
|
||||
const text = hideFin.value ? "显示已完成" : "隐藏已完成";
|
||||
hideFin.value = !hideFin.value;
|
||||
showSnackbar({ text: `已${text}`, color: "success" });
|
||||
showSnackbar.success(`已${text}`);
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
@@ -140,20 +140,12 @@ async function importJson(): Promise<void> {
|
||||
const selectedFile = await open({
|
||||
title: "选择 UIAF 数据文件",
|
||||
multiple: false,
|
||||
filters: [
|
||||
{
|
||||
name: "UIAF JSON",
|
||||
extensions: ["json"],
|
||||
},
|
||||
],
|
||||
filters: [{ name: "UIAF JSON", extensions: ["json"] }],
|
||||
defaultPath: await path.downloadDir(),
|
||||
directory: false,
|
||||
});
|
||||
if (selectedFile === null) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消文件选择",
|
||||
});
|
||||
showSnackbar.cancel("已取消文件选择");
|
||||
await TGLogger.Info("[Achievements][importJson] 已取消文件选择");
|
||||
return;
|
||||
}
|
||||
@@ -166,12 +158,12 @@ async function importJson(): Promise<void> {
|
||||
input: uidCur.value.toString(),
|
||||
});
|
||||
if (uidInput === false) {
|
||||
showSnackbar({ text: "已取消存档导入!", color: "cancel" });
|
||||
showSnackbar.cancel("已取消存档导入");
|
||||
return;
|
||||
}
|
||||
if (uidInput === undefined) uidInput = uidCur.value.toString();
|
||||
else if (isNaN(Number(uidInput))) {
|
||||
showSnackbar({ text: "请输入合法数字", color: "warn" });
|
||||
showSnackbar.warn("请输入合法数字");
|
||||
return;
|
||||
}
|
||||
const remoteRaw = await readUiafData(selectedFile);
|
||||
@@ -186,15 +178,13 @@ async function importJson(): Promise<void> {
|
||||
loadingTitle.value = "正在合并成就数据";
|
||||
await TSUserAchi.mergeUiaf(remoteRaw.list, Number(uidInput));
|
||||
loadingTitle.value = "即将刷新页面";
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
setTimeout(() => window.location.reload(), 1000);
|
||||
}
|
||||
|
||||
async function exportJson(): Promise<void> {
|
||||
await TGLogger.Info("[Achievements][exportJson] 导出 UIAF 数据");
|
||||
if (overview.value.fin === 0) {
|
||||
showSnackbar({ color: "error", text: "没有可导出的数据" });
|
||||
showSnackbar.warn("没有可导出的数据");
|
||||
await TGLogger.Warn("[Achievements][exportJson] 没有可导出的数据");
|
||||
return;
|
||||
}
|
||||
@@ -205,21 +195,16 @@ async function exportJson(): Promise<void> {
|
||||
const fileName = `UIAF_${UiafData.info.export_app}_${UiafData.info.export_app_version}_${uidCur.value}`;
|
||||
const isSave = await save({
|
||||
title: "导出 UIAF 数据",
|
||||
filters: [
|
||||
{
|
||||
name: "UIAF JSON",
|
||||
extensions: ["json"],
|
||||
},
|
||||
],
|
||||
filters: [{ name: "UIAF JSON", extensions: ["json"] }],
|
||||
defaultPath: `${await path.downloadDir()}${path.sep()}${fileName}.json`,
|
||||
});
|
||||
if (isSave === null) {
|
||||
showSnackbar({ color: "warn", text: "已取消导出" });
|
||||
showSnackbar.cancel("已取消导出");
|
||||
await TGLogger.Info("[Achievements][exportJson] 已取消导出");
|
||||
return;
|
||||
}
|
||||
await writeTextFile(isSave, JSON.stringify(UiafData));
|
||||
showSnackbar({ text: "导出成功", color: "success" });
|
||||
showSnackbar.success("导出成功");
|
||||
await TGLogger.Info("[Achievements][exportJson] 导出成功");
|
||||
await TGLogger.Info(`[Achievements][exportJson] 导出路径:${isSave}`);
|
||||
}
|
||||
@@ -231,10 +216,7 @@ async function handleImportOuter(app: string): Promise<void> {
|
||||
text: `来源APP:${app}`,
|
||||
});
|
||||
if (!confirm) {
|
||||
showSnackbar({
|
||||
color: "warn",
|
||||
text: "已取消导入",
|
||||
});
|
||||
showSnackbar.cancel("已取消导入");
|
||||
await TGLogger.Info("[Achievements][handleImportOuter] 已取消导入");
|
||||
return;
|
||||
}
|
||||
@@ -249,12 +231,12 @@ async function handleImportOuter(app: string): Promise<void> {
|
||||
input: uidCur.value.toString(),
|
||||
});
|
||||
if (uidInput === false) {
|
||||
showSnackbar({ text: "已取消存档导入!", color: "cancel" });
|
||||
showSnackbar.cancel("已取消存档导入");
|
||||
return;
|
||||
}
|
||||
if (uidInput === undefined) uidInput = uidCur.value.toString();
|
||||
else if (isNaN(Number(uidInput))) {
|
||||
showSnackbar({ text: "请输入合法数字", color: "warn" });
|
||||
showSnackbar.warn("请输入合法数字");
|
||||
return;
|
||||
}
|
||||
const data: TGApp.Plugins.UIAF.Data = JSON.parse(clipboard);
|
||||
@@ -262,11 +244,9 @@ async function handleImportOuter(app: string): Promise<void> {
|
||||
loading.value = true;
|
||||
await TSUserAchi.mergeUiaf(data.list, Number(uidInput));
|
||||
loading.value = false;
|
||||
showSnackbar({ color: "success", text: "导入成功,即将刷新页面" });
|
||||
showSnackbar.success("导入成功,即将刷新页面");
|
||||
await TGLogger.Info("[Achievements][handleImportOuter] 导入成功");
|
||||
setTimeout(async () => {
|
||||
await router.push("/achievements");
|
||||
}, 1500);
|
||||
setTimeout(async () => await router.push("/achievements"), 1500);
|
||||
}
|
||||
|
||||
async function createUid(): Promise<void> {
|
||||
@@ -276,20 +256,20 @@ async function createUid(): Promise<void> {
|
||||
text: "UID:",
|
||||
});
|
||||
if (uidInput === undefined || uidInput === false) {
|
||||
showSnackbar({ text: "已取消", color: "cancel" });
|
||||
showSnackbar.cancel("已取消");
|
||||
return;
|
||||
}
|
||||
if (isNaN(Number(uidInput))) {
|
||||
showSnackbar({ text: "请输入合法数字", color: "warn" });
|
||||
showSnackbar.warn("请输入合法数字");
|
||||
return;
|
||||
}
|
||||
if (uidList.value.includes(Number(uidInput))) {
|
||||
showSnackbar({ text: "该存档已存在!", color: "warn" });
|
||||
showSnackbar.warn("该存档已存在!");
|
||||
return;
|
||||
}
|
||||
uidList.value.push(Number(uidInput));
|
||||
uidCur.value = Number(uidInput);
|
||||
showSnackbar({ text: `切换到新存档 ${Number(uidInput)}`, color: "success" });
|
||||
showSnackbar.success(`切换到新存档 ${Number(uidInput)}`);
|
||||
}
|
||||
|
||||
async function deleteUid(): Promise<void> {
|
||||
@@ -298,7 +278,7 @@ async function deleteUid(): Promise<void> {
|
||||
text: `确认则清空存档-${uidCur.value}对应数据`,
|
||||
});
|
||||
if (uidInput === undefined || !uidInput) {
|
||||
showSnackbar({ text: "已取消删除存档", color: "cancel" });
|
||||
showSnackbar.cancel("已取消删除存档");
|
||||
return;
|
||||
}
|
||||
await TSUserAchi.delUid(uidCur.value);
|
||||
|
||||
@@ -116,21 +116,27 @@ const annoCards = ref<AnnoCard>({
|
||||
game: [],
|
||||
});
|
||||
|
||||
watch(curRegion, async (value) => {
|
||||
appStore.server = value;
|
||||
const name = getRegionName(value);
|
||||
await TGLogger.Info(`[Announcements][watch][curRegionName] 切换服务器:${name}`);
|
||||
await loadData();
|
||||
showSnackbar({ text: `服务器切换为:${name}`, color: "success" });
|
||||
});
|
||||
watch(
|
||||
() => curRegion.value,
|
||||
async () => {
|
||||
appStore.server = curRegion.value;
|
||||
const name = getRegionName(curRegion.value);
|
||||
await TGLogger.Info(`[Announcements][watch][curRegionName] 切换服务器:${name}`);
|
||||
await loadData();
|
||||
showSnackbar.success(`服务器切换为:${name}`);
|
||||
},
|
||||
);
|
||||
|
||||
watch(curLang, async (value) => {
|
||||
appStore.lang = value;
|
||||
const name = getLangName(value);
|
||||
await TGLogger.Info(`[Announcements][watch][curLangName] 切换语言:${name}`);
|
||||
await loadData();
|
||||
showSnackbar({ text: `语言切换为:${name}`, color: "success" });
|
||||
});
|
||||
watch(
|
||||
() => curLang.value,
|
||||
async () => {
|
||||
appStore.lang = curLang.value;
|
||||
const name = getLangName(curLang.value);
|
||||
await TGLogger.Info(`[Announcements][watch][curLangName] 切换语言:${name}`);
|
||||
await loadData();
|
||||
showSnackbar.success(`语言切换为:${name}`);
|
||||
},
|
||||
);
|
||||
|
||||
onMounted(async () => {
|
||||
await TGLogger.Info("[Announcements][onMounted] 打开公告页面");
|
||||
@@ -158,9 +164,7 @@ async function loadData(): Promise<void> {
|
||||
game: listCards.filter((item) => item.typeLabel === AnnoType.game),
|
||||
};
|
||||
loadingTitle.value = "正在渲染公告数据";
|
||||
await nextTick(async () => {
|
||||
loading.value = false;
|
||||
});
|
||||
await nextTick(() => (loading.value = false));
|
||||
}
|
||||
|
||||
function getRegionName(value: AnnoServer): string {
|
||||
|
||||
@@ -135,7 +135,7 @@ import TGRequest from "../../web/request/TGRequest.js";
|
||||
// Store
|
||||
const appStore = useAppStore();
|
||||
const homeStore = useHomeStore();
|
||||
|
||||
// @ts-expect-error-next-line
|
||||
const isDevEnv = ref<boolean>(import.meta.env.MODE === "development");
|
||||
|
||||
// loading
|
||||
@@ -167,10 +167,7 @@ async function confirmBackup(): Promise<void> {
|
||||
text: "取消则自选路径,点击外部不做处理",
|
||||
});
|
||||
if (res === undefined) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消备份",
|
||||
});
|
||||
showSnackbar.cancel("已取消备份");
|
||||
return;
|
||||
}
|
||||
let saveDir = appStore.userDir;
|
||||
@@ -181,10 +178,7 @@ async function confirmBackup(): Promise<void> {
|
||||
multiple: false,
|
||||
});
|
||||
if (dir === null) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "路径不能为空!",
|
||||
});
|
||||
showSnackbar.error("路径不能为空!");
|
||||
return;
|
||||
}
|
||||
await TGLogger.Info(`[Config][confirmBackup] 选择备份路径 ${dir.toString()}`);
|
||||
@@ -196,7 +190,7 @@ async function confirmBackup(): Promise<void> {
|
||||
loading.value = true;
|
||||
await backUpUserData(saveDir);
|
||||
loading.value = false;
|
||||
showSnackbar({ text: "数据已备份!" });
|
||||
showSnackbar.success("数据已备份!");
|
||||
await TGLogger.Info("[Config][confirmBackup] 备份完成");
|
||||
}
|
||||
|
||||
@@ -207,10 +201,7 @@ async function confirmRestore(): Promise<void> {
|
||||
text: "取消则自选路径,点击外部不做处理",
|
||||
});
|
||||
if (resConfirm === undefined) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消恢复",
|
||||
});
|
||||
showSnackbar.cancel("已取消恢复");
|
||||
return;
|
||||
}
|
||||
let saveDir = appStore.userDir;
|
||||
@@ -221,10 +212,7 @@ async function confirmRestore(): Promise<void> {
|
||||
multiple: false,
|
||||
});
|
||||
if (dir === null) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "路径不能为空!",
|
||||
});
|
||||
showSnackbar.error("路径不能为空!");
|
||||
return;
|
||||
}
|
||||
await TGLogger.Info(`[Config][confirmRestore] 选择恢复路径 ${dir.toString()}`);
|
||||
@@ -233,25 +221,19 @@ async function confirmRestore(): Promise<void> {
|
||||
await TGLogger.Info(`[Config][confirmRestore] 恢复到默认路径 ${saveDir}`);
|
||||
}
|
||||
loadingTitle.value = "正在恢复数据...";
|
||||
loadingSub.value = "请稍后...";
|
||||
loading.value = true;
|
||||
loadingSub.value = "祈愿数据需单独恢复";
|
||||
await restoreUserData(saveDir);
|
||||
loading.value = false;
|
||||
showSnackbar({ text: "数据已恢复!" });
|
||||
showSnackbar.success("数据已恢复!");
|
||||
await TGLogger.Info("[Config][confirmRestore] 恢复完成");
|
||||
}
|
||||
|
||||
// 更新数据
|
||||
async function confirmUpdate(title?: string): Promise<void> {
|
||||
const res = await showConfirm({
|
||||
title: title ?? "确认更新数据吗?",
|
||||
text: "请确保存在备份数据",
|
||||
});
|
||||
const res = await showConfirm({ title: title ?? "确认更新数据吗?", text: "请确保存在备份数据" });
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消更新数据库",
|
||||
});
|
||||
showSnackbar.cancel("已取消更新数据库");
|
||||
return;
|
||||
}
|
||||
loadingTitle.value = "正在更新数据库...";
|
||||
@@ -259,11 +241,8 @@ async function confirmUpdate(title?: string): Promise<void> {
|
||||
await TGSqlite.update();
|
||||
appStore.buildTime = getBuildTime();
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: "数据库已更新!",
|
||||
});
|
||||
showSnackbar.success("数据库已更新!");
|
||||
await TGLogger.Info("[Config][confirmUpdate] 数据库更新完成");
|
||||
// 刷新
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
@@ -276,25 +255,17 @@ async function confirmUpdateDevice(force?: boolean): Promise<void> {
|
||||
text: `DeviceFp:${appStore.deviceInfo.device_fp}`,
|
||||
});
|
||||
if (!resF) {
|
||||
showSnackbar({
|
||||
text: "已取消强制更新设备信息",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("已取消强制更新设备信息");
|
||||
await TGLogger.Info("[Config][confirmUpdateDevice][force] 取消强制更新设备信息");
|
||||
return;
|
||||
}
|
||||
appStore.deviceInfo = await TGRequest.Device.getFp();
|
||||
if (appStore.deviceInfo.device_fp === "0000000000000") {
|
||||
appStore.deviceInfo.device_fp = getRandomString(13, "hex");
|
||||
showSnackbar({
|
||||
text: `设备信息获取失败!已使用随机值 ${appStore.deviceInfo.device_fp} 代替`,
|
||||
color: "warn",
|
||||
});
|
||||
showSnackbar.warn(`设备信息获取失败!已使用随机值${appStore.deviceInfo.device_fp}代替`);
|
||||
await TGLogger.Warn("[Config][confirmUpdateDevice][force] 设备信息获取失败!已使用随机值代替");
|
||||
} else {
|
||||
showSnackbar({
|
||||
text: "设备信息已更新! DeviceFp: " + appStore.deviceInfo.device_fp,
|
||||
});
|
||||
showSnackbar.success(`设备信息已更新! DeviceFp: ${appStore.deviceInfo.device_fp}`);
|
||||
}
|
||||
await TGSqlite.saveAppData("deviceInfo", JSON.stringify(appStore.deviceInfo));
|
||||
await TGLogger.Info("[Config][confirmUpdateDevice][force] 设备信息更新完成");
|
||||
@@ -303,15 +274,9 @@ async function confirmUpdateDevice(force?: boolean): Promise<void> {
|
||||
await TGLogger.Info("[Config][confirmUpdateDevice] 开始更新设备信息");
|
||||
const localFp = getDeviceInfo("device_fp");
|
||||
if (localFp !== "0000000000000") {
|
||||
const res = await showConfirm({
|
||||
title: "确认更新设备信息吗?",
|
||||
text: `DeviceFp:${localFp}`,
|
||||
});
|
||||
const res = await showConfirm({ title: "确认更新设备信息吗?", text: `DeviceFp:${localFp}` });
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
text: "已取消更新设备信息",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("已取消更新设备信息");
|
||||
await TGLogger.Info("[Config][confirmUpdateDevice] 取消更新设备信息");
|
||||
return;
|
||||
}
|
||||
@@ -321,15 +286,11 @@ async function confirmUpdateDevice(force?: boolean): Promise<void> {
|
||||
console.log(appStore.deviceInfo);
|
||||
if (appStore.deviceInfo.device_fp === "0000000000000") {
|
||||
appStore.deviceInfo.device_fp = getRandomString(13, "hex");
|
||||
showSnackbar({
|
||||
text: "设备信息获取失败!已使用随机值代替",
|
||||
});
|
||||
showSnackbar.warn(`设备信息获取失败!已使用随机值${appStore.deviceInfo.device_fp}代替`);
|
||||
await TGLogger.Warn("[Config][confirmUpdateDevice] 设备信息获取失败!已使用随机值代替");
|
||||
return;
|
||||
}
|
||||
showSnackbar({
|
||||
text: "设备信息已更新! DeviceFp: " + appStore.deviceInfo.device_fp,
|
||||
});
|
||||
showSnackbar.success(`设备信息已更新! DeviceFp: ${appStore.deviceInfo.device_fp}`);
|
||||
await TGSqlite.saveAppData("deviceInfo", JSON.stringify(appStore.deviceInfo));
|
||||
await TGLogger.Info("[Config][confirmUpdateDevice] 设备信息更新完成");
|
||||
}
|
||||
@@ -339,10 +300,7 @@ async function confirmDelCache(): Promise<void> {
|
||||
await TGLogger.Info("[Config][confirmDelCache] 开始清除缓存");
|
||||
const CacheDir = await getCacheDir();
|
||||
if (CacheDir === false) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "不支持的平台!",
|
||||
});
|
||||
showSnackbar.error("不支持的平台!");
|
||||
return;
|
||||
}
|
||||
let cacheBSize: number = 0;
|
||||
@@ -359,10 +317,7 @@ async function confirmDelCache(): Promise<void> {
|
||||
text: `当前缓存大小为 ${bytesToSize(cacheBSize)}`,
|
||||
});
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消清除缓存",
|
||||
});
|
||||
showSnackbar.cancel("已取消清除缓存");
|
||||
await TGLogger.Info("[Config][confirmDelCache] 取消清除缓存");
|
||||
return;
|
||||
}
|
||||
@@ -373,35 +328,24 @@ async function confirmDelCache(): Promise<void> {
|
||||
}
|
||||
await TGLogger.Info("[Config][confirmDelCache] 缓存清除完成");
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: "缓存已清除!即将退出应用!",
|
||||
});
|
||||
setTimeout(async () => {
|
||||
await exit();
|
||||
}, 1000);
|
||||
showSnackbar.success("缓存已清除!即将退出应用!");
|
||||
setTimeout(async () => await exit(), 1000);
|
||||
}
|
||||
|
||||
// 恢复默认设置
|
||||
async function confirmResetApp(): Promise<void> {
|
||||
await TGLogger.Info("[Config][confirmResetApp] 开始恢复默认设置");
|
||||
const res = await showConfirm({
|
||||
title: "确认恢复默认设置吗?",
|
||||
});
|
||||
const res = await showConfirm({ title: "确认恢复默认设置吗?" });
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消恢复默认设置",
|
||||
});
|
||||
showSnackbar.cancel("已取消恢复默认设置");
|
||||
await TGLogger.Info("[Config][confirmResetApp] 取消恢复默认设置");
|
||||
return;
|
||||
}
|
||||
appStore.init();
|
||||
homeStore.init();
|
||||
await TGLogger.Info("[Config][confirmResetApp] 恢复默认设置完成");
|
||||
showSnackbar({ text: "已恢复默认配置!即将刷新页面..." });
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1500);
|
||||
showSnackbar.success("已恢复默认配置!即将刷新页面...");
|
||||
setTimeout(() => window.location.reload(), 1500);
|
||||
}
|
||||
|
||||
// 前置
|
||||
@@ -412,25 +356,17 @@ async function tryShowReset(): Promise<void> {
|
||||
mode: "input",
|
||||
});
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消",
|
||||
});
|
||||
showSnackbar.cancel("已取消");
|
||||
return;
|
||||
}
|
||||
const time = getBuildTime();
|
||||
const code = time.startsWith("dev.") ? "dev" : time;
|
||||
if (res === code || res === "reset1128") {
|
||||
showReset.value = true;
|
||||
showSnackbar({
|
||||
text: "已开启重置数据库选项",
|
||||
});
|
||||
} else {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "验证失败",
|
||||
});
|
||||
showSnackbar.success("已开启重置数据库选项");
|
||||
return;
|
||||
}
|
||||
showSnackbar.error("验证失败");
|
||||
}
|
||||
|
||||
// 重置数据库
|
||||
@@ -441,10 +377,7 @@ async function confirmResetDB(title?: string): Promise<void> {
|
||||
text: "请确认已经备份关键数据",
|
||||
});
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消重置数据库",
|
||||
});
|
||||
showSnackbar.cancel("已取消重置数据库");
|
||||
await TGLogger.Info("[Config][confirmResetDB] 取消重置数据库");
|
||||
return;
|
||||
}
|
||||
@@ -453,42 +386,34 @@ async function confirmResetDB(title?: string): Promise<void> {
|
||||
await TGSqlite.reset();
|
||||
await TGLogger.Info("[Config][confirmResetDB] 数据库重置完成");
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: "数据库已重置!请进行再次检查。",
|
||||
});
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1500);
|
||||
showSnackbar.success("数据库已重置!请进行再次检查。");
|
||||
setTimeout(() => window.location.reload(), 1500);
|
||||
}
|
||||
|
||||
// 开启 dev 模式
|
||||
function submitDevMode(): void {
|
||||
if (appStore.devMode) {
|
||||
showSnackbar({ text: "已关闭 dev 模式!" });
|
||||
showSnackbar.success("已关闭 dev 模式!");
|
||||
return;
|
||||
}
|
||||
showSnackbar({ text: "已开启 dev 模式!" });
|
||||
showSnackbar.success("已开启 dev 模式!");
|
||||
}
|
||||
|
||||
// 开启窗口回正
|
||||
function submitResize(): void {
|
||||
appStore.needResize = (!needResize.value).toString();
|
||||
if (needResize.value) {
|
||||
showSnackbar({ text: "已关闭窗口回正!" });
|
||||
showSnackbar.success("已关闭窗口回正!");
|
||||
return;
|
||||
}
|
||||
showSnackbar({ text: "已开启窗口回正!" });
|
||||
showSnackbar.success("已开启窗口回正!");
|
||||
}
|
||||
|
||||
// 通过子组件的事件来控制 loading
|
||||
function loadHandle(params: TGApp.Component.Loading.EmitParams): void {
|
||||
loading.value = params.show;
|
||||
if (params.title) {
|
||||
loadingTitle.value = params.title;
|
||||
}
|
||||
if (params.text) {
|
||||
loadingSub.value = params.text;
|
||||
}
|
||||
if (params.title) loadingTitle.value = params.title;
|
||||
if (params.text) loadingSub.value = params.text;
|
||||
}
|
||||
</script>
|
||||
<style lang="css" scoped>
|
||||
|
||||
@@ -71,6 +71,7 @@ const curGid = ref<string>(gameSelectList[0].gid);
|
||||
|
||||
onMounted(async () => {
|
||||
loadingTitle.value = "正在加载首页";
|
||||
// @ts-expect-error-next-line
|
||||
const isProdEnv = import.meta.env.MODE === "production";
|
||||
// 获取当前环境
|
||||
if (isProdEnv && appStore.devMode) {
|
||||
@@ -101,21 +102,13 @@ onMounted(async () => {
|
||||
async function submitHome(): Promise<void> {
|
||||
const show = showHome.value;
|
||||
if (show.length < 1) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "请至少选择一个!",
|
||||
});
|
||||
showSnackbar.warn("请至少选择一个!");
|
||||
return;
|
||||
}
|
||||
homeStore.setShowValue(show);
|
||||
showSnackbar({
|
||||
color: "success",
|
||||
text: "设置成功!",
|
||||
});
|
||||
showSnackbar.success("设置成功!");
|
||||
await TGLogger.Info("[Home][submitHome] 首页设置成功,当前显示:" + show.join("、"));
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 1000);
|
||||
setTimeout(() => window.location.reload(), 1000);
|
||||
}
|
||||
|
||||
// 组件加载完成
|
||||
|
||||
@@ -171,10 +171,7 @@ async function switchAnno(): Promise<void> {
|
||||
async function loadMore(key: NewsKey): Promise<void> {
|
||||
loadingSub.value = true;
|
||||
if (rawData.value[key].isLast) {
|
||||
showSnackbar({
|
||||
text: "已经是最后一页了",
|
||||
color: "warn",
|
||||
});
|
||||
showSnackbar.warn("已经是最后一页了");
|
||||
loadingSub.value = false;
|
||||
return;
|
||||
}
|
||||
@@ -185,10 +182,7 @@ async function loadMore(key: NewsKey): Promise<void> {
|
||||
rawData.value[key].isLast = getData.is_last;
|
||||
postData.value[key] = postData.value[key].concat(getData.list);
|
||||
if (rawData.value[key].isLast) {
|
||||
showSnackbar({
|
||||
text: "已经是最后一页了",
|
||||
color: "warn",
|
||||
});
|
||||
showSnackbar.warn("已经是最后一页了");
|
||||
loadingSub.value = false;
|
||||
loading.value = false;
|
||||
return;
|
||||
@@ -201,10 +195,7 @@ async function loadMore(key: NewsKey): Promise<void> {
|
||||
|
||||
async function searchPost(): Promise<void> {
|
||||
if (search.value === "") {
|
||||
showSnackbar({
|
||||
text: "请输入搜索内容",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("请输入搜索内容");
|
||||
return;
|
||||
}
|
||||
const numCheck = Number(search.value);
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<div class="pc-posts">
|
||||
<div v-for="item in getPageItems()" :key="item.post.post_id">
|
||||
<TPostCard
|
||||
@update:selected="updateSelected"
|
||||
@update:selected="selectedPost = $event"
|
||||
:model-value="item"
|
||||
:selected="selectedPost"
|
||||
:select-mode="selectedMode"
|
||||
@@ -93,14 +93,13 @@
|
||||
import { event } from "@tauri-apps/api";
|
||||
import { UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { computed, onBeforeMount, onMounted, onUnmounted, ref, watch } from "vue";
|
||||
import { computed, onMounted, onUnmounted, ref, watch } from "vue";
|
||||
|
||||
import showConfirm from "../../components/func/confirm.js";
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
import TPostCard from "../../components/main/t-postcard.vue";
|
||||
import ToCollectPost from "../../components/overlay/to-collectPost.vue";
|
||||
import ToLoading from "../../components/overlay/to-loading.vue";
|
||||
import TGSqlite from "../../plugins/Sqlite/index.js";
|
||||
import TSUserCollection from "../../plugins/Sqlite/modules/userCollect.js";
|
||||
import { useUserStore } from "../../store/modules/user.js";
|
||||
import TGLogger from "../../utils/TGLogger.js";
|
||||
@@ -128,18 +127,10 @@ const sortId = ref<boolean>(false);
|
||||
|
||||
let collectListener: UnlistenFn | null = null;
|
||||
|
||||
onBeforeMount(async () => {
|
||||
if (!(await TGSqlite.checkTableExist("UFPost"))) {
|
||||
await TGSqlite.update();
|
||||
showSnackbar({
|
||||
text: "数据库已更新",
|
||||
color: "success",
|
||||
});
|
||||
}
|
||||
onMounted(async () => {
|
||||
collectListener = await event.listen("refreshCollect", async () => await load());
|
||||
await load();
|
||||
});
|
||||
|
||||
onMounted(async () => await load());
|
||||
onUnmounted(() => {
|
||||
if (collectListener !== null) {
|
||||
collectListener();
|
||||
@@ -147,10 +138,6 @@ onUnmounted(() => {
|
||||
}
|
||||
});
|
||||
|
||||
function updateSelected(v: string[]) {
|
||||
selectedPost.value = v;
|
||||
}
|
||||
|
||||
function sortPost(value: boolean) {
|
||||
let ori = sortId.value;
|
||||
sortId.value = value;
|
||||
@@ -162,10 +149,7 @@ function sortPost(value: boolean) {
|
||||
}
|
||||
});
|
||||
if (ori !== sortId.value) {
|
||||
showSnackbar({
|
||||
text: `已${sortId.value ? "按帖子ID排序" : "按更新时间排序"}`,
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success(`已${sortId.value ? "按帖子ID排序" : "按更新时间排序"}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,14 +176,14 @@ async function load(): Promise<void> {
|
||||
}
|
||||
|
||||
function toSelect() {
|
||||
if (!selectedMode.value) {
|
||||
selectedPost.value = [];
|
||||
selectedMode.value = true;
|
||||
} else {
|
||||
if (selectedMode.value) {
|
||||
selectedMode.value = false;
|
||||
if (selectedPost.value.length === 0) return;
|
||||
showOverlay.value = true;
|
||||
return;
|
||||
}
|
||||
selectedPost.value = [];
|
||||
selectedMode.value = true;
|
||||
}
|
||||
|
||||
async function addCollect(): Promise<void> {
|
||||
@@ -211,17 +195,11 @@ async function addCollect(): Promise<void> {
|
||||
});
|
||||
if (titleC === undefined || titleC === false) return;
|
||||
if (titleC === "未分类") {
|
||||
showSnackbar({
|
||||
text: "分类名不可为未分类",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("分类名不可为未分类");
|
||||
return;
|
||||
}
|
||||
if (collections.value.find((i) => i.title === titleC)) {
|
||||
showSnackbar({
|
||||
text: "分类已存在",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("分类已存在");
|
||||
return;
|
||||
}
|
||||
title = titleC;
|
||||
@@ -235,26 +213,17 @@ async function addCollect(): Promise<void> {
|
||||
else desc = descC;
|
||||
const res = await TSUserCollection.createCollect(title, desc);
|
||||
if (res) {
|
||||
showSnackbar({
|
||||
text: "新建成功",
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success("成功新建分类");
|
||||
await load();
|
||||
} else {
|
||||
showSnackbar({
|
||||
text: "新建失败",
|
||||
color: "error",
|
||||
});
|
||||
return;
|
||||
}
|
||||
showSnackbar.error("新建失败");
|
||||
}
|
||||
|
||||
async function toEdit(): Promise<void> {
|
||||
const collect = collections.value.find((c) => c.title === curSelect.value);
|
||||
if (collect === undefined) {
|
||||
showSnackbar({
|
||||
text: "未找到合集信息!",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("未找到合集信息");
|
||||
return;
|
||||
}
|
||||
let cTc = await showConfirm({
|
||||
@@ -264,25 +233,16 @@ async function toEdit(): Promise<void> {
|
||||
input: collect.title,
|
||||
});
|
||||
if (cTc === false) {
|
||||
showSnackbar({
|
||||
text: "取消修改分类信息",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("取消修改分类信息");
|
||||
return;
|
||||
}
|
||||
if (typeof cTc !== "string") cTc = collect.title;
|
||||
if (cTc === "未分类") {
|
||||
showSnackbar({
|
||||
text: "该名称为保留名称,不可用于作为分类名!",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("分类名不可为未分类");
|
||||
return;
|
||||
}
|
||||
if (cTc !== collect.title && collections.value.find((c) => c.title === cTc)) {
|
||||
showSnackbar({
|
||||
text: "分类名称重复!",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("分类名称重复");
|
||||
return;
|
||||
}
|
||||
let cTd = await showConfirm({
|
||||
@@ -292,15 +252,9 @@ async function toEdit(): Promise<void> {
|
||||
input: collect.desc,
|
||||
});
|
||||
if (typeof cTd !== "string") cTd = collect.desc;
|
||||
const cc = await showConfirm({
|
||||
title: "确定修改?",
|
||||
text: `[${cTc}] ${cTd}`,
|
||||
});
|
||||
const cc = await showConfirm({ title: "确定修改?", text: `[${cTc}] ${cTd}` });
|
||||
if (!cc) {
|
||||
showSnackbar({
|
||||
text: "取消修改分类信息",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("取消修改分类信息");
|
||||
return;
|
||||
}
|
||||
loadingTitle.value = "正在修改分类信息...";
|
||||
@@ -308,32 +262,21 @@ async function toEdit(): Promise<void> {
|
||||
const check = await TSUserCollection.updateCollect(collect.title, cTc, cTd);
|
||||
loading.value = false;
|
||||
if (!check) {
|
||||
showSnackbar({
|
||||
text: "修改分类信息失败!",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("修改分类信息失败");
|
||||
return;
|
||||
}
|
||||
showSnackbar({
|
||||
text: "成功修改分类信息!",
|
||||
});
|
||||
showSnackbar.success("成功修改分类信息!");
|
||||
await load();
|
||||
}
|
||||
|
||||
async function deleteOper(force: boolean): Promise<void> {
|
||||
if (selectedMode.value) {
|
||||
await deletePost(force);
|
||||
} else {
|
||||
await deleteCollect(force);
|
||||
}
|
||||
if (selectedMode.value) await deletePost(force);
|
||||
else await deleteCollect(force);
|
||||
}
|
||||
|
||||
async function deletePost(force: boolean = false): Promise<void> {
|
||||
if (selectedPost.value.length === 0) {
|
||||
showSnackbar({
|
||||
text: "未选择帖子",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("未选择帖子");
|
||||
return;
|
||||
}
|
||||
const title = force ? "删除帖子" : "移除帖子分类";
|
||||
@@ -342,10 +285,7 @@ async function deletePost(force: boolean = false): Promise<void> {
|
||||
text: `共 ${selectedPost.value.length} 条帖子`,
|
||||
});
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
text: "取消操作",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("取消操作");
|
||||
return;
|
||||
}
|
||||
loadingTitle.value = `正在${title}...`;
|
||||
@@ -353,30 +293,21 @@ async function deletePost(force: boolean = false): Promise<void> {
|
||||
let success = 0;
|
||||
for (const post of selectedPost.value) {
|
||||
const check = await TSUserCollection.deletePostCollect(post, force);
|
||||
if (!check) {
|
||||
showSnackbar({
|
||||
text: `帖子 ${post} 操作失败`,
|
||||
color: "error",
|
||||
});
|
||||
await new Promise((resolve) => setTimeout(resolve, 1500));
|
||||
} else {
|
||||
if (check) {
|
||||
success++;
|
||||
continue;
|
||||
}
|
||||
showSnackbar.warn(`帖子 ${post} 操作失败`);
|
||||
await new Promise((resolve) => setTimeout(resolve, 1500));
|
||||
}
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: `成功${title} ${success} 条`,
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success(`成功${title} ${success} 条`);
|
||||
await load();
|
||||
}
|
||||
|
||||
async function deleteCollect(force: boolean): Promise<void> {
|
||||
if (curSelect.value === "未分类" && force) {
|
||||
showSnackbar({
|
||||
text: "未分类不可删除",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("未分类不可删除");
|
||||
return;
|
||||
}
|
||||
const title = force ? "删除分类" : "清空分类";
|
||||
@@ -385,10 +316,7 @@ async function deleteCollect(force: boolean): Promise<void> {
|
||||
text: `该分类下${selected.value.length}条帖子将被${force ? "删除" : "移除分类(未分类将被删除)"}`,
|
||||
});
|
||||
if (!res) {
|
||||
showSnackbar({
|
||||
text: "取消删除",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("取消操作");
|
||||
return;
|
||||
}
|
||||
let resD;
|
||||
@@ -398,17 +326,11 @@ async function deleteCollect(force: boolean): Promise<void> {
|
||||
resD = await TSUserCollection.deleteUnCollectPost();
|
||||
}
|
||||
if (resD) {
|
||||
showSnackbar({
|
||||
text: `成功 ${title}`,
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success(`成功${title}`);
|
||||
await load();
|
||||
} else {
|
||||
showSnackbar({
|
||||
text: `${title} 失败`,
|
||||
color: "error",
|
||||
});
|
||||
return;
|
||||
}
|
||||
showSnackbar.warn(`${title} 失败`);
|
||||
}
|
||||
|
||||
// 根据合集筛选
|
||||
@@ -427,10 +349,7 @@ async function freshPost(select: string | null): Promise<void> {
|
||||
}
|
||||
page.value = 1;
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: `切换合集 ${select},共 ${selected.value.length} 条帖子`,
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success(`切换合集 ${select},共 ${selected.value.length} 条帖子`);
|
||||
}
|
||||
|
||||
// 获取当前页的帖子
|
||||
@@ -452,9 +371,10 @@ function getPageItems(): TGApp.Plugins.Mys.Post.FullData[] {
|
||||
return card;
|
||||
}
|
||||
|
||||
watch(curSelect, async () => {
|
||||
await freshPost(curSelect.value);
|
||||
});
|
||||
watch(
|
||||
() => curSelect.value,
|
||||
async () => await freshPost(curSelect.value),
|
||||
);
|
||||
|
||||
async function freshOther(): Promise<void> {
|
||||
const input = await showConfirm({
|
||||
@@ -464,27 +384,18 @@ async function freshOther(): Promise<void> {
|
||||
});
|
||||
if (typeof input === "string") {
|
||||
if (isNaN(Number(input))) {
|
||||
showSnackbar({
|
||||
text: "UID 格式错误,请输入数字",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("UID 格式错误,请输入数字");
|
||||
return;
|
||||
}
|
||||
await freshUser(input);
|
||||
return;
|
||||
}
|
||||
showSnackbar({
|
||||
text: "取消导入",
|
||||
color: "cancel",
|
||||
});
|
||||
showSnackbar.cancel("取消导入");
|
||||
}
|
||||
|
||||
async function freshUser(uid?: string): Promise<void> {
|
||||
if (!userStore.cookie.value) {
|
||||
showSnackbar({
|
||||
text: "请先登录",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("请先登录");
|
||||
return;
|
||||
}
|
||||
const cookie = {
|
||||
@@ -494,43 +405,30 @@ async function freshUser(uid?: string): Promise<void> {
|
||||
loadingTitle.value = "获取用户收藏...";
|
||||
loading.value = true;
|
||||
let res = await TGRequest.User.getCollect(cookie, uid || userStore.briefInfo.value.uid);
|
||||
let is_last = false;
|
||||
while (!is_last) {
|
||||
while (true) {
|
||||
if ("retcode" in res) {
|
||||
if (res.retcode === 1001) {
|
||||
showSnackbar({
|
||||
text: "用户收藏已设为私密,无法获取",
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.warn("用户收藏已设为私密,无法获取");
|
||||
} else {
|
||||
showSnackbar({
|
||||
text: `[${res.retcode}] ${res.message}`,
|
||||
color: "error",
|
||||
});
|
||||
showSnackbar.error(`[${res.retcode}] ${res.message}`);
|
||||
}
|
||||
loading.value = false;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
let posts = res.list;
|
||||
loadingTitle.value = `合并收藏帖子 [offset]${res.next_offset}...`;
|
||||
await mergePosts(posts, uid || userStore.briefInfo.value.uid);
|
||||
if (res.is_last) {
|
||||
is_last = true;
|
||||
} else {
|
||||
loadingTitle.value = "获取用户收藏...";
|
||||
loadingSub.value = `[offset]${res.next_offset} [is_last]${res.is_last}`;
|
||||
res = await TGRequest.User.getCollect(
|
||||
cookie,
|
||||
uid || userStore.briefInfo.value.uid,
|
||||
res.next_offset,
|
||||
);
|
||||
}
|
||||
if (res.is_last) break;
|
||||
loadingTitle.value = "获取用户收藏...";
|
||||
loadingSub.value = `[offset]${res.next_offset} [is_last]${res.is_last}`;
|
||||
res = await TGRequest.User.getCollect(
|
||||
cookie,
|
||||
uid || userStore.briefInfo.value.uid,
|
||||
res.next_offset,
|
||||
);
|
||||
}
|
||||
loading.value = false;
|
||||
showSnackbar({
|
||||
text: "获取用户收藏成功",
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success("获取用户收藏成功");
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
<ToPostSearch :gid="curGid.toString()" v-model="showSearch" :keyword="search" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { nextTick, onBeforeMount, onMounted, ref, watch } from "vue";
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
import showSnackbar from "../../components/func/snackbar.js";
|
||||
@@ -188,12 +188,9 @@ const posts = ref<TGApp.Plugins.Mys.Post.FullData[]>([]);
|
||||
const search = ref<string>("");
|
||||
const showSearch = ref<boolean>(false);
|
||||
|
||||
onBeforeMount(async () => {
|
||||
onMounted(async () => {
|
||||
if (gid && typeof gid === "string") curGid.value = Number(gid);
|
||||
if (forum && typeof forum === "string") curForum.value = Number(forum);
|
||||
});
|
||||
|
||||
onMounted(async () => {
|
||||
const gameLabel = getGameLabel(curGid.value);
|
||||
const forumLabel = getForumLabel(curGid.value, curForum.value);
|
||||
await TGLogger.Info(`[Posts][${gameLabel}][onMounted][${forumLabel}] 打开帖子列表`);
|
||||
@@ -210,8 +207,7 @@ watch(
|
||||
const forumFind = forums.find((item) => item.text === curForumLabel.value);
|
||||
if (forumFind) curForum.value = forumFind.value;
|
||||
else curForum.value = forums[0].value;
|
||||
await nextTick();
|
||||
showSnackbar({ text: `已将分区切换到 ${getGameLabel(newVal)}`, color: "success" });
|
||||
showSnackbar.success(`已将分区切换到 ${getGameLabel(newVal)}`);
|
||||
},
|
||||
);
|
||||
watch(
|
||||
@@ -221,10 +217,7 @@ watch(
|
||||
const oldForumLabel = JSON.parse(JSON.stringify(curForumLabel.value));
|
||||
curForumLabel.value = getForumLabel(curGid.value, curForum.value);
|
||||
if (oldForumLabel !== curForumLabel.value) {
|
||||
showSnackbar({
|
||||
text: `已将版块切换到 ${curForumLabel.value}`,
|
||||
color: "success",
|
||||
});
|
||||
showSnackbar.success(`已将版块切换到 ${curForumLabel.value}`);
|
||||
}
|
||||
},
|
||||
);
|
||||
@@ -233,7 +226,7 @@ watch(
|
||||
async () => {
|
||||
await freshPostData();
|
||||
const sortLabel = getSortLabel(curSortType.value);
|
||||
showSnackbar({ text: `已将排序切换到 ${sortLabel}`, color: "success" });
|
||||
showSnackbar.success(`已将排序切换到 ${sortLabel}`);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -248,14 +241,13 @@ async function freshPostData(): Promise<void> {
|
||||
loadingTitle.value = `正在加载 ${gameLabel}-${forumLabel}-${sortLabel} 数据`;
|
||||
const postsGet = await Mys.Post.getForumPostList(curForum.value, curSortType.value);
|
||||
posts.value = postsGet.list;
|
||||
await nextTick();
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
// 查询帖子
|
||||
function searchPost(): void {
|
||||
if (search.value === "") {
|
||||
showSnackbar({ text: "请输入搜索内容", color: "error" });
|
||||
showSnackbar.warn("请输入搜索内容");
|
||||
return;
|
||||
}
|
||||
const numCheck = Number(search.value);
|
||||
|
||||
Reference in New Issue
Block a user