mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-14 15:15:22 +03:00
Update logic for similarity search
This commit is contained in:
parent
c1ea5cd19d
commit
856ea7d82d
@ -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]
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user