defmodule PhoenixKitWeb.Live.Modules.Maintenance.Settings do @moduledoc """ Settings page for the Maintenance module. Allows admins to customize the maintenance page header and subtext. """ use PhoenixKitWeb, :live_view use Gettext, backend: PhoenixKitWeb.Gettext alias PhoenixKit.Modules.Maintenance alias PhoenixKit.Settings alias PhoenixKit.Utils.Routes def mount(_params, _session, socket) do # Get current path for navigation current_path = Routes.path("/admin/settings/maintenance", locale: socket.assigns.current_locale_base) # Get current settings config = Maintenance.get_config() socket = socket |> assign(:page_title, "Maintenance Mode Settings") |> assign(:project_title, Settings.get_project_title()) |> assign(:current_path, current_path) |> assign(:header, config.header) |> assign(:subtext, config.subtext) |> assign(:enabled, config.enabled) |> assign(:saved, false) {:ok, socket} end def handle_event("update_header", %{"header" => header}, socket) do {:noreply, assign(socket, :header, header)} end def handle_event("update_subtext", %{"subtext" => subtext}, socket) do {:noreply, assign(socket, :subtext, subtext)} end def handle_event("save", _params, socket) do # Save header and subtext to database Maintenance.update_header(socket.assigns.header) Maintenance.update_subtext(socket.assigns.subtext) socket = socket |> assign(:saved, true) |> put_flash(:info, "Maintenance mode settings saved successfully") # Reset saved flag after 2 seconds Process.send_after(self(), :reset_saved, 2000) {:noreply, socket} end def handle_event("cancel", _params, socket) do # Reload settings from database config = Maintenance.get_config() socket = socket |> assign(:header, config.header) |> assign(:subtext, config.subtext) |> put_flash(:info, "Changes discarded") {:noreply, socket} end def handle_event("toggle_maintenance_mode", _params, socket) do # Toggle actual maintenance mode new_enabled = !socket.assigns.enabled result = if new_enabled do Maintenance.enable_system() else Maintenance.disable_system() end case result do {:ok, _setting} -> socket = socket |> assign(:enabled, new_enabled) |> put_flash( :info, if(new_enabled, do: "Maintenance mode activated - non-admin users will see the maintenance page", else: "Maintenance mode deactivated - site is now accessible to all users" ) ) {:noreply, socket} {:error, _changeset} -> socket = put_flash(socket, :error, "Failed to toggle maintenance mode") {:noreply, socket} end end def handle_info(:reset_saved, socket) do {:noreply, assign(socket, :saved, false)} end @doc """ Renders the maintenance settings LiveView. """ def render(assigns) do ~H"""
<%!-- Header Section --%>
<%!-- Back Button --%> <.link navigate={PhoenixKit.Utils.Routes.path("/admin/modules")} class="btn btn-ghost btn-sm" > <.icon name="hero-arrow-left" class="w-4 h-4" /> <%!-- Title Section --%>

Maintenance Mode Settings

Customize the maintenance page message

<%!-- Maintenance Mode Toggle --%>

<.icon name="hero-power" class="w-5 h-5" /> Maintenance Mode Status

{if @enabled, do: "Site is currently in maintenance mode - non-admin users see the maintenance page", else: "Site is operating normally - all users have access"}

<%= if @enabled do %>
<.icon name="hero-exclamation-triangle" class="w-5 h-5" /> Active: Non-admin users are currently seeing the maintenance page below.
<% end %>
<%!-- Two Column Layout: Settings + Preview --%>
<%!-- Settings Form (Left Column) --%>

<.icon name="hero-cog-6-tooth" class="w-5 h-5" /> Configuration

<%!-- Header Input --%>
<%!-- Subtext Input --%>
<%!-- Action Buttons --%>
<%!-- Live Preview (Right Column) --%>

<.icon name="hero-eye" class="w-5 h-5" /> Live Preview

<%!-- Icon --%>
🚧
<%!-- Header --%>

{@header}

<%!-- Subtext --%>

{@subtext}

<.icon name="hero-information-circle" class="w-5 h-5" /> This is how non-admin users will see the maintenance page
""" end end