import React, { useState, useEffect } from "react"; import { View, Text, TouchableOpacity, FlatList, KeyboardAvoidingView, TextInput, Platform, Keyboard, ScrollView, Linking, } from "react-native"; import { useAllTrainDiagram } from "../stateBox/useAllTrainDiagram"; import { customTrainDataDetector } from "./custom-train-data"; import { getTrainType } from "../lib/getTrainType"; import { SheetManager } from "react-native-actions-sheet"; import { useNavigation } from "@react-navigation/native"; import { BigButton } from "./atom/BigButton"; import { Switch } from "react-native-elements"; export default function AllTrainDiagramView() { const { goBack, navigate } = useNavigation(); const { keyList, allTrainDiagram } = useAllTrainDiagram(); const [input, setInput] = useState(""); // 文字入力 const [keyBoardVisible, setKeyBoardVisible] = useState(false); const [useStationName, setUseStationName] = useState(false); const [useRegex, setUseRegex] = useState(false); const regexTextStyle = { color: "white", fontSize: 20, margin: 3, padding: 3, }; const regexTextButtonStyle = { ...regexTextStyle, borderWidth: 1, borderColor: "white", borderRadius: 3, }; useEffect(() => { const showSubscription = Keyboard.addListener("keyboardDidShow", () => { setKeyBoardVisible(true); }); const hideSubscription = Keyboard.addListener("keyboardDidHide", () => { setKeyBoardVisible(false); }); return () => { showSubscription.remove(); hideSubscription.remove(); }; }, []); const openTrainInfo = (d) => { const train = customTrainDataDetector(d); let TrainNumber = ""; if (train.trainNumDistance != undefined) { const timeInfo = parseInt(d.replace("M", "").replace("D", "")) - train.trainNumDistance; TrainNumber = timeInfo + "号"; } const type = getTrainType(train.type).data; const limited = `${type}:${train.trainName}${TrainNumber}`; const payload = { data: { trainNum: d, limited }, navigate, from: "AllTrainIDList", }; SheetManager.show("EachTrainInfo", { payload, }); }; return ( { if (useStationName) { const ls = input.split(",").map((stationName) => { return allTrainDiagram[d].includes(stationName); }); return !ls.includes(false); } if (useRegex) { try { const regex = new RegExp(input); return regex.test(d); } catch (e) { return false; } } return d.includes(input); })} renderItem={({ item }) => } keyExtractor={(item) => item} //initialNumToRender={100} /> { setUseRegex(!useRegex); setUseStationName(false); }} color="red" style={{ margin: 5 }} /> 正規表現を使用 { setUseRegex(false); setUseStationName(!useStationName); }} color="red" style={{ margin: 5 }} /> 駅名で検索 正規表現のサンプル: setInput("D")}> 気動車を選択 setInput("3\\d\\d\\dM")} > マリンライナーを選択 setInput("[4,5]\\d\\d\\d[D,M]")} > ワンマン列車を選択 setInput("^\\d?\\dM")} > しおかぜを選択 setInput("^\\d?[0,2,4,6,8]D")} > 下り南風を選択 setInput("^([\\d])+\\1")} > 数字が二桁揃っている列車を選択 Linking.openURL( "https://qiita.com/tossh/items/635aea9a529b9deb3038" ) } > 参考資料(Qiita) setKeyBoardVisible(true)} onEndEditing={() => {}} onChange={(ret) => setInput(ret.nativeEvent.text)} value={input} style={{ flex: 1 }} /> ); } const Item = ({ id, openTrainInfo }) => { return ( openTrainInfo(id)} > {id} ); };