diff --git a/services/web/frontend/js/features/project-list/context/project-list-context.tsx b/services/web/frontend/js/features/project-list/context/project-list-context.tsx index 5a376344d2..aabc726fca 100644 --- a/services/web/frontend/js/features/project-list/context/project-list-context.tsx +++ b/services/web/frontend/js/features/project-list/context/project-list-context.tsx @@ -15,7 +15,6 @@ import { useContext, useEffect, useMemo, - useRef, useState, } from 'react' import { Tag } from '../../../../../app/src/Features/Tags/types' @@ -126,7 +125,6 @@ export function ProjectListProvider({ children }: ProjectListProviderProps) { 'project-list-filter', 'all' ) - const prevSortRef = useRef(sort) const [selectedTagId, setSelectedTagId] = usePersistedState< string | undefined >('project-list-selected-tag-id', undefined) @@ -158,15 +156,28 @@ export function ProjectListProvider({ children }: ProjectListProviderProps) { }) }, [prefetchedProjectsBlob, runAsync]) + // Search related effects + useEffect(() => { + if (!searchText.length) { + return + } + + const filteredProjects = loadedProjects.filter(project => + project.name.toLowerCase().includes(searchText.toLowerCase()) + ) + + setVisibleProjects(filteredProjects) + }, [searchText, loadedProjects]) + + // Sort related effects + useEffect(() => { + setLoadedProjects(loadedProjects => sortProjects(loadedProjects, sort)) + }, [sort]) + + // Filters/Tags and load more related effects useEffect(() => { let filteredProjects = [...loadedProjects] - if (searchText.length) { - filteredProjects = filteredProjects.filter(project => - project.name.toLowerCase().includes(searchText.toLowerCase()) - ) - } - if (selectedTagId !== undefined) { if (selectedTagId === UNCATEGORIZED_KEY) { const taggedProjectIds = uniq(flatten(tags.map(tag => tag.project_ids))) @@ -191,12 +202,7 @@ export function ProjectListProvider({ children }: ProjectListProviderProps) { filteredProjects = arrayFilter(filteredProjects, filters[filter]) } - if (prevSortRef.current !== sort) { - filteredProjects = sortProjects(filteredProjects, sort) - const loadedProjectsSorted = sortProjects(loadedProjects, sort) - setLoadedProjects(loadedProjectsSorted) - } - + // load more if (filteredProjects.length > maxVisibleProjects) { const visibleFilteredProjects = filteredProjects.slice( 0, @@ -220,21 +226,15 @@ export function ProjectListProvider({ children }: ProjectListProviderProps) { setHiddenProjectsCount(0) } }, [ + filter, loadedProjects, maxVisibleProjects, - tags, - filter, - setFilter, selectedTagId, + setFilter, setSelectedTagId, - searchText, - sort, + tags, ]) - useEffect(() => { - prevSortRef.current = sort - }, [sort]) - const showAllProjects = useCallback(() => { setLoadMoreCount(0) setHiddenProjectsCount(0)