diff --git a/friends/lib/friends/friend.ex b/friends/lib/friends/friend.ex
index d7aa75c..42281e3 100644
--- a/friends/lib/friends/friend.ex
+++ b/friends/lib/friends/friend.ex
@@ -46,20 +46,35 @@ defmodule Friends.Friend do
:user_id,
:address_id
])
- |> Ecto.Changeset.validate_required([:name, :email, :phone, :born])
- |> Ecto.Changeset.validate_format(:name, ~r/\w+\ \w+/)
+ |> Ecto.Changeset.validate_required([:name, :email, :phone, :born], message: "This field is required.")
+ |> Ecto.Changeset.validate_format(:name, ~r/\w+\ \w+/, message: "Please enter your full name.")
|> Ecto.Changeset.validate_format(
:email,
- Regex.compile!("^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$")
+ Regex.compile!("^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$"),
+ message: "Invalid email format."
)
|> Ecto.Changeset.validate_format(
:phone,
- Regex.compile!("^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$")
+ Regex.compile!("^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$"),
+ message: "Invalid phone format."
)
+ |> validate_birthdate()
|> Ecto.Changeset.unique_constraint(:name)
|> Ecto.Changeset.unique_constraint(:email)
end
+ defp validate_birthdate(%{changes: %{born: born}} = changeset) do
+ today = DateTime.utc_now |> DateTime.to_date
+ case born |> Date.diff(today) |> div(-365) do
+ age when age < 0 ->
+ changeset |> Ecto.Changeset.add_error(:born, "Please enter a date in the past.")
+ age when age > 90 ->
+ changeset |> Ecto.Changeset.add_error(:born, "Are you sure you're #{age} years old?")
+ _ -> changeset
+ end
+ end
+ defp validate_birthdate(changeset), do: changeset
+
def all() do
preloads = [:relationships, :reverse_relationships, :user, :address]
@repo.all(from(f in Friends.Friend, preload: ^preloads))
@@ -97,7 +112,7 @@ defmodule Friends.Friend do
|> load_preloads()
end
- def create(params) do
+ def create(params \\ %{id: nil}) do
%Friend{}
|> Friend.changeset(%{params | id: nil})
|> Map.put(:action, :insert)
@@ -223,7 +238,7 @@ defmodule Friends.Friend do
|> @repo.preload([:user, :relationships, :reverse_relationships, :address])
end
- def load_preloads(%Friends.Friend{} = friend), do: friend
+ def load_preloads(friend), do: friend
def get_address(%Friend{} = friend) do
if friend.address do
diff --git a/friends/lib/friends_web/live/components/components.ex b/friends/lib/friends_web/live/components/components.ex
index dbd874b..aba518d 100644
--- a/friends/lib/friends_web/live/components/components.ex
+++ b/friends/lib/friends_web/live/components/components.ex
@@ -185,7 +185,7 @@ defmodule FriendsWeb.FriendsLive.Components do
Phone:
- <%= text_input f, :phone, class: "input input-primary input-sm md:input-md", phx_debounce: "blur", value: @friend.phone %>
+ <%= text_input f, :phone, class: "input input-primary input-sm md:input-md", phx_debounce: "blur", value: @friend.phone |> FriendsWeb.LiveHelpers.display_phone(@changeset) %>
<%= error_tag f, :phone %>
@@ -220,7 +220,7 @@ defmodule FriendsWeb.FriendsLive.Components do
<%= submit "Save", class: "btn btn-block btn-disabled" %>
<% end %>
- <%= if @current_user.profile.id == @friend.id do %>
+ <%= if @live_action != :welcome and @current_user.profile.id == @friend.id do %>
<.link href={Routes.user_settings_path(FriendsWeb.Endpoint, :edit)} class="btn btn-block btn-error">Delete
diff --git a/friends/lib/friends_web/live/edit.ex b/friends/lib/friends_web/live/edit.ex
index ef60e36..25ebe2b 100644
--- a/friends/lib/friends_web/live/edit.ex
+++ b/friends/lib/friends_web/live/edit.ex
@@ -17,6 +17,8 @@ defmodule FriendsWeb.FriendsLive.Edit do
|> assign(:live_action, live_action)
|> assign_current_user(token |> Map.get("user_token"))
|> assign(:friend, friend)
+ |> assign(:address_latlon, nil)
+ |> assign(:search_results, nil)
|> title("Welcome")
|> assign(:changeset, %Friend{} |> Friend.changeset())}
end
@@ -76,7 +78,7 @@ defmodule FriendsWeb.FriendsLive.Edit do
end
def handle_event("validate", %{"friend" => form_params}, %{assigns: %{friend: friend}} = socket) do
- id = form_params["id"] |> String.to_integer()
+ id = form_params["id"] |> parse_id
name = form_params["name"]
nickname = form_params["nickname"]
born = form_params["born"]
diff --git a/friends/lib/friends_web/views/error_helpers.ex b/friends/lib/friends_web/views/error_helpers.ex
index b9a4776..685c497 100644
--- a/friends/lib/friends_web/views/error_helpers.ex
+++ b/friends/lib/friends_web/views/error_helpers.ex
@@ -10,10 +10,8 @@ defmodule FriendsWeb.ErrorHelpers do
"""
def error_tag(form, field) do
Enum.map(Keyword.get_values(form.errors, field), fn error ->
- content_tag(:span, translate_error(error),
- class: "invalid-feedback",
- phx_feedback_for: input_name(form, field)
- )
+ field = field |> Atom.to_string() |> String.capitalize()
+ content_tag(:span, "#{translate_error(error)}", class: "block mt-1 text-sm text-red-700")
end)
end
diff --git a/friends/lib/friends_web/views/live_helpers.ex b/friends/lib/friends_web/views/live_helpers.ex
index 5c7fbca..d5ffb82 100644
--- a/friends/lib/friends_web/views/live_helpers.ex
+++ b/friends/lib/friends_web/views/live_helpers.ex
@@ -6,6 +6,33 @@ defmodule FriendsWeb.LiveHelpers do
atom |> to_string |> :string.titlecase()
end
+ def parse_id("new"), do: "new"
+ def parse_id(int), do: int |> String.to_integer()
+
+ def display_phone(phone, changeset) do
+ if changeset.errors[:phone] do
+ phone
+ else
+ display_phone(phone)
+ end
+ end
+ def display_phone(phone) do
+ """
+ TODO: Actually implement this
+ """
+
+ has_plus = phone |> String.starts_with?("+")
+ case phone |> String.length do
+ 10 ->
+ country = "+1 "
+ [area, first, sec1, sec2] = phone |> to_charlist |> Enum.chunk_every(3) |> Enum.map(&(&1 |> to_string))
+ "#{country}(#{area}) #{first}-#{sec1}#{sec2}"
+ IO.inspect "#{country}(#{area}) #{first}-#{sec1}#{sec2}"
+ 11 when has_plus ->
+ phone
+ end
+ end
+
def assign_current_user(socket, user_token) do
user =
case user_token do