@@ -2,9 +2,12 @@ defmodule AlgoraWeb.JobsLive do
2
2
@ moduledoc false
3
3
use AlgoraWeb , :live_view
4
4
5
+ import Ecto.Changeset
6
+
5
7
alias Algora.Accounts
6
8
alias Algora.Jobs
7
9
alias Algora.Jobs.JobPosting
10
+ alias Phoenix.LiveView.AsyncResult
8
11
9
12
require Logger
10
13
@@ -18,6 +21,7 @@ defmodule AlgoraWeb.JobsLive do
18
21
|> assign ( :page_title , "Jobs" )
19
22
|> assign ( :jobs , jobs )
20
23
|> assign ( :form , to_form ( changeset ) )
24
+ |> assign ( :user_metadata , AsyncResult . loading ( ) )
21
25
|> assign_user_applications ( ) }
22
26
end
23
27
@@ -103,20 +107,43 @@ defmodule AlgoraWeb.JobsLive do
103
107
< div class = "pt-1 text-base font-medium text-muted-foreground " >
104
108
Reach thousands of developers looking for their next opportunity versed in your tech stack
105
109
</ div >
106
- < . simple_form for = { @ form } phx-submit = "create_job " class = "mt-4 space-y-6 " >
110
+ < . simple_form
111
+ for = { @ form }
112
+ phx-change = "validate_job "
113
+ phx-submit = "create_job "
114
+ class = "mt-4 space-y-6 "
115
+ >
107
116
< div class = "grid grid-cols-1 gap-4 sm:grid-cols-2 " >
108
117
< . input
109
118
field = { @ form [ :email ] }
110
119
label = "Email "
111
120
data-domain-target
112
121
phx-hook = "DeriveDomain "
122
+ phx-blur = "email_changed "
113
123
/>
114
124
< . input field = { @ form [ :company_name ] } label = "Company Name " />
115
125
< . input field = { @ form [ :company_url ] } label = "Company Website " data-domain-source />
116
126
< . input field = { @ form [ :url ] } label = "Job Posting URL " />
117
127
</ div >
118
128
119
- < div class = "flex justify-end " >
129
+ < div class = "flex justify-between " >
130
+ < div >
131
+ < div :if = { @ user_metadata . ok? } class = "flex items-center gap-4 " >
132
+ < img
133
+ :if = { get_in ( @ user_metadata . result , [ :org , :favicon_url ] ) }
134
+ src = { get_in ( @ user_metadata . result , [ :org , :favicon_url ] ) }
135
+ class = "h-12 w-12 rounded-full "
136
+ />
137
+ < div >
138
+ < div class = "text-lg text-foreground font-bold font-display " >
139
+ { get_change ( @ form . source , :company_name ) }
140
+ </ div >
141
+ < div class = "text-sm text-muted-foreground " >
142
+ { get_change ( @ form . source , :company_url ) }
143
+ </ div >
144
+ </ div >
145
+ </ div >
146
+ </ div >
120
147
< . button class = "flex items-center gap-2 " phx-disable-with = "Processing... " >
121
148
Post Job
122
149
</ . button >
@@ -140,6 +167,22 @@ defmodule AlgoraWeb.JobsLive do
140
167
{ :noreply , socket }
141
168
end
142
169
170
+ def handle_event ( "email_changed" , % { "value" => email } , socket ) do
171
+ if socket . assigns . user_metadata . ok? do
172
+ { :noreply , socket }
173
+ else
174
+ { :noreply ,
175
+ socket
176
+ |> start_async ( :fetch_metadata , fn -> Algora.Crawler . fetch_user_metadata ( email ) end )
177
+ |> assign ( :user_metadata , AsyncResult . loading ( ) ) }
178
+ end
179
+ end
180
+
181
+ @ impl true
182
+ def handle_event ( "validate_job" , % { "job_posting" => params } , socket ) do
183
+ { :noreply , assign ( socket , :form , to_form ( JobPosting . changeset ( socket . assigns . form . source , params ) ) ) }
184
+ end
185
+
143
186
@ impl true
144
187
def handle_event ( "create_job" , % { "job_posting" => params } , socket ) do
145
188
case Jobs . create_job_posting ( params ) do
@@ -178,6 +221,16 @@ defmodule AlgoraWeb.JobsLive do
178
221
end
179
222
end
180
223
224
+ @ impl true
225
+ def handle_async ( :fetch_metadata , { :ok , metadata } , socket ) do
226
+ { :noreply , assign ( socket , :user_metadata , AsyncResult . ok ( socket . assigns . user_metadata , metadata ) ) }
227
+ end
228
+
229
+ @ impl true
230
+ def handle_async ( :fetch_metadata , { :exit , reason } , socket ) do
231
+ { :noreply , assign ( socket , :user_metadata , AsyncResult . failed ( socket . assigns . user_metadata , reason ) ) }
232
+ end
233
+
181
234
defp assign_user_applications ( socket ) do
182
235
user_applications =
183
236
if socket . assigns [ :current_user ] do
0 commit comments