Skip to content

Commit

Permalink
Merge branch 'master' into feature/meme-frames
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/aoWebWallet/Shared/NavMenu.razor
  • Loading branch information
michielpost committed Jun 4, 2024
2 parents ec3c05d + df1d324 commit ff74b1d
Show file tree
Hide file tree
Showing 109 changed files with 5,410 additions and 2,121 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
env:
APP_VERSION: ${{ env.GITHUB_REF_SLUG }}-$(git rev-parse --short "$GITHUB_SHA")
- name: Setup dotnet
uses: actions/setup-dotnet@v1
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Build with dotnet
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ ao Web Wallet is a wallet for the [ao network](https://ao.arweave.dev) running o

Features:
- Add ArConnect Wallets
- Add read-only wallets
- Create new wallets and import wallet.json files
- View your ao processes
- Send tokens for your owned ao processes
- View balances of a wallet
- View all transactions for a wallet
- Send tokens for ArConnect Wallets
- Receive instructions for all wallets
- Add custom tokens
- Dark and Light theme

Expand Down
Binary file added assets/aoww-logo-3840.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/aowwdotnet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/spiral.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/spiral2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions src/aoWebWallet.Tests/StorageServiceTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using aoWebWallet.Models;
using aoWebWallet.Services;
using ArweaveAO;
using ArweaveAO.Models;
using Microsoft.Extensions.Options;

namespace aoWebWallet.Tests
{
[TestClass]
public class StorageServiceTests
{
[TestMethod]
public async Task TestBuildInTokenData()
{
List<Token> result = new();

StorageService.AddSystemTokens(result);

TokenClient tokenClient = new TokenClient(Options.Create(new ArweaveConfig()), new HttpClient());

foreach(var token in result)
{
//Get live data
var data = await tokenClient.GetTokenMetaData(token.TokenId);

Assert.IsNotNull(token.TokenData);
Assert.IsNotNull(data);

Assert.AreEqual(token.TokenId, data.TokenId);
Assert.AreEqual(token.TokenData.TokenId, data.TokenId);
Assert.AreEqual(token.TokenData.Name, data.Name);
Assert.AreEqual(token.TokenData.Ticker, data.Ticker);
Assert.AreEqual(token.TokenData.Denomination, data.Denomination);
Assert.AreEqual(token.TokenData.Logo, data.Logo);

}
}
}
}
30 changes: 30 additions & 0 deletions src/aoWebWallet.Tests/aoWebWallet.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.4.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.4.3" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\aoWebWallet\aoWebWallet.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
</ItemGroup>

</Project>
23 changes: 23 additions & 0 deletions src/aoWebWallet.sln
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libs", "Libs", "{06E5BC39-7
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "webvNext.DataLoader", "webvNext.DataLoader\webvNext.DataLoader.csproj", "{17CA4374-64D0-4618-852F-8A76D0A57166}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aoww.Services", "aoww.Services\aoww.Services.csproj", "{178C3213-D574-4B39-A2DA-1FB1D2806242}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{89AC47DF-65AD-4870-AA1D-74ABF1F3D8FE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aoww.Services.Tests", "aoww.Services.Tests\aoww.Services.Tests.csproj", "{322F4807-05CF-431D-B400-7420E1B29936}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aoWebWallet.Tests", "aoWebWallet.Tests\aoWebWallet.Tests.csproj", "{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -23,12 +31,27 @@ Global
{17CA4374-64D0-4618-852F-8A76D0A57166}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17CA4374-64D0-4618-852F-8A76D0A57166}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17CA4374-64D0-4618-852F-8A76D0A57166}.Release|Any CPU.Build.0 = Release|Any CPU
{178C3213-D574-4B39-A2DA-1FB1D2806242}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{178C3213-D574-4B39-A2DA-1FB1D2806242}.Debug|Any CPU.Build.0 = Debug|Any CPU
{178C3213-D574-4B39-A2DA-1FB1D2806242}.Release|Any CPU.ActiveCfg = Release|Any CPU
{178C3213-D574-4B39-A2DA-1FB1D2806242}.Release|Any CPU.Build.0 = Release|Any CPU
{322F4807-05CF-431D-B400-7420E1B29936}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{322F4807-05CF-431D-B400-7420E1B29936}.Debug|Any CPU.Build.0 = Debug|Any CPU
{322F4807-05CF-431D-B400-7420E1B29936}.Release|Any CPU.ActiveCfg = Release|Any CPU
{322F4807-05CF-431D-B400-7420E1B29936}.Release|Any CPU.Build.0 = Release|Any CPU
{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{17CA4374-64D0-4618-852F-8A76D0A57166} = {06E5BC39-764A-48B9-B4F9-F48387A2C965}
{178C3213-D574-4B39-A2DA-1FB1D2806242} = {06E5BC39-764A-48B9-B4F9-F48387A2C965}
{322F4807-05CF-431D-B400-7420E1B29936} = {89AC47DF-65AD-4870-AA1D-74ABF1F3D8FE}
{12E9E40E-96D1-4501-A9A4-EBE4D4F43D8D} = {89AC47DF-65AD-4870-AA1D-74ABF1F3D8FE}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {432E3F8E-53FF-4D9C-869D-48449BD3B8B4}
Expand Down
18 changes: 18 additions & 0 deletions src/aoWebWallet/Extensions/TagExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using ArweaveBlazor.Models;

namespace aoWebWallet.Extensions
{
public static class TagExtensions
{
public static string ToSendCommand(this List<ArweaveBlazor.Models.Tag> tagList)
{
var tagListString = string.Join(", ", tagList.Select(x => x.ToSendCommand()));
return "{" + tagListString + "}";
}

public static string ToSendCommand(this ArweaveBlazor.Models.Tag tag)
{
return $"{tag.Name} = \"{tag.Value}\"";
}
}
}
17 changes: 17 additions & 0 deletions src/aoWebWallet/Extensions/WalletExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using aoWebWallet.Models;

namespace aoWebWallet.Extensions
{
public static class WalletExtensions
{
public static string ToAutocompleteDisplay(this Wallet wallet)
{
if (string.IsNullOrWhiteSpace(wallet.Name))
{
return wallet.Address;
}

return $"{wallet.Name} ({wallet.Address})";
}
}
}
28 changes: 14 additions & 14 deletions src/aoWebWallet/Layout/MainLayout.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@
string? versionHash = Program.GetVersionHash();
}

<MudThemeProvider IsDarkMode="MainViewModel.IsDarkMode" />
<MudDialogProvider />
<MudThemeProvider IsDarkMode="true" />
<MudDialogProvider CloseButton="true" CloseOnEscapeKey="true"/>
<MudSnackbarProvider />

<MudLayout style="display: flex; flex-direction: column; min-height: 100vh;">
<MudLayout Class="d-flex flex-column d-min-h-vh-100">
<MudAppBar Elevation="1">
<MudLink Href="">
<MudImage title="aoWebWallet" Src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMzExLjU4IDI0MC45MiI+CiAgPGRlZnM+CiAgICA8c3R5bGU+CiAgICAgIC5jbHMtMSB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI+CiAgICA8Zz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjAgMjQwLjQ1IDgwLjIgMjQwLjQ1IDk2LjU3IDE5Ni4xOSA1OS43NCAxMjAuNzkgMCAyNDAuNDUiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjEyMy41NyAxLjEyIDk2LjU3IDYyLjYgMTgwLjg2IDI0MC40NSAyNDEuNTggMjQwLjQ1IDIxMi43NyAxODAuNjIgMTIzLjU3IDEuMTIiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9Ijc4NS4wMSA0Ni44NSA4MjEuODQgMTIyLjI2IDg4MS41OCAyLjU5IDgwMS4zOCAyLjU5IDc4NS4wMSA0Ni44NSIvPgogICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNDcyIDEuMTIgNTAwLjggNjAuOTYgNTkwIDI0MC40NSA2MTcuMDEgMTc4Ljk4IDUzMi43MiAxLjEyIDQ3MiAxLjEyIi8+CiAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSI3MTMuMzQgMS41OSA3MTMuNTggMS4xMiA2MzMuMzggMS4xMiA2MTcuMDEgNDUuMzggNjUzLjg0IDEyMC43OSA2ODIuNjQgNjMuMSA3NzEgMjQwLjkyIDc5OC4wMSAxNzkuNDUgNzEzLjcyIDEuNTkgNzEzLjM0IDEuNTkiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjEyMzEuMzggMi41OSAxMjE1LjAxIDQ2Ljg1IDEyNTEuODQgMTIyLjI2IDEzMTEuNTggMi41OSAxMjMxLjM4IDIuNTkiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkwMiAxLjEyIDkzMC44IDYwLjk2IDEwMjAgMjQwLjQ1IDEwNDcuMDEgMTc4Ljk4IDk2Mi43MiAxLjEyIDkwMiAxLjEyIi8+CiAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxMTQzLjM0IDEuNTkgMTE0My41OCAxLjEyIDEwNjMuMzggMS4xMiAxMDQ3LjAxIDQ1LjM4IDEwODMuODQgMTIwLjc5IDExMTIuNjQgNjMuMSAxMjAxIDI0MC45MiAxMjI4LjAxIDE3OS40NSAxMTQzLjcyIDEuNTkgMTE0My4zNCAxLjU5Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTM2MS44LDBjLTY2LjQsMC0xMjAuMjMsNTMuODMtMTIwLjIzLDEyMC4yM3M1My44MywxMjAuMjMsMTIwLjIzLDEyMC4yMywxMjAuMjMtNTMuODMsMTIwLjIzLTEyMC4yM1M0MjguMiwwLDM2MS44LDBabTAsMTkzLjI2Yy00MC4zNCwwLTczLjAzLTMyLjctNzMuMDMtNzMuMDNzMzIuNy03My4wMyw3My4wMy03My4wMyw3My4wMywzMi43LDczLjAzLDczLjAzLTMyLjcsNzMuMDMtNzMuMDMsNzMuMDNaIi8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4="
Width="88" Class="pt-2" Alt="AOWW"/>
Width="100" Class="pt-2" Alt="AOWW"/>
</MudLink>
<MudSpacer />
<MudIconButton title="menu" Icon="@Icons.Material.Filled.Workspaces" Color="MudBlazor.Color.Inherit" Edge="Edge.Start" OnClick="@((e) => DrawerToggle())" />
<MudIconButton title="menu" Icon="@Icons.Material.Filled.Workspaces" Color="MudBlazor.Color.Inherit" Edge="MudBlazor.Edge.Start" OnClick="@((e) => DrawerToggle())" />
@*<MudText Typo="Typo.h5" Class="ml-3">aoWebWallet</MudText>*@
@*<MudIconButton Icon="@Icons.Material.Filled.MoreVert" Color="Color.Inherit" Edge="Edge.End" />*@
@* <ApiConnectionDisplay />*@
Expand All @@ -27,22 +27,22 @@
<MudMainContent>
@Body
</MudMainContent>
<div style="margin-top: auto;">
<div Class="mt-auto mb-4">
<!-- Footer content -->
<MudDivider DividerType="DividerType.FullWidth" Class="mt-6 mb-2"/>
<MudText Align="Align.Center" Typo="Typo.caption" Class="d-flex justify-center KodeMono">
<a href="https://twitter.com/aoWebWallet" target="_blank" style="text-decoration-line:underline">
<svg fill="#949498" width="20px" viewBox="0 0 24 24" aria-hidden="true" class="r-4qtqp9 r-yyyyoo r-dnmrzs r-bnwqim r-1plcrui r-lrvibr r-lrsllp r-18jsvk2 r-16y2uox r-8kz0gk"><g><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg>
</a>
</MudText>
<MudText Align="Align.Center" Typo="Typo.caption" Class="d-flex justify-center KodeMono">
<div style="display:flex; flex-direction: column; justify-content:center; padding:3px 0 10px 0; margin-top:20px; align-items: center; width:100%">
<MudDivider DividerType="DividerType.FullWidth" Class="mb-8" />
<MudImage style="opacity: 0.55" Src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMzExLjU4IDI0MC45MiI+CiAgPGRlZnM+CiAgICA8c3R5bGU+CiAgICAgIC5jbHMtMSB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI+CiAgICA8Zz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjAgMjQwLjQ1IDgwLjIgMjQwLjQ1IDk2LjU3IDE5Ni4xOSA1OS43NCAxMjAuNzkgMCAyNDAuNDUiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjEyMy41NyAxLjEyIDk2LjU3IDYyLjYgMTgwLjg2IDI0MC40NSAyNDEuNTggMjQwLjQ1IDIxMi43NyAxODAuNjIgMTIzLjU3IDEuMTIiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9Ijc4NS4wMSA0Ni44NSA4MjEuODQgMTIyLjI2IDg4MS41OCAyLjU5IDgwMS4zOCAyLjU5IDc4NS4wMSA0Ni44NSIvPgogICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNDcyIDEuMTIgNTAwLjggNjAuOTYgNTkwIDI0MC40NSA2MTcuMDEgMTc4Ljk4IDUzMi43MiAxLjEyIDQ3MiAxLjEyIi8+CiAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSI3MTMuMzQgMS41OSA3MTMuNTggMS4xMiA2MzMuMzggMS4xMiA2MTcuMDEgNDUuMzggNjUzLjg0IDEyMC43OSA2ODIuNjQgNjMuMSA3NzEgMjQwLjkyIDc5OC4wMSAxNzkuNDUgNzEzLjcyIDEuNTkgNzEzLjM0IDEuNTkiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjEyMzEuMzggMi41OSAxMjE1LjAxIDQ2Ljg1IDEyNTEuODQgMTIyLjI2IDEzMTEuNTggMi41OSAxMjMxLjM4IDIuNTkiLz4KICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkwMiAxLjEyIDkzMC44IDYwLjk2IDEwMjAgMjQwLjQ1IDEwNDcuMDEgMTc4Ljk4IDk2Mi43MiAxLjEyIDkwMiAxLjEyIi8+CiAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxMTQzLjM0IDEuNTkgMTE0My41OCAxLjEyIDEwNjMuMzggMS4xMiAxMDQ3LjAxIDQ1LjM4IDEwODMuODQgMTIwLjc5IDExMTIuNjQgNjMuMSAxMjAxIDI0MC45MiAxMjI4LjAxIDE3OS40NSAxMTQzLjcyIDEuNTkgMTE0My4zNCAxLjU5Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTM2MS44LDBjLTY2LjQsMC0xMjAuMjMsNTMuODMtMTIwLjIzLDEyMC4yM3M1My44MywxMjAuMjMsMTIwLjIzLDEyMC4yMywxMjAuMjMtNTMuODMsMTIwLjIzLTEyMC4yM1M0MjguMiwwLDM2MS44LDBabTAsMTkzLjI2Yy00MC4zNCwwLTczLjAzLTMyLjctNzMuMDMtNzMuMDNzMzIuNy03My4wMyw3My4wMy03My4wMyw3My4wMywzMi43LDczLjAzLDczLjAzLTMyLjcsNzMuMDMtNzMuMDMsNzMuMDNaIi8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4="
Width="66" Class="pt-0" Alt="AOWW Logotype" />
</div>
<MudText Typo="Typo.caption" Class="d-flex justify-center KodeMono">
Version: @Program.GetVersionWithoutHash()
@if (!string.IsNullOrEmpty(versionHash))
{
<text>-</text><a href="https://github.com/michielpost/aoWebWallet/tree/@versionHash" target="_blank">@versionHash</a>
}
</MudText>
<MudText Align="Align.Center" Typo="Typo.caption" Class="d-flex justify-center mb-2 KodeMono">zsXSvJtHVSK4QyPch4Uf0JMiZi9uEhgVvyz6qeEJcfY</MudText>


</div>
</MudLayout>

Expand Down
11 changes: 0 additions & 11 deletions src/aoWebWallet/Layout/MainLayout.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ public partial class MainLayout

protected override void OnInitialized()
{
BindingContext.PropertyChanged += BindingContext_PropertyChanged;

base.OnInitialized();
}

Expand All @@ -27,17 +25,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
await base.OnAfterRenderAsync(firstRender);
}

private void BindingContext_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(MainViewModel.IsDarkMode))
{
this.StateHasChanged();
}
}

public virtual void Dispose()
{
BindingContext.PropertyChanged -= BindingContext_PropertyChanged;
}
}
}
Loading

0 comments on commit ff74b1d

Please sign in to comment.