Add filter input to source manager for searching cached sources by name
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,15 @@
|
||||
import { Database, Trash2 } from "lucide-react";
|
||||
import { useCallback, useEffect, useOptimistic, useState } from "react";
|
||||
import { Database, Search, Trash2 } from "lucide-react";
|
||||
import {
|
||||
useCallback,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useOptimistic,
|
||||
useState,
|
||||
} from "react";
|
||||
import type { CachedSourceInfo } from "../adapters/bestiary-cache.js";
|
||||
import * as bestiaryCache from "../adapters/bestiary-cache.js";
|
||||
import { Button } from "./ui/button.js";
|
||||
import { Input } from "./ui/input.js";
|
||||
|
||||
interface SourceManagerProps {
|
||||
onCacheCleared: () => void;
|
||||
@@ -12,6 +19,7 @@ export function SourceManager({
|
||||
onCacheCleared,
|
||||
}: Readonly<SourceManagerProps>) {
|
||||
const [sources, setSources] = useState<CachedSourceInfo[]>([]);
|
||||
const [filter, setFilter] = useState("");
|
||||
const [optimisticSources, applyOptimistic] = useOptimistic(
|
||||
sources,
|
||||
(
|
||||
@@ -46,6 +54,15 @@ export function SourceManager({
|
||||
onCacheCleared();
|
||||
};
|
||||
|
||||
const filteredSources = useMemo(() => {
|
||||
const term = filter.toLowerCase();
|
||||
return term
|
||||
? optimisticSources.filter((s) =>
|
||||
s.displayName.toLowerCase().includes(term),
|
||||
)
|
||||
: optimisticSources;
|
||||
}, [optimisticSources, filter]);
|
||||
|
||||
if (optimisticSources.length === 0) {
|
||||
return (
|
||||
<div className="flex flex-col items-center gap-2 py-8 text-center">
|
||||
@@ -70,8 +87,17 @@ export function SourceManager({
|
||||
Clear All
|
||||
</Button>
|
||||
</div>
|
||||
<div className="relative">
|
||||
<Search className="pointer-events-none absolute top-1/2 left-3 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" />
|
||||
<Input
|
||||
placeholder="Filter sources…"
|
||||
value={filter}
|
||||
onChange={(e) => setFilter(e.target.value)}
|
||||
className="pl-8"
|
||||
/>
|
||||
</div>
|
||||
<ul className="flex flex-col gap-1">
|
||||
{optimisticSources.map((source) => (
|
||||
{filteredSources.map((source) => (
|
||||
<li
|
||||
key={source.sourceCode}
|
||||
className="flex items-center justify-between rounded-md border border-border px-3 py-2"
|
||||
|
||||
Reference in New Issue
Block a user