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

This commit is contained in:
Xwite 2023-05-07 11:40:33 +08:00
parent d65d9429d7
commit ee70523026
3 changed files with 27 additions and 26 deletions

View File

@ -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) {

View File

@ -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 }) => {

View File

@ -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 = [];
},
},
});