defmodule SlaxWeb.ChatRoomLive do
@moduledoc false
use SlaxWeb, :live_view
alias Slax.Chat
alias Slax.Chat.Message
alias Slax.Chat.Room
@impl Phoenix.LiveView
def render(assigns) do
~H"""
Rooms
<.room_link :for={room <- @rooms} room={room} active={room.id == @room.id} />
#<%= @room.name %>
<.link
class="font-normal text-xs text-blue-600 hover:text-blue-700"
navigate={~p"/rooms/#{@room}/edit"}
>
Edit
<%= if @hide_topic? do %>
[Topic hidden]
<% else %>
<%= @room.topic %>
<% end %>
<%= if @current_user do %>
-
<%= @current_user.email %>
-
<.link
href={~p"/users/settings"}
class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700"
>
Settings
-
<.link
href={~p"/users/log_out"}
method="delete"
class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700"
>
Log out
<% else %>
-
<.link
href={~p"/users/register"}
class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700"
>
Register
-
<.link
href={~p"/users/log_in"}
class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700"
>
Log in
<% end %>
<.message :for={message <- @messages} message={message} />
"""
end
@impl Phoenix.LiveView
def mount(_params, _session, socket) do
rooms = Chat.list_rooms()
{:ok, assign(socket, hide_topic?: false, rooms: rooms)}
end
@impl Phoenix.LiveView
def handle_params(params, _session, socket) do
room =
case Map.fetch(params, "id") do
{:ok, id} ->
Chat.get_room!(id)
:error ->
Chat.get_first_room!()
end
messages = Chat.list_messages_in_room(room)
{:noreply,
assign(socket,
hide_topic?: false,
messages: messages,
page_title: "# #{room.name}",
room: room
)}
end
@impl Phoenix.LiveView
def handle_event("toggle-topic", _params, socket) do
{:noreply, update(socket, :hide_topic?, &(!&1))}
end
attr :active, :boolean, required: true
attr :room, Room, required: true
@spec room_link(Phoenix.LiveView.Socket.assigns()) :: Phoenix.LiveView.Rendered.t()
defp room_link(assigns) do
~H"""
<.link
class={[
"flex items-center h-8 text-sm pl-8 pr-3",
(@active && "bg-slate-300") || "hover:bg-slate-300"
]}
patch={~p"/rooms/#{@room}"}
>
<.icon name="hero-hashtag" class="h-4 w-4" />
<%= @room.name %>
"""
end
attr :message, Message, required: true
defp message(assigns) do
~H"""
<.link class="text-sm font-semibold hover:underline">
User
<%= @message.body %>
"""
end
end