diff --git a/lib/algora_web/live/crowdfund.ex b/lib/algora_web/live/crowdfund.ex index 6eb21d50..256cccb6 100644 --- a/lib/algora_web/live/crowdfund.ex +++ b/lib/algora_web/live/crowdfund.ex @@ -19,6 +19,7 @@ defmodule AlgoraWeb.CrowdfundLive do alias AlgoraWeb.Data.PlatformStats alias AlgoraWeb.Forms.BountyForm alias AlgoraWeb.Forms.TipForm + alias AlgoraWeb.LocalStore require Logger @@ -58,7 +59,7 @@ defmodule AlgoraWeb.CrowdfundLive do |> assign(:page_title, "Crowdfund") |> assign(:page_image, "#{AlgoraWeb.Endpoint.url()}/og/crowdfund") |> assign(:screenshot?, not is_nil(params["screenshot"])) - |> assign(:oauth_url, Github.authorize_url(%{socket_id: socket.id})) + |> assign(:oauth_url, Github.authorize_url(%{return_to: "/crowdfund"})) |> assign(:featured_devs, Accounts.list_featured_developers()) |> assign(:stats, stats) |> assign(:bounty_form, to_form(BountyForm.changeset(%BountyForm{}, %{}))) @@ -106,7 +107,7 @@ defmodule AlgoraWeb.CrowdfundLive do @impl true def render(assigns) do ~H""" -
+
<%= if @screenshot? do %>
<% else %> @@ -406,6 +407,28 @@ defmodule AlgoraWeb.CrowdfundLive do """ end + @impl true + def handle_params(_params, _uri, socket) do + {:noreply, + socket + |> LocalStore.init(key: __MODULE__) + |> LocalStore.subscribe()} + end + + @impl true + def handle_event("restore_settings", params, socket) do + socket = LocalStore.restore(socket, params) + + case socket.assigns.pending_action do + nil -> + {:noreply, socket} + + {event, params} -> + socket = LocalStore.assign_cached(socket, :pending_action, nil) + handle_event(event, params, socket) + end + end + @impl true def handle_event("create_bounty" = event, %{"bounty_form" => params} = unsigned_params, socket) do changeset = @@ -436,8 +459,8 @@ defmodule AlgoraWeb.CrowdfundLive do else {:noreply, socket - |> assign(:pending_action, {event, unsigned_params}) - |> push_event("open_popup", %{url: socket.assigns.oauth_url})} + |> LocalStore.assign_cached(:pending_action, {event, unsigned_params}) + |> redirect(external: socket.assigns.oauth_url)} end else {:noreply, assign(socket, :bounty_form, to_form(changeset))} @@ -473,8 +496,8 @@ defmodule AlgoraWeb.CrowdfundLive do else {:noreply, socket - |> assign(:pending_action, {event, unsigned_params}) - |> push_event("open_popup", %{url: socket.assigns.oauth_url})} + |> LocalStore.assign_cached(:pending_action, {event, unsigned_params}) + |> redirect(external: socket.assigns.oauth_url)} end else {:noreply, assign(socket, :tip_form, to_form(changeset))} diff --git a/lib/algora_web/live/org/bounties_new_live.ex b/lib/algora_web/live/org/bounties_new_live.ex index 76af2086..5fd1cda5 100644 --- a/lib/algora_web/live/org/bounties_new_live.ex +++ b/lib/algora_web/live/org/bounties_new_live.ex @@ -11,6 +11,7 @@ defmodule AlgoraWeb.Org.BountiesNewLive do alias Algora.Github alias Algora.Payments alias AlgoraWeb.Forms.BountyForm + alias AlgoraWeb.LocalStore require Logger @@ -51,7 +52,8 @@ defmodule AlgoraWeb.Org.BountiesNewLive do socket |> assign(:org, org) |> assign(:has_fresh_token?, Accounts.has_fresh_token?(socket.assigns.current_user)) - |> assign(:oauth_url, Github.authorize_url(%{socket_id: socket.id})) + |> assign(:oauth_url, Github.authorize_url(%{return_to: "/#{org.handle}/bounties/new"})) + |> assign(:pending_action, nil) |> assign(:bounty_form, to_form(BountyForm.changeset(%BountyForm{}, %{}))) |> assign(:page_title, org.name) |> assign(:page_description, "#{org.name} OSS bounty board - fund GitHub issues and prioritize development") @@ -67,7 +69,11 @@ defmodule AlgoraWeb.Org.BountiesNewLive do @impl true def render(assigns) do ~H""" -
+
@@ -265,6 +271,31 @@ defmodule AlgoraWeb.Org.BountiesNewLive do """ end + @impl true + def handle_params(_params, uri, socket) do + return_to = URI.parse(uri).path + + {:noreply, + socket + |> assign(:oauth_url, Github.authorize_url(%{return_to: return_to})) + |> LocalStore.init(key: __MODULE__) + |> LocalStore.subscribe()} + end + + @impl true + def handle_event("restore_settings", params, socket) do + socket = LocalStore.restore(socket, params) + + case socket.assigns.pending_action do + nil -> + {:noreply, socket} + + {event, params} -> + socket = LocalStore.assign_cached(socket, :pending_action, nil) + handle_event(event, params, socket) + end + end + @impl true def handle_info({:authenticated, user}, socket) do socket = @@ -322,8 +353,8 @@ defmodule AlgoraWeb.Org.BountiesNewLive do else {:noreply, socket - |> assign(:pending_action, {event, unsigned_params}) - |> push_event("open_popup", %{url: socket.assigns.oauth_url})} + |> LocalStore.assign_cached(:pending_action, {event, unsigned_params}) + |> redirect(external: socket.assigns.oauth_url)} end end diff --git a/lib/algora_web/live/org/settings_live.ex b/lib/algora_web/live/org/settings_live.ex index 20357ebe..837c6f19 100644 --- a/lib/algora_web/live/org/settings_live.ex +++ b/lib/algora_web/live/org/settings_live.ex @@ -10,13 +10,18 @@ defmodule AlgoraWeb.Org.SettingsLive do alias Algora.Markdown alias Algora.Payments alias AlgoraWeb.Components.Logos + alias AlgoraWeb.LocalStore require Logger @impl true def render(assigns) do ~H""" -
+

Settings

Update your settings and preferences

@@ -248,7 +253,8 @@ defmodule AlgoraWeb.Org.SettingsLive do socket |> assign(:has_fresh_token?, Accounts.has_fresh_token?(socket.assigns.current_user)) |> assign(:installations, installations) - |> assign(:oauth_url, Github.authorize_url(%{socket_id: socket.id})) + |> assign(:oauth_url, Github.authorize_url(%{return_to: "/#{current_org.handle}/settings"})) + |> assign(:pending_action, nil) |> assign_has_default_payment_method() |> assign(:template_form, to_form(template_changeset)) |> assign(:template_preview, preview_template(socket, template)) @@ -285,8 +291,8 @@ defmodule AlgoraWeb.Org.SettingsLive do redirect(socket, external: Github.install_url_select_target()) else socket - |> assign(:pending_action, {event, unsigned_params}) - |> push_event("open_popup", %{url: socket.assigns.oauth_url}) + |> LocalStore.assign_cached(:pending_action, {event, unsigned_params}) + |> redirect(external: socket.assigns.oauth_url) end} end @@ -360,6 +366,20 @@ defmodule AlgoraWeb.Org.SettingsLive do end end + @impl true + def handle_event("restore_settings", params, socket) do + socket = LocalStore.restore(socket, params) + + case socket.assigns.pending_action do + nil -> + {:noreply, socket} + + {event, params} -> + socket = LocalStore.assign_cached(socket, :pending_action, nil) + handle_event(event, params, socket) + end + end + @impl true def handle_event(_event, _params, socket) do {:noreply, socket} @@ -367,7 +387,11 @@ defmodule AlgoraWeb.Org.SettingsLive do @impl true def handle_params(params, _url, socket) do - {:noreply, apply_action(socket, socket.assigns.live_action, params)} + {:noreply, + socket + |> LocalStore.init(key: __MODULE__) + |> LocalStore.subscribe() + |> apply_action(socket.assigns.live_action, params)} end defp apply_action(socket, :edit, _params) do diff --git a/lib/algora_web/live/swift_bounties_live.ex b/lib/algora_web/live/swift_bounties_live.ex index 1a2e0af0..5e57931b 100644 --- a/lib/algora_web/live/swift_bounties_live.ex +++ b/lib/algora_web/live/swift_bounties_live.ex @@ -15,6 +15,7 @@ defmodule AlgoraWeb.SwiftBountiesLive do alias AlgoraWeb.Components.Logos alias AlgoraWeb.Forms.BountyForm alias AlgoraWeb.Forms.TipForm + alias AlgoraWeb.LocalStore alias AlgoraWeb.UserAuth require Logger @@ -34,7 +35,7 @@ defmodule AlgoraWeb.SwiftBountiesLive do |> assign(:page_image, "#{AlgoraWeb.Endpoint.url()}/images/og/swift.png") |> assign(:bounty_form, to_form(BountyForm.changeset(%BountyForm{}, %{}))) |> assign(:tip_form, to_form(TipForm.changeset(%TipForm{}, %{}))) - |> assign(:oauth_url, Github.authorize_url(%{socket_id: socket.id})) + |> assign(:oauth_url, Github.authorize_url(%{return_to: "/swift"})) |> assign(:pending_action, nil) |> assign_bounties() |> assign_active_repos() @@ -48,7 +49,11 @@ defmodule AlgoraWeb.SwiftBountiesLive do def render(assigns) do ~H""" -
+