import { api } from "./api"; import { byNewest, filterByCategorySlug, paginate } from "./format"; import type { Blog, Brand, Category, Reportage } from "./types"; export const PAGE_SIZE = 9; export const ADMIN_URL = import.meta.env.VITE_ADMIN_URL ?? "http://novintrades.local:5173"; export async function fetchTopCategories(): Promise { const categories = await api("/api/categories"); return categories .filter((category) => category.parentId === null) .sort((a, b) => a.name.localeCompare(b.name)); } export async function fetchApprovedBlogs(): Promise { const blogs = await api("/api/blogs"); return blogs .filter((blog) => blog.verificationStatus === "APPROVED") .sort(byNewest); } export async function fetchApprovedReportages(): Promise { const reportages = await api("/api/reportages"); return reportages .filter((item) => item.verificationStatus === "APPROVED") .sort(byNewest); } export async function fetchApprovedBrands(): Promise { const brands = await api("/api/brands"); return brands .filter((brand) => brand.verificationStatus === "APPROVED") .sort(byNewest); } export async function fetchLatestBlogs(limit = 3): Promise { const blogs = await fetchApprovedBlogs(); return blogs.slice(0, limit); } export async function fetchLatestBrands(limit = 4): Promise { const brands = await fetchApprovedBrands(); return brands.slice(0, limit); } export async function fetchBlogBySlug(slug: string): Promise { const blogs = await fetchApprovedBlogs(); return blogs.find((blog) => blog.slug === slug) ?? null; } export async function fetchReportageBySlug( slug: string, ): Promise { const reportages = await fetchApprovedReportages(); return reportages.find((item) => item.slug === slug) ?? null; } export async function fetchBrandBySlug(slug: string): Promise { const brands = await fetchApprovedBrands(); return brands.find((brand) => brand.slug === slug) ?? null; } export function listPage }>( items: T[], categorySlug: string | null, page: number, pageSize = PAGE_SIZE, ) { return paginate(filterByCategorySlug(items, categorySlug), page, pageSize); }