44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import type { LocationQuery } from 'vue-router'
|
|
import {
|
|
DEFAULT_PAGE_SIZE,
|
|
PAGE_SIZES,
|
|
SEARCH_MAX_LENGTH,
|
|
firstQueryValue,
|
|
parsePositiveInteger,
|
|
} from '@/lib/pageQuery'
|
|
|
|
export interface DirectoryQuery {
|
|
q: string
|
|
page: number
|
|
size: number
|
|
}
|
|
|
|
export function parseDirectoryQuery(query: LocationQuery): DirectoryQuery {
|
|
const page = firstQueryValue(query.page)
|
|
const size = Number(firstQueryValue(query.size))
|
|
return {
|
|
q: firstQueryValue(query.q).slice(0, SEARCH_MAX_LENGTH),
|
|
page: parsePositiveInteger(page) ?? 1,
|
|
size: PAGE_SIZES.includes(size) ? size : DEFAULT_PAGE_SIZE,
|
|
}
|
|
}
|
|
|
|
export function toDirectoryRouteQuery(query: DirectoryQuery, rest: LocationQuery = {}) {
|
|
const route: Record<string, string> = {}
|
|
for (const [key, value] of Object.entries(rest)) {
|
|
if (key !== 'q' && key !== 'page' && key !== 'size') {
|
|
route[key] = firstQueryValue(value)
|
|
}
|
|
}
|
|
if (query.q) {
|
|
route.q = query.q
|
|
}
|
|
if (query.page !== 1) {
|
|
route.page = String(query.page)
|
|
}
|
|
if (query.size !== DEFAULT_PAGE_SIZE) {
|
|
route.size = String(query.size)
|
|
}
|
|
return route
|
|
}
|