@@ -2,9 +2,12 @@ defmodule AlgoraWeb.JobsLive do
22 @ moduledoc false
33 use AlgoraWeb , :live_view
44
5+ import Ecto.Changeset
6+
57 alias Algora.Accounts
68 alias Algora.Jobs
79 alias Algora.Jobs.JobPosting
10+ alias Phoenix.LiveView.AsyncResult
811
912 require Logger
1013
@@ -18,6 +21,7 @@ defmodule AlgoraWeb.JobsLive do
1821 |> assign ( :page_title , "Jobs" )
1922 |> assign ( :jobs , jobs )
2023 |> assign ( :form , to_form ( changeset ) )
24+ |> assign ( :user_metadata , AsyncResult . loading ( ) )
2125 |> assign_user_applications ( ) }
2226 end
2327
@@ -103,20 +107,43 @@ defmodule AlgoraWeb.JobsLive do
103107 < div class = "pt-1 text-base font-medium text-muted-foreground " >
104108 Reach thousands of developers looking for their next opportunity versed in your tech stack
105109 </ 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+ >
107116 < div class = "grid grid-cols-1 gap-4 sm:grid-cols-2 " >
108117 < . input
109118 field = { @ form [ :email ] }
110119 label = "Email "
111120 data-domain-target
112121 phx-hook = "DeriveDomain "
122+ phx-blur = "email_changed "
113123 />
114124 < . input field = { @ form [ :company_name ] } label = "Company Name " />
115125 < . input field = { @ form [ :company_url ] } label = "Company Website " data-domain-source />
116126 < . input field = { @ form [ :url ] } label = "Job Posting URL " />
117127 </ div >
118128
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 >
120147 < . button class = "flex items-center gap-2 " phx-disable-with = "Processing... " >
121148 Post Job
122149 </ . button >
@@ -140,6 +167,22 @@ defmodule AlgoraWeb.JobsLive do
140167 { :noreply , socket }
141168 end
142169
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+
143186 @ impl true
144187 def handle_event ( "create_job" , % { "job_posting" => params } , socket ) do
145188 case Jobs . create_job_posting ( params ) do
@@ -178,6 +221,16 @@ defmodule AlgoraWeb.JobsLive do
178221 end
179222 end
180223
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+
181234 defp assign_user_applications ( socket ) do
182235 user_applications =
183236 if socket . assigns [ :current_user ] do
0 commit comments