defmodule DexiWeb.LoginLive do use DexiWeb, :live_view alias Dexi.GridsLoginHandler @impl true def mount(_params, %{"session_id" => session_id}, socket) do if connected?(socket), do: Phoenix.PubSub.subscribe(Dexi.PubSub, session_id) grids_url = GridsLoginHandler.get_signature_url(session_id) socket = socket |> assign(:page_title, "Log in") |> assign(:session_id, session_id) |> assign_grids_url(grids_url) |> schedule_refresh() {:ok, socket} end @impl true def handle_info({:pubkey_added, message_id}, socket) do {:noreply, redirect(socket, to: ~p"/session/#{message_id}")} end def handle_info(:refresh_grids_url, socket) do grids_url = GridsLoginHandler.get_signature_url(socket.assigns.session_id) {:noreply, socket |> assign_grids_url(grids_url) |> schedule_refresh()} end @impl true def render(assigns) do ~H"""

Wallet authentication

Log in to Dexi

Sign this one-time message with the account key you want to use. A new key creates a new user account.

{raw(@qr_code)}
  1. 1. Open your wallet and select an account.
  2. 2. Open GRIDS URL and paste the code if needed.
  3. 3. Approve the message signature.
""" end defp schedule_refresh(socket) do if connected?(socket) do Process.send_after( self(), :refresh_grids_url, Application.fetch_env!(:dexi, :login_url_refresh_interval_in_milliseconds) ) end socket end defp assign_grids_url(socket, grids_url) do qr_code = grids_url |> EQRCode.encode() |> EQRCode.svg(%{color: "var(--color-electric-cyan)", width: 256}) socket |> assign(:grids_url, grids_url) |> assign(:qr_code, qr_code) end end