defmodule PlausibleWeb.Live.Plugins.API.TokenForm do @moduledoc """ Live view for the goal creation form """ use PlausibleWeb, live_view: :no_sentry_context import PlausibleWeb.Live.Components.Form alias Plausible.Plugins.API.{Token, Tokens} def mount( _params, %{ "token_description" => token_description, "domain" => domain, "rendered_by" => pid }, socket ) do socket = socket |> assign_new(:site, fn %{current_user: current_user} -> Plausible.Sites.get_for_user!(current_user, domain, roles: [ :owner, :admin, :editor, :super_admin ] ) end) token = Token.generate() form = to_form(Token.insert_changeset(socket.assigns.site, token)) {:ok, assign(socket, token_description: token_description, token: token, form: form, domain: domain, rendered_by: pid, token_generated: false )} end def render(assigns) do ~H"""
<%= if @token_generated do %>
<.input_with_clipboard id="token-clipboard" name="token_clipboard" label="Plugin Token" value={@token.raw} />

Copy the token and store it in a secure place, as it won't be shown again. You'll need to paste the token in the settings area of the Plausible WordPress plugin.

<.button theme="secondary" phx-click="close-token-modal" class="w-full" > Close modal <% else %> <.form :let={f} for={@form} phx-submit="generate-token"> <.title> Create plugin token for {@domain}
<.input autofocus field={f[:description]} label="Description" placeholder="e.g. Your Plugin Name" value={@token_description} autocomplete="off" disabled={@token_generated} />

Once created, we will display the token so it can be copied.

<.button type="submit" class="w-full"> Create plugin token <% end %>
""" end def handle_event("generate-token", %{"token" => %{"description" => description}}, socket) do case Tokens.create(socket.assigns.site, description, socket.assigns.token) do {:ok, token, _} -> send(socket.assigns.rendered_by, {:token_created, token}) {:noreply, assign(socket, token_generated: true)} {:error, changeset} -> {:noreply, assign(socket, form: to_form(changeset))} end end def handle_event("close-token-modal", _value, socket) do send(socket.assigns.rendered_by, :close_token_modal) {:noreply, socket} end end