diff --git a/src/components/ProjectDropDown/ProjectDropDown.js b/src/components/ProjectDropDown/ProjectDropDown.js index b6049e8..0ce6825 100644 --- a/src/components/ProjectDropDown/ProjectDropDown.js +++ b/src/components/ProjectDropDown/ProjectDropDown.js @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, useRef, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { FlatList, Image, @@ -66,30 +66,36 @@ const ProjectDropDown = ({ }) : normalizedProjects; - const toggleDropdown = () => { + const toggleDropdown = useCallback(() => { if (isDisabled) { return; } setIsOpen((prev) => !prev); - }; + }, [isDisabled]); - const closeDropdown = () => setIsOpen(false); + const closeDropdown = useCallback(() => setIsOpen(false), []); - const handleSelect = (project) => { - if (!project?.id) return; - onSelectProject?.(project); - closeDropdown(); - }; + const handleSelect = useCallback( + (project) => { + if (!project?.id) return; + onSelectProject?.(project); + closeDropdown(); + }, + [closeDropdown, onSelectProject], + ); - const handleModify = (project, topPosition) => { - if (!project?.id) return; - onModifyProject?.(project, topPosition); - }; + const handleModify = useCallback( + (project, topPosition) => { + if (!project?.id) return; + onModifyProject?.(project, topPosition); + }, + [onModifyProject], + ); - const handleCreate = () => { + const handleCreate = useCallback(() => { onCreateProject?.(); closeDropdown(); - }; + }, [closeDropdown, onCreateProject]); const dropdownWidth = useMemo( () => triggerLayout?.width || 0, @@ -124,35 +130,26 @@ const ProjectDropDown = ({ /> - {isOpen && ( - - + + - - + project?.id || project?.title || `project-${index}` @@ -171,14 +168,13 @@ const ProjectDropDown = ({ contentContainerStyle={styles.dropdownListContent} style={styles.dropdownList} /> - - - - )} + + + ); @@ -227,6 +223,10 @@ const ProjectRow = ({ project?.coverUrl || project?.coverUri || (typeof project?.cover === "string" ? project.cover : project?.cover?.uri); + const imageSource = useMemo( + () => (coverUri ? { uri: coverUri } : img.placeholder), + [coverUri], + ); const title = project?.title || (isEmptyProject ? "Nouvelle musique" : "Sans titre"); const formattedDate = !isEmptyProject @@ -245,10 +245,7 @@ const ProjectRow = ({ onLayout={(event) => setLayout(event.nativeEvent.layout)} style={styles.projectRowPressable} > - + @@ -306,6 +303,22 @@ const styles = StyleSheet.create({ position: "relative", zIndex: 3, }, + dropdownOverlay: { + position: "absolute", + top: 0, + left: 0, + borderRadius: 16, + paddingHorizontal: 8, + paddingVertical: 8, + gap: 9, + maxHeight: 400, + zIndex: 4, + elevation: 4, + overflow: "hidden", + }, + dropdownOverlayHidden: { + opacity: 0, + }, dropdownOverlayContent: { maxHeight: 260, width: "100%",