Skip to content

Commit 848e2ad

Browse files
Adding Local Storage and ToDo Service
1 parent 809cfc9 commit 848e2ad

File tree

9 files changed

+127
-17
lines changed

9 files changed

+127
-17
lines changed

ToDo.sln

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 17
44
VisualStudioVersion = 17.1.32421.90
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDo", "ToDo\ToDo.csproj", "{A8B81C68-CC38-4932-B462-46CA015AEE56}"
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToDoApp", "ToDo\ToDoApp.csproj", "{A8B81C68-CC38-4932-B462-46CA015AEE56}"
77
EndProject
88
Global
99
GlobalSection(SolutionConfigurationPlatforms) = preSolution

ToDo/Application/Models/ToDo.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System;
22
using MudBlazor;
33

4-
namespace ToDo.Application.Models;
4+
namespace ToDoApp.Application.Models;
55

66
public class ToDo
77
{
8+
public Guid Id { get; set; } = Guid.NewGuid();
89
public string Name { get; set; } = string.Empty;
910

1011
public string Icon
@@ -18,9 +19,4 @@ public string Icon
1819
}
1920

2021
public bool IsComplete { get; set; }
21-
22-
public void SetComplete()
23-
{
24-
IsComplete = !IsComplete;
25-
}
2622
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using ToDoApp.Application.Models;
2+
3+
namespace ToDoApp.Application.Services;
4+
5+
public interface IToDoService
6+
{
7+
Task AddToDoAsync(ToDo todo, CancellationToken cancellationToken = default);
8+
Task RemoveToDoAsync(ToDo todo, CancellationToken cancellationToken = default);
9+
Task UpdateToDoAsync(ToDo todo, CancellationToken cancellationToken = default);
10+
Task<IList<ToDo>> GetToDosAsync();
11+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using Blazored.LocalStorage;
3+
using ToDoApp.Application.Models;
4+
5+
namespace ToDoApp.Application.Services
6+
{
7+
public class ToDoService : IToDoService
8+
{
9+
private IList<ToDo> _toDos;
10+
private readonly ILocalStorageService _localStorage;
11+
12+
public ToDoService(ILocalStorageService localStorage)
13+
{
14+
_toDos = new List<ToDo>();
15+
_localStorage = localStorage;
16+
}
17+
18+
public async Task AddToDoAsync(ToDo todo, CancellationToken cancellationToken = new CancellationToken())
19+
{
20+
ArgumentNullException.ThrowIfNull(todo, "ToDo Cannot be null");
21+
22+
await LoadToDosAsync(cancellationToken);
23+
24+
_toDos.Add(todo);
25+
26+
await SaveChangesAsync(cancellationToken);
27+
}
28+
29+
public async Task RemoveToDoAsync(ToDo todo, CancellationToken cancellationToken = new CancellationToken())
30+
{
31+
ArgumentNullException.ThrowIfNull(todo, "ToDo Cannot be null");
32+
33+
await LoadToDosAsync(cancellationToken);
34+
35+
_toDos.Remove(todo);
36+
37+
await SaveChangesAsync(cancellationToken);
38+
}
39+
40+
public async Task UpdateToDoAsync(ToDo todo, CancellationToken cancellationToken = new CancellationToken())
41+
{
42+
ArgumentNullException.ThrowIfNull(todo, "ToDo Cannot be null");
43+
44+
await LoadToDosAsync(cancellationToken);
45+
46+
var existingTodo = _toDos.First(_ => _.Id == todo.Id);
47+
existingTodo.IsComplete = todo.IsComplete;
48+
existingTodo.Name = todo.Name;
49+
50+
await SaveChangesAsync(cancellationToken);
51+
}
52+
53+
public async Task<IList<ToDo>> GetToDosAsync()
54+
{
55+
await LoadToDosAsync(new CancellationToken());
56+
return _toDos;
57+
}
58+
59+
60+
private async Task LoadToDosAsync(CancellationToken cancellationToken)
61+
{
62+
_toDos = await _localStorage.GetItemAsync<IList<ToDo>>("todos", cancellationToken);
63+
}
64+
65+
private async Task SaveChangesAsync(CancellationToken cancellationToken)
66+
{
67+
await _localStorage.SetItemAsync<IList<ToDo>>("todos", _toDos, cancellationToken);
68+
}
69+
70+
}
71+
}
72+

ToDo/Pages/Index.razor

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@page "/"
2-
@using ToDo.Application.Models
2+
@using ToDoApp.Application.Models
3+
@inject ToDoApp.Application.Services.IToDoService _toDoService
34

45
<PageTitle>My ToDo App</PageTitle>
56

@@ -21,13 +22,13 @@
2122
</MudGrid>
2223
</EditForm>
2324

24-
@if (todos.Any())
25+
@if (todos != null && todos.Any())
2526
{
2627
<MudPaper Class="mt-5" Outlined="true">
2728
<MudList Clickable=true>
2829
@foreach (var todo in todos)
2930
{
30-
<MudListItem Icon="@todo.Icon" OnClick="todo.SetComplete">
31+
<MudListItem Icon="@todo.Icon" OnClick="() => SetComplete(todo)">
3132
@if (todo.IsComplete)
3233
{
3334
<span style="text-decoration:line-through">@todo.Name</span>
@@ -45,13 +46,28 @@
4546
@code {
4647
ToDo model = new ToDo();
4748

48-
List<ToDo> todos = new List<ToDo>();
49+
IList<ToDo>? todos;
4950

50-
private void OnValidSubmit(EditContext context)
51+
protected override async Task OnInitializedAsync()
5152
{
53+
todos = await _toDoService.GetToDosAsync();
54+
await base.OnInitializedAsync();
55+
}
56+
57+
private async Task OnValidSubmit(EditContext context)
58+
{
59+
ArgumentNullException.ThrowIfNull(todos);
60+
5261
if (!string.IsNullOrWhiteSpace(model.Name))
53-
todos.Add(model);
62+
await _toDoService.AddToDoAsync(model);
63+
5464
model = new ToDo();
5565
StateHasChanged();
5666
}
67+
68+
private async Task SetComplete(ToDo todo)
69+
{
70+
todo.IsComplete = !todo.IsComplete;
71+
await _toDoService.UpdateToDoAsync(todo);
72+
}
5773
}

ToDo/Program.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
using Blazored.LocalStorage;
12
using Microsoft.AspNetCore.Components.Web;
23
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
34
using MudBlazor.Services;
4-
using ToDo;
5-
5+
using ToDoApp;
6+
using ToDoApp.Application.Services;
7+
68
var builder = WebAssemblyHostBuilder.CreateDefault(args);
79
builder.RootComponents.Add<App>("#app");
810
builder.RootComponents.Add<HeadOutlet>("head::after");
911

1012
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
1113
builder.Services.AddMudServices();
14+
builder.Services.AddBlazoredLocalStorage();
15+
builder.Services.AddScoped<IToDoService, ToDoService>();
1216

1317
await builder.Build().RunAsync();

ToDo/Properties/launchSettings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@
2424
"environmentVariables": {
2525
"ASPNETCORE_ENVIRONMENT": "Development"
2626
}
27+
},
28+
"ToDoApp": {
29+
"commandName": "Project",
30+
"launchBrowser": true,
31+
"environmentVariables": {
32+
"DOTNET_ENVIRONMENT": "Development"
33+
}
2734
}
2835
}
2936
}

ToDo/ToDo.csproj renamed to ToDo/ToDoApp.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFramework>net7.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
7+
<AssemblyName>ToDo</AssemblyName>
78
</PropertyGroup>
89
<PropertyGroup Condition=" '$(RunConfiguration)' == 'Mudblazor.Template' ">
910
<ExternalConsole>true</ExternalConsole>
@@ -12,13 +13,16 @@
1213
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.1" />
1314
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.1" PrivateAssets="all" />
1415
<PackageReference Include="MudBlazor" Version="6.1.7" />
16+
<PackageReference Include="Blazored.LocalStorage" Version="4.3.0" />
1517
</ItemGroup>
1618
<ItemGroup>
1719
<None Remove="Application\" />
1820
<None Remove="Application\Models\" />
21+
<None Remove="Application\Services\" />
1922
</ItemGroup>
2023
<ItemGroup>
2124
<Folder Include="Application\" />
2225
<Folder Include="Application\Models\" />
26+
<Folder Include="Application\Services\" />
2327
</ItemGroup>
2428
</Project>

ToDo/_Imports.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
@using Microsoft.AspNetCore.Components.WebAssembly.Http
88
@using Microsoft.JSInterop
99
@using MudBlazor
10-
@using ToDo
11-
@using ToDo.Shared
10+
@using ToDoApp
11+
@using ToDoApp.Shared

0 commit comments

Comments
 (0)