@@ -4,6 +4,7 @@ defmodule AlgoraWeb.Org.SettingsLive do
4
4
5
5
alias Algora.Accounts
6
6
alias Algora.Accounts.User
7
+ alias Algora.Github
7
8
alias AlgoraWeb.Components.Logos
8
9
9
10
def render ( assigns ) do
@@ -36,19 +37,15 @@ defmodule AlgoraWeb.Org.SettingsLive do
36
37
</ div >
37
38
</ div >
38
39
<% end %>
39
- < . link href = { Algora.Github . install_url ( ) } rel = "noopener " class = "ml-auto gap-2 " >
40
- < . button >
41
- < Logos . github class = "w-4 h-4 mr-2 -ml-1 " />
42
- Manage { ngettext ( "installation" , "installations" , length ( @ installations ) ) }
43
- </ . button >
44
- </ . link >
40
+ < . button phx-click = "install_app " class = "ml-auto gap-2 " >
41
+ < Logos . github class = "w-4 h-4 mr-2 -ml-1 " />
42
+ Manage { ngettext ( "installation" , "installations" , length ( @ installations ) ) }
43
+ </ . button >
45
44
<% else %>
46
45
< div class = "flex flex-col gap-2 " >
47
- < . link href = { Algora.Github . install_url ( ) } rel = "noopener " class = "ml-auto gap-2 " >
48
- < . button >
49
- < Logos . github class = "w-4 h-4 mr-2 -ml-1 " /> Install GitHub App
50
- </ . button >
51
- </ . link >
46
+ < . button phx-click = "install_app " class = "ml-auto gap-2 " >
47
+ < Logos . github class = "w-4 h-4 mr-2 -ml-1 " /> Install GitHub App
48
+ </ . button >
52
49
</ div >
53
50
<% end %>
54
51
</ div >
@@ -102,6 +99,10 @@ defmodule AlgoraWeb.Org.SettingsLive do
102
99
end
103
100
104
101
def mount ( _params , _session , socket ) do
102
+ if connected? ( socket ) do
103
+ Phoenix.PubSub . subscribe ( Algora.PubSub , "auth:#{ socket . id } " )
104
+ end
105
+
105
106
% { current_org: current_org } = socket . assigns
106
107
107
108
changeset = User . settings_changeset ( current_org , % { } )
@@ -110,9 +111,20 @@ defmodule AlgoraWeb.Org.SettingsLive do
110
111
{ :ok ,
111
112
socket
112
113
|> assign ( :installations , installations )
114
+ |> assign ( :oauth_url , Github . authorize_url ( % { socket_id: socket . id } ) )
113
115
|> assign_form ( changeset ) }
114
116
end
115
117
118
+ def handle_info ( { :authenticated , user } , socket ) do
119
+ # TODO: skip auth step in installation flow
120
+ { :noreply , socket |> assign ( :current_user , user ) |> redirect ( external: Github . install_url ( ) ) }
121
+ end
122
+
123
+ def handle_event ( "install_app" , _params , socket ) do
124
+ # TODO: immediately redirect to install_url if user has valid token
125
+ { :noreply , push_event ( socket , "open_popup" , % { url: socket . assigns . oauth_url } ) }
126
+ end
127
+
116
128
def handle_event ( "validate" , % { "user" => params } , socket ) do
117
129
changeset =
118
130
socket . assigns . current_org
0 commit comments