112 lines
3.2 KiB
Elixir
112 lines
3.2 KiB
Elixir
defmodule SomethingErlangWeb.ThreadLive do
|
||
use SomethingErlangWeb, :live_view
|
||
|
||
alias SomethingErlang.Grover
|
||
|
||
def render(assigns) do
|
||
~H"""
|
||
<h1>Threads!</h1>
|
||
<pre class="whitespace-pre-wrap break-all">
|
||
<%= inspect(@current_user) %>
|
||
</pre>
|
||
"""
|
||
end
|
||
|
||
def post(assigns) do
|
||
~H"""
|
||
<div class="post">
|
||
<.user info={@author} />
|
||
<article class="postbody">
|
||
<%= raw(@article) %>
|
||
</article>
|
||
<.toolbar date={@date} />
|
||
</div>
|
||
"""
|
||
end
|
||
|
||
def user(assigns) do
|
||
~H"""
|
||
<aside class="userinfo bg-base-100">
|
||
<h3 class="mb-4"><%= @info.name %></h3>
|
||
<div class="title hidden sm:flex flex-col text-sm pr-4">
|
||
<%= raw(@info.title) %>
|
||
</div>
|
||
</aside>
|
||
"""
|
||
end
|
||
|
||
def toolbar(assigns) do
|
||
~H"""
|
||
<div class="sm:col-span-2 text-sm p-2 px-4">
|
||
<%= @date |> Calendar.strftime("%A, %b %d %Y @ %H:%M") %>
|
||
</div>
|
||
"""
|
||
end
|
||
|
||
def pagination(assigns) do
|
||
%{page: page_number, page_count: page_count} = assigns.thread
|
||
|
||
first_page_disabled_button = if page_number == 1, do: " btn-disabled", else: ""
|
||
last_page_disabled_button = if page_number == page_count, do: " btn-disabled", else: ""
|
||
active_page_button = " btn-active"
|
||
|
||
prev_button_target = if page_number > 1, do: page_number - 1, else: 1
|
||
next_button_target = if page_number < page_count, do: page_number + 1, else: page_count
|
||
|
||
buttons = [
|
||
%{label: "«", page: 1, special: "" <> first_page_disabled_button},
|
||
%{label: "‹", page: prev_button_target, special: "" <> first_page_disabled_button},
|
||
%{label: "#{page_number}", page: page_number, special: active_page_button},
|
||
%{label: "›", page: next_button_target, special: "" <> last_page_disabled_button},
|
||
%{label: "»", page: page_count, special: "" <> last_page_disabled_button}
|
||
]
|
||
|
||
~H"""
|
||
<div class="navbar my-4 bg-base-200">
|
||
<div class="flex-1"></div>
|
||
<div class="pagination flex-none btn-group grid grid-cols-5">
|
||
<%= for btn <- buttons do %>
|
||
<%= live_redirect class: "btn btn-sm btn-ghost" <> btn.special,
|
||
to: ~p"/thread/#{@thread.id}?page=#{btn.page}" do %>
|
||
<%= case btn.label do %>
|
||
<% "«" -> %>
|
||
<Icons.chevron_left_double /><%= btn.page %>
|
||
<% "‹" -> %>
|
||
<Icons.chevron_left /><%= btn.page %>
|
||
<% "›" -> %>
|
||
<%= btn.page %><Icons.chevron_right />
|
||
<% "»" -> %>
|
||
<%= btn.page %><Icons.chevron_right_double />
|
||
<% _ -> %>
|
||
<%= btn.page %>
|
||
<% end %>
|
||
<% end %>
|
||
<% end %>
|
||
</div>
|
||
</div>
|
||
"""
|
||
end
|
||
|
||
def mount(_params, _session, socket) do
|
||
{:ok, socket}
|
||
end
|
||
|
||
def handle_params(%{"id" => id, "page" => page}, _, socket) do
|
||
thread = Grover.get_thread!(id, page |> String.to_integer())
|
||
|
||
{:noreply,
|
||
socket
|
||
|> assign(:page_title, thread.title)
|
||
|> assign(:thread, thread)}
|
||
end
|
||
|
||
def handle_params(%{"id" => id}, _, socket) do
|
||
params = %{page: 1}
|
||
{:noreply, push_redirect(socket, to: ~p"/thread/#{id}?#{params}")}
|
||
end
|
||
|
||
def handle_params(%{}, _, socket) do
|
||
{:noreply, socket}
|
||
end
|
||
end
|