feat(front): [WIP] federated search in search modal

This commit is contained in:
ArneBo 2025-04-22 16:51:54 +02:00
parent a7ad823a25
commit 0f2be469da
1 changed files with 22 additions and 3 deletions

View File

@ -98,7 +98,8 @@ type Results = {
podcasts: Response['podcasts']['results'], podcasts: Response['podcasts']['results'],
series: Response['series']['results'], series: Response['series']['results'],
rss: [Response['rss']], rss: [Response['rss']],
federation: [Response['federation']] federation: [Response['federation']],
type: Category
} }
const responses = ref<Partial<Response>>({}) const responses = ref<Partial<Response>>({})
@ -321,18 +322,21 @@ const search = async () => {
} }
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else { } else {
// TODO: add (@)type key to Response type
if (category.type === 'rss') { if (category.type === 'rss') {
const response = await axios.post<Response['rss']>( const response = await axios.post<Response['rss']>(
category.endpoint, category.endpoint,
{ url: trimmedQuery.value } { url: trimmedQuery.value }
) )
results.value.type = category.type
results.value.rss = [response.data] results.value.rss = [response.data]
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else if (category.type === 'federation') { } else if (category.type === 'federation') {
const response = await axios.post<Response['federation']>( const response = await axios.post<Response['federation']>(
category.endpoint, category.endpoint,
{ params } { object: trimmedQuery.value }
) )
results.value.type = category.type
results.value.federation = [response.data] results.value.federation = [response.data]
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else if (category.type === 'playlists') { } else if (category.type === 'playlists') {
@ -340,6 +344,7 @@ const search = async () => {
category.endpoint, category.endpoint,
{ params } { params }
) )
results.value.type = category.type
results.value.playlists = response.data.results results.value.playlists = response.data.results
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else if (category.type === 'podcasts') { } else if (category.type === 'podcasts') {
@ -347,6 +352,7 @@ const search = async () => {
category.endpoint, category.endpoint,
{ params } { params }
) )
results.value.type = category.type
results.value.podcasts = response.data.results results.value.podcasts = response.data.results
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else if (category.type === 'radios') { } else if (category.type === 'radios') {
@ -354,6 +360,7 @@ const search = async () => {
category.endpoint, category.endpoint,
{ params } { params }
) )
results.value.type = category.type
results.value.radios = response.data.results results.value.radios = response.data.results
responses.value[category.type] = response.data responses.value[category.type] = response.data
} else if (category.type === 'series') { } else if (category.type === 'series') {
@ -361,6 +368,7 @@ const search = async () => {
category.endpoint, category.endpoint,
{ params } { params }
) )
results.value.type = category.type
results.value.series = response.data.results results.value.series = response.data.results
responses.value[category.type] = response.data responses.value[category.type] = response.data
} }
@ -398,6 +406,8 @@ const radioConfig = computed<RadioConfig | null>(() =>
// Start the search // Start the search
watch(queryDebounced, search, { immediate: true }) watch(queryDebounced, search, { immediate: true })
// TODO: Include redirectRoute function from RemoteSearchForm.vue and adapt to !results.value and results.value.type instead of objInfo
</script> </script>
<template> <template>
@ -503,9 +513,18 @@ watch(queryDebounced, search, { immediate: true })
</Link> </Link>
</span> </span>
<span v-else-if="category.type === 'federation'"> <span v-else-if="category.type === 'federation' && count(category) > 0">
<!-- TODO: Federation search: backend adapter + display, fix results_per_category query --> <!-- TODO: Federation search: backend adapter + display, fix results_per_category query -->
<!-- {{ resultsPerCategory(category) }} --> <!-- {{ resultsPerCategory(category) }} -->
<!-- TODO: compute :to url for federated object -->
<Link
v-for="result in resultsPerCategory(category)"
:key="result.id"
:to="{name: 'profile.full', params: result.object?.full_username}"
target="_blank"
>
{{ result.object?.full_username }}
</Link>
</span> </span>
<EmptyState <EmptyState