5801cbf85b
- KnowledgeBoard + KnowledgeItem models + migration (DRAFT/PUBLISHED/ARCHIVED status, slug per tenant) - KnowledgeModule: admin CRUD for boards + items (auto-slug, status workflow) - Member endpoint GET /my/knowledge?q= — published items grouped by board, optional text search over question/answer - /my/knowledge page: search box + collapsible boards with accordion FAQ items - KnowledgeItem accordion + KnowledgeSearch (debounced URL-driven) client components - Knowledge nav item; register KnowledgeModule Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
31 lines
951 B
TypeScript
31 lines
951 B
TypeScript
'use client';
|
|
|
|
import { useRouter, useSearchParams } from 'next/navigation';
|
|
import { useEffect, useState } from 'react';
|
|
|
|
export function KnowledgeSearch() {
|
|
const router = useRouter();
|
|
const searchParams = useSearchParams();
|
|
const [q, setQ] = useState(searchParams.get('q') ?? '');
|
|
|
|
useEffect(() => {
|
|
const handle = setTimeout(() => {
|
|
const params = new URLSearchParams();
|
|
if (q.trim()) params.set('q', q.trim());
|
|
router.replace(`/my/knowledge${params.toString() ? `?${params.toString()}` : ''}`);
|
|
}, 300);
|
|
return () => clearTimeout(handle);
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [q]);
|
|
|
|
return (
|
|
<input
|
|
type="text"
|
|
value={q}
|
|
onChange={(e) => setQ(e.target.value)}
|
|
placeholder="Search the knowledge base…"
|
|
className="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-500"
|
|
/>
|
|
);
|
|
}
|