use new hook to get all knowledges

This commit is contained in:
Lucas Oliveira 2025-12-12 15:13:56 -03:00
parent f22f479b1f
commit fb554445ce

View file

@ -1,165 +1,158 @@
"use client"; "use client";
import { Plus } from "lucide-react"; import { Plus } from "lucide-react";
import { useState } from "react"; import { useGetAllFiltersQuery } from "@/app/api/queries/useGetAllFiltersQuery";
import { import type { KnowledgeFilter } from "@/app/api/queries/useGetFiltersSearchQuery";
type KnowledgeFilter,
useGetFiltersSearchQuery,
} from "@/app/api/queries/useGetFiltersSearchQuery";
import { cn } from "@/lib/utils";
import { useKnowledgeFilter } from "@/contexts/knowledge-filter-context"; import { useKnowledgeFilter } from "@/contexts/knowledge-filter-context";
import { cn } from "@/lib/utils";
import { import {
type FilterColor, type FilterColor,
type IconKey, type IconKey,
iconKeyToComponent, iconKeyToComponent,
} from "./filter-icon-popover"; } from "./filter-icon-popover";
import { filterAccentClasses } from "./knowledge-filter-panel"; import { filterAccentClasses } from "./knowledge-filter-panel";
interface ParsedQueryData { interface ParsedQueryData {
query: string; query: string;
filters: { filters: {
data_sources: string[]; data_sources: string[];
document_types: string[]; document_types: string[];
owners: string[]; owners: string[];
}; };
limit: number; limit: number;
scoreThreshold: number; scoreThreshold: number;
color: FilterColor; color: FilterColor;
icon: IconKey; icon: IconKey;
} }
interface KnowledgeFilterListProps { interface KnowledgeFilterListProps {
selectedFilter: KnowledgeFilter | null; selectedFilter: KnowledgeFilter | null;
onFilterSelect: (filter: KnowledgeFilter | null) => void; onFilterSelect: (filter: KnowledgeFilter | null) => void;
} }
export function KnowledgeFilterList({ export function KnowledgeFilterList({
selectedFilter, selectedFilter,
onFilterSelect, onFilterSelect,
}: KnowledgeFilterListProps) { }: KnowledgeFilterListProps) {
const [searchQuery] = useState(""); const { startCreateMode } = useKnowledgeFilter();
const { startCreateMode } = useKnowledgeFilter();
const { data, isFetching: loading } = useGetFiltersSearchQuery( const { data, isFetching: loading } = useGetAllFiltersQuery();
searchQuery,
20,
);
const filters = data || []; const filters = data || [];
const handleFilterSelect = (filter: KnowledgeFilter) => { const handleFilterSelect = (filter: KnowledgeFilter) => {
if (filter.id === selectedFilter?.id) { if (filter.id === selectedFilter?.id) {
onFilterSelect(null); onFilterSelect(null);
return; return;
} }
onFilterSelect(filter); onFilterSelect(filter);
}; };
const handleCreateNew = () => { const handleCreateNew = () => {
startCreateMode(); startCreateMode();
}; };
const parseQueryData = (queryData: string): ParsedQueryData => { const parseQueryData = (queryData: string): ParsedQueryData => {
return JSON.parse(queryData) as ParsedQueryData; return JSON.parse(queryData) as ParsedQueryData;
}; };
return ( return (
<div className="flex-1 min-h-0 flex flex-col"> <div className="flex-1 min-h-0 flex flex-col">
<div className="px-3 flex-1 min-h-0 flex flex-col"> <div className="px-3 flex-1 min-h-0 flex flex-col">
<div className="flex-shrink-0"> <div className="flex-shrink-0">
<div className="flex items-center justify-between mb-3 mr-2 ml-4"> <div className="flex items-center justify-between mb-3 mr-2 ml-4">
<h3 className="text-xs font-medium text-muted-foreground"> <h3 className="text-xs font-medium text-muted-foreground">
Knowledge Filters Knowledge Filters
</h3> </h3>
<button <button
type="button" type="button"
className="p-1 hover:bg-accent rounded" className="p-1 hover:bg-accent rounded"
onClick={handleCreateNew} onClick={handleCreateNew}
title="Create New Filter" title="Create New Filter"
> >
<Plus className="h-4 w-4 text-muted-foreground" /> <Plus className="h-4 w-4 text-muted-foreground" />
</button> </button>
</div> </div>
<div className="overflow-y-auto scrollbar-hide space-y-1"> <div className="overflow-y-auto scrollbar-hide space-y-1">
{loading ? ( {loading ? (
<div className="text-[13px] text-muted-foreground p-2 ml-2"> <div className="text-[13px] text-muted-foreground p-2 ml-2">
Loading... Loading...
</div> </div>
) : filters.length === 0 ? ( ) : filters.length === 0 ? (
<div className="text-[13px] text-muted-foreground pb-2 pt-3 ml-4"> <div className="text-[13px] text-muted-foreground pb-2 pt-3 ml-4">
{searchQuery ? "No filters found" : "No saved filters"} No saved filters
</div> </div>
) : ( ) : (
filters.map((filter) => ( filters.map((filter) => (
<div <div
key={filter.id} key={filter.id}
onClick={() => handleFilterSelect(filter)} onClick={() => handleFilterSelect(filter)}
className={cn( className={cn(
"flex items-center gap-3 px-3 py-2 w-full rounded-lg hover:bg-accent hover:text-accent-foreground cursor-pointer group transition-colors", "flex items-center gap-3 px-3 py-2 w-full rounded-lg hover:bg-accent hover:text-accent-foreground cursor-pointer group transition-colors",
selectedFilter?.id === filter.id && selectedFilter?.id === filter.id &&
"active bg-accent text-accent-foreground", "active bg-accent text-accent-foreground",
)} )}
> >
<div className="flex flex-col gap-1 flex-1 min-w-0"> <div className="flex flex-col gap-1 flex-1 min-w-0">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
{(() => { {(() => {
const parsed = parseQueryData( const parsed = parseQueryData(
filter.query_data, filter.query_data,
) as ParsedQueryData; ) as ParsedQueryData;
const Icon = iconKeyToComponent(parsed.icon); const Icon = iconKeyToComponent(parsed.icon);
return ( return (
<div <div
className={cn( className={cn(
"flex items-center justify-center w-5 h-5 rounded transition-colors", "flex items-center justify-center w-5 h-5 rounded transition-colors",
filterAccentClasses[parsed.color], filterAccentClasses[parsed.color],
parsed.color === "zinc" && parsed.color === "zinc" &&
"group-hover:bg-background group-[.active]:bg-background", "group-hover:bg-background group-[.active]:bg-background",
)} )}
> >
{Icon && <Icon className="h-3 w-3" />} {Icon && <Icon className="h-3 w-3" />}
</div> </div>
); );
})()} })()}
<div className="text-sm font-medium truncate group-hover:text-accent-foreground"> <div className="text-sm font-medium truncate group-hover:text-accent-foreground">
{filter.name} {filter.name}
</div> </div>
</div> </div>
{filter.description && ( {filter.description && (
<div className="text-xs text-muted-foreground line-clamp-2"> <div className="text-xs text-muted-foreground line-clamp-2">
{filter.description} {filter.description}
</div> </div>
)} )}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<div className="text-xs text-muted-foreground"> <div className="text-xs text-muted-foreground">
{new Date(filter.created_at).toLocaleDateString( {new Date(filter.created_at).toLocaleDateString(
undefined, undefined,
{ {
month: "short", month: "short",
day: "numeric", day: "numeric",
year: "numeric", year: "numeric",
}, },
)} )}
</div> </div>
<span className="text-xs bg-muted text-muted-foreground px-1 py-0.5 rounded-sm group-hover:bg-background group-[.active]:bg-background transition-colors"> <span className="text-xs bg-muted text-muted-foreground px-1 py-0.5 rounded-sm group-hover:bg-background group-[.active]:bg-background transition-colors">
{(() => { {(() => {
const dataSources = parseQueryData(filter.query_data) const dataSources = parseQueryData(filter.query_data)
.filters.data_sources; .filters.data_sources;
if (dataSources[0] === "*") return "All sources"; if (dataSources[0] === "*") return "All sources";
const count = dataSources.length; const count = dataSources.length;
return `${count} ${ return `${count} ${
count === 1 ? "source" : "sources" count === 1 ? "source" : "sources"
}`; }`;
})()} })()}
</span> </span>
</div> </div>
</div> </div>
</div> </div>
)) ))
)} )}
</div> </div>
</div> </div>
{/* Create flow moved to panel create mode */} {/* Create flow moved to panel create mode */}
</div> </div>
</div> </div>
); );
} }