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,
}: SearchTypeButtonProps) {
const [open, setOpen] = useState(false);
const [currentSearchSources, setCurrentSearchSources] = useState<
SearchSource[]
>(selectedSearchSources);
const buttonText = useMemo(() => {
if (isMobile) {
@ -847,8 +844,6 @@ function SearchTypeButton({
const content = (
<SearchTypeContent
selectedSearchSources={selectedSearchSources}
currentSearchSources={currentSearchSources}
setCurrentSearchSources={setCurrentSearchSources}
updateSearchSourceFilter={updateSearchSourceFilter}
onClose={() => setOpen(false)}
/>
@ -859,10 +854,6 @@ function SearchTypeButton({
<Drawer
open={open}
onOpenChange={(open) => {
if (!open) {
setCurrentSearchSources(selectedSearchSources);
}
setOpen(open);
}}
>
@ -878,10 +869,6 @@ function SearchTypeButton({
<Popover
open={open}
onOpenChange={(open) => {
if (!open) {
setCurrentSearchSources(selectedSearchSources);
}
setOpen(open);
}}
>
@ -893,25 +880,25 @@ function SearchTypeButton({
type SearchTypeContentProps = {
selectedSearchSources: SearchSource[];
currentSearchSources: SearchSource[];
setCurrentSearchSources: (sources: SearchSource[]) => void;
updateSearchSourceFilter: (sources: SearchSource[]) => void;
onClose: () => void;
};
export function SearchTypeContent({
selectedSearchSources,
currentSearchSources,
setCurrentSearchSources,
updateSearchSourceFilter,
onClose,
}: SearchTypeContentProps) {
const [currentSearchSources, setCurrentSearchSources] = useState<
SearchSource[]
>(selectedSearchSources);
return (
<>
<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">
<FilterSwitch
label="Thumbnail Image"
isChecked={currentSearchSources?.includes("thumbnail") ?? false}
isChecked={selectedSearchSources?.includes("thumbnail") ?? false}
onCheckedChange={(isChecked) => {
const updatedSources = currentSearchSources
? [...currentSearchSources]

View File

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

View File

@ -1,6 +1,6 @@
import { useApiFilterArgs } from "@/hooks/use-api-filter";
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 { RecordingStartingPoint } from "@/types/record";
import {
@ -46,37 +46,23 @@ export default function Explore() {
const [similaritySearch, setSimilaritySearch] =
useState<PartialSearchResult>();
useEffect(() => {
if (
config?.semantic_search.enabled &&
searchSearchParams["search_type"] == "similarity" &&
searchSearchParams["event_id"]?.length != 0 &&
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(() => {
const updateFilterWithSimilarity = useCallback(
(similaritySearch: PartialSearchResult) => {
let newFilter = searchFilter;
setSimilaritySearch(similaritySearch);
if (similaritySearch) {
newFilter = {
...searchFilter,
// @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,
};
}
@ -84,9 +70,13 @@ export default function Explore() {
if (newFilter) {
setSearchFilter(newFilter);
}
// don't rerun when the filter updates
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [similaritySearch, setSearchFilter]);
},
[searchFilter, setSearchFilter],
);
useSearchEffect("similarity_search_id", (similarityId) => {
updateFilterWithSimilarity({ id: similarityId });
});
useEffect(() => {
if (similaritySearch) {
@ -261,7 +251,7 @@ export default function Explore() {
isLoading={isLoading}
setSearch={setSearch}
similaritySearch={similaritySearch}
setSimilaritySearch={setSimilaritySearch}
setSimilaritySearch={updateFilterWithSimilarity}
onUpdateFilter={onUpdateFilter}
onOpenSearch={onOpenSearch}
/>