"use client"; import { useModuleClient } from "@86d-app/core/client"; import { useState } from "react"; interface AnalyticsData { totalQueries: number; uniqueTerms: number; avgResultCount: number; zeroResultCount: number; zeroResultRate: number; clickThroughRate: number; avgClickPosition: number; indexedItems: number; } interface PopularTerm { term: string; count: number; avgResultCount: number; } interface Synonym { id: string; term: string; synonyms: string[]; createdAt: string; } type ProviderStatus = "connected" | "not_configured" | "error"; interface SearchSettings { meilisearch: { status: ProviderStatus; error?: string; configured: boolean; host: string | null; apiKey: string | null; indexUid: string; documentCount?: number; }; embeddings: { status: ProviderStatus; error?: string; configured: boolean; provider: "openai" | "openrouter" | null; model: string; }; indexCount: number; } function Skeleton({ className = "" }: { className?: string }) { return (
); } function useSearchAdminApi() { const client = useModuleClient(); return { settings: client.module("search").admin["/admin/search/settings"], analytics: client.module("search").admin["/admin/search/analytics"], popular: client.module("search").admin["/admin/search/popular"], zeroResults: client.module("search").admin["/admin/search/zero-results"], synonyms: client.module("search").admin["/admin/search/synonyms"], addSynonym: client.module("search").admin["/admin/search/synonyms/add"], removeSynonym: client.module("search").admin["/admin/search/synonyms/:id/delete"], }; } function StatCard({ label, value }: { label: string; value: string | number }) { return ({label}
{value}
Host: {settingsData.meilisearch.host}
Index: {settingsData.meilisearch.indexUid}
Key: {settingsData.meilisearch.apiKey}
{typeof settingsData.meilisearch.documentCount === "number" ? (Documents:{" "} {settingsData.meilisearch.documentCount.toLocaleString()}
) : null}MeiliSearch at{" "} {settingsData.meilisearch.host ?? "configured host"} is unreachable.
{settingsData.meilisearch.error ? ({settingsData.meilisearch.error}
) : null}Falling back to the local search engine. Verify the instance URL and master key.
Using local search engine. Configure{" "}
MEILISEARCH_HOST
{" "}
and{" "}
MEILISEARCH_API_KEY
{" "}
for dedicated search.
Model: {settingsData.embeddings.model}
) : settingsData.embeddings.status === "error" ? ({settingsData.embeddings.provider === "openai" ? "OpenAI" : settingsData.embeddings.provider === "openrouter" ? "OpenRouter" : "Embedding provider"}{" "} rejected the configured key.
{settingsData.embeddings.error ? ({settingsData.embeddings.error}
) : null}Semantic search is disabled until the key is replaced.
Semantic search disabled. Configure{" "}
OPENAI_API_KEY
{" "}
for AI-powered results.
No search data yet.
) : (No zero-result queries yet.
) : ({error}
} {synonyms.length === 0 ? (No synonyms configured yet.
) : (