Skip to content

Commit 8ee8fe7

Browse files
authored
feat(Routes.Route): shared line name helpers (#3583)
1 parent 44d53a3 commit 8ee8fe7

6 files changed

Lines changed: 75 additions & 40 deletions

File tree

‎lib/dotcom/trip_plan/helpers.ex‎

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,7 @@ defmodule Dotcom.TripPlan.Helpers do
112112
def route_line_name(route) do
113113
route
114114
|> mbta_id()
115-
|> case do
116-
"Mattapan" -> "mattapan-line"
117-
"Red" -> "red-line"
118-
"Green" -> "green-line"
119-
"Green-" <> branch -> "green-line-#{String.downcase(branch)}"
120-
"Blue" -> "blue-line"
121-
"Orange" -> "orange-line"
122-
_ -> nil
123-
end
115+
|> Routes.Route.subway_line_name()
124116
end
125117

126118
# Icons we know we have SVGs for, modify if new icons are added/removed

‎lib/dotcom_web/components/route_components.ex‎

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule DotcomWeb.RouteComponents do
3333
end
3434

3535
def route_icon(%{route: %Route{id: route_id}} = assigns) do
36-
case line_name(route_id) do
36+
case Route.subway_line_name(route_id) do
3737
nil ->
3838
~H"""
3939
<SystemIcons.route_icon name={@route.name} size={@size} {@rest} />
@@ -48,18 +48,6 @@ defmodule DotcomWeb.RouteComponents do
4848
end
4949
end
5050

51-
defp line_name(route_id) do
52-
case route_id do
53-
"Mattapan" -> "mattapan-line"
54-
"Red" -> "red-line"
55-
"Green" -> "green-line"
56-
"Green-" <> branch -> "green-line-#{String.downcase(branch)}"
57-
"Blue" -> "blue-line"
58-
"Orange" -> "orange-line"
59-
_ -> nil
60-
end
61-
end
62-
6351
slot :inner_block
6452

6553
@doc """

‎lib/dotcom_web/components/search_hits.ex‎

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ defmodule DotcomWeb.Components.SearchHits do
7272
end
7373

7474
defp hit_icon(%{hit: %{"index" => "routes", "route" => route}} = assigns) do
75-
line_name = hit_route_line_name(route)
75+
line_name = Routes.Route.subway_line_name(route["id"])
7676

7777
cond do
7878
not is_nil(line_name) ->
@@ -221,18 +221,6 @@ defmodule DotcomWeb.Components.SearchHits do
221221

222222
defp hit_highlight(_), do: nil
223223

224-
defp hit_route_line_name(%{"id" => route_id}) do
225-
case route_id do
226-
"Mattapan" -> "mattapan-line"
227-
"Red" -> "red-line"
228-
"Green" -> "green-line"
229-
"Green-" <> branch -> "green-line-#{String.downcase(branch)}"
230-
"Blue" -> "blue-line"
231-
"Orange" -> "orange-line"
232-
_ -> nil
233-
end
234-
end
235-
236224
defp transit_name("CR-" <> _), do: "commuter-rail"
237225
defp transit_name("local_bus"), do: "bus"
238226

‎lib/dotcom_web/live/projects_page_live.ex‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,6 @@ defmodule DotcomWeb.ProjectsPageLive do
185185
Enum.uniq_by(routes, &route_to_mode_name/1)
186186
end
187187

188-
def bus_name(id) do
189-
if Routes.Route.silver_line?(id), do: "silver-line", else: "bus"
190-
end
191-
192188
def route_to_mode_name(%{mode: "subway", id: id}) do
193189
cond do
194190
Regex.run(~r/^green/i, id) ->
@@ -207,7 +203,7 @@ defmodule DotcomWeb.ProjectsPageLive do
207203

208204
def route_to_mode_name(%{mode: "commuter_rail"}), do: "commuter-rail"
209205
def route_to_mode_name(%{mode: "ferry"}), do: "ferry"
210-
def route_to_mode_name(%{id: id}), do: bus_name(id)
206+
def route_to_mode_name(%{id: id}), do: Routes.Route.line_name(id) || "bus"
211207

212208
attr :route, :any, required: true
213209
attr :size, :string, default: "default"

‎lib/routes/route.ex‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,32 @@ defmodule Routes.Route do
139139
def types_for_mode(:mattapan_line), do: [0]
140140
def types_for_mode(:silver_line), do: [3]
141141

142+
@doc """
143+
The `MbtaMetro` route icon line name (e.g. `"green-line-b"`) for a subway line
144+
route ID, or `nil` if the ID is not a subway line.
145+
"""
146+
@spec subway_line_name(id_t() | nil) :: String.t() | nil
147+
def subway_line_name("Mattapan"), do: "mattapan-line"
148+
def subway_line_name("Red"), do: "red-line"
149+
def subway_line_name("Green"), do: "green-line"
150+
def subway_line_name("Green-" <> branch), do: "green-line-#{String.downcase(branch)}"
151+
def subway_line_name("Blue"), do: "blue-line"
152+
def subway_line_name("Orange"), do: "orange-line"
153+
def subway_line_name(_), do: nil
154+
155+
@doc """
156+
Like `subway_line_name/1`, but also returns `"silver-line"` for Silver Line
157+
route IDs.
158+
"""
159+
@spec line_name(id_t() | nil) :: String.t() | nil
160+
def line_name(id) do
161+
if silver_line?(id) do
162+
"silver-line"
163+
else
164+
subway_line_name(id)
165+
end
166+
end
167+
142168
@spec icon_atom(t) :: gtfs_route_type | subway_lines_type
143169
def icon_atom(%__MODULE__{external_agency_name: "Massport"}), do: :massport_shuttle
144170
def icon_atom(%__MODULE__{external_agency_name: "Logan Express"}), do: :logan_express

‎test/routes/route_test.exs‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,51 @@ defmodule Routes.RouteTest do
238238
end
239239
end
240240

241+
describe "subway_line_name/1" do
242+
test "returns the icon name for each subway line" do
243+
for {id, name} <- [
244+
{"Red", "red-line"},
245+
{"Orange", "orange-line"},
246+
{"Blue", "blue-line"},
247+
{"Mattapan", "mattapan-line"},
248+
{"Green", "green-line"}
249+
] do
250+
assert subway_line_name(id) == name
251+
end
252+
end
253+
254+
test "returns the icon name for each Green Line branch" do
255+
for branch <- ~w(B C D E) do
256+
assert subway_line_name("Green-#{branch}") == "green-line-#{String.downcase(branch)}"
257+
end
258+
end
259+
260+
test "returns nil for routes that aren't subway lines" do
261+
for id <- ["1", "741", "CR-Providence", "Boat-F1", "", nil] do
262+
assert subway_line_name(id) == nil
263+
end
264+
end
265+
end
266+
267+
describe "line_name/1" do
268+
test "returns subway line icon names" do
269+
assert line_name("Red") == "red-line"
270+
assert line_name("Green-C") == "green-line-c"
271+
end
272+
273+
test "returns silver-line for Silver Line routes" do
274+
for id <- Route.silver_line() do
275+
assert line_name(id) == "silver-line"
276+
end
277+
end
278+
279+
test "returns nil for other routes" do
280+
for id <- ["1", "CR-Providence", "Boat-F1", nil] do
281+
assert line_name(id) == nil
282+
end
283+
end
284+
end
285+
241286
describe "hidden?/1" do
242287
test "Returns true for hidden routes" do
243288
hidden_routes = [

0 commit comments

Comments
 (0)