From d7f227d5e5c2e58dafbaa99e391f79783e02099b Mon Sep 17 00:00:00 2001 From: harukin-expo-dev-env Date: Fri, 6 Mar 2026 10:37:00 +0000 Subject: [PATCH] =?UTF-8?q?=E9=81=8B=E7=94=A8Hub=E3=81=AE=E5=88=97?= =?UTF-8?q?=E8=BB=8A=E3=83=87=E3=83=BC=E3=82=BF=E5=8F=96=E5=BE=97=E3=83=AD?= =?UTF-8?q?=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E6=94=B9=E5=96=84=E3=81=97?= =?UTF-8?q?=E3=80=81=E6=96=B9=E5=90=91=E3=81=AB=E5=9F=BA=E3=81=A5=E3=81=84?= =?UTF-8?q?=E3=81=A6=E9=81=8B=E7=94=A8=E7=95=AA=E5=8F=B7=E3=82=92=E6=AD=A3?= =?UTF-8?q?=E3=81=97=E3=81=84=E9=A0=86=E5=BA=8F=E3=81=A7=E3=82=BD=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActionSheetComponents/TrainDataSources.tsx | 16 ++++++++++++++-- lib/webViewInjectjavascript.ts | 9 +++++++-- stateBox/useUnyohub.tsx | 15 ++++++++++----- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/components/ActionSheetComponents/TrainDataSources.tsx b/components/ActionSheetComponents/TrainDataSources.tsx index 6c33723..6110056 100644 --- a/components/ActionSheetComponents/TrainDataSources.tsx +++ b/components/ActionSheetComponents/TrainDataSources.tsx @@ -110,9 +110,21 @@ export const TrainDataSources: FC<{ payload?: TrainDataSourcesPayload }> = ({ // 鉄道運用Hub: 車番(formations)が空でないエントリのみ抽出して判定 const hasNonEmptyFormations = unyohubEntries.some(e => !!e.formations && e.formations.trim() !== ""); const nonEmptyFormationEntries = unyohubEntries.filter(e => !!e.formations && e.formations.trim() !== ""); + + // 先頭エントリで direction を取得し、表示順を決定: + // outbound → position_forward 昇順 (pos=1 が宇和島/南端側) + // inbound → position_forward 降順 (pos=MAX が宇和島/南端側) + const matchedDirection = nonEmptyFormationEntries[0] + ?.trains?.find(t => t.train_number === trainNum)?.direction; + const hubSortDescending = matchedDirection === "inbound"; + const formationNames = [...nonEmptyFormationEntries] - .reverse() + .sort((a, b) => { + const posA = a.trains?.find(t => t.train_number === trainNum)?.position_forward ?? 0; + const posB = b.trains?.find(t => t.train_number === trainNum)?.position_forward ?? 0; + return hubSortDescending ? posB - posA : posA - posB; + }) .slice(0, 4) .map((e) => e.formations) .join("・") + (nonEmptyFormationEntries.length > 4 ? ` 他${nonEmptyFormationEntries.length - 4}件` : ""); @@ -307,7 +319,7 @@ const CyclingRefDirectionBanner: FC<{ rows: RefDirRow[]; color?: string }> = ({ useNativeDriver: true, }).start(); }); - }, 1000); + }, 3000); return () => clearInterval(timer); }, [rows.length]); diff --git a/lib/webViewInjectjavascript.ts b/lib/webViewInjectjavascript.ts index 629a0ab..8fb7e7b 100644 --- a/lib/webViewInjectjavascript.ts +++ b/lib/webViewInjectjavascript.ts @@ -326,12 +326,17 @@ export const injectJavascriptData = ({ formations: unyo.formations, position_forward: found.position_forward, position_rear: found.position_rear, + direction: found.direction, }); } } if (foundUnyos.length === 0) return null; - // position_forward順にソート - foundUnyos.sort((a, b) => a.position_forward - b.position_forward); + // outbound=pos_fwd昇順, inbound=pos_fwd降順(TrainDataSources と同じ判定) + const dir = foundUnyos[0].direction; + foundUnyos.sort((a, b) => dir === 'inbound' + ? b.position_forward - a.position_forward + : a.position_forward - b.position_forward + ); const result = foundUnyos.map(u => u.formations + '(' + u.position_forward + '-' + u.position_rear + ')').join(', '); return result; }; diff --git a/stateBox/useUnyohub.tsx b/stateBox/useUnyohub.tsx index 963ea4f..1f357a2 100644 --- a/stateBox/useUnyohub.tsx +++ b/stateBox/useUnyohub.tsx @@ -63,28 +63,33 @@ export const useUnyohub = (): UnyohubHook => { return () => clearInterval(interval); }, [useUnyohub]); - // 列番から運用番号を取得(複数ある場合はposition_forward順) + // 列番から運用番号を取得(direction に基づいて正しい順序でソート) const getUnyohubByTrainNumber = (trainNumber: string): string | null => { if (!useUnyohub || unyohubData.length === 0) return null; - const foundUnyos: Array<{ formations: string; position_forward: number; position_rear: number }> = []; + const foundUnyos: Array<{ formations: string; position_forward: number; position_rear: number; direction: string }> = []; for (const unyo of unyohubData) { if (!unyo.trains) continue; const found = unyo.trains.find(train => train.train_number === trainNumber); - if (found) { + if (found && unyo.formations && unyo.formations.trim() !== "") { foundUnyos.push({ formations: unyo.formations, position_forward: found.position_forward, position_rear: found.position_rear, + direction: found.direction, }); } } if (foundUnyos.length === 0) return null; - // position_forward順にソート - foundUnyos.sort((a, b) => a.position_forward - b.position_forward); + // outbound=pos_fwd昇順, inbound=pos_fwd降順 + const dir = foundUnyos[0].direction; + foundUnyos.sort((a, b) => dir === "inbound" + ? b.position_forward - a.position_forward + : a.position_forward - b.position_forward + ); // 「運用番号(編成位置)」の形式で結合 return foundUnyos