2026-08-25 11:42:17 +02:00
|
|
|
/** Strapi query fragments. Only the fields the pages actually render are requested. */
|
|
|
|
|
|
|
|
|
|
const list = (prefix: string, names: readonly string[]) =>
|
|
|
|
|
names.map((name, i) => `${prefix}[${i}]=${name}`).join('&')
|
|
|
|
|
|
|
|
|
|
const IMAGE_FIELDS = ['url', 'alternativeText', 'width', 'height'] as const
|
|
|
|
|
|
|
|
|
|
export const ARTICLE_SUMMARY_QUERY = [
|
|
|
|
|
list('fields', ['title', 'slug', 'publishedAt']),
|
|
|
|
|
list('populate[cover][fields]', IMAGE_FIELDS),
|
|
|
|
|
list('populate[category][fields]', ['name', 'slug']),
|
|
|
|
|
'sort[0]=publishedAt:desc',
|
|
|
|
|
].join('&')
|
|
|
|
|
|
|
|
|
|
export const ARTICLE_DETAIL_QUERY = [
|
|
|
|
|
list('fields', ['title', 'slug', 'content', 'publishedAt']),
|
|
|
|
|
list('populate[cover][fields]', IMAGE_FIELDS),
|
|
|
|
|
list('populate[category][fields]', ['name', 'slug']),
|
2026-08-25 15:30:57 +02:00
|
|
|
// The byline is the admin user who created the entry; Strapi exposes the
|
|
|
|
|
// name fields only because the content type sets populateCreatorFields.
|
|
|
|
|
list('populate[createdBy][fields]', ['firstname', 'lastname']),
|
2026-08-25 11:42:17 +02:00
|
|
|
].join('&')
|
|
|
|
|
|
|
|
|
|
export const PAGE_SIZE = 12
|
|
|
|
|
|
|
|
|
|
export const pagination = (page: number, pageSize = PAGE_SIZE) =>
|
|
|
|
|
`pagination[page]=${page}&pagination[pageSize]=${pageSize}`
|
|
|
|
|
|
|
|
|
|
/** Reads a positive integer query param, falling back to 1. */
|
|
|
|
|
export const pageParam = (value: unknown): number => {
|
|
|
|
|
const page = Number(value)
|
|
|
|
|
return Number.isInteger(page) && page > 0 ? page : 1
|
|
|
|
|
}
|
2026-09-08 23:34:42 +02:00
|
|
|
|
|
|
|
|
export type Locale = 'it' | 'en'
|
|
|
|
|
|
|
|
|
|
/** Reads the `lang` query param, falling back to the site default `it`. */
|
|
|
|
|
export const localeParam = (value: unknown): Locale => (value === 'en' ? 'en' : 'it')
|