Skip to content

Commit 499fd23

Browse files
committed
fix: preserve sessions channel selection
1 parent 1576e10 commit 499fd23

3 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/OpenClaw.Tray.WinUI/Pages/SessionsPage.xaml.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,22 +121,31 @@ private void RebuildChannelTabs()
121121
{
122122
if (_allSessions == null) return;
123123

124+
var requestedChannel = _activeChannel;
124125
var visibleSessions = SessionVisibilityFilter.VisibleSessions(_allSessions, ShowCompletedSessions);
125126
var channels = visibleSessions
126127
.Where(s => !string.IsNullOrWhiteSpace(s.Channel))
127128
.Select(s => s.Channel!)
128129
.Distinct(StringComparer.OrdinalIgnoreCase)
129130
.OrderBy(c => c)
130131
.ToList();
132+
var activeChannel = SessionVisibilityFilter.ResolveActiveChannel(requestedChannel, channels);
131133

132134
// Keep "All" tab, clear dynamic tabs
133135
while (ChannelSelector.Items.Count > 1)
134136
ChannelSelector.Items.RemoveAt(ChannelSelector.Items.Count - 1);
135137

138+
SelectorBarItem selectedItem = AllTab;
136139
foreach (var ch in channels)
137140
{
138-
ChannelSelector.Items.Add(new SelectorBarItem { Text = ch });
141+
var item = new SelectorBarItem { Text = ch };
142+
ChannelSelector.Items.Add(item);
143+
if (string.Equals(ch, activeChannel, StringComparison.OrdinalIgnoreCase))
144+
selectedItem = item;
139145
}
146+
147+
_activeChannel = activeChannel;
148+
selectedItem.IsSelected = true;
140149
}
141150

142151
private void ApplyFilter()

src/OpenClaw.Tray.WinUI/Services/SessionVisibilityFilter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,15 @@ public static bool IsCleanCompleted(SessionInfo session)
1919
return string.Equals(status, "done", StringComparison.OrdinalIgnoreCase)
2020
|| string.Equals(status, "completed", StringComparison.OrdinalIgnoreCase);
2121
}
22+
23+
public static string ResolveActiveChannel(string activeChannel, IEnumerable<string> visibleChannels)
24+
{
25+
if (!string.Equals(activeChannel, "all", StringComparison.OrdinalIgnoreCase)
26+
&& visibleChannels.Any(channel => string.Equals(channel, activeChannel, StringComparison.OrdinalIgnoreCase)))
27+
{
28+
return activeChannel;
29+
}
30+
31+
return "all";
32+
}
2233
}

tests/OpenClaw.Tray.Tests/SessionVisibilityFilterTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,16 @@ public void VisibleSessions_ShowCompletedPreservesAllSessions()
7979

8080
Assert.Equal(new[] { "done", "failed" }, visible);
8181
}
82+
83+
[Theory]
84+
[InlineData("all", "all")]
85+
[InlineData("Slack", "Slack")]
86+
[InlineData("slack", "slack")]
87+
[InlineData("missing", "all")]
88+
public void ResolveActiveChannel_PreservesOnlyVisibleChannels(string activeChannel, string expected)
89+
{
90+
var visibleChannels = new[] { "Slack", "WhatsApp" };
91+
92+
Assert.Equal(expected, SessionVisibilityFilter.ResolveActiveChannel(activeChannel, visibleChannels));
93+
}
8294
}

0 commit comments

Comments
 (0)