Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e002f15
feat(tracker): store and switch verified org keys by EFT profile
GiribaldiTTV Aug 10, 2026
f659649
feat(settings): add guided TarkovTracker key management
GiribaldiTTV Aug 10, 2026
7407d56
bugfix(raw-logs): replay task history chronologically and in profile …
GiribaldiTTV Aug 10, 2026
1664912
bugfix(settings): handle missing EFT profile identity
GiribaldiTTV Aug 10, 2026
ea9f3a3
bugfix(startup): stabilize first paint and window restoration
GiribaldiTTV Aug 10, 2026
57a46fb
feat(ui): overhaul responsive settings and dropdown interactions
GiribaldiTTV Aug 10, 2026
e9b70ee
merge(master): reconcile PR 212 with 2.0.5.0
GiribaldiTTV Aug 12, 2026
7446f45
fix(tracker): harden profile activation and diagnostic reporting
GiribaldiTTV Aug 13, 2026
216e90b
fix(ui): make session messages and assets deterministic
GiribaldiTTV Aug 13, 2026
cc748f3
bump needed sdk version
Razzmatazzz Aug 12, 2026
5d961e5
identify self on connect
Razzmatazzz Aug 12, 2026
bf0a282
fix(watcher): treat missing EFT install as idle state
GiribaldiTTV Aug 13, 2026
63d58f0
merge(master): apply current base fixes to PR 212
GiribaldiTTV Aug 13, 2026
7756b28
fix(security): protect profile-bound tracker tokens with DPAPI
GiribaldiTTV Aug 13, 2026
7664b14
fix(settings): make tracker key assignment state explicit
GiribaldiTTV Aug 13, 2026
2884169
fix(tarkov.dev): make session data lifecycle identity-safe
GiribaldiTTV Aug 13, 2026
a2a524a
fix(replay): isolate historical task catalogs and renderer work
GiribaldiTTV Aug 13, 2026
8fbfa11
fix(ui): reject expired message actions at execution time
GiribaldiTTV Aug 13, 2026
5c541ce
fix(startup): validate WebView2 before constructing UI
GiribaldiTTV Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions TarkovMonitor/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,18 @@
<setting name="tarkovTrackerTokens" serializeAs="String">
<value>{}</value>
</setting>
<setting name="tarkovTrackerModeTokens" serializeAs="String">
<value>{}</value>
</setting>
<setting name="tarkovTrackerVerifiedModeTokenHashes" serializeAs="String">
<value>{}</value>
</setting>
<setting name="tarkovTrackerOrgTokenStore" serializeAs="String">
<value>{"version":6,"keys":[],"accounts":[],"profiles":[]}</value>
</setting>
<setting name="lastTarkovSessionMode" serializeAs="String">
<value />
</setting>
<setting name="runthroughTime" serializeAs="String">
<value>00:07:10</value>
</setting>
Expand Down
51 changes: 42 additions & 9 deletions TarkovMonitor/Blazor/AppLayout.razor
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
</div>
<div class="window-controls" aria-label="Window controls">
<MudIconButton Class="window-control" Icon="@Icons.Material.Filled.Remove" Color="Color.Inherit" Size="Size.Small" OnClick="MinimizeWindow" aria-label="Minimize" />
<MudIconButton Class="window-control" Icon="@(WindowHost.IsMaximized ? Icons.Material.Filled.FilterNone : Icons.Material.Filled.CropSquare)" Color="Color.Inherit" Size="Size.Small" OnClick="ToggleMaximizeWindow" aria-label="@(WindowHost.IsMaximized ? "Restore" : "Maximize")" />
<MudIconButton Class="window-control" Icon="@(isWindowMaximized ? Icons.Material.Filled.FilterNone : Icons.Material.Filled.CropSquare)" Color="Color.Inherit" Size="Size.Small" OnClick="ToggleMaximizeWindow" aria-label="@(isWindowMaximized ? "Restore" : "Maximize")" />
<MudIconButton Class="window-control window-control-close" Icon="@Icons.Material.Filled.Close" Color="Color.Inherit" Size="Size.Small" OnClick="CloseWindow" aria-label="Close" />
</div>
</MudAppBar>
<MudDrawer Class="navigation-drawer" @bind-Open="@drawerOpen" Elevation="1" Anchor="Anchor.Left" Variant="@DrawerVariant.Responsive">
<MudDrawer Class="navigation-drawer" @bind-Open="@drawerOpen" Elevation="1" Anchor="Anchor.Left" Variant="@DrawerVariant.Responsive" Breakpoint="Breakpoint.None">
<MudDrawerHeader Class="navigation-drawer-header">
<button class="navigation-brand" type="button" @onclick="@ToggleDrawer" aria-label="Collapse navigation">
<div class="navigation-brand-copy">
Expand All @@ -44,7 +44,7 @@
<MudNavLink Href="/timers" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Timer">@LocalizationService.GetString("Timers")</MudNavLink>
</MudNavMenu>
</MudDrawer>
<MudMainContent Class="app-main-content" Style="box-sizing: border-box;">
<MudMainContent Class="@MainContentClass" Style="box-sizing: border-box;">
<CascadingValue Name="AppLayout" Value="this">
@Body
</CascadingValue>
Expand All @@ -62,11 +62,11 @@
{
<MudText Typo="Typo.subtitle2">Raid timers</MudText>
<MudIconButton Icon="@Icons.Material.Filled.Restore" Size="Size.Small" Color="Color.Inherit"
Title="Reset position" OnClick="ResetFloatingTimerPosition" />
Title="Reset timer position" OnClick="ResetFloatingTimerPosition" />
}
<MudIconButton Icon="@(floatingTimerPanelCollapsed ? Icons.Material.Filled.ExpandLess : Icons.Material.Filled.ExpandMore)"
Size="Size.Small" Color="Color.Inherit"
Title="@(floatingTimerPanelCollapsed ? "Expand timer panel" : "Collapse timer panel")"
Title="@(floatingTimerPanelCollapsed ? "Expand the timer panel" : "Collapse the timer panel")"
OnClick="ToggleFloatingTimerPanel" />
</div>
@if (!floatingTimerPanelCollapsed)
Expand All @@ -75,7 +75,7 @@
@if (TimersManager.FloatingPanelShowTimeInRaid)
{
<div class="floating-timer-panel__timer">
<MudText Typo="Typo.caption">Elapsed Raid Time</MudText>
<MudText Typo="Typo.caption">Elapsed raid time</MudText>
<MudText Typo="Typo.h5" Class="floating-timer-panel__value">@FormatTimer(timeInRaid)</MudText>
</div>
}
Expand Down Expand Up @@ -106,13 +106,19 @@

@code {

bool drawerOpen = true;
// Keep the drawer under explicit user control. Automatic responsive drawer
// transitions can reopen it when a resize crosses a card-layout breakpoint.
bool drawerOpen = false;

public string CurrentPageTitle = "TarkovMonitor";
public string CurrentPageTitle = "Tarkov Monitor";
private bool isWindowMaximized;
private TimeSpan timeInRaid;
private TimeSpan runThroughRemaining;
private bool isTimersPage;
private bool floatingTimerPanelCollapsed = true;
private string MainContentClass => isWindowMaximized
? "app-main-content"
: "app-main-content app-main-content--restored";

private bool ShowFloatingTimerPanel =>
TimersManager.FloatingPanelEnabled && TimersManager.IsRaidActive && !isTimersPage;
Expand All @@ -135,13 +141,19 @@
TimersManager.RunThroughTimerChanged += OnRunThroughTimerChanged;
TimersManager.RaidActiveChanged += OnFloatingTimerStateChanged;
TimersManager.FloatingPanelSettingChanged += OnFloatingTimerStateChanged;
isWindowMaximized = WindowHost.IsMaximized;
timeInRaid = TimersManager.TimeInRaid;
runThroughRemaining = TimersManager.RunThroughRemaining;
UpdateCurrentPage();
}

protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
WindowHost.MarkUiReady();
}

if (ShowFloatingTimerPanel)
await JSRuntime.InvokeVoidAsync("floatingTimerPanel.initialize", "floating-timer-panel");
}
Expand All @@ -156,7 +168,21 @@
drawerOpen = !drawerOpen;
}

private void BeginWindowDrag() => WindowHost.BeginWindowDrag();
private void BeginWindowDrag(MouseEventArgs eventArgs)
{
if (eventArgs.Button != 0)
{
return;
}

if (eventArgs.Detail == 2)
{
ToggleMaximizeWindow();
return;
}

WindowHost.BeginWindowDrag();
}

private void BeginWindowResize(int hitTest) => WindowHost.BeginWindowResize(hitTest);

Expand All @@ -168,6 +194,13 @@

private void OnWindowStateChanged(object? sender, EventArgs e)
{
var nextMaximizedState = WindowHost.IsMaximized;
if (isWindowMaximized == nextMaximizedState)
{
return;
}

isWindowMaximized = nextMaximizedState;
InvokeAsync(StateHasChanged);
}

Expand Down
7 changes: 6 additions & 1 deletion TarkovMonitor/Blazor/AppLayout.razor.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@
padding-top: 8px !important;
overflow-x: hidden;
overflow-y: auto;
scrollbar-color: #8f825f #252522;
scrollbar-color: auto;
scrollbar-gutter: stable;
scrollbar-width: auto;
}

::deep .app-main-content--restored {
margin-right: 4px;
}

::deep .app-main-content::-webkit-scrollbar {
width: 12px;
}
Expand Down
10 changes: 8 additions & 2 deletions TarkovMonitor/Blazor/Components/LogBoard.razor
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
@using Humanizer
@implements IDisposable
@inject LogRepository logRepository
<MudStack Reverse="true" Justify="Justify.FlexStart" AlignItems="AlignItems.Stretch" Class="ma-2" Style="min-width: 0;">
<MudStack Justify="Justify.FlexStart" AlignItems="AlignItems.Stretch" Class="ma-2" Style="min-width: 0;">
@if (logRepository.Logs.Count == 0)
{
<MudAlert Severity="Severity.Info">No new logs have been seen since launching the monitor.</MudAlert>
<MudAlert Severity="Severity.Info">No new log entries since Tarkov Monitor started.</MudAlert>
}else{
@foreach (LogLine line in logRepository.Logs)
{
Expand Down Expand Up @@ -35,4 +36,9 @@
{
InvokeAsync(() => StateHasChanged());
}

public void Dispose()
{
logRepository.newLog -= LogAdded;
}
}
Loading
Loading