Current section
Files
Jump to
Current section
Files
lib/console_web/live/system_live/settings.ex
defmodule ReflectOS.ConsoleWeb.SystemLive.Settings do
use ReflectOS.ConsoleWeb, :live_view
alias ReflectOS.Kernel.Settings.LayoutManagerStore
alias ReflectOS.Kernel.Settings.System
@impl true
def mount(_params, _session, socket) do
layout_manager_options =
LayoutManagerStore.list()
|> Enum.map(fn %{id: id, name: name} ->
{name, id}
end)
timezone_options =
NervesTimeZones.time_zones()
|> Enum.sort(fn tz1, tz2 ->
case {tz1, tz2} do
{"US/" <> rest1, "US/" <> rest2} ->
rest1 <= rest2
{"US/" <> _, _} ->
true
{_, "US/" <> _} ->
false
_ ->
tz1 <= tz2
end
end)
socket =
socket
|> assign(:page_title, "System Settings")
|> assign(:layout_manager_options, layout_manager_options)
|> assign(:timezone_options, timezone_options)
|> assign(
:form,
to_form(%{
"time_format" => System.time_format(),
"timezone" => System.timezone(),
"viewport_size" =>
System.viewport_size()
|> Tuple.to_list()
|> Enum.join("x"),
"show_instructions" => System.show_instructions?(),
"layout_manager" => System.layout_manager()
})
)
{:ok, socket}
end
@impl true
def handle_event("time_format_changed", %{"time_format" => time_format}, socket) do
System.time_format(time_format)
{:noreply, socket}
end
def handle_event("timezone_changed", %{"timezone" => timezone}, socket) do
System.timezone(timezone)
{:noreply, socket}
end
def handle_event(
"show_instructions_changed",
%{"show_instructions" => show_instructions},
socket
) do
System.show_instructions?(show_instructions)
{:noreply, socket}
end
def handle_event(
"layout_manager_changed",
%{"layout_manager" => layout_manager},
socket
) do
System.layout_manager(layout_manager)
{:noreply, socket}
end
def handle_event(
"viewport_size_changed",
%{"viewport_size" => viewport_size},
%{assigns: %{form: form}} = socket
) do
errors =
if Regex.match?(~r/\d{3,4}x\d{3,4}/, viewport_size) do
[width, height] =
viewport_size
|> String.split("x")
|> Enum.map(fn size ->
Integer.parse(size)
|> elem(0)
end)
System.viewport_size({width, height})
form.errors
|> Keyword.delete(:viewport_size)
else
form.errors
|> Keyword.put(
:viewport_size,
{"Invalid scren size, please enter in width by height format (e.g. 1080x1920)", []}
)
end
params =
form.params
|> Map.put("viewport_size", viewport_size)
socket =
socket
|> assign(form: %{form | errors: errors, params: params})
{:noreply, socket}
end
end