diff --git a/src/screens/Library/Research.js b/src/screens/Library/Research.js index 99b5780..a660cdf 100644 --- a/src/screens/Library/Research.js +++ b/src/screens/Library/Research.js @@ -2,7 +2,7 @@ import React, { useEffect, useMemo, useState } from "react"; import { Image, Pressable, ScrollView, Text, View } from "react-native"; import { background, img } from "../../assets"; import MoreMenu from "../../components/MoreMenu"; -import { usersRef } from "../../config/firebase"; +import { usersRef, projectsRef } from "../../config/firebase"; import useDataFromRef from "../../hooks/useDataFromRef"; import { useGlobal } from "reactn"; import Page from "../../layouts/Page"; @@ -36,6 +36,20 @@ const Research = () => { } }, [queryText]); + const projectsQueryRef = useMemo(() => { + try { + if (queryText) { + return projectsRef + .orderBy("title") + .startAt(queryText) + .endAt(queryText + "\uf8ff"); + } + return projectsRef.orderBy("updatedAt", "desc"); + } catch (e) { + return null; + } + }, [queryText]); + const { data: userResults = [], loading: usersLoading, @@ -51,9 +65,35 @@ const Research = () => { }); const filteredUsers = useMemo(() => { const arr = Array.isArray(userResults) ? userResults : []; - return arr.filter((u) => u?.id !== currentUID && u?.userID !== currentUID); + const seen = new Set(); + const unique = []; + for (const u of arr) { + const id = u?.id; + if (!id || seen.has(id)) continue; + if (id === currentUID || u?.userID === currentUID) continue; + seen.add(id); + unique.push(u); + } + return unique; }, [JSON.stringify(userResults), currentUID]); + const { + data: projectResults = [], + loading: projectsLoading, + loadMore: loadMoreProjects, + } = useDataFromRef({ + ref: projectsQueryRef, + simpleRef: false, + listener: false, + condition: !!projectsQueryRef, + refreshArray: [queryText], + usePagination: true, + batchSize: 6, + }); + const filteredProjects = useMemo(() => { + return Array.isArray(projectResults) ? projectResults : []; + }, [JSON.stringify(projectResults)]); + useEffect(() => { setAutoLoads(0); }, [queryText]); @@ -65,7 +105,13 @@ const Research = () => { loadMoreUsers(); } } - }, [filteredUsers.length, usersLoading, usersQueryRef, autoLoads, loadMoreUsers]); + }, [ + filteredUsers.length, + usersLoading, + usersQueryRef, + autoLoads, + loadMoreUsers, + ]); const [menuTop, setMenuTop] = useState(0); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); @@ -105,17 +151,42 @@ const Research = () => { }} > - {Array.from({ length: 3 }).map((_, index) => ( - navigate(Routes.MusicDetails)} - onPressMore={(posTop) => { - setSelectedProjectId(null); - setMenuTop(posTop); - setShowMenu((prev) => !prev || posTop !== menuTop); - }} - /> - ))} + {Array.isArray(filteredProjects) && + filteredProjects.slice(0, 6).map((p) => ( + + navigate(Routes.MusicDetails, { projectId: p.id }) + } + onPressMore={(posTop) => { + setSelectedProjectId(p.id); + setMenuTop(posTop); + setShowMenu((prev) => !prev || posTop !== menuTop); + }} + /> + ))} + {(filteredProjects.length >= 6 || projectsLoading) && ( + + + {projectsLoading ? "Chargement…" : "Charger plus"} + + + )} @@ -171,7 +242,14 @@ const Research = () => { >