70 lines
2.0 KiB
Elixir
70 lines
2.0 KiB
Elixir
defmodule SsoBsnWeb.UserSettingsLive do
|
|
use SsoBsnWeb, :live_view
|
|
|
|
alias SsoBsn.Accounts
|
|
|
|
def render(assigns) do
|
|
~H"""
|
|
<.header class="text-center">
|
|
Account Settings
|
|
</.header>
|
|
|
|
<div class="space-y-12 divide-y">
|
|
<div class="space-y-2">
|
|
<.header>Keys</.header>
|
|
<ol>
|
|
<li :for={key <- @current_user.keys}><pre class="truncate"><%= key.key_id %></pre></li>
|
|
</ol>
|
|
<.button id="settings-add-key" phx-hook="registrationHook" phx-click="register">
|
|
Register additional key
|
|
</.button>
|
|
</div>
|
|
<div class="space-y-2">
|
|
<%= if !@login_url do %>
|
|
<.button id="show-login-url" phx-click="show-login-url">Show login url</.button>
|
|
<% else %>
|
|
<pre><%= @login_url %></pre>
|
|
<% end %>
|
|
</div>
|
|
</div>
|
|
"""
|
|
end
|
|
|
|
def mount(_params, _session, socket) do
|
|
{:ok, socket |> assign(login_url: nil)}
|
|
end
|
|
|
|
def handle_event("register", _, socket) do
|
|
{challenge, challenge_client} = Accounts.registration_challenge(socket.assigns.current_user)
|
|
|
|
{:noreply,
|
|
socket
|
|
|> assign(challenge: challenge)
|
|
|> push_event("registration-challenge", challenge_client)}
|
|
end
|
|
|
|
def handle_event("registration-complete", params, socket) do
|
|
%{current_user: user, challenge: challenge} = socket.assigns
|
|
|
|
case Accounts.register_key(user, challenge, params) do
|
|
{:ok, _key} ->
|
|
{:noreply,
|
|
socket |> assign(current_user: Accounts.reload_user(socket.assigns.current_user))}
|
|
|
|
{:error, error} ->
|
|
dbg(error)
|
|
{:noreply, socket |> put_flash(:error, "An error occured")}
|
|
end
|
|
end
|
|
|
|
def handle_event("show-login-url", %{}, socket) do
|
|
token = Accounts.generate_user_login_token(socket.assigns.current_user)
|
|
|
|
{:noreply,
|
|
socket |> assign(login_url: url(socket, ~p"/users/log_in/#{token}"))}
|
|
end
|
|
|
|
def handle_event("error", payload, socket),
|
|
do: {:noreply, socket |> put_flash(:error, inspect(payload))}
|
|
end
|