列番を並び替え、列車リンク表示機能等を実装

This commit is contained in:
harukin-expo-dev-env
2025-08-19 15:32:39 +00:00
parent d15d7c74fb
commit f16fe6c994
3 changed files with 64 additions and 22 deletions

View File

@@ -10,6 +10,8 @@ import { trainPosition } from "../../../lib/trainPositionTextArray";
import { StationPosPushDialog } from "../../発車時刻表/LED_inside_Component/TrainPositionDataPush"; import { StationPosPushDialog } from "../../発車時刻表/LED_inside_Component/TrainPositionDataPush";
import { getStationID } from "../../../lib/eachTrainInfoCoreLib/getStationData"; import { getStationID } from "../../../lib/eachTrainInfoCoreLib/getStationData";
import { useStationList } from "../../../stateBox/useStationList"; import { useStationList } from "../../../stateBox/useStationList";
import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { customTrainDataDetector } from "@/components/custom-train-data";
export const TrainDataView = ({ export const TrainDataView = ({
currentTrainData, currentTrainData,
@@ -24,6 +26,8 @@ export const TrainDataView = ({
const { width, height } = useWindowDimensions(); const { width, height } = useWindowDimensions();
const { isLandscape } = useDeviceOrientationChange(); const { isLandscape } = useDeviceOrientationChange();
const { inject } = useCurrentTrain(); const { inject } = useCurrentTrain();
const { allCustomTrainData } = useAllTrainDiagram();
const [mapsStationData, setMapsStationData] = useState(undefined); const [mapsStationData, setMapsStationData] = useState(undefined);
const [platformNumber, setPlatformNumber] = useState(); const [platformNumber, setPlatformNumber] = useState();
@@ -72,6 +76,14 @@ export const TrainDataView = ({
}, []); }, []);
const onLine = !!currentPosition?.toString().length; const onLine = !!currentPosition?.toString().length;
const [trainNumber, setTrainNumber] = useState(currentTrainData?.num);
useEffect(() => {
const {
TrainNumberOverride,
} = customTrainDataDetector(currentTrainData?.num, allCustomTrainData);
if (!TrainNumberOverride) return;
setTrainNumber(TrainNumberOverride);
}, [currentTrainData?.num, allCustomTrainData]);
// 投稿システム関係 // 投稿システム関係
// Dialog表示関係 // Dialog表示関係
const [dialog, setDialog] = useState(false); const [dialog, setDialog] = useState(false);
@@ -88,7 +100,6 @@ export const TrainDataView = ({
const [descInput, setDescInput] = useState<string>(""); const [descInput, setDescInput] = useState<string>("");
const openEditWindow = () => { const openEditWindow = () => {
const { isBetween, Pos } = trainPosition(currentTrainData); const { isBetween, Pos } = trainPosition(currentTrainData);
if (isBetween === true) return; if (isBetween === true) return;
//固定値 //固定値
@@ -193,7 +204,7 @@ export const TrainDataView = ({
}} }}
> >
{nearTrainIDList.length == 0 ? ( {nearTrainIDList.length == 0 ? (
<StateBox mode={mode} title="列番" text={currentTrainData?.num} /> <StateBox mode={mode} title="列番" text={trainNumber} />
) : ( ) : (
<StateBox <StateBox
mode={mode} mode={mode}

View File

@@ -12,6 +12,7 @@ import { useAllTrainDiagram } from "@/stateBox/useAllTrainDiagram";
import { useNotification } from "@/stateBox/useNotifications"; import { useNotification } from "@/stateBox/useNotifications";
import { getStringConfig } from "@/lib/getStringConfig"; import { getStringConfig } from "@/lib/getStringConfig";
import { FontAwesome } from "@expo/vector-icons"; import { FontAwesome } from "@expo/vector-icons";
import { getPDFViewURL } from "@/lib/getPdfViewURL";
type Props = { type Props = {
data: { trainNum: string; limited: string }; data: { trainNum: string; limited: string };
@@ -59,9 +60,18 @@ export const HeaderText: FC<Props> = ({
isEdit, isEdit,
uwasa, uwasa,
vehicleFormation, vehicleFormation,
trainInfoUrl,
] = useMemo(() => { ] = useMemo(() => {
const { type, trainName, trainNumDistance, infogram, isEdit, uwasa, vehicleFormation } = const {
customTrainDataDetector(trainNum, allCustomTrainData); type,
trainName,
trainNumDistance,
infogram,
isEdit,
uwasa,
vehicleFormation,
trainInfoUrl,
} = customTrainDataDetector(trainNum, allCustomTrainData);
const [typeString, fontAvailable, isOneMan] = getStringConfig( const [typeString, fontAvailable, isOneMan] = getStringConfig(
type, type,
trainNum trainNum
@@ -81,7 +91,8 @@ export const HeaderText: FC<Props> = ({
infogram, infogram,
isEdit, isEdit,
uwasa, uwasa,
vehicleFormation vehicleFormation,
trainInfoUrl,
]; ];
case trainData[trainData.length - 1] === undefined: case trainData[trainData.length - 1] === undefined:
return [ return [
@@ -92,7 +103,8 @@ export const HeaderText: FC<Props> = ({
infogram, infogram,
isEdit, isEdit,
uwasa, uwasa,
vehicleFormation vehicleFormation,
trainInfoUrl,
]; ];
default: default:
// 行先がある場合は、行先を取得 // 行先がある場合は、行先を取得
@@ -106,7 +118,8 @@ export const HeaderText: FC<Props> = ({
infogram, infogram,
isEdit, isEdit,
uwasa, uwasa,
vehicleFormation vehicleFormation,
trainInfoUrl,
]; ];
} }
}, [trainData]); }, [trainData]);
@@ -122,11 +135,20 @@ export const HeaderText: FC<Props> = ({
<TouchableOpacity <TouchableOpacity
style={{ borderRadius: 5, flexDirection: "row", alignItems: "center" }} style={{ borderRadius: 5, flexDirection: "row", alignItems: "center" }}
onLongPress={() => { onLongPress={() => {
if (!updatePermission) return;
const uri = `https://jr-shikoku-data-post-system.pages.dev?trainNum=${trainNum}&token=${expoPushToken}`; const uri = `https://jr-shikoku-data-post-system.pages.dev?trainNum=${trainNum}&token=${expoPushToken}`;
navigate("generalWebView", { uri, useExitButton: false }); navigate("generalWebView", { uri, useExitButton: false });
SheetManager.hide("EachTrainInfo"); SheetManager.hide("EachTrainInfo");
}} }}
disabled={!updatePermission} onPress={() => {
if (!trainInfoUrl) return;
const uri = trainInfoUrl.includes("pdf")
? getPDFViewURL(trainInfoUrl)
: trainInfoUrl;
navigate("generalWebView", { uri, useExitButton: true });
SheetManager.hide("EachTrainInfo");
}}
disabled={!(!!updatePermission || !!trainInfoUrl)}
> >
<Text <Text
style={{ style={{
@@ -142,20 +164,22 @@ export const HeaderText: FC<Props> = ({
{isOneMan && <OneManText />} {isOneMan && <OneManText />}
<Text style={textConfig}>{trainName}</Text> <Text style={textConfig}>{trainName}</Text>
<InfogramText infogram={infogram} /> <InfogramText infogram={infogram} />
{isEdit && (
<FontAwesome
name="commenting-o"
size={20}
color="white"
style={{ marginLeft: 5 }}
onPress={() =>
alert(
`[このアイコン、列車データはコミュニティによってリアルタイム追加されています。]\n使用車両情報:\n${vehicleFormation}\n投稿者メモ:\n${uwasa || "なし"}`
)
}
/>
)}
</TouchableOpacity> </TouchableOpacity>
{isEdit && (
<FontAwesome
name="commenting-o"
size={20}
color="white"
style={{ marginLeft: 5 }}
onPress={() =>
alert(
`[このアイコン、列車データはコミュニティによってリアルタイム追加されています。]\n使用車両情報:\n${vehicleFormation}\n投稿者メモ:\n${
uwasa || "なし"
}`
)
}
/>
)}
<View style={{ flex: 1 }} /> <View style={{ flex: 1 }} />
<Text style={textConfig}> <Text style={textConfig}>

View File

@@ -31,7 +31,14 @@ export const AllTrainDiagramProvider = ({ children }) => {
const keys = Object.keys(d); const keys = Object.keys(d);
data[keys] = d[keys]; data[keys] = d[keys];
}); });
return data; //dataのkeyで並び替え
const sortedData = Object.keys(data)
.sort((a, b) => a.replace(/[D,M]/, "") - b.replace(/[D,M]/, ""))
.reduce((acc, key) => {
acc[key] = data[key];
return acc;
}, {});
return sortedData;
}) })
.then((res) => { .then((res) => {
setAllTrainDiagram(res); setAllTrainDiagram(res);