Skip to content

Commit cbbaf3d

Browse files
taras-tyshkoTaras Tyshko
andauthored
Refactor complex macros in NervesHubWeb module (#2298)
- Split updated_live_view() macro into smaller, focused functions: - live_view_setup() for basic setup - live_view_imports() for imports and aliases - live_view_helper_functions() for helper functions - tab_component_functions() for tab-related functionality - Split hooked_component() macro into smaller, focused functions: - hooked_component_setup() for basic setup - hooked_component_imports() for imports - hooked_component_tab_setup() for tab configuration - hook_connection_functions() for hook management - hooked_component_helper_functions() for helper functions - Reduced cyclomatic complexity from 13 to <9 for updated_live_view() - Reduced cyclomatic complexity from 16 to <9 for hooked_component() - Fixed alias ordering to maintain alphabetical order - Improved code readability and maintainability Resolves Credo refactoring opportunities for complex functions. --------- Co-authored-by: Taras Tyshko <[email protected]>
1 parent 22c4b3f commit cbbaf3d

File tree

1 file changed

+58
-36
lines changed

1 file changed

+58
-36
lines changed

lib/nerves_hub_web.ex

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,37 +76,45 @@ defmodule NervesHubWeb do
7676
end
7777

7878
def updated_live_view() do
79+
quote do
80+
unquote(live_view_setup())
81+
unquote(live_view_imports())
82+
unquote(live_view_helper_functions())
83+
end
84+
end
85+
86+
defp live_view_setup() do
7987
quote do
8088
use NervesHubWeb.LiveView,
8189
layout: {NervesHubWeb.LayoutView, :live},
8290
container: {:div, class: "h-screen"}
8391

8492
use Gettext, backend: NervesHubWeb.Gettext
93+
on_mount(Sentry.LiveViewHook)
94+
end
95+
end
8596

97+
defp live_view_imports() do
98+
quote do
8699
# HTML escaping functionality
87100
import Phoenix.HTML
88-
89101
import NervesHubWeb.Helpers.Authorization
90-
91102
import NervesHubWeb.Components.Icons
92103
import NervesHubWeb.CoreComponents, only: [button: 1, input: 1, core_label: 1, error: 1]
93104

94-
# Shortcut for generating JS commands
95-
alias Phoenix.LiveView.JS
96-
97105
alias NervesHubWeb.Components.Navigation
106+
alias Phoenix.LiveView.JS
98107

99108
# Routes generation with the ~p sigil
100109
unquote(verified_routes())
101-
102110
unquote(view_helpers())
111+
end
112+
end
103113

104-
on_mount(Sentry.LiveViewHook)
105-
114+
defp live_view_helper_functions() do
115+
quote do
106116
def ok(socket), do: {:ok, socket}
107-
108117
def noreply(socket), do: {:noreply, socket}
109-
110118
def page_title(socket, page_title), do: assign(socket, :page_title, page_title)
111119

112120
@spec sidebar_tab(
@@ -125,15 +133,18 @@ defmodule NervesHubWeb do
125133
|> Enum.into(%{}, fn x -> {x, params[to_string(x)]} end)
126134
end
127135

128-
def analytics_enabled?() do
129-
Application.get_env(:nerves_hub, :analytics_enabled)
130-
end
136+
def analytics_enabled?(), do: Application.get_env(:nerves_hub, :analytics_enabled)
131137

138+
unquote(tab_component_functions())
139+
end
140+
end
141+
142+
defp tab_component_functions() do
143+
quote do
132144
defp setup_tab_components(socket, tabs \\ []) do
133145
if socket.assigns[:new_ui] do
134-
Enum.reduce(tabs, socket, fn component, socket ->
135-
component.connect(socket)
136-
end)
146+
tabs
147+
|> Enum.reduce(socket, fn component, socket -> component.connect(socket) end)
137148
|> put_private(:tabs, tabs)
138149
else
139150
socket
@@ -152,16 +163,12 @@ defmodule NervesHubWeb do
152163

153164
defp detach_hooks(socket) do
154165
socket.private[:tabs]
155-
|> Enum.reduce(socket, fn component, socket ->
156-
component.detach_hooks(socket)
157-
end)
166+
|> Enum.reduce(socket, fn component, socket -> component.detach_hooks(socket) end)
158167
end
159168

160169
defp attach_hooks(socket) do
161170
socket.private[:tabs]
162-
|> Enum.reduce(socket, fn component, socket ->
163-
component.attach_hooks(socket)
164-
end)
171+
|> Enum.reduce(socket, fn component, socket -> component.attach_hooks(socket) end)
165172
end
166173
end
167174
end
@@ -278,12 +285,26 @@ defmodule NervesHubWeb do
278285
end
279286

280287
def hooked_component({:tab_id, tab_id}) do
288+
quote do
289+
unquote(hooked_component_setup())
290+
unquote(hooked_component_imports())
291+
unquote(hooked_component_tab_setup(tab_id))
292+
unquote(hook_connection_functions())
293+
unquote(hooked_component_helper_functions())
294+
end
295+
end
296+
297+
defp hooked_component_setup() do
281298
quote do
282299
use Phoenix.Component
300+
alias Phoenix.Socket.Broadcast
301+
end
302+
end
283303

304+
defp hooked_component_imports() do
305+
quote do
284306
import NervesHubWeb.Components.Icons
285307
import NervesHubWeb.CoreComponents, only: [button: 1, input: 1, core_label: 1, error: 1]
286-
287308
import NervesHubWeb.Helpers.Authorization
288309

289310
import Phoenix.LiveView,
@@ -304,13 +325,18 @@ defmodule NervesHubWeb do
304325
consume_uploaded_entry: 3,
305326
put_flash: 3
306327
]
328+
end
329+
end
307330

308-
alias Phoenix.Socket.Broadcast
309-
331+
defp hooked_component_tab_setup(tab_id) do
332+
quote do
310333
@tab_id unquote(tab_id)
311-
312334
defp tab_hook_id(), do: "#{@tab_id}_tab"
335+
end
336+
end
313337

338+
defp hook_connection_functions() do
339+
quote do
314340
def connect(socket) do
315341
attach_hook(socket, tab_hook_id(), :handle_params, &__MODULE__.hooked_params/3)
316342
end
@@ -346,22 +372,18 @@ defmodule NervesHubWeb do
346372
end
347373
end
348374

349-
def tab_params(_params, _uri, socket) do
350-
cont(socket)
351-
end
352-
353-
def cleanup() do
354-
[]
355-
end
375+
def tab_params(_params, _uri, socket), do: cont(socket)
376+
def cleanup(), do: []
356377

357378
defoverridable tab_params: 3, cleanup: 0
379+
end
380+
end
358381

382+
defp hooked_component_helper_functions() do
383+
quote do
359384
def ok(socket), do: {:ok, socket}
360-
361385
def halt(socket), do: {:halt, socket}
362-
363386
def cont(socket), do: {:cont, socket}
364-
365387
def page_title(socket, page_title), do: assign(socket, :page_title, page_title)
366388

367389
def sidebar_tab(socket, tab) do

0 commit comments

Comments
 (0)