@@ -41,6 +41,8 @@ defmodule CodebattleWeb.GroupTournamentChannel do
4141 { user , platform_error } = maybe_ensure_platform_credentials ( current_user , invite , group_tournament )
4242 external_setup = maybe_ensure_external_setup ( user , group_tournament , invite )
4343
44+ maybe_schedule_invite_refresh ( socket , tournament_id , invite )
45+
4446 { :ok ,
4547 % {
4648 status: group_tournament . state ,
@@ -76,6 +78,32 @@ defmodule CodebattleWeb.GroupTournamentChannel do
7678 { :noreply , socket }
7779 end
7880
81+ def handle_info ( { :refresh_invite , tournament_id , retries_left } , socket ) do
82+ current_user = socket . assigns . current_user
83+ group_tournament = GroupTournamentContext . get_group_tournament! ( tournament_id )
84+
85+ invite =
86+ current_user . id
87+ |> InviteContext . get_or_create_invite ( tournament_id )
88+ |> InviteAdvancer . advance ( current_user )
89+
90+ if invite . state in [ "creating" , "pending" ] do
91+ maybe_schedule_invite_refresh ( socket , tournament_id , invite , retries_left )
92+ { :noreply , socket }
93+ else
94+ { user , platform_error } = maybe_ensure_platform_credentials ( current_user , invite , group_tournament )
95+ external_setup = maybe_ensure_external_setup ( user , group_tournament , invite )
96+
97+ push ( socket , "group_tournament:invite_updated" , % {
98+ invite: serialize_invite ( invite ) ,
99+ platform_error: platform_error ,
100+ external_setup: serialize_external_setup ( external_setup , user , group_tournament )
101+ } )
102+
103+ { :noreply , socket }
104+ end
105+ end
106+
79107 def handle_info ( _message , socket ) do
80108 { :noreply , socket }
81109 end
@@ -89,6 +117,9 @@ defmodule CodebattleWeb.GroupTournamentChannel do
89117 |> InviteAdvancer . advance ( current_user )
90118
91119 { user , platform_error } = maybe_ensure_platform_credentials ( current_user , invite , group_tournament )
120+ response = serialize_invite_reply ( user , group_tournament , invite , platform_error )
121+
122+ maybe_schedule_invite_refresh ( socket , tournament_id , invite )
92123
93124 socket =
94125 if invite . state == "accepted" do
@@ -97,7 +128,7 @@ defmodule CodebattleWeb.GroupTournamentChannel do
97128 socket
98129 end
99130
100- { :reply , { :ok , serialize_invite_reply ( user , group_tournament , invite , platform_error ) } , socket }
131+ { :reply , { :ok , response } , socket }
101132 end
102133
103134 defp extract_tournament_id ( "group_tournament:" <> tournament_id ) do
@@ -205,4 +236,15 @@ defmodule CodebattleWeb.GroupTournamentChannel do
205236 _ -> :error
206237 end
207238 end
239+
240+ defp maybe_schedule_invite_refresh ( socket , tournament_id , invite ) ,
241+ do: maybe_schedule_invite_refresh ( socket , tournament_id , invite , 15 )
242+
243+ defp maybe_schedule_invite_refresh ( socket , tournament_id , % { state: state } , retries_left )
244+ when state in [ "creating" , "pending" ] and retries_left > 0 do
245+ Process . send_after ( self ( ) , { :refresh_invite , tournament_id , retries_left - 1 } , 1_000 )
246+ socket
247+ end
248+
249+ defp maybe_schedule_invite_refresh ( socket , _tournament_id , _invite , _retries_left ) , do: socket
208250end
0 commit comments