2022-12-18 00:35:07 +03:00
|
|
|
import type { MaybeRef } from '@vueuse/core'
|
2022-12-22 13:34:35 +03:00
|
|
|
import type { Account, Paginator, Results, SearchParams, Status } from 'masto'
|
2022-12-18 00:35:07 +03:00
|
|
|
|
|
|
|
export interface UseSearchOptions {
|
|
|
|
type?: MaybeRef<'accounts' | 'hashtags' | 'statuses'>
|
|
|
|
}
|
|
|
|
|
|
|
|
export function useSearch(query: MaybeRef<string>, options?: UseSearchOptions) {
|
|
|
|
const done = ref(false)
|
2022-12-29 17:44:26 +03:00
|
|
|
const masto = useMasto()
|
2022-12-18 00:35:07 +03:00
|
|
|
const loading = ref(false)
|
|
|
|
const statuses = ref<Status[]>([])
|
|
|
|
const accounts = ref<Account[]>([])
|
|
|
|
const hashtags = ref<any[]>([])
|
|
|
|
|
2022-12-22 13:34:35 +03:00
|
|
|
let paginator: Paginator<SearchParams, Results> | undefined
|
|
|
|
|
2022-12-18 00:35:07 +03:00
|
|
|
debouncedWatch(() => unref(query), async () => {
|
2022-12-22 13:34:35 +03:00
|
|
|
if (!unref(query) || !isMastoInitialised.value)
|
2022-12-18 00:35:07 +03:00
|
|
|
return
|
|
|
|
|
|
|
|
loading.value = true
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Based on the source it seems like modifying the params when calling next would result in a new search,
|
|
|
|
* but that doesn't seem to be the case. So instead we just create a new paginator with the new params.
|
|
|
|
*/
|
2023-01-03 06:25:02 +03:00
|
|
|
paginator = masto.search({ q: unref(query), resolve: !!currentUser.value, type: unref(options?.type) })
|
2022-12-18 00:35:07 +03:00
|
|
|
const nextResults = await paginator.next()
|
|
|
|
|
|
|
|
done.value = nextResults.done || false
|
|
|
|
|
|
|
|
statuses.value = nextResults.value?.statuses || []
|
|
|
|
accounts.value = nextResults.value?.accounts || []
|
|
|
|
hashtags.value = nextResults.value?.hashtags || []
|
|
|
|
|
|
|
|
loading.value = false
|
|
|
|
}, { debounce: 500 })
|
|
|
|
|
|
|
|
const next = async () => {
|
2022-12-22 13:34:35 +03:00
|
|
|
if (!unref(query) || !isMastoInitialised.value || !paginator)
|
2022-12-18 00:35:07 +03:00
|
|
|
return
|
|
|
|
|
|
|
|
loading.value = true
|
|
|
|
const nextResults = await paginator.next()
|
|
|
|
loading.value = false
|
|
|
|
|
|
|
|
done.value = nextResults.done || false
|
|
|
|
statuses.value = [
|
|
|
|
...statuses.value,
|
|
|
|
...(nextResults.value.statuses || []),
|
|
|
|
]
|
|
|
|
accounts.value = [
|
|
|
|
...statuses.value,
|
|
|
|
...(nextResults.value.accounts || []),
|
|
|
|
]
|
|
|
|
hashtags.value = [
|
|
|
|
...statuses.value,
|
|
|
|
...(nextResults.value.statuses || []),
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
accounts,
|
|
|
|
hashtags,
|
|
|
|
statuses,
|
|
|
|
loading: readonly(loading),
|
|
|
|
next,
|
|
|
|
}
|
|
|
|
}
|