Skip to content

Commit caf8586

Browse files
committed
preview job
1 parent 6b7cacc commit caf8586

File tree

1 file changed

+55
-2
lines changed

1 file changed

+55
-2
lines changed

lib/algora_web/live/jobs_live.ex

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)