diff --git a/assets/js/app.js b/assets/js/app.js index 34316da..c673ab7 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -183,6 +183,8 @@ window.addEventListener("phx:page-loading-stop", info => topbar.hide()) window.addEventListener("js:exec", e => e.target[e.detail.call](...e.detail.args)) // connect if there are any LiveViews on the page +liveSocket.getSocket().onOpen(() => execJS("#connection-status", "js-hide")) +liveSocket.getSocket().onError(() => execJS("#connection-status", "js-show")) liveSocket.connect() // expose liveSocket on window for web console debug logs and latency simulation: diff --git a/lib/live_beats_web/live/live_helpers.ex b/lib/live_beats_web/live/live_helpers.ex index c0b0690..109c3ef 100644 --- a/lib/live_beats_web/live/live_helpers.ex +++ b/lib/live_beats_web/live/live_helpers.ex @@ -16,12 +16,37 @@ defmodule LiveBeatsWeb.LiveHelpers do Routes.song_index_path(LiveBeatsWeb.Endpoint, :index, profile.username) end + def connection_status(assigns) do + ~H""" + + """ + end + def flash(%{kind: :error} = assigns) do ~H""" <%= if live_flash(@flash, @kind) do %>
JS.remove_class("fade-in-scale", to: "#flash") |> hide("#flash")} phx-value-key="error" phx-hook="Flash" @@ -154,6 +179,17 @@ defmodule LiveBeatsWeb.LiveHelpers do ) end + def show(js \\ %JS{}, selector) do + JS.show(js, + to: selector, + time: 300, + display: "inline-block", + transition: + {"ease-out duration-300", "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", + "opacity-100 translate-y-0 sm:scale-100"} + ) + end + def hide(js \\ %JS{}, selector) do JS.hide(js, to: selector, diff --git a/lib/live_beats_web/templates/layout/live.html.heex b/lib/live_beats_web/templates/layout/live.html.heex index 406c458..979505e 100644 --- a/lib/live_beats_web/templates/layout/live.html.heex +++ b/lib/live_beats_web/templates/layout/live.html.heex @@ -144,6 +144,9 @@ <.flash flash={@flash} kind={:info}/> <.flash flash={@flash} kind={:error}/> + <.connection_status> + Re-establishing connection... + <%= @inner_content %>