launcher: friendly errors + Retry / Get help buttons

Raw exception messages ("Access is denied", HttpRequestException
stack traces) gave the user nothing to do. The flow now translates
the common failures into plain language and offers a one-click
retry that re-runs the host/join flow from the top:

- ErrorTranslator handles HttpRequestException (network down),
  TaskCanceledException (timeout), SocketException (firewall),
  UnauthorizedAccessException + IOException "in use" (Rec Room
  open), missing folder / files (re-pick install), cloudflared
  download truncation (suggests LAN mode), port 5005 already bound
- Patcher log output goes through TranslateMessage which catches
  the same "access denied" / missing files cases
- HostStepsPanel / JoinStepsPanel gain a Retry + "Get help" row
  below the steps; visible only on failure
- "Get help" opens README.md#troubleshooting on GitHub
- Stop / new run hides the retry row so a fresh start is clean
This commit is contained in:
Alexa
2026-05-27 11:17:39 +03:00
parent 7c974e39ab
commit 5b98886937
3 changed files with 226 additions and 11 deletions
+18
View File
@@ -238,6 +238,15 @@
Foreground="{StaticResource InkSoft}"
TextWrapping="Wrap" FontSize="13"
Margin="0,4,0,0" />
<StackPanel x:Name="HostRetryPanel" Visibility="Collapsed"
Orientation="Horizontal" Margin="0,12,0,0">
<Button x:Name="HostRetryBtn" Style="{StaticResource PrimaryBtn}"
Content="Retry" Click="OnHostRetry" />
<Button Style="{StaticResource GhostBtn}"
Content="Get help"
Click="OnOpenTroubleshooting"
Margin="10,0,0,0" />
</StackPanel>
</StackPanel>
</Border>
@@ -395,6 +404,15 @@
Foreground="{StaticResource InkSoft}"
TextWrapping="Wrap" FontSize="13"
Margin="0,4,0,0" />
<StackPanel x:Name="JoinRetryPanel" Visibility="Collapsed"
Orientation="Horizontal" Margin="0,12,0,0">
<Button x:Name="JoinRetryBtn" Style="{StaticResource PrimaryBtn}"
Content="Retry" Click="OnJoinRetry" />
<Button Style="{StaticResource GhostBtn}"
Content="Get help"
Click="OnOpenTroubleshooting"
Margin="10,0,0,0" />
</StackPanel>
</StackPanel>
</Border>
</StackPanel>