import { useLazyQuery, useQuery } from "@apollo/client"; import { Ionicons } from "@expo/vector-icons"; import React from "react"; import { useTranslation } from "react-i18next"; import { FlatList, Keyboard, KeyboardAvoidingView, RefreshControl, Text, View, } from "react-native"; import { Button, List, Modal, Portal, Searchbar } from "react-native-paper"; import { connect } from "react-redux"; import { SEARCH_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; import ErrorDisplay from "../error-display/error-display.component"; import _ from "lodash"; import { useCallback, useRef, useEffect } from "react"; const useIsMounted = () => { const isMounted = useRef(false); useEffect(() => { isMounted.current = true; return () => { isMounted.current = false; }; }, []); return isMounted.current; }; export function JobSearchAndSelectModal(props) { const { t } = useTranslation(); const jobSrchNotExported = props?.notExported !== undefined ? props.notExported : true; const jobSrchNotInvoiced = props?.notInvoiced !== undefined ? props.notInvoiced : false; const jobSrchConvertedOnly = props?.convertedOnly !== undefined ? props.convertedOnly : false; const jobSrchCurrentValue = props?.currentValue !== undefined ? props.currentValue : { id: "temp", ro_number: t("selectjobid.labels.noselection") }; const jobSrchOnSetCurrentValue = props?.onSetCurrentValue !== undefined ? props.onSetCurrentValue : (e) => { console.info("onSetCurrentValue was called", e); }; const [visible, setVisible] = React.useState(false); const [searchText, setSearchText] = React.useState(""); const showModal = () => setVisible(true); const hideModal = () => setVisible(false); const [searchQuery, { loading, error, data, refetch }] = useLazyQuery( SEARCH_JOBS_FOR_AUTOCOMPLETE, { fetchPolicy: "cache-and-network" } ); if (error) return ; const onRefresh = async () => { refetch({ notInvoiced: jobSrchNotInvoiced, notExported: jobSrchNotExported, isConverted: jobSrchConvertedOnly, search: searchText, }); }; const search = (v) => { if (v && v !== "") searchQuery(v); }; const searchDebouncer = useCallback(_.debounce(search, 1000), []); const onChangeSearch = (query) => { setSearchText(query); searchDebouncer({ variables: { search: query, ...(jobSrchConvertedOnly || jobSrchNotExported ? { ...(jobSrchConvertedOnly ? { isConverted: true } : {}), ...(jobSrchNotExported ? { notExported: true } : {}), ...(jobSrchNotInvoiced ? { notInvoiced: true } : {}), } : {}), }, }); }; const inputSearch = useRef(null); const isMounted = useIsMounted(); const setFocus = useCallback(() => { if (inputSearch.current) { inputSearch.current.focus(); } }, []); useEffect(() => { setTimeout(() => { if (visible) { setFocus(); } }, 300); }, [visible, isMounted]); return ( <> } data={data?.search_jobs} keyExtractor={(item) => item.id} renderItem={(object) => ( { jobSrchOnSetCurrentValue(object.item); hideModal(); setSearchText(""); }} left={() => { if (object.item.id !== jobSrchCurrentValue?.id) return null; return ( ); }} titleStyle={{ ...(object.item.id === jobSrchCurrentValue?.id ? { color: "dodgerblue" } : {}), }} title={`${ object.item.ro_number ? `${object.item.ro_number} ` : `` }${object.item.ownr_fn || ""} ${object.item.ownr_ln || ""}${ object.item.v_model_yr ? `- ${object.item.v_model_yr}` : "" }${ object.item.v_make_desc ? `- ${object.item.v_make_desc}` : "" }${ object.item.v_model_desc ? `- ${object.item.v_model_desc}` : "" }`} key={object.item.id} /> )} ListEmptyComponent={ {t("selectjobid.labels.nodata")} } /> ); } export default connect(null, null)(JobSearchAndSelectModal);