import React, { useEffect, useMemo, useRef, useState } from "react"; import { FlatList, KeyboardAvoidingView, Modal, Pressable, TextInput, View, } from "react-native"; import { ProjectItem } from "./ProjectItem"; import { Project } from "contract-models"; import RemixIcon from "react-native-remix-icon"; import Fuse from "fuse.js"; interface ProjectSelectModalProps extends React.PropsWithChildren { projects: Project[]; projectModalOpen: boolean; setProjectModalOpen: (value: boolean) => void; selectedProjectId: Project["id"] | null; onSelectProject: (id: Project["id"]) => void; } export default function ProjectSelectModal(props: ProjectSelectModalProps) { const searchRef = useRef(null); useEffect(() => { if (!props.projectModalOpen) return; setTimeout(() => searchRef.current?.focus(), 100); }, [props.projectModalOpen]); const [search, setSearch] = useState(""); useEffect(() => { setSearch(""); }, [props.projectModalOpen]); const filteredProjects = useMemo(() => { if (!search) return props.projects; const fuse = new Fuse(props.projects, { keys: ["title"], }); return fuse.search(search).map((project) => { return project.item; }); }, [search, props.projects]); return ( props.setProjectModalOpen(false)} animationType="fade" > ( props.onSelectProject(item.id)}> )} > searchRef.current?.focus()} > ); }