43 lines
1.1 KiB
Elixir
43 lines
1.1 KiB
Elixir
defmodule PostlandWeb.TimelineLive do
|
|
use PostlandWeb, :live_view
|
|
|
|
def render(assigns) do
|
|
~H"""
|
|
<.post_form post_content={@post} />
|
|
<div id="timeline-posts" phx-update="stream">
|
|
<div :for={{id, post} <- @streams.posts} id={id} class="mt-10">
|
|
<.post_card post={post} />
|
|
</div>
|
|
</div>
|
|
"""
|
|
end
|
|
|
|
def mount(_params, _session, socket) do
|
|
{:ok, socket |> assign(:post, "") |> stream(:posts, Postland.Timeline.timeline())}
|
|
end
|
|
|
|
def handle_event("create_post", %{"post" => post}, socket) do
|
|
{:ok, results} = Postland.Activities.record_markdown_post(post)
|
|
|
|
new_posts =
|
|
results
|
|
|> Enum.filter(fn {_key, value} ->
|
|
is_struct(value, Postland.Object)
|
|
end)
|
|
|
|
socket =
|
|
socket
|
|
|> assign(:post, "")
|
|
|> then(fn socket ->
|
|
Enum.reduce(new_posts, socket, fn {_id, post}, socket ->
|
|
stream_insert(socket, :posts, post, at: 0)
|
|
end)
|
|
end)
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
def handle_event("change_post", %{"post" => post}, socket) do
|
|
{:noreply, socket |> assign(:post, post)}
|
|
end
|
|
end
|