admin/hooks/useQueryParams.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

55 lines
1.2 KiB
TypeScript

'use client'
import { useMemo } from 'react'
import { useSearchParams } from 'next/navigation'
import qs from 'qs'
import { coerceToString } from '@/helpers'
/**
* Parses the current URL query string into a flat object (supports filters[field] keys).
*/
export default function useQueryParams(): Record<string, string> {
const searchParams = useSearchParams()
return useMemo(() => {
const query = searchParams.toString()
if (!query) {
return {}
}
const parsed = qs.parse(query, {
ignoreQueryPrefix: true,
allowDots: true,
})
const flat: Record<string, string> = {}
for (const [key, value] of Object.entries(parsed)) {
if (value == null) {
continue
}
if (typeof value === 'object' && !Array.isArray(value)) {
for (const [nestedKey, nestedValue] of Object.entries(value)) {
if (nestedValue == null) {
continue
}
flat[`${key}[${nestedKey}]`] = coerceToString(nestedValue)
}
continue
}
if (Array.isArray(value)) {
flat[key] = value.map(String).join(',')
continue
}
flat[key] = coerceToString(value)
}
return flat
}, [searchParams])
}