- <.link patch={"/friend/#{@friend.slug}"} class="btn btn-block btn-outline">back
+ <.link patch={Routes.friends_show_path(FriendsWeb.Endpoint, :overview, @friend.slug)} class="btn btn-block btn-outline">back
<%= if @changeset.valid? do %>
@@ -159,9 +178,9 @@ defmodule FriendsWeb.FriendsLive.Components do
"""
end
- def form_page("relationships", assigns) do
+ def edit_page(:relationships, assigns) do
~H"""
- <%= FriendsWeb.FriendLive.Friend.header(assigns) %>
+ <%= Components.header(assigns) %>
"""
end
end
diff --git a/friends/lib/friends_web/live/friend.ex b/friends/lib/friends_web/live/friend.ex
index d789cff..2bceeca 100644
--- a/friends/lib/friends_web/live/friend.ex
+++ b/friends/lib/friends_web/live/friend.ex
@@ -1,7 +1,7 @@
defmodule FriendsWeb.FriendsLive.Friend do
use FriendsWeb, :live_view
- alias FriendsWeb.FriendLive.Components
+ alias FriendsWeb.FriendsLive.Components
alias FriendsWeb.Router.Helpers, as: Routes
alias Friends.Friend
@@ -18,32 +18,6 @@ defmodule FriendsWeb.FriendsLive.Friend do
|> assign(:changeset, %Friend{} |> Friend.changeset())}
end
- # Show Friend
- def handle_params(%{"slug" => slug} = attrs, _url, socket) do
- friend = Friend.get_by_slug(slug)
-
- page =
- if (attrs |> Map.get("page")) in ["overview", "calendar", "relationships"] do
- attrs["page"]
- else
- "redir"
- end
-
- if page == "redir" do
- {:noreply,
- socket
- |> push_patch(to: "/friend/#{slug}/overview")}
- else
- {:noreply,
- socket
- |> title(friend.name <> " - " <> (page |> :string.titlecase()))
- |> assign_friend(friend)
- |> page_view(page)
- |> assign(:current_user, nil)
- |> assign(:action, Routes.friend_path(socket, :update, friend.id))}
- end
- end
-
# New Friend
def handle_params(_attrs, _token, socket) do
friend = Friend.new()
@@ -52,8 +26,7 @@ defmodule FriendsWeb.FriendsLive.Friend do
socket
|> title("New Friend")
|> assign_friend(friend)
- |> page_view("overview")
- |> assign(:action, Routes.friend_path(socket, :create))}
+ |> assign(:action, Routes.friends_path(socket, :create))}
end
# Handle form validation
@@ -134,57 +107,5 @@ defmodule FriendsWeb.FriendsLive.Friend do
|> push_navigate(to: "/")}
end
- # Set variables on page: friend, changeset, relationships
- def assign_friend(socket, friend) do
- socket
- |> assign(:friend, friend)
- |> assign(:changeset, friend |> Friend.changeset())
- |> assign(:relationships, friend.relationships)
- end
-
- # Same thing, but this time we have a changeset we want to keep
- def assign_friend(socket, friend, changeset) do
- socket
- |> assign(:friend, friend)
- |> assign(:changeset, changeset)
- |> assign(:relationships, friend.relationships)
- end
-
# Route to the right sub-template in Components/Components.ex
- def content(assigns) do
- ~H"""
- <%= if @live_action != :new do %>
- <%= FriendsWeb.FriendsLive.Friend.menu(assigns) %>
- <% end %>
- <%= cond do %>
- <% @live_action == :show -> %>
- <%= header(assigns) %>
- <%= @page_view |> Components.show_page(assigns) %>
- <% @live_action in [:edit, :new] -> %>
- <%= @page_view |> Components.form_page(assigns) %>
- <% end %>
- """
- end
-
- def header(assigns) do
- ~H"""
-
-
<%= @friend.name %>
-
- """
- end
-
- def menu(assigns) do
- ~H"""
-
- <%= for page <- ["overview", "calendar", "relationships"] do %>
- <% is_active = if(page == @page_view) do "tab-active" end %>
- <.link patch={"/friend/#{@friend.slug}/#{page}"} class={"font-bold sm:tab-lg flex-grow no-underline tab tab-lifted #{is_active}"}>
- <%= page |> :string.titlecase() %>
-
- <% end %>
-
-
- """
- end
end
diff --git a/friends/lib/friends_web/live/friend_live.ex b/friends/lib/friends_web/live/friend_live.ex
deleted file mode 100644
index edfef0a..0000000
--- a/friends/lib/friends_web/live/friend_live.ex
+++ /dev/null
@@ -1,3 +0,0 @@
-defmodule FriendsWeb.FriendLive do
- use FriendsWeb, :live_view
-end
diff --git a/friends/lib/friends_web/live/friends_live.ex b/friends/lib/friends_web/live/friends_live.ex
new file mode 100644
index 0000000..6ab079b
--- /dev/null
+++ b/friends/lib/friends_web/live/friends_live.ex
@@ -0,0 +1,3 @@
+defmodule FriendsWeb.FriendsLive do
+ use FriendsWeb, :live_view
+end
diff --git a/friends/lib/friends_web/live/show.ex b/friends/lib/friends_web/live/show.ex
index c2fb39a..af77f2c 100644
--- a/friends/lib/friends_web/live/show.ex
+++ b/friends/lib/friends_web/live/show.ex
@@ -1,31 +1,40 @@
-"""
-defmodule FriendsWeb.FriendLive.Show do
+defmodule FriendsWeb.FriendsLive.Show do
use FriendsWeb, :live_view
+ import FriendsWeb.LiveHelpers
alias Friends.Friend
+ alias FriendsWeb.FriendsLive.Components
- def handle_params(attrs, token, socket) do
- FriendsWeb.FriendLive.Friend.handle_params(attrs, token, socket)
+ def mount(%{"slug" => slug} = _attrs, token, socket) do
+ live_action = socket.assigns.live_action || false
+
+ friend = Friend.get_by_slug(slug)
+ editable = friend |> Friend.can_be_edited_by(socket.assigns[:current_user])
+
+ if(live_action) do
+ {:ok,
+ socket
+ |> assign(:live_action, live_action)
+ |> assign_current_user(token |> Map.get("user_token"))
+ |> assign(:friend, friend)
+ |> title(friend.name <> " - " <> (live_action |> titlecase))
+ |> assign(:changeset, %Friend{} |> Friend.changeset())
+ |> assign(:action, editable)}
+ else
+ {:ok, socket |> redirect(to: Routes.friends_show_path(socket, :overview, friend.slug))}
+ end
end
- def mount(%{"slug" => slug} = attrs, token, socket) do
- friend = slug |> Friends.Friend.get_by_slug()
+ def handle_params(%{"slug" => slug} = attrs, _url, socket) do
+ live_action = socket.assigns.live_action || false
- page =
- if (attrs |> Map.get("page")) in ["overview", "calendar", "relationships"] do
- attrs["page"]
- else
- "overview"
- end
+ friend = Friend.get_by_slug(slug)
+ editable = friend |> Friend.can_be_edited_by(socket.assigns[:current_user])
- {:ok,
+ {:noreply,
socket
- |> title(friend.name <> " - " <> (page |> :string.titlecase()))
- |> page_view(page)
- |> assign_current_user(token |> Map.get("user_token"))
- |> assign(:friend, friend)
- |> assign(:changeset, %Friend{} |> Friend.changeset())
- |> assign(:action, Routes.friend_path(socket, :update, friend.id))}
+ |> assign_friend(friend)
+ |> assign(:live_action, live_action)
+ |> title(friend.name <> " - " <> (live_action |> titlecase))
+ |> assign(:editable, editable)}
end
end
-
-"""
diff --git a/friends/lib/friends_web/live/show.html.heex b/friends/lib/friends_web/live/show.html.heex
index 39e6945..4b76ca2 100644
--- a/friends/lib/friends_web/live/show.html.heex
+++ b/friends/lib/friends_web/live/show.html.heex
@@ -1,5 +1,13 @@
-
+ <%= Components.menu(assigns) %>
+ <%= Components.header(assigns) %>
+ <%= Components.show_page(@live_action, assigns) %>
+
+ <%= if @editable do %>
+
+ <.link patch={Routes.friends_edit_path(FriendsWeb.Endpoint, :overview, @friend.slug)} class="btn btn-block md:btn-wide text-white">edit
+
+ <% end %>
diff --git a/friends/lib/friends_web/router.ex b/friends/lib/friends_web/router.ex
index 7226300..ba0962d 100644
--- a/friends/lib/friends_web/router.ex
+++ b/friends/lib/friends_web/router.ex
@@ -52,54 +52,63 @@ defmodule FriendsWeb.Router do
end
## Authentication routes
-
- scope "/", FriendsWeb do
+ # Routes that only work if user not authenticated
+ scope "/users", FriendsWeb do
pipe_through [:browser, :redirect_if_user_is_authenticated]
- # Requires the user NOT be authenticated:
-
- get "/users/register", UserRegistrationController, :new
- post "/users/register", UserRegistrationController, :create
- get "/users/log_in", UserSessionController, :new
- post "/users/log_in", UserSessionController, :create
- get "/users/reset_password", UserResetPasswordController, :new
- post "/users/reset_password", UserResetPasswordController, :create
- get "/users/reset_password/:token", UserResetPasswordController, :edit
- put "/users/reset_password/:token", UserResetPasswordController, :update
+ get "/register", UserRegistrationController, :new
+ post "/register", UserRegistrationController, :create
+ get "/log_in", UserSessionController, :new
+ post "/log_in", UserSessionController, :create
+ get "/reset_password", UserResetPasswordController, :new
+ post "/reset_password", UserResetPasswordController, :create
+ get "/reset_password/:token", UserResetPasswordController, :edit
+ put "/reset_password/:token", UserResetPasswordController, :update
end
- scope "/", FriendsWeb do
- pipe_through [:browser, :require_authenticated_user]
- # Requires the user DO be authenticated:
-
- live "/profile/new", ProfileLive.Form, :new
-
- get "/users/settings", UserSettingsController, :edit
- put "/users/settings", UserSettingsController, :update
- get "/users/settings/confirm_email/:token", UserSettingsController, :confirm_email
- end
-
- scope "/", FriendsWeb do
+ # Confirmation and logout
+ scope "/users", FriendsWeb do
pipe_through [:browser]
-
- delete "/users/log_out", UserSessionController, :delete
- get "/users/confirm", UserConfirmationController, :new
- post "/users/confirm", UserConfirmationController, :create
- get "/users/confirm/:token", UserConfirmationController, :edit
- post "/users/confirm/:token", UserConfirmationController, :update
+ delete "/log_out", UserSessionController, :delete
+ get "/confirm", UserConfirmationController, :new
+ post "/confirm", UserConfirmationController, :create
+ get "/confirm/:token", UserConfirmationController, :edit
+ post "/confirm/:token", UserConfirmationController, :update
end
+ # Routes that require the user be authenticated:
+ scope "/users/settings", FriendsWeb do
+ pipe_through [:browser, :require_authenticated_user]
+ get "/", UserSettingsController, :edit
+ put "/", UserSettingsController, :update
+ get "/confirm_email/:token", UserSettingsController, :confirm_email
+ end
# THE ACTUAL GUTS OF THE APP
scope "/", FriendsWeb do
pipe_through [:browser, :capture_profile]
-
get "/", PageController, :index
- get "/friends", FriendController, :index
-
- live "/friend/:slug", FriendLive.Show
- live "/friend/:slug/edit", FriendLive.Edit
end
+ # View-only modes (don't require being logged in and having a profile)
+ scope "/friends", FriendsWeb do
+ pipe_through [:browser]
+ get "/", FriendsController, :index
+ live "/:slug", FriendsLive.Show
+ live "/:slug/overview", FriendsLive.Show, :overview
+ live "/:slug/timeline", FriendsLive.Show, :timeline
+ live "/:slug/relationships", FriendsLive.Show, :relationships
+ end
+
+ # Edit modes (require being logged in and having a profile)
+ scope "/update/", FriendsWeb do
+ pipe_through [:browser, :require_authenticated_user, :capture_profile]
+
+ live "/:slug/overview", FriendsLive.Edit, :overview
+ live "/:slug/timeline", FriendsLive.Edit, :timeline
+ live "/:slug/relationships", FriendsLive.Edit, :relationships
+
+ post "/:slug/update", FriendsController, :update
+ end
end
diff --git a/friends/lib/friends_web/templates/friend/index.html.heex b/friends/lib/friends_web/templates/friends/index.html.heex
similarity index 63%
rename from friends/lib/friends_web/templates/friend/index.html.heex
rename to friends/lib/friends_web/templates/friends/index.html.heex
index 171a8b8..c89c1e8 100644
--- a/friends/lib/friends_web/templates/friend/index.html.heex
+++ b/friends/lib/friends_web/templates/friends/index.html.heex
@@ -3,7 +3,7 @@
<%= for f <- @all_friends do %>
-
- <.link href={"/friend/#{f.slug}"}><%= f.name %>
+ <.link href={Routes.friends_show_path(@conn, :overview, f.slug)}><%= f.name %>
<%= if @current_user do %>
<%= if f.id == @current_user.profile.id do %>
(you)
@@ -14,6 +14,6 @@
<%= if @current_user do %>
- <.link href="/friends/new" class="btn btn-primary">Add Friend
+ <.link href={Routes.friends_edit_path(@conn, :overview, :new)}>Add Friend
<% end %>
\ No newline at end of file
diff --git a/friends/lib/friends_web/templates/page/index.html.heex b/friends/lib/friends_web/templates/page/index.html.heex
index d63ea4f..943fdc2 100644
--- a/friends/lib/friends_web/templates/page/index.html.heex
+++ b/friends/lib/friends_web/templates/page/index.html.heex
@@ -9,7 +9,7 @@
and basically go back to the 2011 Facebook we all miss.
- <.db_stats all_friends={@all_friends} users={@users} />
+ <.friends_list friends={@friends} />
@@ -20,7 +20,7 @@
<.sign_up new_friend={@new_friend} />