Hi, here is an example script:
Application.put_env(:sample, Example.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 5001],
server: true,
live_view: [signing_salt: "aaaaaaaa"],
secret_key_base: String.duplicate("a", 64)
)
Mix.install(
jason: "~> 1.0",
phoenix: "~> 1.7.0",
phoenix_live_view: "~> 0.20.0",
plug_cowboy: "~> 2.5"
)
defmodule Example.ErrorView do
def render(template, _), do: Phoenix.Controller.status_message_from_template(template)
end
defmodule Example.HomeLive do
use Phoenix.LiveView, layout: {__MODULE__, :live}
alias Phoenix.LiveView.JS
def mount(_params, _session, socket) do
{:ok, assign(socket, :count, 0)}
end
defp phx_vsn, do: Application.spec(:phoenix, :vsn)
defp lv_vsn, do: Application.spec(:phoenix_live_view, :vsn)
def render("live.html", assigns) do
~H"""
<script src={"https://cdn.jsdelivr.net/npm/phoenix@#{phx_vsn()}/priv/static/phoenix.min.js"}></script>
<script src={"https://cdn.jsdelivr.net/npm/phoenix_live_view@#{lv_vsn()}/priv/static/phoenix_live_view.min.js"}></script>
<script>
let liveSocket = new window.LiveView.LiveSocket("/live", window.Phoenix.Socket)
liveSocket.connect()
</script>
<style>
</style>
<%= @inner_content %>
"""
end
def render(assigns) do
~H"""
<button class="fadeIn" phx-click={
JS.toggle_class("fadeIn fadeOut", time: 5000)
|> JS.push("example")
}>Example</button>
"""
end
def handle_event("example", _params, socket) do
IO.inspect(Time.utc_now())
{:noreply, socket}
end
end
defmodule Example.Router do
use Phoenix.Router
import Phoenix.LiveView.Router
pipeline :browser do
plug(:accepts, ["html"])
end
scope "/", Example do
pipe_through(:browser)
live("/", HomeLive, :index)
end
end
defmodule Example.Endpoint do
use Phoenix.Endpoint, otp_app: :sample
socket("/live", Phoenix.LiveView.Socket)
plug(Example.Router)
end
{:ok, _} = Supervisor.start_link([Example.Endpoint], strategy: :one_for_one)
Process.sleep(:infinity)
The problem is that JS.push/1
is called immediately without giving a chance for animation. Using this example you can reproduce the issue (see inspected time in logs).
I have no idea if it’s a bug or intended behaviour. All I know is that at the start of every handle_event/3
function body For now instead of inspecting time I’m adding: Process.sleep/1
call which looks like a workaround, but after adding it animation works as expected. I wonder if other people experienced the same and if so what did you do with that. Is Process.sleep/1
call good here or maybe you can recommend some alternative (within JS
+ handle_event/3
).