interface MeiliHit {
id: string;
content: string;
senderName: string;
sourceGroupName: string;
tags: string[];
approvedAt: number;
}
interface SearchResponse {
hits: MeiliHit[];
total: number;
page: number;
limit: number;
query: string;
}
export function SearchResults({
hits,
total,
q,
page,
}: {
hits: MeiliHit[];
total: number;
q: string;
page: number;
}) {
return (
{hits.length === 0 ? (
No results{q ? ` for "${q}"` : ''}.
) : (
<>
{total} result{total !== 1 ? 's' : ''}
>
)}
);
}
export default async function SearchPage({
searchParams,
}: {
searchParams: Promise<{ q?: string; page?: string }>;
}) {
const { q = '', page = '1' } = await searchParams;
const apiUrl = process.env.API_URL ?? 'http://localhost:3001';
const url = new URL(`${apiUrl}/search`);
url.searchParams.set('q', q);
url.searchParams.set('page', page);
let data: SearchResponse = { hits: [], total: 0, page: 1, limit: 20, query: q };
try {
const res = await fetch(url, { cache: 'no-store' });
if (res.ok) data = await res.json();
} catch {
// API unavailable — render empty results
}
return (
Search
);
}