diff --git a/lib/malarkey/timeline.ex b/lib/malarkey/timeline.ex index 25f084e..8821364 100644 --- a/lib/malarkey/timeline.ex +++ b/lib/malarkey/timeline.ex @@ -5,7 +5,7 @@ defmodule Malarkey.Timeline do import Ecto.Query, warn: false - alias Malarkey.Accounts + alias Malarkey.Timeline.PostUserLike alias Malarkey.Repo alias Malarkey.Timeline.Post @@ -40,7 +40,7 @@ defmodule Malarkey.Timeline do post |> Post.changeset(attrs) |> Repo.update() - |> broadcast(:post_created) + |> broadcast(:post_updated) end def delete_post(%Post{} = post) do @@ -52,12 +52,17 @@ defmodule Malarkey.Timeline do end def add_like(user, post) do - post - |> Repo.preload(:liked_by) - |> Repo.preload(:user) - |> Post.changeset_add_like(user) - |> Repo.update() - |> broadcast(:post_created) + if user in post.liked_by do + Repo.delete_all(PostUserLike.user_post_like_query(user, post)) + |> broadcast(:post_updated) + else + post + |> Repo.preload(:liked_by) + |> Repo.preload(:user) + |> Post.changeset_add_like(user) + |> Repo.update() + |> broadcast(:post_updated) + end end def add_repost(user, post) do diff --git a/lib/malarkey/timeline/post_user_like.ex b/lib/malarkey/timeline/post_user_like.ex index d132b1b..2a58747 100644 --- a/lib/malarkey/timeline/post_user_like.ex +++ b/lib/malarkey/timeline/post_user_like.ex @@ -1,5 +1,7 @@ defmodule Malarkey.Timeline.PostUserLike do + import Ecto.Query use Ecto.Schema + alias Malarkey.Timeline.PostUserLike @primary_key false schema "user_likes" do @@ -7,4 +9,8 @@ defmodule Malarkey.Timeline.PostUserLike do belongs_to :post, Malarkey.Timeline.Post, primary_key: true timestamps() end + + def user_post_like_query(user, post) do + from PostUserLike, where: [user_id: ^user.id, post_id: ^post.id] + end end diff --git a/lib/malarkey_web/live/post_live/index.ex b/lib/malarkey_web/live/post_live/index.ex index 1dfea5d..2fa1923 100644 --- a/lib/malarkey_web/live/post_live/index.ex +++ b/lib/malarkey_web/live/post_live/index.ex @@ -6,8 +6,6 @@ defmodule MalarkeyWeb.PostLive.Index do on_mount MalarkeyWeb.UserLiveAuth @impl true - @spec mount(any, any, Phoenix.LiveView.Socket.t()) :: - {:ok, map, [{:temporary_assigns, [...]}, ...]} def mount(_params, _session, socket) do if connected?(socket), do: Timeline.subscribe() {:ok, assign(socket, :posts, list_posts()), temporary_assigns: [posts: []]} @@ -42,6 +40,13 @@ defmodule MalarkeyWeb.PostLive.Index do |> assign(:post, nil) end + @impl true + def handle_event("login", _id, socket) do + {:noreply, + socket + |> push_redirect(to: "/users/log_in")} + end + @impl true def handle_event("like", %{"id" => id}, socket) do post = Timeline.get_post!(id) diff --git a/lib/malarkey_web/live/post_live/index.html.heex b/lib/malarkey_web/live/post_live/index.html.heex index 416d563..44b46ad 100644 --- a/lib/malarkey_web/live/post_live/index.html.heex +++ b/lib/malarkey_web/live/post_live/index.html.heex @@ -1,5 +1,9 @@ <.header> - Timeline + <%= if !!@current_user do %> +
Hi, <%= !!@current_user.fullname || "Sailor" %>
+ <% else %> +
Hello, Sailor!
+ <% end %> <:actions> <.link patch={(!!@current_user && ~p"/posts/new") || "/users/log_in"}>