Today I am going to put together how to make a loading icon LiveComponent for Phoenix LiveView.
Get a loader CSS
First, I look for an open-source loader CSS because I am poor at designing and writing CSS. Luke Haas's Single Element CSS Spinners is nice.
Make a loader CSS file
I create assets/css/_loader.scss
file in my phoenix project and paste the loader CSS into that file.
I make sure that my loader CSS file is imported into assets/css/app.scss
file.
+ @import 'loader';
Make a loading icon component
First I make lib/mnishiguchi_web/live/components/loading_component.ex
file. I make the component configurable for the CSS class name bacause I might want to use different loaders in different locations.
defmodule MnishiguchiWeb.LoadingComponent do
@moduledoc """
Shows a loading icon.
## Examples
<%= live_component @socket,
MnishiguchiWeb.LoadingComponent,
class: "loader7" %>
<%= live_component @socket,
MnishiguchiWeb.LoadingComponent,
loading: @loading,
class: "loader7" %>
<%= live_component @socket,
MnishiguchiWeb.LoadingComponent,
loading: !connected?(@socket),
class: "loader7" %>
"""
use MnishiguchiWeb, :live_component
@default_assigns %{
loading: true,
class: "loader"
}
@impl Phoenix.LiveComponent
def update(assigns, socket) do
socket =
socket
|> assign(@default_assigns)
|> assign(assigns)
{:ok, socket}
end
@impl Phoenix.LiveComponent
def render(assigns) do
~L"""
<%= if @loading do %>
<div class="<%= @class %>">
Loading...
</div>
<% end %>
"""
end
end
That's it!
Top comments (0)