defmodule PlausibleWeb.Live.SharedLinkSettings do @moduledoc """ LiveView allowing listing, creating and deleting shared links. """ use PlausibleWeb, :live_view alias PlausibleWeb.Live.Components.Modal import Ecto.Query def mount( _params, %{"site_id" => site_id, "domain" => domain}, socket ) do socket = socket |> assign_new(:site, fn %{current_user: current_user} -> current_user |> Plausible.Sites.get_for_user!(domain, roles: [:owner, :admin, :editor, :super_admin]) end) |> assign_new(:shared_links, fn %{site: site} -> Plausible.Repo.all( from(l in Plausible.Site.SharedLink, where: l.site_id == ^site.id and l.name not in ^Plausible.Sites.shared_link_special_names(), order_by: [desc: l.id] ) ) end) {:ok, assign(socket, site_id: site_id, site_team: socket.assigns.site.team, domain: domain, form_shared_link: nil )} end def render(assigns) do ~H""" """ end def handle_event("add-shared-link", _, socket) do socket = socket |> assign(form_shared_link: nil) |> Modal.open("shared-links-form-modal") {:noreply, socket} end def handle_event("edit-shared-link", %{"slug" => slug}, socket) do site_id = socket.assigns.site.id shared_link = Plausible.Site.SharedLink |> Plausible.Repo.get_by(slug: slug, site_id: site_id) |> Plausible.Repo.preload(:segment) socket = if shared_link do socket |> assign(form_shared_link: shared_link) |> Modal.open("shared-links-form-modal") else put_live_flash(socket, :error, "Could not find Shared Link") end {:noreply, socket} end def handle_event("delete-shared-link", %{"slug" => slug}, socket) do site_id = socket.assigns.site.id case Plausible.Repo.delete_all( from(l in Plausible.Site.SharedLink, where: l.slug == ^slug, where: l.site_id == ^site_id ) ) do {1, _} -> socket = socket |> put_live_flash(:success, "Shared link deleted") |> assign(shared_links: Enum.reject(socket.assigns.shared_links, &(&1.slug == slug))) {:noreply, socket} {0, _} -> socket = socket |> put_live_flash(:error, "Could not find Shared Link") {:noreply, socket} end end def handle_info({:shared_link_added, _shared_link}, socket) do shared_links = Plausible.Repo.all( from(l in Plausible.Site.SharedLink, where: l.site_id == ^socket.assigns.site.id and l.name not in ^Plausible.Sites.shared_link_special_names(), order_by: [desc: l.id] ) ) socket = socket |> assign( shared_links: shared_links, form_shared_link: nil ) |> put_live_flash(:success, "Shared link saved") {:noreply, socket} end end