diff --git a/pages/search/[searchProjectType].vue b/pages/search/[searchProjectType].vue
index 47d2dc5d5..6dc48e62a 100644
--- a/pages/search/[searchProjectType].vue
+++ b/pages/search/[searchProjectType].vue
@@ -284,7 +284,8 @@
class="pagination-before"
@switch-page="onSearchChange"
/>
-
+
+
No results found for your query!
@@ -336,6 +337,7 @@ import ProjectCard from '~/components/ui/ProjectCard'
import Pagination from '~/components/ui/Pagination'
import SearchFilter from '~/components/ui/search/SearchFilter'
import Checkbox from '~/components/ui/Checkbox'
+import LogoAnimated from '~/components/brand/LogoAnimated'
import ClientIcon from '~/assets/images/categories/client.svg'
import ServerIcon from '~/assets/images/categories/server.svg'
@@ -351,6 +353,7 @@ import Promotion from '~/components/ads/Promotion.vue'
export default defineNuxtComponent({
components: {
+ LogoAnimated,
Promotion,
ProjectCard,
Pagination,
@@ -465,118 +468,121 @@ export default defineNuxtComponent({
(x) => x.id === route.path.substring(1, route.path.length - 1)
)
+ const noLoad = ref(false)
const {
data: rawResults,
refresh: refreshSearch,
- pending,
- } = useLazyFetch(() => {
- const config = useRuntimeConfig()
- const base = process.server ? config.apiBaseUrl : config.public.apiBaseUrl
+ pending: searchLoading,
+ } = useLazyFetch(
+ () => {
+ const config = useRuntimeConfig()
+ const base = process.server ? config.apiBaseUrl : config.public.apiBaseUrl
- const params = [`limit=${maxResults.value}`, `index=${sortType.value.name}`]
+ const params = [`limit=${maxResults.value}`, `index=${sortType.value.name}`]
- if (query.value.length > 0) {
- params.push(`query=${query.value.replace(/ /g, '+')}`)
- }
-
- if (
- facets.value.length > 0 ||
- orFacets.value.length > 0 ||
- selectedVersions.value.length > 0 ||
- selectedEnvironments.value.length > 0 ||
- projectType.value
- ) {
- let formattedFacets = []
- for (const facet of facets.value) {
- formattedFacets.push([facet])
+ if (query.value.length > 0) {
+ params.push(`query=${query.value.replace(/ /g, '+')}`)
}
- // loaders specifier
- if (orFacets.value.length > 0) {
- formattedFacets.push(orFacets.value)
- } else if (projectType.value.id === 'plugin') {
- formattedFacets.push(
- data.$tag.loaderData.allPluginLoaders.map(
- (x) => `categories:'${encodeURIComponent(x)}'`
+ if (
+ facets.value.length > 0 ||
+ orFacets.value.length > 0 ||
+ selectedVersions.value.length > 0 ||
+ selectedEnvironments.value.length > 0 ||
+ projectType.value
+ ) {
+ let formattedFacets = []
+ for (const facet of facets.value) {
+ formattedFacets.push([facet])
+ }
+
+ // loaders specifier
+ if (orFacets.value.length > 0) {
+ formattedFacets.push(orFacets.value)
+ } else if (projectType.value.id === 'plugin') {
+ formattedFacets.push(
+ data.$tag.loaderData.allPluginLoaders.map(
+ (x) => `categories:'${encodeURIComponent(x)}'`
+ )
+ )
+ } else if (projectType.value.id === 'mod') {
+ formattedFacets.push(
+ data.$tag.loaderData.modLoaders.map((x) => `categories:'${encodeURIComponent(x)}'`)
+ )
+ } else if (projectType.value.id === 'datapack') {
+ formattedFacets.push(
+ data.$tag.loaderData.dataPackLoaders.map(
+ (x) => `categories:'${encodeURIComponent(x)}'`
+ )
)
- )
- } else if (projectType.value.id === 'mod') {
- formattedFacets.push(
- data.$tag.loaderData.modLoaders.map((x) => `categories:'${encodeURIComponent(x)}'`)
- )
- } else if (projectType.value.id === 'datapack') {
- formattedFacets.push(
- data.$tag.loaderData.dataPackLoaders.map((x) => `categories:'${encodeURIComponent(x)}'`)
- )
- }
-
- if (selectedVersions.value.length > 0) {
- const versionFacets = []
- for (const facet of selectedVersions.value) {
- versionFacets.push('versions:' + facet)
- }
- formattedFacets.push(versionFacets)
- }
-
- if (onlyOpenSource.value) {
- formattedFacets.push(['open_source:true'])
- }
-
- if (selectedEnvironments.value.length > 0) {
- let environmentFacets = []
-
- const includesClient = selectedEnvironments.value.includes('client')
- const includesServer = selectedEnvironments.value.includes('server')
- if (includesClient && includesServer) {
- environmentFacets = [['client_side:required'], ['server_side:required']]
- } else {
- if (includesClient) {
- environmentFacets = [
- ['client_side:optional', 'client_side:required'],
- ['server_side:optional', 'server_side:unsupported'],
- ]
- }
- if (includesServer) {
- environmentFacets = [
- ['client_side:optional', 'client_side:unsupported'],
- ['server_side:optional', 'server_side:required'],
- ]
- }
}
- formattedFacets = [...formattedFacets, ...environmentFacets]
+ if (selectedVersions.value.length > 0) {
+ const versionFacets = []
+ for (const facet of selectedVersions.value) {
+ versionFacets.push('versions:' + facet)
+ }
+ formattedFacets.push(versionFacets)
+ }
+
+ if (onlyOpenSource.value) {
+ formattedFacets.push(['open_source:true'])
+ }
+
+ if (selectedEnvironments.value.length > 0) {
+ let environmentFacets = []
+
+ const includesClient = selectedEnvironments.value.includes('client')
+ const includesServer = selectedEnvironments.value.includes('server')
+ if (includesClient && includesServer) {
+ environmentFacets = [['client_side:required'], ['server_side:required']]
+ } else {
+ if (includesClient) {
+ environmentFacets = [
+ ['client_side:optional', 'client_side:required'],
+ ['server_side:optional', 'server_side:unsupported'],
+ ]
+ }
+ if (includesServer) {
+ environmentFacets = [
+ ['client_side:optional', 'client_side:unsupported'],
+ ['server_side:optional', 'server_side:required'],
+ ]
+ }
+ }
+
+ formattedFacets = [...formattedFacets, ...environmentFacets]
+ }
+
+ if (projectType.value) {
+ formattedFacets.push([`project_type:${projectType.value.actual}`])
+ }
+
+ params.push(`facets=${JSON.stringify(formattedFacets)}`)
}
- if (projectType.value) {
- formattedFacets.push([`project_type:${projectType.value.actual}`])
+ const offset = (currentPage.value - 1) * maxResults.value
+ if (currentPage.value !== 1) {
+ params.push(`offset=${offset}`)
}
- params.push(`facets=${JSON.stringify(formattedFacets)}`)
- }
+ let url = 'search'
- const offset = (currentPage.value - 1) * maxResults.value
- if (currentPage.value !== 1) {
- params.push(`offset=${offset}`)
- }
-
- let url = 'search'
-
- if (params.length > 0) {
- for (let i = 0; i < params.length; i++) {
- url += i === 0 ? `?${params[i]}` : `&${params[i]}`
+ if (params.length > 0) {
+ for (let i = 0; i < params.length; i++) {
+ url += i === 0 ? `?${params[i]}` : `&${params[i]}`
+ }
}
- }
- return `${base}${url}`
- })
-
- watch(pending, (newVal) => {
- if (newVal) {
- startLoading()
- } else {
- stopLoading()
+ return `${base}${url}`
+ },
+ {
+ transform(hits) {
+ noLoad.value = false
+ return hits
+ },
}
- })
+ )
const results = shallowRef(toRaw(rawResults))
const pageCount = computed(() =>
@@ -584,6 +590,9 @@ export default defineNuxtComponent({
)
const onSearchChange = (newPageNumber) => {
+ noLoad.value = true
+ console.log(noLoad.value)
+
currentPage.value = newPageNumber
if (query.value === null) {
@@ -674,6 +683,8 @@ export default defineNuxtComponent({
projectType,
onSearchChange,
getSearchUrl,
+ searchLoading,
+ noLoad,
}
},
computed: {