diff --git a/lib/plausible_web/controllers/stats_controller.ex b/lib/plausible_web/controllers/stats_controller.ex index 88d93460a9cb..e1db517cb05d 100644 --- a/lib/plausible_web/controllers/stats_controller.ex +++ b/lib/plausible_web/controllers/stats_controller.ex @@ -7,6 +7,7 @@ defmodule PlausibleWeb.StatsController do plug PlausibleWeb.AuthorizeStatsPlug when action in [:stats, :csv_export] plug PlausibleWeb.UpgradeBillingPlug when action in [:stats] plug PlausibleWeb.EmbeddableStatsPlug when action in [:stats] + plug PlausibleWeb.SharedLinkThemeSelectionPlug when action in [:stats] plug PlausibleWeb.EmbeddableAuthSharedLinkPlug when action in [:shared_link, :authenticate_shared_link] @@ -15,7 +16,16 @@ defmodule PlausibleWeb.StatsController do PlausibleWeb.Endpoint.host() end - def stats(%{assigns: %{site: site}} = conn, _params) do + def stats( + %{ + assigns: %{ + site: site, + valid_shared_link: valid_shared_link, + selected_theme: selected_theme + } + } = conn, + _params + ) do if Stats.has_pageviews?(site) do demo = site.domain == base_domain() offer_email_report = get_session(conn, site.domain <> "_offer_email_report") @@ -30,7 +40,9 @@ defmodule PlausibleWeb.StatsController do has_goals: Plausible.Sites.has_goals?(site), title: "Plausible · " <> site.domain, offer_email_report: offer_email_report, - demo: demo + demo: demo, + valid_shared_link: valid_shared_link, + selected_theme: selected_theme ) else conn diff --git a/lib/plausible_web/plugs/embeddable_stats_plug.ex b/lib/plausible_web/plugs/embeddable_stats_plug.ex index 02be1cd6363a..1a2ff29123d1 100644 --- a/lib/plausible_web/plugs/embeddable_stats_plug.ex +++ b/lib/plausible_web/plugs/embeddable_stats_plug.ex @@ -1,6 +1,5 @@ defmodule PlausibleWeb.EmbeddableStatsPlug do import Plug.Conn - use Plausible.Repo def init(options) do options diff --git a/lib/plausible_web/plugs/shared_link_theme_selection_plug.ex b/lib/plausible_web/plugs/shared_link_theme_selection_plug.ex new file mode 100644 index 000000000000..bc600c6139d4 --- /dev/null +++ b/lib/plausible_web/plugs/shared_link_theme_selection_plug.ex @@ -0,0 +1,44 @@ +defmodule PlausibleWeb.SharedLinkThemeSelectionPlug do + import Plug.Conn + + def init(options) do + options + end + + def call(%{assigns: %{site: site}} = conn, _opts) do + if !site do + PlausibleWeb.ControllerHelpers.render_error(conn, 404) |> halt + else + shared_link_key = "shared_link_auth_" <> site.domain + shared_link_auth = get_session(conn, shared_link_key) + + valid_shared_link = + shared_link_auth && shared_link_auth[:valid_until] > DateTime.to_unix(Timex.now()) + + if valid_shared_link do + theme_index = Enum.find_index(conn.path_info, fn x -> x == "theme" end) + + selected_theme = + if( + theme_index, + do: Enum.at(conn.path_info, theme_index + 1), + else: get_session(conn, "selected_theme") + ) + + conn + |> put_session("selected_theme", selected_theme) + |> assign(:site, site) + |> assign(:valid_shared_link, valid_shared_link) + |> assign(:selected_theme, selected_theme) + else + selected_theme = nil + + conn + |> delete_session("selected_theme") + |> assign(:site, site) + |> assign(:valid_shared_link, valid_shared_link) + |> assign(:selected_theme, selected_theme) + end + end + end +end diff --git a/lib/plausible_web/templates/layout/app.html.eex b/lib/plausible_web/templates/layout/app.html.eex index 709ab9b1a45d..15333c573e83 100644 --- a/lib/plausible_web/templates/layout/app.html.eex +++ b/lib/plausible_web/templates/layout/app.html.eex @@ -10,7 +10,7 @@