defmodule AshHqWeb.AppViewLive do # credo:disable-for-this-file Credo.Check.Readability.MaxLineLength use Surface.LiveView, container: {:div, class: "h-full"} alias AshHqWeb.Components.{CatalogueModal, Search} alias AshHqWeb.Components.AppView.TopBar alias AshHqWeb.Pages.{Blog, Docs, Home, LogIn, Register, ResetPassword, UserSettings} alias Phoenix.LiveView.JS alias Surface.Components.Context require Ash.Query data(configured_theme, :string, default: :system) data(searching, :boolean, default: false) data(selected_versions, :map, default: %{}) 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"""
""" end def handle_params(params, uri, socket) do {:noreply, socket |> assign(params: params, uri: uri)} end def handle_event("remove_version", %{"library" => library}, socket) do new_selected_versions = Map.put(socket.assigns.selected_versions, library, "") {:noreply, socket |> assign(:selected_versions, new_selected_versions) |> push_event("selected-versions", new_selected_versions)} end def handle_event("add_version", %{"library" => library}, socket) do new_selected_versions = Map.put(socket.assigns.selected_versions, library, "latest") {:noreply, socket |> assign(:selected_versions, new_selected_versions) |> push_event("selected-versions", new_selected_versions)} end def handle_event("change-versions", %{"versions" => versions}, socket) do {:noreply, socket |> assign(:selected_versions, versions) |> push_event("selected-versions", versions)} 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_new(socket, :user_agent, fn _assigns -> get_connect_params(socket)["user_agent"] end) socket = case socket.assigns[:user_agent] do empty when empty in [nil, ""] -> assign(socket, :device_brand, :unknown) ua -> brand = case UAInspector.parse(ua) do %{device: %{brand: brand}} -> brand _ -> :unknown end assign(socket, :device_brand, brand) end socket = Context.put(socket, platform: socket.assigns.platform) configured_theme = session["theme"] || "system" configured_library_versions = case session["selected_versions"] do nil -> %{} "" -> %{} value -> value |> String.split(",") |> Map.new(fn str -> str |> String.split(":") |> List.to_tuple() end) end 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]) selected_versions = Enum.reduce(libraries, configured_library_versions, fn library, acc -> if library.name == "ash" do Map.put_new(acc, library.id, "latest") else Map.put_new(acc, library.id, "") end end) {:ok, socket |> assign(:libraries, libraries) |> assign( :selected_versions, selected_versions ) |> assign( :selected_types, selected_types ) |> assign(:selected_versions, selected_versions) |> assign(configured_theme: configured_theme) |> push_event("selected-versions", selected_versions) |> 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 toggle_catalogue(js \\ %JS{}) do js |> JS.toggle( to: "#catalogue-box", in: { "transition ease-in duration-100", "opacity-0", "opacity-100" }, out: { "transition ease-out duration-75", "opacity-100", "opacity-0" } ) |> JS.dispatch("phx:js:scroll-to", detail: %{id: "catalogue-box"}) 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 def close_catalogue(js \\ %JS{}) do js |> JS.hide( transition: "fade-out", to: "#catalogue-box" ) end end