We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Post 18
Game Site Journal - 09 Core Components (put_flash)
Published on: 2025-04-19
Tags:
elixir, Side Project, LiveView, Game Site, Fly, Deployment, Html/CSS
For this entry I wanted to go over how I changed the core components for the flash_group so that the message only stays up for a certain amount of time.
I wanted the user to be able to see what they are doing without having to clear the message every time.
In order to do this I had to find the function definition within the core_components.ex
Once there you will find everything that the function will display.
attr :flash, :map, required: true, doc: "the map of flash messages"
attr :id, :string, default: "flash-group", doc: "the optional id of flash container"
def flash_group(assigns) do
~H"""
<div id={@id}>
<.flash
kind={:info}
title={gettext("Success!")}
flash={@flash}
/>
<.flash
kind={:error}
title={gettext("Error!")}
flash={@flash}
/>
<.flash
id="client-error"
kind={:error}
title={gettext("We can't find the internet")}
phx-disconnected={show(".phx-client-error #client-error")}
phx-connected={hide("#client-error")}
hidden
>
{gettext("Attempting to reconnect")}
<.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
</.flash>
<.flash
id="server-error"
kind={:error}
title={gettext("Something went wrong!")}
phx-disconnected={show(".phx-server-error #server-error")}
phx-connected={hide("#server-error")}
hidden
>
{gettext("Hang in there while we get back on track")}
<.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" />
</.flash>
</div>
"""
end
This is the part I'm talking about. We want to add the following to any of the flash messages that we want to have a limited time to show.
phx-hook="AutoDismiss"
data-timeout="3000"
Once that is done we need to be sure to add in the Hook
Hooks.AutoDismiss = {
mounted() {
// Get the timeout value from the data attribute
const timeout = this.el.dataset.timeout || 5000; // Default to 5000ms if not provided
// Set a timeout to hide the flash message
setTimeout(() => {
this.el.style.opacity = "0"; // Fade out
setTimeout(() => {
this.el.remove(); // Completely remove the flash message from DOM after fade-out
}, 500); // Time for fade-out effect
}, timeout);
}
}
That should be it. If you want to change the values that we send (time the message will stay up), just change the value for data-timeout #to amount of time in milliseconds