defmodule MoonWeb.Examples.Parts.ModalExample.WithForm2 do @moduledoc false use Moon.StatefulComponent alias Moon.Design.Tabs alias Moon.Design.Form alias Moon.Design.Form.{Field, Input, Dropdown, Checkbox} alias Moon.Parts.{Wizard, Modal} alias Moon.Design.Button alias MoonWeb.Schema.Flow prop(is_open, :boolean, default: false) data(changeset, :any, default: Flow.changeset(%{})) data(steps, :any) data(verification_types, :any) data(provider_names, :any) data(merchant_names, :any) data(form_id, :string) def render(assigns) do form_id = "#{assigns.id}-form" assigns = assign(assigns, form_id: form_id) ~F"""
<:description>

Create new flow

""" end def mount(socket) do steps = list_flow_steps() merchant_names = [ %{key: "Merchant1", value: "Merchant1"}, %{key: "Merchant2", value: "Merchant2"} ] verification_types = list_verification_types() {:ok, socket |> assign(:steps, steps) |> assign(:merchant_names, merchant_names) |> assign(:provider_names, []) |> assign(:get_merchants_response, [ %{name: "Merchant1", providers: [%{name: "Provider1"}]}, %{name: "Merchant2", providers: [%{name: "Provider"}]} ]) |> assign(:verification_types, verification_types) |> assign(:form, Flow.changeset(%{}))} end defp list_flow_steps() do [ %{ title: "General", text: "Basic information about the flow." }, %{ title: "Details", text: "We require some additional information based on the provider you choose." } ] end defp list_verification_types() do [ %{ key: "ID", value: "id" }, %{ key: "Selfie", value: "selfie" }, %{ key: "POA", value: "poa" }, %{ key: "Liveness", value: "liveness" } ] end def handle_event("set_open", _, socket) do {:noreply, assign(socket, is_open: true)} end def handle_event("set_close", _, socket) do {:noreply, assign(socket, is_open: false)} end def handle_event("on_form_change", params = %{"_target" => ["flow", "flow_name"]}, socket) do flow_name = get_in(params, ["flow", "flow_name"]) form = Flow.changeset(socket.assigns.form, %{flow_name: flow_name}) socket = socket |> assign(:form, form) {:noreply, socket} end def handle_event("on_form_change", params = %{"_target" => ["flow", "merchant_name"]}, socket) do merchant_name = get_in(params, ["flow", "merchant_name"]) provider_names = list_provider_names(socket.assigns.get_merchants_response, merchant_name) form = Flow.changeset(socket.assigns.form, %{merchant_name: merchant_name}) socket = socket |> assign(:form, form) |> assign(:provider_names, provider_names) {:noreply, socket} end def handle_event("on_form_change", params = %{"_target" => ["flow", "provider_name"]}, socket) do provider_name = get_in(params, ["flow", "provider_name"]) form = Flow.changeset(socket.assigns.form, %{provider_name: provider_name}) socket = socket |> assign(:form, form) {:noreply, socket} end def handle_event( "on_form_change", params = %{"_target" => ["flow", "verification_types"]}, socket ) do verification_types = get_in(params, ["flow", "verification_types"]) form = Flow.changeset(socket.assigns.form, %{verification_types: verification_types}) {:noreply, socket |> assign(:form, form)} end def handle_event("apply", _params, socket) do changeset = Map.merge(socket.assigns.changeset, %{action: :insert}) {:noreply, assign(socket, is_open: !changeset.valid?, changeset: changeset)} end defp list_provider_names(get_merchants_response, merchant_name) do merchant = get_merchants_response |> Enum.find(fn merchant -> merchant.name == merchant_name end) merchant.providers |> Enum.map(fn provider -> %{key: provider["name"], value: provider["name"]} end) end end