Merge commit '7eea78027649dec4dd7492efd8edfb0e61df5eea'
This commit is contained in:
commit
8df32b9c1d
@ -12,7 +12,7 @@ import * as Updates from "expo-updates";
|
|||||||
import { useWindowDimensions } from "react-native";
|
import { useWindowDimensions } from "react-native";
|
||||||
import { ListItem } from "native-base";
|
import { ListItem } from "native-base";
|
||||||
|
|
||||||
const versionCode = "5.1.1";
|
const versionCode = "5.2";
|
||||||
|
|
||||||
export const SettingTopPage = ({ navigate, testNFC, updateAndReload }) => {
|
export const SettingTopPage = ({ navigate, testNFC, updateAndReload }) => {
|
||||||
const { width } = useWindowDimensions();
|
const { width } = useWindowDimensions();
|
||||||
|
@ -1,45 +1,71 @@
|
|||||||
import React, { useRef, useMemo } from "react";
|
import React, { useRef, useState, useEffect } from "react";
|
||||||
import { View, Text, TouchableOpacity, Linking } from "react-native";
|
import { View, Text, TouchableOpacity, Linking } from "react-native";
|
||||||
import MapView, { Marker } from "react-native-maps";
|
import MapView, { Marker } from "react-native-maps";
|
||||||
import { MaterialCommunityIcons } from "@expo/vector-icons";
|
import { MaterialCommunityIcons } from "@expo/vector-icons";
|
||||||
import { useCurrentTrain } from "../stateBox/useCurrentTrain";
|
import { useCurrentTrain } from "../stateBox/useCurrentTrain";
|
||||||
import { useNavigation } from "@react-navigation/native";
|
import { useNavigation } from "@react-navigation/native";
|
||||||
|
import lineColorList from "../assets/originData/lineColorList";
|
||||||
|
import { stationIDPair } from "../lib/getStationList2";
|
||||||
|
import { lineListPair } from "../lib/getStationList";
|
||||||
export default function TrainMenu({ stationData, style }) {
|
export default function TrainMenu({ stationData, style }) {
|
||||||
const { webview } = useCurrentTrain();
|
const { webview } = useCurrentTrain();
|
||||||
const mapRef = useRef();
|
const mapRef = useRef();
|
||||||
const { navigate } = useNavigation();
|
const { navigate } = useNavigation();
|
||||||
const stationPin = useMemo(
|
const [stationPin, setStationPin] = useState([]);
|
||||||
() =>
|
const [selectedLine, setSelectedLine] = useState(undefined);
|
||||||
|
useEffect(() => {
|
||||||
|
const stationPinData = [];
|
||||||
Object.keys(stationData).map((d, indexBase) =>
|
Object.keys(stationData).map((d, indexBase) =>
|
||||||
stationData[d].map((D, index) => {
|
stationData[d].map((D, index) => {
|
||||||
if (!D.StationMap) return null;
|
if (!D.StationMap) return null;
|
||||||
|
if (selectedLine && selectedLine != d) return;
|
||||||
const latlng = D.StationMap.replace(
|
const latlng = D.StationMap.replace(
|
||||||
"https://www.google.co.jp/maps/place/",
|
"https://www.google.co.jp/maps/place/",
|
||||||
""
|
""
|
||||||
).split(",");
|
).split(",");
|
||||||
if (latlng.length == 0) return null;
|
if (latlng.length == 0) return null;
|
||||||
return (
|
stationPinData.push({ D, d, latlng, indexBase: 0, index });
|
||||||
<Marker
|
})
|
||||||
key={index + indexBase}
|
);
|
||||||
coordinate={{
|
setStationPin(stationPinData);
|
||||||
|
}, [stationData, selectedLine]);
|
||||||
|
useEffect(() => {
|
||||||
|
mapRef.current.fitToCoordinates(
|
||||||
|
stationPin.map(({ latlng }) => ({
|
||||||
latitude: parseFloat(latlng[0]),
|
latitude: parseFloat(latlng[0]),
|
||||||
longitude: parseFloat(latlng[1]),
|
longitude: parseFloat(latlng[1]),
|
||||||
}}
|
})),
|
||||||
onPress={() => {
|
{ edgePadding: { top: 100, bottom: 50, left: 50, right: 50 } } // Add margin values here
|
||||||
webview.current?.injectJavaScript(
|
|
||||||
`MoveDisplayStation('${d}_${D.MyStation}_${D.Station_JP}');
|
|
||||||
setStrings();`
|
|
||||||
);
|
|
||||||
if (navigate) navigate("Apps");
|
|
||||||
}}
|
|
||||||
></Marker>
|
|
||||||
);
|
|
||||||
})
|
|
||||||
),
|
|
||||||
[stationData]
|
|
||||||
);
|
);
|
||||||
|
}, [stationPin]);
|
||||||
return (
|
return (
|
||||||
<View style={{ height: "100%", backgroundColor: "#0099CC", ...style }}>
|
<View style={{ height: "100%", backgroundColor: "#0099CC", ...style }}>
|
||||||
|
{selectedLine && (
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
position: "absolute",
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
backgroundColor: lineColorList[stationIDPair[selectedLine]],
|
||||||
|
padding: 10,
|
||||||
|
zIndex: 100,
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
color: "white",
|
||||||
|
fontWeight: "bold",
|
||||||
|
fontSize: 20,
|
||||||
|
textAlign: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{selectedLine ? lineListPair[stationIDPair[selectedLine]] : "全線"}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
<MapView
|
<MapView
|
||||||
style={{ flex: 1, width: "100%", height: "100%" }}
|
style={{ flex: 1, width: "100%", height: "100%" }}
|
||||||
showsUserLocation={true}
|
showsUserLocation={true}
|
||||||
@ -56,8 +82,54 @@ export default function TrainMenu({ stationData, style }) {
|
|||||||
longitudeDelta: 1.8,
|
longitudeDelta: 1.8,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{stationPin}
|
{stationPin.map(({ D, d, latlng, indexBase, index }) => (
|
||||||
|
<MapPin
|
||||||
|
index={index}
|
||||||
|
indexBase={indexBase}
|
||||||
|
latlng={latlng}
|
||||||
|
D={D}
|
||||||
|
d={d}
|
||||||
|
navigate={navigate}
|
||||||
|
webview={webview}
|
||||||
|
key={index + indexBase}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
</MapView>
|
</MapView>
|
||||||
|
<View style={{ position: "relative" }}>
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
flexDirection: "row",
|
||||||
|
position: "absolute",
|
||||||
|
width: "100vw",
|
||||||
|
bottom: 0,
|
||||||
|
flex: 1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={{ position: "absolute", bottom: 40 }}>
|
||||||
|
路線記号からフィルタリング
|
||||||
|
</Text>
|
||||||
|
{Object.keys(stationData).map((d) => (
|
||||||
|
<TouchableOpacity
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: lineColorList[stationIDPair[d]],
|
||||||
|
padding: 5,
|
||||||
|
margin: 2,
|
||||||
|
borderRadius: 10,
|
||||||
|
alignItems: "center",
|
||||||
|
opacity: selectedLine == d ? 1 : !selectedLine ? 1 : 0.5,
|
||||||
|
}}
|
||||||
|
onPress={() => setSelectedLine(selectedLine == d ? undefined : d)}
|
||||||
|
>
|
||||||
|
<Text
|
||||||
|
style={{ color: "white", fontWeight: "bold", fontSize: 20 }}
|
||||||
|
>
|
||||||
|
{stationIDPair[d]}
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
{navigate && (
|
{navigate && (
|
||||||
<View style={{ flexDirection: "row" }}>
|
<View style={{ flexDirection: "row" }}>
|
||||||
<UsefulBox
|
<UsefulBox
|
||||||
@ -137,3 +209,22 @@ const UsefulBox = (props) => {
|
|||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const MapPin = ({ index, indexBase, latlng, D, d, navigate, webview }) => {
|
||||||
|
return (
|
||||||
|
<Marker
|
||||||
|
key={index + indexBase}
|
||||||
|
coordinate={{
|
||||||
|
latitude: parseFloat(latlng[0]),
|
||||||
|
longitude: parseFloat(latlng[1]),
|
||||||
|
}}
|
||||||
|
onPress={() => {
|
||||||
|
webview.current?.injectJavaScript(
|
||||||
|
`MoveDisplayStation('${d}_${D.MyStation}_${D.Station_JP}');
|
||||||
|
setStrings();`
|
||||||
|
);
|
||||||
|
if (navigate) navigate("Apps");
|
||||||
|
}}
|
||||||
|
></Marker>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
@ -10,4 +10,17 @@ export const searchSpecialTrain = (trainNum, trainList) => {
|
|||||||
};
|
};
|
||||||
if (search("D")) return searchBase + "D";
|
if (search("D")) return searchBase + "D";
|
||||||
if (search("M")) return searchBase + "M";
|
if (search("M")) return searchBase + "M";
|
||||||
|
|
||||||
|
//増結いしづちの場合
|
||||||
|
const baseStr = trainNum
|
||||||
|
.replace("D", "")
|
||||||
|
.replace("M", "")
|
||||||
|
.replace("S", "")
|
||||||
|
.replace("X", "");
|
||||||
|
const baseNum = parseInt(baseStr);
|
||||||
|
if (9000 < baseNum && baseNum < 9047) {
|
||||||
|
//いしづちの1001M-1046Mが9000番台になっている場合に発動
|
||||||
|
const TD = trainList[`${baseNum - 8000}M`];
|
||||||
|
if (TD) return `${baseNum - 8000}M`;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -29,6 +29,17 @@ export const lineList = [
|
|||||||
"鳴門線(池谷-鳴門間)[N]",
|
"鳴門線(池谷-鳴門間)[N]",
|
||||||
"瀬戸大橋線(宇多津-児島間)[M]",
|
"瀬戸大橋線(宇多津-児島間)[M]",
|
||||||
];
|
];
|
||||||
|
export const lineListPair = {
|
||||||
|
Y: "予讃線(高松-松山間)[Y]",
|
||||||
|
U: "予讃線(松山-宇和島間)[U]",
|
||||||
|
S: "予讃線/愛ある伊予灘線(向井原-伊予大洲間)[S]",
|
||||||
|
D: "土讃線(多度津-高知間)[D]",
|
||||||
|
K: "土讃線(高知-窪川間)[K]",
|
||||||
|
T: "高徳線(高松-徳島間)[T]",
|
||||||
|
B: "徳島線(徳島-阿波池田)[B]",
|
||||||
|
N: "鳴門線(池谷-鳴門間)[N]",
|
||||||
|
M: "瀬戸大橋線(宇多津-児島間)[M]",
|
||||||
|
};
|
||||||
|
|
||||||
export const getStationList = async (props) => {
|
export const getStationList = async (props) => {
|
||||||
if (status) return status;
|
if (status) return status;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
let status = undefined;
|
|
||||||
import yosan from "../assets/originData/yosan";
|
import yosan from "../assets/originData/yosan";
|
||||||
import uwajima from "../assets/originData/uwajima";
|
import uwajima from "../assets/originData/uwajima";
|
||||||
import uwajima2 from "../assets/originData/uwajima2";
|
import uwajima2 from "../assets/originData/uwajima2";
|
||||||
@ -21,3 +20,15 @@ export const getStationList2 = async (props) => {
|
|||||||
seto,
|
seto,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const stationIDPair = {
|
||||||
|
yosan: "Y",
|
||||||
|
uwajima: "U",
|
||||||
|
uwajima2: "S",
|
||||||
|
dosan: "D",
|
||||||
|
dosan2: "K",
|
||||||
|
koutoku: "T",
|
||||||
|
tokushima: "B",
|
||||||
|
naruto: "N",
|
||||||
|
seto: "M",
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user