Files
tp/main_dc/yalarba/yalarba-nuxt/app/stores/search.ts
T
2026-06-12 00:29:34 +05:00

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
}
},
},
})