defmodule PlausibleWeb.Live.ChoosePlan do @moduledoc """ LiveView for upgrading to a plan, or changing an existing plan. """ use PlausibleWeb, :live_view use Phoenix.HTML require Plausible.Billing.Subscription.Status alias PlausibleWeb.Components.Billing.{PlanBox, PlanBenefits, Notice, PageviewSlider} alias Plausible.Site alias Plausible.Users alias Plausible.Billing.{Plans, Quota} @contact_link "https://plausible.io/contact" @billing_faq_link "https://plausible.io/docs/billing" def mount(_params, %{"current_user_id" => user_id, "remote_ip" => remote_ip}, socket) do socket = socket |> assign_new(:user, fn -> Users.with_subscription(user_id) end) |> assign_new(:pending_ownership_site_ids, fn %{user: user} -> user.email |> Site.Memberships.all_pending_ownerships() |> Enum.map(& &1.site_id) end) |> assign_new(:usage, fn %{ user: user, pending_ownership_site_ids: pending_ownership_site_ids } -> Quota.Usage.usage(user, with_features: true, pending_ownership_site_ids: pending_ownership_site_ids ) end) |> assign_new(:owned_plan, fn %{user: %{subscription: subscription}} -> Plans.get_regular_plan(subscription, only_non_expired: true) end) |> assign_new(:owned_tier, fn %{owned_plan: owned_plan} -> if owned_plan, do: Map.get(owned_plan, :kind), else: nil end) |> assign_new(:current_interval, fn %{user: user} -> current_user_subscription_interval(user.subscription) end) |> assign_new(:available_plans, fn %{user: user} -> Plans.available_plans_for(user, with_prices: true, customer_ip: remote_ip) end) |> assign_new(:recommended_tier, fn %{usage: usage, available_plans: available_plans} -> highest_growth_plan = List.last(available_plans.growth) highest_business_plan = List.last(available_plans.business) Quota.suggest_tier(usage, highest_growth_plan, highest_business_plan) end) |> assign_new(:available_volumes, fn %{available_plans: available_plans} -> get_available_volumes(available_plans) end) |> assign_new(:selected_volume, fn %{ usage: usage, available_volumes: available_volumes } -> default_selected_volume(usage.monthly_pageviews, available_volumes) end) |> assign_new(:selected_interval, fn %{current_interval: current_interval} -> current_interval || :monthly end) |> assign_new(:selected_growth_plan, fn %{ available_plans: available_plans, selected_volume: selected_volume } -> get_plan_by_volume(available_plans.growth, selected_volume) end) |> assign_new(:selected_business_plan, fn %{ available_plans: available_plans, selected_volume: selected_volume } -> get_plan_by_volume(available_plans.business, selected_volume) end) {:ok, socket} end def render(assigns) do growth_plan_to_render = assigns.selected_growth_plan || List.last(assigns.available_plans.growth) business_plan_to_render = assigns.selected_business_plan || List.last(assigns.available_plans.business) growth_benefits = PlanBenefits.for_growth(growth_plan_to_render) business_benefits = PlanBenefits.for_business(business_plan_to_render, growth_benefits) enterprise_benefits = PlanBenefits.for_enterprise(business_benefits) assigns = assigns |> assign(:growth_plan_to_render, growth_plan_to_render) |> assign(:business_plan_to_render, business_plan_to_render) |> assign(:growth_benefits, growth_benefits) |> assign(:business_benefits, business_benefits) |> assign(:enterprise_benefits, enterprise_benefits) ~H"""
<%= if @owned_plan, do: "Change subscription plan", else: "Upgrade your account" %>
<.render_usage pageview_usage={@usage.monthly_pageviews} />
<.pageview_limit_notice :if={!@owned_plan} /> <.help_links />What happens if I go over my page views limit?