mirror of
https://gitlab.com/RemixDev/deemix-webui.git
synced 2024-12-29 10:56:05 +00:00
fix: prevented duplicate keys when searching by scroll
This commit is contained in:
parent
6789ea8be4
commit
d738494595
File diff suppressed because one or more lines are too long
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { computed, onMounted, reactive, ref, toRefs, watch, defineComponent } from '@vue/composition-api'
|
import { computed, onMounted, reactive, ref, toRefs, watch, defineComponent } from '@vue/composition-api'
|
||||||
|
import { uniqWith } from 'lodash-es'
|
||||||
|
|
||||||
import BaseLoadingPlaceholder from '@components/globals/BaseLoadingPlaceholder.vue'
|
import BaseLoadingPlaceholder from '@components/globals/BaseLoadingPlaceholder.vue'
|
||||||
import ResultsAll from '@components/search/ResultsAll.vue'
|
import ResultsAll from '@components/search/ResultsAll.vue'
|
||||||
|
@ -139,22 +140,19 @@ export default defineComponent({
|
||||||
})
|
})
|
||||||
const { searchResult, performMainSearch } = useMainSearch()
|
const { searchResult, performMainSearch } = useMainSearch()
|
||||||
const { result, performSearch } = useSearch()
|
const { result, performSearch } = useSearch()
|
||||||
const isQueryEmpty = computed(() => state.results.query === '')
|
|
||||||
const searchedTerm = computed(() => ctx.root.$route.query.term)
|
const searchedTerm = computed(() => ctx.root.$route.query.term)
|
||||||
|
const isQueryEmpty = computed(() => state.results.query === '')
|
||||||
const isSearching = ref(false)
|
const isSearching = ref(false)
|
||||||
const isMainSearchCached = computed(() => Object.keys(searchResult.value).length !== 0)
|
const isMainSearchCached = computed(() => Object.keys(searchResult.value).length !== 0)
|
||||||
const isNewQuery = computed(() => searchResult.value.QUERY !== searchedTerm.value)
|
const isNewSearch = computed(() => searchResult.value.QUERY !== searchedTerm.value)
|
||||||
console.log('onSetup', lastTab.value)
|
|
||||||
|
|
||||||
if (isMainSearchCached.value && !isNewQuery.value) {
|
if (isMainSearchCached.value && !isNewSearch.value) {
|
||||||
console.log('main search cached!')
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
handleMainSearch(searchResult.value)
|
handleMainSearch(searchResult.value)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (searchedTerm.value && (!isMainSearchCached.value || isNewQuery.value)) {
|
if (searchedTerm.value && (!isMainSearchCached.value || isNewSearch.value)) {
|
||||||
console.log('need to perform main search')
|
|
||||||
performMainSearch(searchedTerm.value)
|
performMainSearch(searchedTerm.value)
|
||||||
isSearching.value = true
|
isSearching.value = true
|
||||||
}
|
}
|
||||||
|
@ -171,13 +169,7 @@ export default defineComponent({
|
||||||
state.results.allTab.ARTIST.hasLoaded = true
|
state.results.allTab.ARTIST.hasLoaded = true
|
||||||
state.results.allTab.PLAYLIST.hasLoaded = true
|
state.results.allTab.PLAYLIST.hasLoaded = true
|
||||||
|
|
||||||
// state.results.trackTab = { ...resetObj }
|
|
||||||
// state.results.albumTab = { ...resetObj }
|
|
||||||
// state.results.artistTab = { ...resetObj }
|
|
||||||
// state.results.playlistTab = { ...resetObj }
|
|
||||||
|
|
||||||
if (lastTab.value && lastTab.value.searchType !== 'all') {
|
if (lastTab.value && lastTab.value.searchType !== 'all') {
|
||||||
console.log('in main search, set last tab')
|
|
||||||
state.currentTab = lastTab.value
|
state.currentTab = lastTab.value
|
||||||
|
|
||||||
performSearch({
|
performSearch({
|
||||||
|
@ -185,7 +177,6 @@ export default defineComponent({
|
||||||
type: state.currentTab.searchType
|
type: state.currentTab.searchType
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
console.log('in main search, all tab')
|
|
||||||
state.currentTab = state.tabs.find(tab => tab.searchType === 'all')
|
state.currentTab = state.tabs.find(tab => tab.searchType === 'all')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,14 +188,15 @@ export default defineComponent({
|
||||||
watch(result, newValue => {
|
watch(result, newValue => {
|
||||||
const { next: nextResult, total, type, data: newData } = newValue
|
const { next: nextResult, total, type, data: newData } = newValue
|
||||||
|
|
||||||
const currentTabKey = type + 'Tab'
|
const currentTabKey = `${type}Tab`
|
||||||
let next = total
|
let next = total
|
||||||
|
|
||||||
|
// console.log({ currentTabKey, test: state.currentTab.searchType })
|
||||||
|
|
||||||
if (nextResult) {
|
if (nextResult) {
|
||||||
next = parseInt(nextResult.match(/index=(\d*)/)[1])
|
next = parseInt(nextResult.match(/index=(\d*)/)[1])
|
||||||
} /* else {
|
}
|
||||||
next = total
|
// console.log({ next, total, type, newData })
|
||||||
} */
|
|
||||||
|
|
||||||
if (state.results[currentTabKey].total !== total) {
|
if (state.results[currentTabKey].total !== total) {
|
||||||
state.results[currentTabKey].total = total
|
state.results[currentTabKey].total = total
|
||||||
|
@ -212,7 +204,14 @@ export default defineComponent({
|
||||||
|
|
||||||
if (state.results[currentTabKey].next !== next) {
|
if (state.results[currentTabKey].next !== next) {
|
||||||
state.results[currentTabKey].next = next
|
state.results[currentTabKey].next = next
|
||||||
state.results[currentTabKey].data = state.results[currentTabKey].data.concat(newData)
|
|
||||||
|
// Preventing duplicate entries by filtering them by ID
|
||||||
|
const rawData = state.results[currentTabKey].data.concat(newData)
|
||||||
|
const filteredData = uniqWith(rawData, (obj1, obj2) => {
|
||||||
|
return obj1.id === obj2.id
|
||||||
|
})
|
||||||
|
|
||||||
|
state.results[currentTabKey].data = filteredData
|
||||||
}
|
}
|
||||||
|
|
||||||
state.results[currentTabKey].hasLoaded = true
|
state.results[currentTabKey].hasLoaded = true
|
||||||
|
@ -226,11 +225,7 @@ export default defineComponent({
|
||||||
isQueryEmpty,
|
isQueryEmpty,
|
||||||
searchResult,
|
searchResult,
|
||||||
performMainSearch,
|
performMainSearch,
|
||||||
performSearch,
|
performSearch
|
||||||
// Remove
|
|
||||||
isNewQuery,
|
|
||||||
searchedTerm,
|
|
||||||
isMainSearchCached
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -304,7 +299,6 @@ export default defineComponent({
|
||||||
this.scrolledSearch(needToSearch)
|
this.scrolledSearch(needToSearch)
|
||||||
},
|
},
|
||||||
currentTab(newTab, old) {
|
currentTab(newTab, old) {
|
||||||
console.log('watch current tab %s -> %s', old.searchType, newTab.searchType)
|
|
||||||
if (this.isTabLoaded(newTab)) return
|
if (this.isTabLoaded(newTab)) return
|
||||||
|
|
||||||
this.performSearch({
|
this.performSearch({
|
||||||
|
|
|
@ -4,7 +4,6 @@ import { socket } from '@/utils/socket'
|
||||||
const searchResult = ref({})
|
const searchResult = ref({})
|
||||||
|
|
||||||
function performMainSearch(searchTerm) {
|
function performMainSearch(searchTerm) {
|
||||||
console.log('Perform main search')
|
|
||||||
socket.emit('mainSearch', { term: searchTerm })
|
socket.emit('mainSearch', { term: searchTerm })
|
||||||
|
|
||||||
socket.on('mainSearch', data => {
|
socket.on('mainSearch', data => {
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import { ref, computed } from '@vue/composition-api'
|
import { ref } from '@vue/composition-api'
|
||||||
import { socket } from '@/utils/socket'
|
import { socket } from '@/utils/socket'
|
||||||
|
|
||||||
const result = ref({})
|
const result = ref({})
|
||||||
|
|
||||||
function performSearch({ term, type, start = 0, nb = 30 }) {
|
function performSearch({ term, type, start = 0, nb = 30 }) {
|
||||||
console.log('perform search!')
|
|
||||||
socket.emit('search', {
|
socket.emit('search', {
|
||||||
term,
|
term,
|
||||||
type,
|
type,
|
||||||
|
|
Loading…
Reference in a new issue