背景
現状の useDeepLink は sgid (stationGroupId) + lid (lineId) + dir を基に lineStations(lid) または lineGroupStations(lgid) を1本取得して開く設計のため、他路線を含む経路全体を再現できない。
例: 「新宿(JY) → 池袋(JY) → 茗荷谷(M)」のように山手線→丸ノ内線を乗り継ぐ経路をディープリンクで共有しても、受け取り側は「出発駅 + 最初の路線 + 方向」までしか復元できず、乗換駅以降を手動で再選択する必要がある。
現状の制約
useDeepLink.handleUrl のクエリパラメータ:
| param |
役割 |
sgid |
出発駅 groupId(必須) |
lid |
路線 ID(必須) |
dir |
0=INBOUND / 1=OUTBOUND(必須) |
lgid |
路線グループ(任意、相互直通の一本のみ) |
auto |
自動モード |
theme |
テーマ |
lgid を渡せば相互直通の路線グループは扱えるが、これは StationAPI 側の CSV で手動メンテされているグループ定義に依存する。任意に組み立てた複数路線にまたがる経路を表現する手段は無い。
提案
駅 ID(Station.id、事業者ごとに固有の行ID)の順序リストを受け取る新パラメータ sids を追加する。
TrainLCD://route?sids=1131211,1131310,2800217,2800218
駅 ID を使う理由(groupId ではなく)
- 各
Station 行は .line を持つので、駅IDを渡すだけでどの路線でその駅に居るかが一意に決まる。受信側で隣接関係から路線を推定し直す必要がない
- 乗換駅(複数事業者・複数路線が共存する駅)でユーザが意図した路線を曖昧さなく表現できる
- 既存の
stations(ids: [Int!]!) クエリにそのまま渡せる
方向は sids の順序そのもの
sids の並び順がそのまま進行方向。sids[0] を出発駅、sids[sids.length - 1] を終着駅として扱う。逆方向にしたい場合は配列を逆順にして渡す。dir パラメータは sids 利用時には不要。
受信側の挙動
sids が存在する場合、sgid / lid / lgid / dir は無視する
sids をカンマ区切り→整数配列にパース、空・1件のみ・パース失敗時は何もしない
stations(ids: $sids) で全駅を一括取得し、stationState.stations に渡された順序のまま投入する
station = stations[0]、selectedLine = stations[0].line(行ごとに線が決まっているため自動)
selectedBound = stations[stations.length - 1](並び順から自動)
selectedDirection は stations[0] と stations[stations.length - 1] の selectedLine 上の位置関係から導出可能(必要なら)
trainType は stations[0].trainType ?? null(既存実装と同じ)
後方互換性
- 既存の
sgid / lid / lgid / dir ベースのリンクはそのまま動作させる
- 新パラメータ
sids を受け取った時のみ新ロジックに分岐
- iOS/Android のURLスキーム (
trainlcd / trainlcd-canary) は変更なし
受け入れ条件
関連
背景
現状の
useDeepLinkはsgid(stationGroupId) +lid(lineId) +dirを基にlineStations(lid)またはlineGroupStations(lgid)を1本取得して開く設計のため、他路線を含む経路全体を再現できない。例: 「新宿(JY) → 池袋(JY) → 茗荷谷(M)」のように山手線→丸ノ内線を乗り継ぐ経路をディープリンクで共有しても、受け取り側は「出発駅 + 最初の路線 + 方向」までしか復元できず、乗換駅以降を手動で再選択する必要がある。
現状の制約
useDeepLink.handleUrlのクエリパラメータ:sgidliddirlgidautothemelgidを渡せば相互直通の路線グループは扱えるが、これは StationAPI 側の CSV で手動メンテされているグループ定義に依存する。任意に組み立てた複数路線にまたがる経路を表現する手段は無い。提案
駅 ID(
Station.id、事業者ごとに固有の行ID)の順序リストを受け取る新パラメータsidsを追加する。駅 ID を使う理由(groupId ではなく)
Station行は.lineを持つので、駅IDを渡すだけでどの路線でその駅に居るかが一意に決まる。受信側で隣接関係から路線を推定し直す必要がないstations(ids: [Int!]!)クエリにそのまま渡せる方向は
sidsの順序そのものsidsの並び順がそのまま進行方向。sids[0]を出発駅、sids[sids.length - 1]を終着駅として扱う。逆方向にしたい場合は配列を逆順にして渡す。dirパラメータはsids利用時には不要。受信側の挙動
sidsが存在する場合、sgid/lid/lgid/dirは無視するsidsをカンマ区切り→整数配列にパース、空・1件のみ・パース失敗時は何もしないstations(ids: $sids)で全駅を一括取得し、stationState.stationsに渡された順序のまま投入するstation = stations[0]、selectedLine = stations[0].line(行ごとに線が決まっているため自動)selectedBound = stations[stations.length - 1](並び順から自動)selectedDirectionはstations[0]とstations[stations.length - 1]のselectedLine上の位置関係から導出可能(必要なら)trainTypeはstations[0].trainType ?? null(既存実装と同じ)後方互換性
sgid/lid/lgid/dirベースのリンクはそのまま動作させるsidsを受け取った時のみ新ロジックに分岐trainlcd/trainlcd-canary) は変更なし受け入れ条件
?sids=A,B,C,...形式のリンクで、列挙された駅列の順序通りにstationState.stationsが投入され、selectedBoundが末尾駅になるstations(ids)で1件以上解決できれば表示は開く(途切れがある場合のUI表現はこのissueの範囲外)auto)/テーマ(theme)等の既存パラメータは併用可能sgid/lid/dir) のリンクは動作変化なし関連