@@ -2,6 +2,7 @@ defmodule AlgoraWeb.JobsLive do
22 @ moduledoc false
33 use AlgoraWeb , :live_view
44
5+ alias Algora.Accounts
56 alias Algora.Jobs
67 alias Algora.Jobs.JobPosting
78
@@ -16,7 +17,8 @@ defmodule AlgoraWeb.JobsLive do
1617 socket
1718 |> assign ( :page_title , "Jobs" )
1819 |> assign ( :jobs , jobs )
19- |> assign ( :form , to_form ( changeset ) ) }
20+ |> assign ( :form , to_form ( changeset ) )
21+ |> assign_user_applications ( ) }
2022 end
2123
2224 @ impl true
@@ -64,6 +66,15 @@ defmodule AlgoraWeb.JobsLive do
6466 </ div >
6567 </ div >
6668 </ div >
69+ <%= if MapSet . member? ( @ user_applications , job . id ) do %>
70+ < . button disabled class = "opacity-50 " >
71+ < . icon name = "tabler-check " class = "h-4 w-4 mr-2 -ml-1 " /> Applied
72+ </ . button >
73+ <% else %>
74+ < . button phx-click = "apply_job " phx-value-job-id = { job . id } >
75+ < . icon name = "github " class = "h-4 w-4 mr-2 " /> Apply with GitHub
76+ </ . button >
77+ <% end %>
6778 </ div >
6879 < div class = "text-sm text-muted-foreground " >
6980 { job . description }
@@ -142,4 +153,34 @@ defmodule AlgoraWeb.JobsLive do
142153 { :noreply , assign ( socket , :form , to_form ( changeset ) ) }
143154 end
144155 end
156+
157+ @ impl true
158+ def handle_event ( "apply_job" , % { "job-id" => job_id } , socket ) do
159+ if socket . assigns [ :current_user ] do
160+ if Accounts . has_fresh_token? ( socket . assigns . current_user ) do
161+ case Jobs . create_application ( job_id , socket . assigns . current_user ) do
162+ { :ok , _application } ->
163+ { :noreply , assign_user_applications ( socket ) }
164+
165+ { :error , _changeset } ->
166+ { :noreply , put_flash ( socket , :error , "Failed to submit application. Please try again." ) }
167+ end
168+ else
169+ { :noreply , redirect ( socket , external: Algora.Github . authorize_url ( ) ) }
170+ end
171+ else
172+ { :noreply , redirect ( socket , external: Algora.Github . authorize_url ( ) ) }
173+ end
174+ end
175+
176+ defp assign_user_applications ( socket ) do
177+ user_applications =
178+ if socket . assigns [ :current_user ] do
179+ Jobs . list_user_applications ( socket . assigns . current_user )
180+ else
181+ MapSet . new ( )
182+ end
183+
184+ assign ( socket , :user_applications , user_applications )
185+ end
145186end
0 commit comments