Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
55 lines
1.2 KiB
TypeScript
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])
|
|
}
|