wip: searching logic; wip: memorization of the last tab searched
This commit is contained in:
parent
b5ff097286
commit
b2eb08722c
File diff suppressed because one or more lines are too long
@ -166,7 +166,11 @@ export default defineComponent({
|
|||||||
// The user is searching a normal string
|
// The user is searching a normal string
|
||||||
if (isShowingSearch && isSameAsLastSearch) return
|
if (isShowingSearch && isSameAsLastSearch) return
|
||||||
|
|
||||||
if (!isShowingSearch) {
|
if (!isSameAsLastSearch) {
|
||||||
|
this.$root.$emit('updateSearchLoadingState', true)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastTextSearch = term
|
||||||
await this.$router.push({
|
await this.$router.push({
|
||||||
name: 'Search',
|
name: 'Search',
|
||||||
query: {
|
query: {
|
||||||
@ -174,14 +178,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isSameAsLastSearch) {
|
|
||||||
this.$root.$emit('updateSearchLoadingState', true)
|
|
||||||
this.lastTextSearch = term
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$root.$emit('mainSearch:showNewResults', term)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="search_tab">
|
<div id="search_tab">
|
||||||
<div v-show="!showSearchTab">
|
<div v-show="isQueryEmpty">
|
||||||
<h2>{{ $t('search.startSearching') }}</h2>
|
<h2>{{ $t('search.startSearching') }}</h2>
|
||||||
<p>{{ $t('search.description') }}</p>
|
<p>{{ $t('search.description') }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-show="showSearchTab">
|
<div v-show="!isQueryEmpty">
|
||||||
<BaseTabs>
|
<BaseTabs>
|
||||||
<BaseTab
|
<BaseTab
|
||||||
v-for="tab in tabs"
|
v-for="tab in tabs"
|
||||||
@ -47,9 +47,12 @@ import { formatSingleTrack, formatAlbums, formatArtist, formatPlaylist } from '@
|
|||||||
import { standardizeData } from '@/data/standardize'
|
import { standardizeData } from '@/data/standardize'
|
||||||
import { computed, defineComponent, reactive, ref, toRefs, watch, watchEffect } from '@vue/composition-api'
|
import { computed, defineComponent, reactive, ref, toRefs, watch, watchEffect } from '@vue/composition-api'
|
||||||
import { useMainSearch } from '@/use/main-search'
|
import { useMainSearch } from '@/use/main-search'
|
||||||
|
import { useSearch } from '@/use/search'
|
||||||
|
|
||||||
const resetObj = { data: [], next: 0, total: 0, hasLoaded: false }
|
const resetObj = { data: [], next: 0, total: 0, hasLoaded: false }
|
||||||
|
|
||||||
|
const lastTab = ref(null)
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
BaseLoadingPlaceholder,
|
BaseLoadingPlaceholder,
|
||||||
@ -93,18 +96,76 @@ export default defineComponent({
|
|||||||
albumTab: { ...resetObj },
|
albumTab: { ...resetObj },
|
||||||
artistTab: { ...resetObj },
|
artistTab: { ...resetObj },
|
||||||
playlistTab: { ...resetObj }
|
playlistTab: { ...resetObj }
|
||||||
|
},
|
||||||
|
tabs: [
|
||||||
|
{
|
||||||
|
name: ctx.root.$i18n.t('globals.listTabs.all'),
|
||||||
|
searchType: 'all',
|
||||||
|
component: ResultsAll,
|
||||||
|
viewInfo: 'allTab'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ctx.root.$i18n.tc('globals.listTabs.track', 2),
|
||||||
|
searchType: 'track',
|
||||||
|
component: ResultsTracks,
|
||||||
|
viewInfo: 'trackTab',
|
||||||
|
formatFunc: formatSingleTrack
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ctx.root.$i18n.tc('globals.listTabs.album', 2),
|
||||||
|
searchType: 'album',
|
||||||
|
component: ResultsAlbums,
|
||||||
|
viewInfo: 'albumTab',
|
||||||
|
formatFunc: formatAlbums
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ctx.root.$i18n.tc('globals.listTabs.artist', 2),
|
||||||
|
searchType: 'artist',
|
||||||
|
component: ResultsArtists,
|
||||||
|
viewInfo: 'artistTab',
|
||||||
|
formatFunc: formatArtist
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ctx.root.$i18n.tc('globals.listTabs.playlist', 2),
|
||||||
|
searchType: 'playlist',
|
||||||
|
component: ResultsPlaylists,
|
||||||
|
viewInfo: 'playlistTab',
|
||||||
|
formatFunc: formatPlaylist
|
||||||
}
|
}
|
||||||
|
]
|
||||||
})
|
})
|
||||||
const { searchResult, performSearch } = useMainSearch()
|
const { searchResult, performMainSearch } = useMainSearch()
|
||||||
|
const { result, performSearch } = useSearch()
|
||||||
|
const isQueryEmpty = computed(() => state.results.query === '')
|
||||||
|
const searchedTerm = computed(() => ctx.root.$route.query.term)
|
||||||
|
console.log('onSetup')
|
||||||
|
|
||||||
|
/*
|
||||||
|
Search cases:
|
||||||
|
- same term
|
||||||
|
- from search (component is already rendered) -> do nothing
|
||||||
|
- handled in TheSearchBar ✅
|
||||||
|
- from another tab (component is not rendered yet) -> don't perform new search, show previous results (stored in the ref searchResult) and all tab
|
||||||
|
- handling in beforeRouteEnter ✅, but need to know that we already have the values ❌
|
||||||
|
- different term
|
||||||
|
- from search (component is already rendered) -> show new results and keep the tab
|
||||||
|
- handling in beforeRouteUpdate ❌, but need to keep the tab, therefore perform a Search or a Main Search according to last tab ❌
|
||||||
|
- from another tab (component is not rendered yet) -> show new results and show all tab
|
||||||
|
- handling in beforeRouteEnter ✅, no need to know that we already have the values ✅
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (searchedTerm.value) {
|
||||||
|
performMainSearch(searchedTerm.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main search watcher
|
||||||
watch(searchResult, newValue => {
|
watch(searchResult, newValue => {
|
||||||
console.log('show main search results watcher')
|
|
||||||
// Hide loading placeholder
|
// Hide loading placeholder
|
||||||
ctx.root.$emit('updateSearchLoadingState', false)
|
ctx.root.$emit('updateSearchLoadingState', false)
|
||||||
|
|
||||||
state.results.query = searchResult.QUERY
|
state.results.query = newValue.QUERY
|
||||||
|
|
||||||
state.results.allTab = searchResult
|
state.results.allTab = newValue
|
||||||
state.results.allTab.TRACK.hasLoaded = true
|
state.results.allTab.TRACK.hasLoaded = true
|
||||||
state.results.allTab.ALBUM.hasLoaded = true
|
state.results.allTab.ALBUM.hasLoaded = true
|
||||||
state.results.allTab.ARTIST.hasLoaded = true
|
state.results.allTab.ARTIST.hasLoaded = true
|
||||||
@ -114,96 +175,61 @@ export default defineComponent({
|
|||||||
state.results.albumTab = { ...resetObj }
|
state.results.albumTab = { ...resetObj }
|
||||||
state.results.artistTab = { ...resetObj }
|
state.results.artistTab = { ...resetObj }
|
||||||
state.results.playlistTab = { ...resetObj }
|
state.results.playlistTab = { ...resetObj }
|
||||||
|
|
||||||
|
if (lastTab.value && lastTab.value.searchType !== 'all') {
|
||||||
|
state.currentTab = lastTab.value
|
||||||
|
|
||||||
|
performSearch({
|
||||||
|
term: newValue.QUERY,
|
||||||
|
type: state.currentTab.searchType
|
||||||
|
// start: state.results[`${state.currentTab.searchType}Tab`].next
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
state.currentTab = state.tabs.find(tab => tab.searchType === 'all')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Search watcher
|
||||||
|
watch(result, newValue => {
|
||||||
|
const { next: nextResult, total, type, data: newData } = newValue
|
||||||
|
|
||||||
|
const currentTabKey = type + 'Tab'
|
||||||
|
let next = total
|
||||||
|
|
||||||
|
if (nextResult) {
|
||||||
|
next = parseInt(nextResult.match(/index=(\d*)/)[1])
|
||||||
|
} /* else {
|
||||||
|
next = total
|
||||||
|
} */
|
||||||
|
|
||||||
|
if (state.results[currentTabKey].total !== total) {
|
||||||
|
state.results[currentTabKey].total = total
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.results[currentTabKey].next !== next) {
|
||||||
|
state.results[currentTabKey].next = next
|
||||||
|
state.results[currentTabKey].data = state.results[currentTabKey].data.concat(newData)
|
||||||
|
}
|
||||||
|
|
||||||
|
state.results[currentTabKey].hasLoaded = true
|
||||||
|
})
|
||||||
|
|
||||||
|
state.currentTab = state.tabs.find(tab => tab.searchType === 'all')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
|
isQueryEmpty,
|
||||||
searchResult,
|
searchResult,
|
||||||
|
performMainSearch,
|
||||||
performSearch
|
performSearch
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
|
||||||
const $t = this.$t.bind(this)
|
|
||||||
const $tc = this.$tc.bind(this)
|
|
||||||
|
|
||||||
return {
|
|
||||||
// currentTab: {
|
|
||||||
// name: '',
|
|
||||||
// searchType: '',
|
|
||||||
// component: {},
|
|
||||||
// viewInfo: '',
|
|
||||||
// formatFunc: () => {}
|
|
||||||
// },
|
|
||||||
tabs: [
|
|
||||||
{
|
|
||||||
name: $t('globals.listTabs.all'),
|
|
||||||
searchType: 'all',
|
|
||||||
component: ResultsAll,
|
|
||||||
viewInfo: 'allTab'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: $tc('globals.listTabs.track', 2),
|
|
||||||
searchType: 'track',
|
|
||||||
component: ResultsTracks,
|
|
||||||
viewInfo: 'trackTab',
|
|
||||||
formatFunc: formatSingleTrack
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: $tc('globals.listTabs.album', 2),
|
|
||||||
searchType: 'album',
|
|
||||||
component: ResultsAlbums,
|
|
||||||
viewInfo: 'albumTab',
|
|
||||||
formatFunc: formatAlbums
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: $tc('globals.listTabs.artist', 2),
|
|
||||||
searchType: 'artist',
|
|
||||||
component: ResultsArtists,
|
|
||||||
viewInfo: 'artistTab',
|
|
||||||
formatFunc: formatArtist
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: $tc('globals.listTabs.playlist', 2),
|
|
||||||
searchType: 'playlist',
|
|
||||||
component: ResultsPlaylists,
|
|
||||||
viewInfo: 'playlistTab',
|
|
||||||
formatFunc: formatPlaylist
|
|
||||||
}
|
|
||||||
]
|
|
||||||
// results: {
|
|
||||||
// query: '',
|
|
||||||
// allTab: {
|
|
||||||
// ORDER: [],
|
|
||||||
// TOP_RESULT: [],
|
|
||||||
// ALBUM: {
|
|
||||||
// hasLoaded: false
|
|
||||||
// },
|
|
||||||
// ARTIST: {
|
|
||||||
// hasLoaded: false
|
|
||||||
// },
|
|
||||||
// TRACK: {
|
|
||||||
// hasLoaded: false
|
|
||||||
// },
|
|
||||||
// PLAYLIST: {
|
|
||||||
// hasLoaded: false
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// trackTab: { ...resetObj },
|
|
||||||
// albumTab: { ...resetObj },
|
|
||||||
// artistTab: { ...resetObj },
|
|
||||||
// playlistTab: { ...resetObj }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
showSearchTab() {
|
|
||||||
return this.results.query !== ''
|
|
||||||
},
|
|
||||||
loadedTabs() {
|
loadedTabs() {
|
||||||
const tabsLoaded = []
|
const tabsLoaded = []
|
||||||
|
|
||||||
for (const resultKey in this.results) {
|
for (const resultKey in this.results) {
|
||||||
if (this.results.hasOwnProperty(resultKey)) {
|
if (this.results.hasOwnProperty(resultKey) && resultKey !== 'query') {
|
||||||
const currentResult = this.results[resultKey]
|
const currentResult = this.results[resultKey]
|
||||||
|
|
||||||
if (currentResult.hasLoaded) {
|
if (currentResult.hasLoaded) {
|
||||||
@ -215,15 +241,6 @@ export default defineComponent({
|
|||||||
return tabsLoaded
|
return tabsLoaded
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
|
||||||
this.currentTab = this.tabs[0]
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$root.$on('mainSearch:showNewResults', this.checkIfPerformNewMainSearch)
|
|
||||||
|
|
||||||
socket.on('mainSearch', this.saveMainSearchResult)
|
|
||||||
socket.on('search', this.handleSearch)
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
numberWithDots,
|
numberWithDots,
|
||||||
convertDuration,
|
convertDuration,
|
||||||
@ -251,33 +268,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
window.scrollTo(0, 0)
|
window.scrollTo(0, 0)
|
||||||
this.currentTab = newTab
|
this.currentTab = newTab
|
||||||
// this.lastTab = newTab
|
lastTab.value = newTab
|
||||||
},
|
|
||||||
checkIfPerformNewMainSearch(searchTerm) {
|
|
||||||
const hasTermChanged = searchTerm !== this.results.query
|
|
||||||
|
|
||||||
if (hasTermChanged) {
|
|
||||||
// this.performNewMainSearch(searchTerm)
|
|
||||||
this.$root.$emit('updateSearchLoadingState', true)
|
|
||||||
this.performSearch(searchTerm)
|
|
||||||
this.currentTab = this.tabs[0]
|
|
||||||
// this.currentTab = this.lastTab
|
|
||||||
}
|
|
||||||
},
|
|
||||||
performNewMainSearch(term) {
|
|
||||||
socket.emit('mainSearch', { term })
|
|
||||||
|
|
||||||
// Showing loading placeholder
|
|
||||||
this.$root.$emit('updateSearchLoadingState', true)
|
|
||||||
this.currentTab = this.tabs[0]
|
|
||||||
},
|
|
||||||
search(type) {
|
|
||||||
socket.emit('search', {
|
|
||||||
term: this.results.query,
|
|
||||||
type,
|
|
||||||
start: this.results[`${type}Tab`].next,
|
|
||||||
nb: 30
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
scrolledSearch() {
|
scrolledSearch() {
|
||||||
if (this.currentTab.searchType === 'all') return
|
if (this.currentTab.searchType === 'all') return
|
||||||
@ -286,51 +277,13 @@ export default defineComponent({
|
|||||||
const needToPerformScrolledSearch = this.results[currentTabKey].next < this.results[currentTabKey].total
|
const needToPerformScrolledSearch = this.results[currentTabKey].next < this.results[currentTabKey].total
|
||||||
|
|
||||||
if (needToPerformScrolledSearch) {
|
if (needToPerformScrolledSearch) {
|
||||||
this.search(this.currentTab.searchType)
|
this.performSearch({
|
||||||
|
term: this.results.query,
|
||||||
|
type: this.currentTab.searchType,
|
||||||
|
start: this.results[`${this.currentTab.searchType}Tab`].next
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
saveMainSearchResult(searchResult) {
|
|
||||||
console.log('show main search results')
|
|
||||||
return
|
|
||||||
// Hide loading placeholder
|
|
||||||
this.$root.$emit('updateSearchLoadingState', false)
|
|
||||||
|
|
||||||
this.results.query = searchResult.QUERY
|
|
||||||
|
|
||||||
this.results.allTab = searchResult
|
|
||||||
this.results.allTab.TRACK.hasLoaded = true
|
|
||||||
this.results.allTab.ALBUM.hasLoaded = true
|
|
||||||
this.results.allTab.ARTIST.hasLoaded = true
|
|
||||||
this.results.allTab.PLAYLIST.hasLoaded = true
|
|
||||||
|
|
||||||
this.results.trackTab = { ...resetObj }
|
|
||||||
this.results.albumTab = { ...resetObj }
|
|
||||||
this.results.artistTab = { ...resetObj }
|
|
||||||
this.results.playlistTab = { ...resetObj }
|
|
||||||
},
|
|
||||||
handleSearch(result) {
|
|
||||||
const { next: nextResult, total, type, data: newData } = result
|
|
||||||
|
|
||||||
const currentTabKey = type + 'Tab'
|
|
||||||
let next = 0
|
|
||||||
|
|
||||||
if (nextResult) {
|
|
||||||
next = parseInt(nextResult.match(/index=(\d*)/)[1])
|
|
||||||
} else {
|
|
||||||
next = total
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.results[currentTabKey].total !== total) {
|
|
||||||
this.results[currentTabKey].total = total
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.results[currentTabKey].next !== next) {
|
|
||||||
this.results[currentTabKey].next = next
|
|
||||||
this.results[currentTabKey].data = this.results[currentTabKey].data.concat(newData)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.results[currentTabKey].hasLoaded = true
|
|
||||||
},
|
|
||||||
isTabLoaded(tab) {
|
isTabLoaded(tab) {
|
||||||
return this.loadedTabs.indexOf(tab.searchType) !== -1 || tab.searchType === 'all'
|
return this.loadedTabs.indexOf(tab.searchType) !== -1 || tab.searchType === 'all'
|
||||||
}
|
}
|
||||||
@ -342,20 +295,32 @@ export default defineComponent({
|
|||||||
this.scrolledSearch(needToSearch)
|
this.scrolledSearch(needToSearch)
|
||||||
},
|
},
|
||||||
currentTab(newTab) {
|
currentTab(newTab) {
|
||||||
|
console.log('watch current tab')
|
||||||
if (this.isTabLoaded(newTab)) return
|
if (this.isTabLoaded(newTab)) return
|
||||||
|
|
||||||
this.search(newTab.searchType)
|
this.performSearch({
|
||||||
}
|
term: this.results.query,
|
||||||
},
|
type: newTab.searchType,
|
||||||
beforeRouteEnter(to, from, next) {
|
start: this.results[`${newTab.searchType}Tab`].next
|
||||||
next(vm => {
|
|
||||||
vm.checkIfPerformNewMainSearch(to.query.term)
|
|
||||||
})
|
})
|
||||||
},
|
|
||||||
beforeRouteUpdate(to, from, next) {
|
|
||||||
this.checkIfPerformNewMainSearch(to.query.term)
|
|
||||||
next()
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// beforeRouteUpdate(to, from, next) {
|
||||||
|
// console.log('beforeRouteUpdate', from)
|
||||||
|
// // this.$root.$emit('updateSearchLoadingState', true)
|
||||||
|
|
||||||
|
// // this.performMainSearch(to.query.term)
|
||||||
|
|
||||||
|
// // if (this.currentTab.searchType !== 'all') {
|
||||||
|
// // this.performSearch({
|
||||||
|
// // term: to.query.term,
|
||||||
|
// // type: this.currentTab.searchType,
|
||||||
|
// // start: this.results[`${this.currentTab.searchType}Tab`].next
|
||||||
|
// // })
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -118,7 +118,6 @@ const routes = [
|
|||||||
|
|
||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
mode: 'history',
|
mode: 'history',
|
||||||
// linkActiveClass: 'open',
|
|
||||||
routes,
|
routes,
|
||||||
scrollBehavior(to, from, savedPosition) {
|
scrollBehavior(to, from, savedPosition) {
|
||||||
return { x: 0, y: 0 }
|
return { x: 0, y: 0 }
|
||||||
|
@ -4,11 +4,9 @@ import { socket } from '@/utils/socket'
|
|||||||
const searchResult = ref({})
|
const searchResult = ref({})
|
||||||
const lastTermSearched = ref(null)
|
const lastTermSearched = ref(null)
|
||||||
|
|
||||||
function performSearch(searchTerm) {
|
function performMainSearch(searchTerm) {
|
||||||
if (searchTerm === lastTermSearched.value) return
|
if (searchTerm === lastTermSearched.value) return
|
||||||
|
|
||||||
// TODO Handle multiple, subsequent calls
|
|
||||||
// TODO Caching
|
|
||||||
socket.emit('mainSearch', { term: searchTerm })
|
socket.emit('mainSearch', { term: searchTerm })
|
||||||
|
|
||||||
socket.on('mainSearch', data => {
|
socket.on('mainSearch', data => {
|
||||||
@ -22,26 +20,6 @@ function performSearch(searchTerm) {
|
|||||||
export function useMainSearch() {
|
export function useMainSearch() {
|
||||||
return {
|
return {
|
||||||
searchResult,
|
searchResult,
|
||||||
performSearch
|
performMainSearch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// socket.on('mainSearch', saveMainSearchResult)
|
|
||||||
|
|
||||||
// saveMainSearchResult(searchResult) {
|
|
||||||
// // Hide loading placeholder
|
|
||||||
// this.$root.$emit('updateSearchLoadingState', false)
|
|
||||||
|
|
||||||
// this.results.query = searchResult.QUERY
|
|
||||||
|
|
||||||
// this.results.allTab = searchResult
|
|
||||||
// this.results.allTab.TRACK.hasLoaded = true
|
|
||||||
// this.results.allTab.ALBUM.hasLoaded = true
|
|
||||||
// this.results.allTab.ARTIST.hasLoaded = true
|
|
||||||
// this.results.allTab.PLAYLIST.hasLoaded = true
|
|
||||||
|
|
||||||
// this.results.trackTab = { ...resetObj }
|
|
||||||
// this.results.albumTab = { ...resetObj }
|
|
||||||
// this.results.artistTab = { ...resetObj }
|
|
||||||
// this.results.playlistTab = { ...resetObj }
|
|
||||||
// },
|
|
||||||
|
27
src/use/search.js
Normal file
27
src/use/search.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { ref, computed } from '@vue/composition-api'
|
||||||
|
import { socket } from '@/utils/socket'
|
||||||
|
|
||||||
|
const result = ref({})
|
||||||
|
|
||||||
|
function performSearch({ term, type, start = 0, nb = 30 }) {
|
||||||
|
console.log('perform search!')
|
||||||
|
socket.emit('search', {
|
||||||
|
term,
|
||||||
|
type,
|
||||||
|
start,
|
||||||
|
nb
|
||||||
|
})
|
||||||
|
|
||||||
|
socket.on('search', data => {
|
||||||
|
result.value = data
|
||||||
|
|
||||||
|
socket.off('search')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useSearch() {
|
||||||
|
return {
|
||||||
|
result,
|
||||||
|
performSearch
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user