import lineColorList from "@/assets/originData/lineColorList"; import { useStationList } from "@/stateBox/useStationList"; import { FC, useEffect, useState } from "react"; import { View, Text, ScrollView, TouchableOpacity, LayoutAnimation, } from "react-native"; type hoge = { trainNumber: string; array: string; name: string; timeType: string; time: string; }[]; export const SearchInputSuggestBox: FC<{ input: string; setInput: (f: string) => void; currentStationDiagram: hoge; }> = ({ input, setInput, currentStationDiagram }) => { const { getStationDataFromName } = useStationList(); const [stationList, setStationList] = useState< { stationName: string; number: string[]; }[] >([]); const [listFiltered, setListFiltered] = useState(""); const [filteredStationLine, setFilteredStationLine] = useState([]); useEffect(() => { const x: { stationName: string; number: string[] }[] = []; currentStationDiagram.forEach((d) => { d.array.split("#").forEach((s) => { if (s == "") return; const [stationName, type, time] = s.split(","); if (!x.find((item) => item.stationName === stationName)) { if (!type?.includes("通")) { const stationData = getStationDataFromName(stationName); if (listFiltered === "その他") { if (stationData.length === 0) { x.push({ stationName, number: stationData.map((item) => item.StationNumber), }); return; } } const filter = stationData.filter((s) => { if (listFiltered === "") return true; if (listFiltered === "その他") { return !( s.StationNumber ? s.StationNumber.slice(0, 1) : "" ).match(/[A-Z]/); } return ( s.StationNumber ? s.StationNumber.slice(0, 1) : "" ).includes(listFiltered); }); if (filter.length === 0) return; x.push({ stationName, number: stationData.map((item) => item.StationNumber), }); } } }); }); setStationList(x); }, [currentStationDiagram, listFiltered]); useEffect(() => { const filtered = stationList .map((s) => s.number?.map((r) => (r ? r.slice(0, 1) : ""))) .flat(); const arrayB = Array.from(new Set(filtered)); setFilteredStationLine(arrayB.map((r) => (r !== "" ? r : "その他"))); }, [stationList]); return ( {input} {stationList.map(({ stationName, number }) => ( setInput(stationName)} > {stationName} ))} { LayoutAnimation.configureNext({ duration: 400, update: { type: "easeInEaseOut", springDamping: 0.6 }, }); setListFiltered(""); }} > 全て {filteredStationLine.map((line) => ( { LayoutAnimation.configureNext({ duration: 400, update: { type: "easeInEaseOut", springDamping: 0.6 }, }); setListFiltered(line); }} > {line} ))} ); };