defmodule AshHqWeb.AppViewLive do
# credo:disable-for-this-file Credo.Check.Readability.MaxLineLength
use Surface.LiveView,
container: {:div, class: "h-full"}
alias AshHqWeb.Components.AppView.TopBar
alias AshHqWeb.Components.Search
alias AshHqWeb.Pages.{Ashley, Blog, Community, Docs, Home, Media, UserSettings}
alias Phoenix.LiveView.JS
alias Surface.Components.Context
require Ash.Query
import AshHqWeb.Tails
data(configured_theme, :string, default: :system)
data(libraries, :list, default: [])
data(selected_types, :map, default: %{})
data(current_user, :map)
data(library, :any, default: nil)
data(extension, :any, default: nil)
data(docs, :any, default: nil)
data(library_version, :any, default: nil)
data(guide, :any, default: nil)
data(doc_path, :list, default: [])
data(dsls, :list, default: [])
data(dsl, :any, default: nil)
data(options, :list, default: [])
data(module, :any, default: nil)
def render(%{platform: :ios} = assigns) do
~F"""
{#case @live_action}
{#match :home}
{/case}
"""
end
def render(assigns) do
~F"""
{#if @live_action not in [:docs_dsl, :blog, :forum]}
{/if}
{#for flash <- List.wrap(live_flash(@flash, :error))}
{flash}
{/for}
{#for flash <- List.wrap(live_flash(@flash, :info))}
{flash}
{/for}
{#case @live_action}
{#match :home}
{#match :blog}
{#match :community}
{#match :docs_dsl}
{#match :user_settings}
{#match :media}
{#match :ashley}
{/case}
{#if @live_action not in [:docs_dsl, :ashley]}
{/if}
"""
end
def handle_params(params, uri, socket) do
{:noreply,
socket
|> assign(params: params, uri: uri)}
end
def handle_info({:page_title, title}, socket) do
{:noreply, assign(socket, :page_title, "Ash Framework - #{title}")}
end
def handle_event("change-types", %{"types" => types}, socket) do
types =
types
|> Enum.filter(fn {_, value} ->
value == "true"
end)
|> Enum.map(&elem(&1, 0))
{:noreply,
socket
|> assign(
:selected_types,
types
)
|> push_event("selected-types", %{types: types})}
end
def handle_event("toggle_theme", _, socket) do
theme =
case socket.assigns.configured_theme do
"light" ->
"dark"
"dark" ->
"system"
"system" ->
"light"
end
{:noreply,
socket
|> assign(:configured_theme, theme)
|> push_event("set_theme", %{theme: theme})}
end
def mount(_params, session, socket) do
socket = assign(socket, :page_title, "Ash Framework")
socket =
assign_new(socket, :user_agent, fn _assigns ->
get_connect_params(socket)["user_agent"]
end)
socket = assign(socket, :device_brand, "Apple")
socket = Context.put(socket, platform: socket.assigns.platform)
configured_theme = session["theme"] || "system"
all_types = AshHq.Docs.Extensions.Search.Types.types()
selected_types =
case session["selected_types"] do
nil ->
AshHq.Docs.Extensions.Search.Types.types()
types ->
types
|> String.split(",")
|> Enum.filter(&(&1 in all_types))
end
versions_query =
AshHq.Docs.LibraryVersion
|> Ash.Query.sort(version: :desc)
libraries = AshHq.Docs.Library.read!(load: [versions: versions_query])
{:ok,
socket
|> assign(:libraries, libraries)
|> assign(
:selected_types,
selected_types
)
|> assign(configured_theme: configured_theme)
|> push_event("selected_types", %{types: selected_types})}
end
def toggle_search(js \\ %JS{}) do
js
|> JS.toggle(
to: "#search-box",
in: {
"transition ease-in duration-100",
"opacity-0",
"opacity-100"
},
out: {
"transition ease-out duration-75",
"opacity-100",
"opacity-0"
}
)
|> JS.dispatch("js:focus", to: "#search-input")
end
def close_search(js \\ %JS{}) do
js
|> JS.hide(
transition: "fade-out",
to: "#search-box"
)
|> JS.hide(transition: "fade-out", to: "#search-versions")
|> JS.show(transition: "fade-in", to: "#search-body")
end
end