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, projectsRef } from "../../config/firebase"; import useDataFromRef from "../../hooks/useDataFromRef"; import { useGlobal } from "reactn"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; import { navigate } from "../../navigation/NavigationService"; import { gutters, Palette, Style } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { size } from "../../styles/Style"; import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader"; import MusicCard from "./components/MusicCard"; import ResearchHeader from "./components/ResearchHeader"; const Research = () => { const [selected, setSelected] = useState(null); const [search, setSearch] = useState(""); const queryText = useMemo(() => search.trim(), [search]); const [currentUID] = useGlobal("currentUID"); const [autoLoads, setAutoLoads] = useState(0); const usersQueryRef = useMemo(() => { try { if (queryText) { return usersRef .orderBy("userName") .startAt(queryText) .endAt(queryText + "\uf8ff"); } return usersRef.orderBy("userName"); } catch (e) { return null; } }, [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, loadMore: loadMoreUsers, } = useDataFromRef({ ref: usersQueryRef, simpleRef: false, listener: false, condition: !!usersQueryRef, refreshArray: [queryText], usePagination: true, batchSize: 5, }); const filteredUsers = useMemo(() => { const arr = Array.isArray(userResults) ? userResults : []; 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]); useEffect(() => { if (filteredUsers.length < 5 && usersQueryRef && !usersLoading) { if (autoLoads < 3) { setAutoLoads((n) => n + 1); loadMoreUsers(); } } }, [ filteredUsers.length, usersLoading, usersQueryRef, autoLoads, loadMoreUsers, ]); const [menuTop, setMenuTop] = useState(0); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); const onPressMenu = (item) => { if (selected === item) { setSelected(null); } else { setSelected(item); } }; return ( onPressMenu(item)} selected={selected} searchValue={search} onChangeSearch={setSearch} /> {(!selected || selected === "Musiques") && ( {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"} )} )} {(!selected || selected === "Clips") && ( {Array.from({ length: 3 }).map((_, index) => ( Pour Lili ))} )} {(!selected || selected === "Profils") && ( {Array.isArray(filteredUsers) && filteredUsers.slice(0, 5).map((u) => ( navigate(Routes.SingerProfile, { userId: u.id }) } > {u?.userName || "Utilisateur"} ))} {(filteredUsers.length >= 5 || usersLoading) && ( {usersLoading ? "Chargement…" : "Charger plus"} )} )} setShowMenu(false)} inPlaylist={false} projectId={selectedProjectId} /> ); }; export default Research;