Update logic for similarity search

This commit is contained in:
Nicolas Mowen 2024-09-11 08:11:38 -06:00
parent c1ea5cd19d
commit 856ea7d82d
3 changed files with 35 additions and 63 deletions

View File

@ -804,9 +804,6 @@ function SearchTypeButton({
updateSearchSourceFilter, updateSearchSourceFilter,
}: SearchTypeButtonProps) { }: SearchTypeButtonProps) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [currentSearchSources, setCurrentSearchSources] = useState<
SearchSource[]
>(selectedSearchSources);
const buttonText = useMemo(() => { const buttonText = useMemo(() => {
if (isMobile) { if (isMobile) {
@ -847,8 +844,6 @@ function SearchTypeButton({
const content = ( const content = (
<SearchTypeContent <SearchTypeContent
selectedSearchSources={selectedSearchSources} selectedSearchSources={selectedSearchSources}
currentSearchSources={currentSearchSources}
setCurrentSearchSources={setCurrentSearchSources}
updateSearchSourceFilter={updateSearchSourceFilter} updateSearchSourceFilter={updateSearchSourceFilter}
onClose={() => setOpen(false)} onClose={() => setOpen(false)}
/> />
@ -859,10 +854,6 @@ function SearchTypeButton({
<Drawer <Drawer
open={open} open={open}
onOpenChange={(open) => { onOpenChange={(open) => {
if (!open) {
setCurrentSearchSources(selectedSearchSources);
}
setOpen(open); setOpen(open);
}} }}
> >
@ -878,10 +869,6 @@ function SearchTypeButton({
<Popover <Popover
open={open} open={open}
onOpenChange={(open) => { onOpenChange={(open) => {
if (!open) {
setCurrentSearchSources(selectedSearchSources);
}
setOpen(open); setOpen(open);
}} }}
> >
@ -893,25 +880,25 @@ function SearchTypeButton({
type SearchTypeContentProps = { type SearchTypeContentProps = {
selectedSearchSources: SearchSource[]; selectedSearchSources: SearchSource[];
currentSearchSources: SearchSource[];
setCurrentSearchSources: (sources: SearchSource[]) => void;
updateSearchSourceFilter: (sources: SearchSource[]) => void; updateSearchSourceFilter: (sources: SearchSource[]) => void;
onClose: () => void; onClose: () => void;
}; };
export function SearchTypeContent({ export function SearchTypeContent({
selectedSearchSources, selectedSearchSources,
currentSearchSources,
setCurrentSearchSources,
updateSearchSourceFilter, updateSearchSourceFilter,
onClose, onClose,
}: SearchTypeContentProps) { }: SearchTypeContentProps) {
const [currentSearchSources, setCurrentSearchSources] = useState<
SearchSource[]
>(selectedSearchSources);
return ( return (
<> <>
<div className="scrollbar-container h-auto max-h-[80dvh] overflow-y-auto overflow-x-hidden"> <div className="scrollbar-container h-auto max-h-[80dvh] overflow-y-auto overflow-x-hidden">
<div className="my-2.5 flex flex-col gap-2.5"> <div className="my-2.5 flex flex-col gap-2.5">
<FilterSwitch <FilterSwitch
label="Thumbnail Image" label="Thumbnail Image"
isChecked={currentSearchSources?.includes("thumbnail") ?? false} isChecked={selectedSearchSources?.includes("thumbnail") ?? false}
onCheckedChange={(isChecked) => { onCheckedChange={(isChecked) => {
const updatedSources = currentSearchSources const updatedSources = currentSearchSources
? [...currentSearchSources] ? [...currentSearchSources]

View File

@ -338,12 +338,7 @@ function EventItem({
<Chip <Chip
className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500" className="cursor-pointer rounded-md bg-gray-500 bg-gradient-to-br from-gray-400 to-gray-500"
onClick={() => { onClick={() => {
const similaritySearchParams = new URLSearchParams({ navigate(`/explore?similarity_search_id=${event.id}`);
search_type: "similarity",
event_id: event.id,
}).toString();
navigate(`/explore?${similaritySearchParams}`);
}} }}
> >
<FaImages className="size-4 text-white" /> <FaImages className="size-4 text-white" />

View File

@ -1,6 +1,6 @@
import { useApiFilterArgs } from "@/hooks/use-api-filter"; import { useApiFilterArgs } from "@/hooks/use-api-filter";
import { useCameraPreviews } from "@/hooks/use-camera-previews"; import { useCameraPreviews } from "@/hooks/use-camera-previews";
import { useOverlayState } from "@/hooks/use-overlay-state"; import { useOverlayState, useSearchEffect } from "@/hooks/use-overlay-state";
import { FrigateConfig } from "@/types/frigateConfig"; import { FrigateConfig } from "@/types/frigateConfig";
import { RecordingStartingPoint } from "@/types/record"; import { RecordingStartingPoint } from "@/types/record";
import { import {
@ -46,47 +46,37 @@ export default function Explore() {
const [similaritySearch, setSimilaritySearch] = const [similaritySearch, setSimilaritySearch] =
useState<PartialSearchResult>(); useState<PartialSearchResult>();
useEffect(() => { const updateFilterWithSimilarity = useCallback(
if ( (similaritySearch: PartialSearchResult) => {
config?.semantic_search.enabled && let newFilter = searchFilter;
searchSearchParams["search_type"] == "similarity" && setSimilaritySearch(similaritySearch);
searchSearchParams["event_id"]?.length != 0 && if (similaritySearch) {
searchFilter
) {
setSimilaritySearch({
id: searchSearchParams["event_id"],
});
// remove event id from url params
const { event_id: _event_id, ...newFilter } = searchFilter;
setSearchFilter(newFilter);
}
// only run similarity search with event_id in the url when coming from review
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
let newFilter = searchFilter;
if (similaritySearch) {
newFilter = {
...searchFilter,
search_type: ["similarity"] as SearchSource[],
};
} else {
if (searchFilter?.search_type?.includes("similarity" as SearchSource)) {
newFilter = { newFilter = {
...searchFilter, ...searchFilter,
search_type: undefined, // @ts-expect-error we want to set this
similarity_search_id: undefined,
search_type: ["similarity"] as SearchSource[],
}; };
} else {
if (searchFilter?.search_type?.includes("similarity" as SearchSource)) {
newFilter = {
...searchFilter,
// @ts-expect-error we want to set this
similarity_search_id: undefined,
search_type: undefined,
};
}
} }
} if (newFilter) {
if (newFilter) { setSearchFilter(newFilter);
setSearchFilter(newFilter); }
} },
// don't rerun when the filter updates [searchFilter, setSearchFilter],
// eslint-disable-next-line react-hooks/exhaustive-deps );
}, [similaritySearch, setSearchFilter]);
useSearchEffect("similarity_search_id", (similarityId) => {
updateFilterWithSimilarity({ id: similarityId });
});
useEffect(() => { useEffect(() => {
if (similaritySearch) { if (similaritySearch) {
@ -261,7 +251,7 @@ export default function Explore() {
isLoading={isLoading} isLoading={isLoading}
setSearch={setSearch} setSearch={setSearch}
similaritySearch={similaritySearch} similaritySearch={similaritySearch}
setSimilaritySearch={setSimilaritySearch} setSimilaritySearch={updateFilterWithSimilarity}
onUpdateFilter={onUpdateFilter} onUpdateFilter={onUpdateFilter}
onOpenSearch={onOpenSearch} onOpenSearch={onOpenSearch}
/> />