Skip to content

Instantly share code, notes, and snippets.

@chrismccord
Last active April 7, 2022 10:11
Show Gist options
  • Star 24 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save chrismccord/5d2f6e99112c9a67fedb2b8501a5bcab to your computer and use it in GitHub Desktop.
Save chrismccord/5d2f6e99112c9a67fedb2b8501a5bcab to your computer and use it in GitHub Desktop.
# <%= f = form_for @changeset, "#", phx_hook: "SavedForm", phx_change: :validate, phx_submit: :save %>

def mount(_session, socket) do
  changeset =
    case get_connect_params(socket) do
      %{"stashed_form" => encoded} ->
        %User{}
        |> Accounts.change_user(Plug.Conn.Query.decode(encoded)["user"])
        |> Map.put(:action, :insert)

      _ ->
        Accounts.change_user(%User{})
    end

  {:ok, assign(socket, changeset: changeset)}
end
let serializeForm = (form) => {
  let formData = new FormData(form)
  let params = new URLSearchParams()
  for(let [key, val] of formData.entries()){ params.append(key, val) }

  return params.toString()
}

let Params = {
  data: {},
  set(namespace, key, val){
    if(!this.data[namespace]){ this.data[namespace] = {}}
    this.data[namespace][key] = val
  },
  get(namespace){ return this.data[namespace] || {} }
}

let Hooks = {}
Hooks.SavedForm = {
  mounted(){
    this.el.addEventListener("input", e => {
      Params.set(this.viewName, "stashed_form", serializeForm(this.el))
    })
  }
}

let socket = new LiveSocket("/live", {hooks: Hooks, params: (view) => Params.get(view)})
socket.connect()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment