From 82c6484ca1c9f9cb26a22f045b5a90154c9f65c1 Mon Sep 17 00:00:00 2001 From: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Date: Fri, 21 Oct 2022 14:33:27 +0300 Subject: [PATCH] Merge pull request #10089 from overleaf/ii-project-list-provider-effects-refactoring [web] Projects list provider refactoring GitOrigin-RevId: e53fcdd32e5493d438d46f4a1bbca049a1967f5c --- .../context/project-list-context.tsx | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) 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)