101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import type { TourObject, SearchParams } from '~/types'
|
|
|
|
interface SearchState {
|
|
query: string
|
|
results: TourObject[]
|
|
total: number
|
|
page: number
|
|
totalPages: number
|
|
loading: boolean
|
|
filters: {
|
|
category_id: number | null
|
|
city: string
|
|
rating_min: number | null
|
|
sort_by: string
|
|
}
|
|
}
|
|
|
|
export const useSearchStore = defineStore('search', {
|
|
state: (): SearchState => ({
|
|
query: '',
|
|
results: [],
|
|
total: 0,
|
|
page: 1,
|
|
totalPages: 0,
|
|
loading: false,
|
|
filters: {
|
|
category_id: null,
|
|
city: '',
|
|
rating_min: null,
|
|
sort_by: 'rating_desc',
|
|
},
|
|
}),
|
|
|
|
actions: {
|
|
setQuery(q: string) {
|
|
this.query = q
|
|
},
|
|
|
|
setFilter<K extends keyof SearchState['filters']>(key: K, value: SearchState['filters'][K]) {
|
|
this.filters[key] = value
|
|
},
|
|
|
|
resetFilters() {
|
|
this.filters = {
|
|
category_id: null,
|
|
city: '',
|
|
rating_min: null,
|
|
sort_by: 'rating_desc',
|
|
}
|
|
},
|
|
|
|
async search(params?: Partial<SearchParams>) {
|
|
this.loading = true
|
|
try {
|
|
const api = useApi()
|
|
const searchParams = new URLSearchParams()
|
|
|
|
const q = params?.query || this.query
|
|
if (q) searchParams.set('query', q)
|
|
if (params?.category_id || this.filters.category_id) {
|
|
searchParams.set('category_id', String(params?.category_id || this.filters.category_id))
|
|
}
|
|
if (params?.city || this.filters.city) {
|
|
searchParams.set('city', params?.city || this.filters.city)
|
|
}
|
|
if (params?.page) searchParams.set('page', String(params.page))
|
|
if (params?.per_page) searchParams.set('per_page', String(params.per_page))
|
|
if (params?.latitude) searchParams.set('latitude', String(params.latitude))
|
|
if (params?.longitude) searchParams.set('longitude', String(params.longitude))
|
|
if (params?.radius) searchParams.set('radius', String(params.radius))
|
|
|
|
if (this.filters.sort_by) {
|
|
const [sort_by, sort_order] = this.filters.sort_by.split('_')
|
|
searchParams.set('sort_by', sort_by)
|
|
searchParams.set('sort_order', sort_order || 'desc')
|
|
}
|
|
|
|
const query = searchParams.toString()
|
|
const endpoint = params?.latitude
|
|
? `/objects/nearby?${query}`
|
|
: `/objects/search?${query}`
|
|
|
|
const response = await api.get<{
|
|
data: TourObject[]
|
|
total: number
|
|
page: number
|
|
total_pages: number
|
|
}>(endpoint)
|
|
|
|
this.results = response.data
|
|
this.total = response.total
|
|
this.page = response.page
|
|
this.totalPages = response.total_pages
|
|
} finally {
|
|
this.loading = false
|
|
}
|
|
},
|
|
},
|
|
})
|