diff --git a/.changeset/dry-melons-listen.md b/.changeset/dry-melons-listen.md index 1e09619060..07342fb88e 100644 --- a/.changeset/dry-melons-listen.md +++ b/.changeset/dry-melons-listen.md @@ -2,7 +2,6 @@ '@backstage/plugin-search-backend': minor '@backstage/plugin-search-backend-module-elasticsearch': minor '@backstage/plugin-search-backend-node': minor -'@backstage/plugin-search-backend-module-pg': minor --- numberOfResults is now provided alongside the query result diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts index c1d73c618d..23f8983074 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts @@ -231,7 +231,6 @@ describe('PgSearchEngine', () => { }, ], nextPageCursor: undefined, - numberOfResults: 1, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -289,7 +288,6 @@ describe('PgSearchEngine', () => { }, })), nextPageCursor: 'MQ==', - numberOfResults: 30, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -350,7 +348,6 @@ describe('PgSearchEngine', () => { })) .slice(25), previousPageCursor: 'MA==', - numberOfResults: 5, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index b0e8d0c6d2..f53c433c2f 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -194,7 +194,6 @@ export class PgSearchEngine implements SearchEngine { const previousPageCursor = hasPreviousPage ? encodePageCursor({ page: page - 1 }) : undefined; - const numberOfResults = rows.length; const results = pageRows.map( ({ type, document, highlight }, index): IndexableResult => ({ @@ -216,7 +215,7 @@ export class PgSearchEngine implements SearchEngine { }), ); - return { results, nextPageCursor, previousPageCursor, numberOfResults }; + return { results, nextPageCursor, previousPageCursor }; } } diff --git a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx index 3b758a0c47..b19af6eef8 100644 --- a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx +++ b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx @@ -17,24 +17,34 @@ import React, { useEffect } from 'react'; import { useAnalytics } from '@backstage/core-plugin-api'; import { useSearch } from '../../context'; +import usePrevious from 'react-use/lib/usePrevious'; /** * Capture search event on term change. */ export const TrackSearch = ({ children }: { children: React.ReactChild }) => { + const useHasChanged = (value: any) => { + const previousVal = usePrevious(value); + return previousVal !== value; + }; + const analytics = useAnalytics(); const { term, result } = useSearch(); const numberOfResults = result.value?.numberOfResults ?? undefined; + // Stops the analtyics event from firing before the new search engine response is returned + const hasStartedLoading = useHasChanged(result.loading); + const hasFinishedLoading = hasStartedLoading && !result.loading; + useEffect(() => { - if (term) { - // Capture analytics search event with search term provided as value + if (term && hasFinishedLoading) { + // Capture analytics search event with search term and numberOfResults (provided as value) analytics.captureEvent('search', term, { value: numberOfResults, }); } - }, [analytics, term, numberOfResults]); + }, [analytics, term, numberOfResults, hasFinishedLoading]); return <>{children}; };