openreplay/frontend/app/hooks/useSessionSearchQueryHandler.ts
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

92 lines
2.8 KiB
TypeScript

import { useEffect, useState } from 'react';
import { useHistory } from 'react-router';
import { JsonUrlConverter } from 'App/utils/search';
import { useStore } from '@/mstore';
import Search from '@/mstore/types/search';
import { getFilterFromJson } from 'Types/filter/newFilter';
interface Props {
onBeforeLoad?: () => Promise<void>;
appliedFilter: Record<string, any>;
loading: boolean;
onLoaded?: () => void;
}
const useSessionSearchQueryHandler = ({
onBeforeLoad,
appliedFilter,
loading,
onLoaded = () => null,
}: Props) => {
const { searchStore } = useStore();
const [beforeHookLoaded, setBeforeHookLoaded] = useState(!onBeforeLoad);
const history = useHistory();
// Apply filter from the query string when the component mounts
useEffect(() => {
const applyFilterFromQuery = async () => {
if (!loading && !searchStore.urlParsed) {
try {
if (onBeforeLoad) {
await onBeforeLoad();
setBeforeHookLoaded(true);
}
const converter = JsonUrlConverter.urlParamsToJson(
history.location.search,
);
const json = getFilterFromJson(converter.toJSON());
const filter = new Search(json);
// // Even if there are no filters, mark URL as parsed
// if (filter.filters.length === 0) {
// searchStore.setUrlParsed();
// return;
// }
// Apply filter first
if (filter.filters.length > 0) {
searchStore.applyFilter(filter, true);
}
// Important: Mark URL as parsed BEFORE fetching
// This prevents the initial fetch when the URL is parsed
searchStore.setUrlParsed();
// Then fetch sessions - this is the only place that should fetch initially
await searchStore.fetchSessions();
onLoaded();
} catch (error) {
console.error('Error applying filter from query:', error);
searchStore.setUrlParsed();
}
}
};
void applyFilterFromQuery();
}, [loading, searchStore, history.location.search, onBeforeLoad]);
// Update the URL whenever the appliedFilter changes
useEffect(() => {
const updateUrlWithFilter = () => {
if (!loading && beforeHookLoaded) {
const query = JsonUrlConverter.jsonToUrlParams(appliedFilter);
history.replace({ search: query });
}
};
updateUrlWithFilter();
}, [appliedFilter, loading, beforeHookLoaded, history]);
// Ensure the URL syncs on remount if already parsed
useEffect(() => {
if (searchStore.urlParsed) {
const query = JsonUrlConverter.jsonToUrlParams(appliedFilter);
history.replace({ search: query });
}
}, [appliedFilter, searchStore.urlParsed, history]);
return null;
};
export default useSessionSearchQueryHandler;