Просмотр исходного кода

perf(web): 使用map查找推送失败的源

Xwite 3 лет назад
Родитель
Сommit
4874558fe8

+ 7 - 3
modules/web/src/components/SourceItem.vue

@@ -4,7 +4,7 @@
     border
     :label="sourceUrl"
     :class="{
-      error: errorPushSources.includes(source),
+      error: isSaveError,
       edit: sourceUrl == currentSourceUrl,
     }"
   >
@@ -17,12 +17,16 @@
 import { Edit } from "@element-plus/icons-vue";
 
 const props = defineProps(["source"]);
-const sourceUrl = props.source.bookSourceUrl || props.source.sourceUrl;
 const store = useSourceStore();
-const { errorPushSources, currentSourceUrl } = storeToRefs(store);
+const { savedSourcesMap, currentSourceUrl, sourceUrlKey } = storeToRefs(store);
+const sourceUrl = computed(() => props.source[sourceUrlKey.value]);
 const handleSourceClick = (source) => {
   store.changeCurrentSource(source);
 };
+const isSaveError = computed(() => {
+  if (savedSourcesMap.value.size == 0) return false;
+  return !savedSourcesMap.value.has(sourceUrl.value);
+});
 </script>
 <style lang="scss" scoped>
 :deep(.el-checkbox__label) {

+ 4 - 3
modules/web/src/components/SourceList.vue

@@ -50,14 +50,15 @@ import SourceItem from "./SourceItem.vue";
 const store = useSourceStore();
 const sourceUrlSelect = ref([]);
 const searchKey = ref("");
-const { sources, sourcesMap, sourceUrlKey } = storeToRefs(store);
+const { sources, sourcesMap } = storeToRefs(store);
 const isBookSource = computed(() => {
   return /bookSource/.test(window.location.href);
 });
 const sourceSelect = computed(() => {
   if (sourceUrlSelect.value.length == 0) return [];
-  let searchKey = sourceUrlKey.value;
-  return sourceUrlSelect.value.map(sourceUrl => sourcesMap.value.get(sourceUrl));
+  return sourceUrlSelect.value.map(
+    (sourceUrl) => sourcesMap.value.get(sourceUrl) ?? {}
+  );
 });
 const deleteSelectSources = () => {
   API.deleteSource(sourceSelect.value).then(({ data }) => {

+ 16 - 20
modules/web/src/store/sourceStore.js

@@ -11,7 +11,8 @@ export const useSourceStore = defineStore("source", {
       bookSources: [], // 临时存放所有书源,
       /** @type {import("@/source").RssSource[]} */
       rssSources: [], // 临时存放所有订阅源
-      errorPushSources: [], // 保存到阅读app出错的源
+      /** @type {import("@/source").Source[]} */
+      savedSources: [], // 批量保存到阅读app成功的源
       /** @type {import("@/source").Source} */
       currentSource: emptySource, // 当前编辑的源
       currentTab: localStorage.getItem("tabName") || "editTab",
@@ -21,11 +22,16 @@ export const useSourceStore = defineStore("source", {
   },
   getters: {
     sources: (state) => (isBookSource ? state.bookSources : state.rssSources),
-    sourceUrlKey: (state) => isBookSource ? "bookSourceUrl" : "sourceUrl",
+    sourceUrlKey: () => isBookSource ? "bookSourceUrl" : "sourceUrl",
     sourcesMap: (state) => {
-        let map = new Map();
-        state.sources.forEach(source => map.set(source[state.sourceUrlKey], source));
-        return map;
+      let map = new Map();
+      state.sources.forEach(source => map.set(source[state.sourceUrlKey], source));
+      return map;
+    },
+    savedSourcesMap: (state) => {
+      let map = new Map();
+      state.savedSources.forEach(source => map.set(source[state.sourceUrlKey], source));
+      return map;
     },
     currentSourceUrl: (state) =>
       isBookSource
@@ -53,6 +59,10 @@ export const useSourceStore = defineStore("source", {
         this.rssSources = data;
       }
     },
+    //批量推送
+    setPushReturnSources(returnSoures) {
+      this.savedSources = returnSoures;
+    },
     //删除源
     deleteSources(data) {
       let sources = isBookSource ? this.bookSources : this.rssSources;
@@ -71,21 +81,6 @@ export const useSourceStore = defineStore("source", {
     changeCurrentSource(source) {
       this.currentSource = JSON.parse(JSON.stringify((source)));
     },
-    async setPushReturnSources(returnSoures) {
-      if (isBookSource) {
-        // @ts-ignore
-        this.errorPushSources = this.sources.filter((source) =>
-          returnSoures.every(
-            (item) => item.bookSourceUrl !== source.bookSourceUrl
-          )
-        );
-      } else {
-        // @ts-ignore
-        this.errorPushSources = this.sources.filter((source) =>
-          returnSoures.every((item) => item.sourceUrl !== source.sourceUrl)
-        );
-      }
-    },
     // update editTab tabName and editTab info
     changeTabName(tabName) {
       this.currentTab = tabName;
@@ -133,6 +128,7 @@ export const useSourceStore = defineStore("source", {
     clearAllSource() {
       this.bookSources = [];
       this.rssSources = [];
+      this.savedSources = [];
     },
   },
 });