Skip to content

Commit 75b2189

Browse files
committed
Simplifies theme cycle management
Refines the theme preference cycling logic to only allow switching between Light and Dark modes directly. The "System" preference is no longer part of the user-facing cycle, although system preference detection continues to determine the active theme when "System" is the selected preference. Updates associated UI elements (icons, tooltips) and removes outdated tests to reflect this change. Also updates the `launchSettings.json` for a more streamlined development experience.
1 parent e70c29e commit 75b2189

File tree

4 files changed

+15
-88
lines changed

4 files changed

+15
-88
lines changed
Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,12 @@
11
{
2-
"iisSettings": {
3-
"windowsAuthentication": false,
4-
"anonymousAuthentication": true,
5-
"iisExpress": {
6-
"applicationUrl": "http://localhost:13580",
7-
"sslPort": 44352
8-
}
9-
},
102
"profiles": {
11-
"http": {
12-
"commandName": "Project",
13-
"dotnetRunMessages": true,
14-
"launchBrowser": true,
15-
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
16-
"applicationUrl": "http://localhost:5225",
17-
"environmentVariables": {
18-
"ASPNETCORE_ENVIRONMENT": "Development"
19-
}
20-
},
21-
"https": {
3+
"PointerStar.Client": {
224
"commandName": "Project",
23-
"dotnetRunMessages": true,
24-
"launchBrowser": true,
25-
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
26-
"applicationUrl": "https://localhost:7234;http://localhost:5225",
27-
"environmentVariables": {
28-
"ASPNETCORE_ENVIRONMENT": "Development"
29-
}
30-
},
31-
"IIS Express": {
32-
"commandName": "IISExpress",
335
"launchBrowser": true,
34-
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
356
"environmentVariables": {
367
"ASPNETCORE_ENVIRONMENT": "Development"
37-
}
8+
},
9+
"applicationUrl": "https://localhost:58850;http://localhost:58851"
3810
}
3911
}
40-
}
12+
}

PointerStar/Client/Services/ThemeService.cs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,26 @@ public interface IThemeService
1919
Task CycleThemeAsync();
2020
}
2121

22-
public class ThemeService : IThemeService
22+
public class ThemeService(ICookie cookie) : IThemeService
2323
{
24-
private readonly ICookie _cookie;
25-
private Func<Task<bool>>? _getSystemPreference;
26-
private bool _systemPreference;
24+
private readonly ICookie _cookie = cookie ?? throw new ArgumentNullException(nameof(cookie));
25+
private bool _systemIsDark;
2726

2827
public ThemePreference CurrentPreference { get; private set; }
2928

3029
public bool IsDarkMode => CurrentPreference switch
3130
{
3231
ThemePreference.Dark => true,
3332
ThemePreference.Light => false,
34-
ThemePreference.System => _systemPreference,
35-
_ => _systemPreference
33+
_ => _systemIsDark
3634
};
3735

3836
public event EventHandler? ThemeChanged;
3937

40-
public ThemeService(ICookie cookie)
41-
{
42-
_cookie = cookie ?? throw new ArgumentNullException(nameof(cookie));
43-
}
44-
4538
public async Task InitializeAsync(Func<Task<bool>> getSystemPreference)
4639
{
47-
_getSystemPreference = getSystemPreference ?? throw new ArgumentNullException(nameof(getSystemPreference));
48-
4940
// Get system preference
50-
_systemPreference = await _getSystemPreference();
41+
_systemIsDark = await getSystemPreference();
5142

5243
// Load saved preference from cookie
5344
string preferenceValue = await _cookie.GetThemePreferenceAsync();
@@ -73,21 +64,19 @@ public async Task SetPreferenceAsync(ThemePreference preference)
7364

7465
public async Task CycleThemeAsync()
7566
{
76-
var nextPreference = CurrentPreference switch
67+
var nextPreference = IsDarkMode switch
7768
{
78-
ThemePreference.System => ThemePreference.Light,
79-
ThemePreference.Light => ThemePreference.Dark,
80-
ThemePreference.Dark => ThemePreference.System,
81-
_ => ThemePreference.System
69+
true => ThemePreference.Light,
70+
false => ThemePreference.Dark,
8271
};
8372
await SetPreferenceAsync(nextPreference);
8473
}
8574

8675
public async Task UpdateSystemPreferenceAsync(bool isDark)
8776
{
88-
if (_systemPreference != isDark)
77+
if (_systemIsDark != isDark)
8978
{
90-
_systemPreference = isDark;
79+
_systemIsDark = isDark;
9180
if (CurrentPreference == ThemePreference.System)
9281
{
9382
ThemeChanged?.Invoke(this, EventArgs.Empty);

PointerStar/Client/Shared/MainLayout.razor

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
{
6464
return ThemeService.CurrentPreference switch
6565
{
66-
ThemePreference.System => Icons.Material.Filled.Brightness4,
6766
ThemePreference.Light => Icons.Material.Filled.LightMode,
6867
ThemePreference.Dark => Icons.Material.Filled.DarkMode,
6968
_ => Icons.Material.Filled.Brightness4
@@ -74,9 +73,8 @@
7473
{
7574
return ThemeService.CurrentPreference switch
7675
{
77-
ThemePreference.System => "Theme: System (click to switch to Light)",
7876
ThemePreference.Light => "Theme: Light (click to switch to Dark)",
79-
ThemePreference.Dark => "Theme: Dark (click to switch to System)",
77+
ThemePreference.Dark => "Theme: Dark (click to switch to Light)",
8078
_ => "Toggle theme"
8179
};
8280
}

Tests/PointerStar.Client.Tests/Services/ThemeServiceTests.cs

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -150,22 +150,6 @@ public async Task SetPreferenceAsync_WithSamePreference_DoesNotRaiseEvent()
150150
mocker.GetMock<ICookie>().Verify(x => x.SetValueAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int?>()), Times.Never);
151151
}
152152

153-
[Fact]
154-
public async Task CycleThemeAsync_FromSystem_SwitchesToLight()
155-
{
156-
AutoMocker mocker = new();
157-
mocker.GetMock<ICookie>()
158-
.Setup(x => x.GetValueAsync("ThemePreference", ""))
159-
.ReturnsAsync("System");
160-
161-
ThemeService service = mocker.CreateInstance<ThemeService>();
162-
await service.InitializeAsync(() => Task.FromResult(false));
163-
164-
await service.CycleThemeAsync();
165-
166-
Assert.Equal(ThemePreference.Light, service.CurrentPreference);
167-
}
168-
169153
[Fact]
170154
public async Task CycleThemeAsync_FromLight_SwitchesToDark()
171155
{
@@ -182,22 +166,6 @@ public async Task CycleThemeAsync_FromLight_SwitchesToDark()
182166
Assert.Equal(ThemePreference.Dark, service.CurrentPreference);
183167
}
184168

185-
[Fact]
186-
public async Task CycleThemeAsync_FromDark_SwitchesToSystem()
187-
{
188-
AutoMocker mocker = new();
189-
mocker.GetMock<ICookie>()
190-
.Setup(x => x.GetValueAsync("ThemePreference", ""))
191-
.ReturnsAsync("Dark");
192-
193-
ThemeService service = mocker.CreateInstance<ThemeService>();
194-
await service.InitializeAsync(() => Task.FromResult(false));
195-
196-
await service.CycleThemeAsync();
197-
198-
Assert.Equal(ThemePreference.System, service.CurrentPreference);
199-
}
200-
201169
[Fact]
202170
public async Task UpdateSystemPreferenceAsync_WhenSystemModeActive_RaisesThemeChangedEvent()
203171
{

0 commit comments

Comments
 (0)