Modal

See ModalHeader on how to configure target.

defmodule PhenixStorybook.Components.Modal.ModalHeader do
  use PhenixStorybook, :component

  @default_class "flex w-full"

  attr(:id, :string, default: nil)
  attr(:title, :string, doc: "Text title", default: nil)
  attr(:title_class, :string, doc: "The title class", default: nil)
  attr(:icon, :string, doc: "Icon displayed above the title.")
  attr(:close_modal_event, :any, doc: "Event to be triggered when closing the modal")
  attr(:with_sidebar, :boolean, doc: "The modal has a sidebar")

  attr(:full_screen, :boolean,
    doc: "The modal is extended to the (almost) full screen",
    default: false
  )

  attr(:"phx-target", :string, doc: "Phx target of the modal")

  @doc """
  This component has one hide event.

  Default event is "close_modal", legacy name of previous hook that was set on modal.
  Can be changed with `close_modal_event` in assigns.

  Use phx-target to change target of event (live view or component), it has same effect as phx-target.
  See https://hexdocs.pm/phoenix_live_view/Phoenix.LiveComponent.html#module-targeting-component-events.
  """
  def modal_header(assigns) do
    assigns
    |> set_theme()
    |> set_phx_attributes()
    |> set_attributes([:icon, :title])
    |> set_attributes(close_modal_event: "close_modal")
    |> extend_class(&modal_header_class/1)
    |> extend_class(&close_button_class/1, attribute: :close_button_class)
    |> extend_class("fal fa-times", attribute: :close_icon_class)
    |> extend_class(&icon_wrapper_class/1, attribute: :icon_wrapper_class)
    |> extend_class("", attribute: :icon)
    |> extend_class(&title_class/1, attribute: :title_class)
    |> render()
  end

  defp render(assigns) do
    ~H"""
    <div {@heex_class} id={@id}>
      <button
        {@heex_close_button_class}
        {@heex_phx_attributes}
        phx-click={@close_modal_event}
        phx-key="escape"
        type="button"
        phx-window-keydown={@close_modal_event}
      >
        <i {@heex_close_icon_class}></i>
      </button>

      <div :if={@icon != ""} {@heex_icon_wrapper_class}>
        <i {@heex_icon}></i>
      </div>

      <h1 :if={@title} {@heex_title_class} style="font-weight: 500; font-size: 1.125rem;">
        {@title}
      </h1>
    </div>
    """
  end

  defp close_button_class(_assigns = %{theme: theme}) do
    "modal-close-btn absolute top-1.5 right-1.5 h-7 w-7 flex justify-center cursor-pointer \
    items-center p-1.5 z-10 focus:outline-none bg-default-bg hover:bg-default-bg-hover \
    text-default-txt #{window_rounded(theme)}"
  end

  defp modal_header_class(assigns) do
    case assigns do
      %{with_sidebar: true} ->
        "#{@default_class} flex-row col-span-full md:col-span-2 items-center justify-start space-x-4 h-28"

      %{full_screen: true} ->
        "flex flex-row gap-4 px-8 pb-4 border-b border-default-border items-center justify-start"

      _ ->
        "#{@default_class} flex-col items-center"
    end
  end

  defp icon_wrapper_class(assigns) do
    class =
      "flex items-center justify-center h-14 w-14 rounded-full border border-default-border text-xl text-primary-txt"

    if assigns[:full_screen] do
      class
    else
      "#{class} mx-auto"
    end
  end

  defp title_class(assigns) do
    class =
      "text-lg! leading-6 font-medium font-medium! text-gray-default mt-2 sm:mt-5 whitespace-nowrap overflow-hidden text-ellipsis w-4/5"

    if assigns[:full_screen] do
      "#{class} text-left"
    else
      "#{class} text-center"
    end
  end
end