From 45401645c6a569c96212e0effbad006d4a0f48e2 Mon Sep 17 00:00:00 2001 From: zxcdenjir Date: Mon, 14 Sep 2026 19:46:46 +0300 Subject: [PATCH] Add initial project structure with basic view models, views, and resources --- .gitignore | 5 + .../Application.cs | 21 + .../CryptoPortfolio Tracker.Android.csproj | 28 ++ CryptoPortfolio Tracker.Android/Icon.png | Bin 0 -> 11731 bytes .../MainActivity.cs | 16 + .../Properties/AndroidManifest.xml | 5 + .../Resources/AboutResources.txt | 44 ++ .../drawable-night-v31/avalonia_anim.xml | 66 +++ .../Resources/drawable-v31/avalonia_anim.xml | 71 ++++ .../Resources/drawable/splash_screen.xml | 13 + .../Resources/values-night/colors.xml | 4 + .../Resources/values-v31/styles.xml | 21 + .../Resources/values/colors.xml | 4 + .../Resources/values/styles.xml | 12 + .../CryptoPortfolio Tracker.Browser.csproj | 17 + CryptoPortfolio Tracker.Browser/Program.cs | 15 + .../Properties/AssemblyInfo.cs | 1 + .../Properties/launchSettings.json | 13 + .../runtimeconfig.template.json | 10 + .../wwwroot/app.css | 58 +++ .../wwwroot/favicon.ico | Bin 0 -> 175875 bytes .../wwwroot/index.html | 36 ++ .../wwwroot/main.js | 13 + .../CryptoPortfolio Tracker.Desktop.csproj | 21 + CryptoPortfolio Tracker.Desktop/Program.cs | 21 + CryptoPortfolio Tracker.Desktop/app.manifest | 18 + CryptoPortfolio Tracker.iOS/AppDelegate.cs | 23 ++ .../CryptoPortfolio Tracker.iOS.csproj | 16 + .../Entitlements.plist | 5 + CryptoPortfolio Tracker.iOS/Info.plist | 43 ++ CryptoPortfolio Tracker.iOS/Main.cs | 14 + .../Resources/LaunchScreen.xib | 43 ++ CryptoPortfolio Tracker.slnx | 15 + CryptoPortfolio Tracker/App.axaml | 78 ++++ CryptoPortfolio Tracker/App.axaml.cs | 43 ++ CryptoPortfolio Tracker/Assets/Icon.png | Bin 0 -> 40257 bytes .../Assets/avalonia-logo.ico | Bin 0 -> 22630 bytes .../Assets/coin-placeholder.png | Bin 0 -> 64708 bytes .../Behaviors/WindowsDragBehavior.cs | 124 ++++++ .../Context/CryptoContext.cs | 214 ++++++++++ CryptoPortfolio Tracker/Core/AppState.cs | 20 + .../CryptoPortfolio Tracker.csproj | 32 ++ CryptoPortfolio Tracker/Models/CryptoType.cs | 13 + .../Models/Cryptocurrency.cs | 58 +++ CryptoPortfolio Tracker/Models/Network.cs | 13 + CryptoPortfolio Tracker/Models/Transaction.cs | 41 ++ .../Models/TransactionType.cs | 13 + .../Models/TransactionsStatus.cs | 13 + CryptoPortfolio Tracker/Models/User.cs | 17 + CryptoPortfolio Tracker/Models/UserWallet.cs | 29 ++ CryptoPortfolio Tracker/Models/WalletType.cs | 13 + .../ViewModels/CryptoChartViewModel.cs | 131 ++++++ .../ViewModels/HomeViewModel.cs | 376 ++++++++++++++++++ .../ViewModels/LoginViewModel.cs | 53 +++ .../ViewModels/MainViewModel.cs | 8 + .../ViewModels/SettingsViewModel.cs | 8 + .../ViewModels/ViewModelBase.cs | 7 + .../Views/CryptoChartView.axaml | 118 ++++++ .../Views/CryptoChartView.axaml.cs | 13 + CryptoPortfolio Tracker/Views/HomeView.axaml | 209 ++++++++++ .../Views/HomeView.axaml.cs | 55 +++ CryptoPortfolio Tracker/Views/LoginView.axaml | 36 ++ .../Views/LoginView.axaml.cs | 14 + CryptoPortfolio Tracker/Views/MainView.axaml | 17 + .../Views/MainView.axaml.cs | 45 +++ .../Views/MainWindow.axaml | 18 + .../Views/MainWindow.axaml.cs | 12 + Directory.Build.props | 5 + 68 files changed, 2538 insertions(+) create mode 100644 .gitignore create mode 100644 CryptoPortfolio Tracker.Android/Application.cs create mode 100644 CryptoPortfolio Tracker.Android/CryptoPortfolio Tracker.Android.csproj create mode 100644 CryptoPortfolio Tracker.Android/Icon.png create mode 100644 CryptoPortfolio Tracker.Android/MainActivity.cs create mode 100644 CryptoPortfolio Tracker.Android/Properties/AndroidManifest.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/AboutResources.txt create mode 100644 CryptoPortfolio Tracker.Android/Resources/drawable-night-v31/avalonia_anim.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/drawable-v31/avalonia_anim.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/drawable/splash_screen.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/values-night/colors.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/values-v31/styles.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/values/colors.xml create mode 100644 CryptoPortfolio Tracker.Android/Resources/values/styles.xml create mode 100644 CryptoPortfolio Tracker.Browser/CryptoPortfolio Tracker.Browser.csproj create mode 100644 CryptoPortfolio Tracker.Browser/Program.cs create mode 100644 CryptoPortfolio Tracker.Browser/Properties/AssemblyInfo.cs create mode 100644 CryptoPortfolio Tracker.Browser/Properties/launchSettings.json create mode 100644 CryptoPortfolio Tracker.Browser/runtimeconfig.template.json create mode 100644 CryptoPortfolio Tracker.Browser/wwwroot/app.css create mode 100644 CryptoPortfolio Tracker.Browser/wwwroot/favicon.ico create mode 100644 CryptoPortfolio Tracker.Browser/wwwroot/index.html create mode 100644 CryptoPortfolio Tracker.Browser/wwwroot/main.js create mode 100644 CryptoPortfolio Tracker.Desktop/CryptoPortfolio Tracker.Desktop.csproj create mode 100644 CryptoPortfolio Tracker.Desktop/Program.cs create mode 100644 CryptoPortfolio Tracker.Desktop/app.manifest create mode 100644 CryptoPortfolio Tracker.iOS/AppDelegate.cs create mode 100644 CryptoPortfolio Tracker.iOS/CryptoPortfolio Tracker.iOS.csproj create mode 100644 CryptoPortfolio Tracker.iOS/Entitlements.plist create mode 100644 CryptoPortfolio Tracker.iOS/Info.plist create mode 100644 CryptoPortfolio Tracker.iOS/Main.cs create mode 100644 CryptoPortfolio Tracker.iOS/Resources/LaunchScreen.xib create mode 100644 CryptoPortfolio Tracker.slnx create mode 100644 CryptoPortfolio Tracker/App.axaml create mode 100644 CryptoPortfolio Tracker/App.axaml.cs create mode 100644 CryptoPortfolio Tracker/Assets/Icon.png create mode 100644 CryptoPortfolio Tracker/Assets/avalonia-logo.ico create mode 100644 CryptoPortfolio Tracker/Assets/coin-placeholder.png create mode 100644 CryptoPortfolio Tracker/Behaviors/WindowsDragBehavior.cs create mode 100644 CryptoPortfolio Tracker/Context/CryptoContext.cs create mode 100644 CryptoPortfolio Tracker/Core/AppState.cs create mode 100644 CryptoPortfolio Tracker/CryptoPortfolio Tracker.csproj create mode 100644 CryptoPortfolio Tracker/Models/CryptoType.cs create mode 100644 CryptoPortfolio Tracker/Models/Cryptocurrency.cs create mode 100644 CryptoPortfolio Tracker/Models/Network.cs create mode 100644 CryptoPortfolio Tracker/Models/Transaction.cs create mode 100644 CryptoPortfolio Tracker/Models/TransactionType.cs create mode 100644 CryptoPortfolio Tracker/Models/TransactionsStatus.cs create mode 100644 CryptoPortfolio Tracker/Models/User.cs create mode 100644 CryptoPortfolio Tracker/Models/UserWallet.cs create mode 100644 CryptoPortfolio Tracker/Models/WalletType.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/CryptoChartViewModel.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/HomeViewModel.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/LoginViewModel.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/MainViewModel.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/SettingsViewModel.cs create mode 100644 CryptoPortfolio Tracker/ViewModels/ViewModelBase.cs create mode 100644 CryptoPortfolio Tracker/Views/CryptoChartView.axaml create mode 100644 CryptoPortfolio Tracker/Views/CryptoChartView.axaml.cs create mode 100644 CryptoPortfolio Tracker/Views/HomeView.axaml create mode 100644 CryptoPortfolio Tracker/Views/HomeView.axaml.cs create mode 100644 CryptoPortfolio Tracker/Views/LoginView.axaml create mode 100644 CryptoPortfolio Tracker/Views/LoginView.axaml.cs create mode 100644 CryptoPortfolio Tracker/Views/MainView.axaml create mode 100644 CryptoPortfolio Tracker/Views/MainView.axaml.cs create mode 100644 CryptoPortfolio Tracker/Views/MainWindow.axaml create mode 100644 CryptoPortfolio Tracker/Views/MainWindow.axaml.cs create mode 100644 Directory.Build.props diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..add57be --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +bin/ +obj/ +/packages/ +riderModule.iml +/_ReSharper.Caches/ \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Android/Application.cs b/CryptoPortfolio Tracker.Android/Application.cs new file mode 100644 index 0000000..38446db --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Application.cs @@ -0,0 +1,21 @@ +using Android.App; +using Android.Runtime; +using Avalonia; +using Avalonia.Android; + +namespace CryptoPortfolio_Tracker.Android +{ + [Application] + public class Application : AvaloniaAndroidApplication + { + protected Application(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Android/CryptoPortfolio Tracker.Android.csproj b/CryptoPortfolio Tracker.Android/CryptoPortfolio Tracker.Android.csproj new file mode 100644 index 0000000..c5f1b08 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/CryptoPortfolio Tracker.Android.csproj @@ -0,0 +1,28 @@ + + + Exe + net10.0-android + 23 + enable + com.CompanyName.CryptoPortfolio_Tracker + 1 + 1.0 + apk + false + + + + + Resources\drawable\Icon.png + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Android/Icon.png b/CryptoPortfolio Tracker.Android/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c39845930eae5a98e094bdada0da2d6646bf9ce GIT binary patch literal 11731 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 literal 0 HcmV?d00001 diff --git a/CryptoPortfolio Tracker.Android/MainActivity.cs b/CryptoPortfolio Tracker.Android/MainActivity.cs new file mode 100644 index 0000000..a8e1844 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/MainActivity.cs @@ -0,0 +1,16 @@ +using Android.App; +using Android.Content.PM; +using Avalonia; +using Avalonia.Android; + +namespace CryptoPortfolio_Tracker.Android; + +[Activity( + Label = "CryptoPortfolio_Tracker.Android", + Theme = "@style/MyTheme.NoActionBar", + Icon = "@drawable/icon", + MainLauncher = true, + ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] +public class MainActivity : AvaloniaMainActivity +{ +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Android/Properties/AndroidManifest.xml b/CryptoPortfolio Tracker.Android/Properties/AndroidManifest.xml new file mode 100644 index 0000000..9db9b3e --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/CryptoPortfolio Tracker.Android/Resources/AboutResources.txt b/CryptoPortfolio Tracker.Android/Resources/AboutResources.txt new file mode 100644 index 0000000..c2bca97 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Android/Resources/drawable-night-v31/avalonia_anim.xml b/CryptoPortfolio Tracker.Android/Resources/drawable-night-v31/avalonia_anim.xml new file mode 100644 index 0000000..dde4b5a --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/drawable-night-v31/avalonia_anim.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Android/Resources/drawable-v31/avalonia_anim.xml b/CryptoPortfolio Tracker.Android/Resources/drawable-v31/avalonia_anim.xml new file mode 100644 index 0000000..94f27d9 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/drawable-v31/avalonia_anim.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Android/Resources/drawable/splash_screen.xml b/CryptoPortfolio Tracker.Android/Resources/drawable/splash_screen.xml new file mode 100644 index 0000000..2e920b4 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/drawable/splash_screen.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Android/Resources/values-night/colors.xml b/CryptoPortfolio Tracker.Android/Resources/values-night/colors.xml new file mode 100644 index 0000000..3d47b6f --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #212121 + diff --git a/CryptoPortfolio Tracker.Android/Resources/values-v31/styles.xml b/CryptoPortfolio Tracker.Android/Resources/values-v31/styles.xml new file mode 100644 index 0000000..d5ecec4 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/CryptoPortfolio Tracker.Android/Resources/values/colors.xml b/CryptoPortfolio Tracker.Android/Resources/values/colors.xml new file mode 100644 index 0000000..59279d5 --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/values/colors.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + diff --git a/CryptoPortfolio Tracker.Android/Resources/values/styles.xml b/CryptoPortfolio Tracker.Android/Resources/values/styles.xml new file mode 100644 index 0000000..6e534de --- /dev/null +++ b/CryptoPortfolio Tracker.Android/Resources/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/CryptoPortfolio Tracker.Browser/CryptoPortfolio Tracker.Browser.csproj b/CryptoPortfolio Tracker.Browser/CryptoPortfolio Tracker.Browser.csproj new file mode 100644 index 0000000..c2fe53c --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/CryptoPortfolio Tracker.Browser.csproj @@ -0,0 +1,17 @@ + + + net10.0-browser + Exe + true + enable + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Browser/Program.cs b/CryptoPortfolio Tracker.Browser/Program.cs new file mode 100644 index 0000000..b072262 --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/Program.cs @@ -0,0 +1,15 @@ +using System.Runtime.Versioning; +using System.Threading.Tasks; +using Avalonia; +using Avalonia.Browser; +using CryptoPortfolio_Tracker; + +internal sealed partial class Program +{ + private static Task Main(string[] args) => BuildAvaloniaApp() + .WithInterFont() + .StartBrowserAppAsync("out"); + + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure(); +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Browser/Properties/AssemblyInfo.cs b/CryptoPortfolio Tracker.Browser/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f31aed8 --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/Properties/AssemblyInfo.cs @@ -0,0 +1 @@ +[assembly: System.Runtime.Versioning.SupportedOSPlatform("browser")] \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Browser/Properties/launchSettings.json b/CryptoPortfolio Tracker.Browser/Properties/launchSettings.json new file mode 100644 index 0000000..bcd0746 --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "CryptoPortfolio_Tracker.Browser": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:7169;http://localhost:5235", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + } + } +} diff --git a/CryptoPortfolio Tracker.Browser/runtimeconfig.template.json b/CryptoPortfolio Tracker.Browser/runtimeconfig.template.json new file mode 100644 index 0000000..b96a943 --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/runtimeconfig.template.json @@ -0,0 +1,10 @@ +{ + "wasmHostProperties": { + "perHostConfig": [ + { + "name": "browser", + "host": "browser" + } + ] + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Browser/wwwroot/app.css b/CryptoPortfolio Tracker.Browser/wwwroot/app.css new file mode 100644 index 0000000..1d6f754 --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/wwwroot/app.css @@ -0,0 +1,58 @@ +/* HTML styles for the splash screen */ +.avalonia-splash { + position: absolute; + height: 100%; + width: 100%; + background: white; + font-family: 'Outfit', sans-serif; + justify-content: center; + align-items: center; + display: flex; + pointer-events: none; +} + +/* Light theme styles */ +@media (prefers-color-scheme: light) { + .avalonia-splash { + background: white; + } + + .avalonia-splash h2 { + color: #1b2a4e; + } + + .avalonia-splash a { + color: #0D6EFD; + } +} + +@media (prefers-color-scheme: dark) { + .avalonia-splash { + background: #1b2a4e; + } + + .avalonia-splash h2 { + color: white; + } + + .avalonia-splash a { + color: white; + } +} + +.avalonia-splash h2 { + font-weight: 400; + font-size: 1.5rem; +} + +.avalonia-splash a { + text-decoration: none; + font-size: 2.5rem; + display: block; +} + +.avalonia-splash.splash-close { + transition: opacity 200ms, display 200ms; + display: none; + opacity: 0; +} diff --git a/CryptoPortfolio Tracker.Browser/wwwroot/favicon.ico b/CryptoPortfolio Tracker.Browser/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7da8bb5863b7cecec2adcdebd948fe2f9418d0c GIT binary patch literal 175875 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 + + + + CryptoPortfolio_Tracker.Browser + + + + + + +
+
+

+ Powered by + + + + + + + + + + + + + + +

+
+
+ + + + diff --git a/CryptoPortfolio Tracker.Browser/wwwroot/main.js b/CryptoPortfolio Tracker.Browser/wwwroot/main.js new file mode 100644 index 0000000..bf1555e --- /dev/null +++ b/CryptoPortfolio Tracker.Browser/wwwroot/main.js @@ -0,0 +1,13 @@ +import { dotnet } from './_framework/dotnet.js' + +const is_browser = typeof window != "undefined"; +if (!is_browser) throw new Error(`Expected to be running in a browser`); + +const dotnetRuntime = await dotnet + .withDiagnosticTracing(false) + .withApplicationArgumentsFromQuery() + .create(); + +const config = dotnetRuntime.getConfig(); + +await dotnetRuntime.runMain(config.mainAssemblyName, [globalThis.location.href]); diff --git a/CryptoPortfolio Tracker.Desktop/CryptoPortfolio Tracker.Desktop.csproj b/CryptoPortfolio Tracker.Desktop/CryptoPortfolio Tracker.Desktop.csproj new file mode 100644 index 0000000..7e627b9 --- /dev/null +++ b/CryptoPortfolio Tracker.Desktop/CryptoPortfolio Tracker.Desktop.csproj @@ -0,0 +1,21 @@ + + + WinExe + + net10.0 + enable + + + + app.manifest + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.Desktop/Program.cs b/CryptoPortfolio Tracker.Desktop/Program.cs new file mode 100644 index 0000000..10918ac --- /dev/null +++ b/CryptoPortfolio Tracker.Desktop/Program.cs @@ -0,0 +1,21 @@ +using System; +using Avalonia; + +namespace CryptoPortfolio_Tracker.Desktop; + +sealed class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace(); +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.Desktop/app.manifest b/CryptoPortfolio Tracker.Desktop/app.manifest new file mode 100644 index 0000000..f3821a4 --- /dev/null +++ b/CryptoPortfolio Tracker.Desktop/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.iOS/AppDelegate.cs b/CryptoPortfolio Tracker.iOS/AppDelegate.cs new file mode 100644 index 0000000..7ccc373 --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/AppDelegate.cs @@ -0,0 +1,23 @@ +using Foundation; +using UIKit; +using Avalonia; +using Avalonia.Controls; +using Avalonia.iOS; +using Avalonia.Media; + +namespace CryptoPortfolio_Tracker.iOS; + +// The UIApplicationDelegate for the application. This class is responsible for launching the +// User Interface of the application, as well as listening (and optionally responding) to +// application events from iOS. +[Register("AppDelegate")] +#pragma warning disable CA1711 // Identifiers should not have incorrect suffix +public partial class AppDelegate : AvaloniaAppDelegate +#pragma warning restore CA1711 // Identifiers should not have incorrect suffix +{ + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.iOS/CryptoPortfolio Tracker.iOS.csproj b/CryptoPortfolio Tracker.iOS/CryptoPortfolio Tracker.iOS.csproj new file mode 100644 index 0000000..5b4dc4f --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/CryptoPortfolio Tracker.iOS.csproj @@ -0,0 +1,16 @@ + + + Exe + net10.0-ios + 13.0 + enable + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.iOS/Entitlements.plist b/CryptoPortfolio Tracker.iOS/Entitlements.plist new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/Entitlements.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/CryptoPortfolio Tracker.iOS/Info.plist b/CryptoPortfolio Tracker.iOS/Info.plist new file mode 100644 index 0000000..28c4082 --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDisplayName + CryptoPortfolio_Tracker + CFBundleIdentifier + companyName.CryptoPortfolio_Tracker + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + MinimumOSVersion + 13.0 + UIDeviceFamily + + 1 + 2 + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/CryptoPortfolio Tracker.iOS/Main.cs b/CryptoPortfolio Tracker.iOS/Main.cs new file mode 100644 index 0000000..554ab35 --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/Main.cs @@ -0,0 +1,14 @@ +using UIKit; + +namespace CryptoPortfolio_Tracker.iOS; + +public class Application +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker.iOS/Resources/LaunchScreen.xib b/CryptoPortfolio Tracker.iOS/Resources/LaunchScreen.xib new file mode 100644 index 0000000..ae4c49a --- /dev/null +++ b/CryptoPortfolio Tracker.iOS/Resources/LaunchScreen.xib @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker.slnx b/CryptoPortfolio Tracker.slnx new file mode 100644 index 0000000..646c63d --- /dev/null +++ b/CryptoPortfolio Tracker.slnx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/CryptoPortfolio Tracker/App.axaml b/CryptoPortfolio Tracker/App.axaml new file mode 100644 index 0000000..8fe368e --- /dev/null +++ b/CryptoPortfolio Tracker/App.axaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CryptoPortfolio Tracker/App.axaml.cs b/CryptoPortfolio Tracker/App.axaml.cs new file mode 100644 index 0000000..3cb625a --- /dev/null +++ b/CryptoPortfolio Tracker/App.axaml.cs @@ -0,0 +1,43 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using CryptoPortfolio_Tracker.ViewModels; +using CryptoPortfolio_Tracker.Views; + +namespace CryptoPortfolio_Tracker; + +public partial class App : Application +{ + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); +#if DEBUG + this.AttachDeveloperTools(); +#endif + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.MainWindow = new MainWindow(); + } + else if (ApplicationLifetime is IActivityApplicationLifetime singleViewFactoryApplicationLifetime) + { + singleViewFactoryApplicationLifetime.MainViewFactory = () => new PageNavigationHost() + { + Page = new MainView { DataContext = new MainViewModel() } + }; + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) + { + singleViewPlatform.MainView = new PageNavigationHost() + { + Page = new MainView { DataContext = new MainViewModel() } + }; + } + + base.OnFrameworkInitializationCompleted(); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Assets/Icon.png b/CryptoPortfolio Tracker/Assets/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3ba79f8a0eb9b1f0cc31a985d8c85e32f19754 GIT binary patch literal 40257 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 literal 0 HcmV?d00001 diff --git a/CryptoPortfolio Tracker/Assets/avalonia-logo.ico b/CryptoPortfolio Tracker/Assets/avalonia-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..c0488b9ecc1312e404eaf12f0768d76e89308f20 GIT binary patch literal 22630 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

os3 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 literal 0 HcmV?d00001 diff --git a/CryptoPortfolio Tracker/Assets/coin-placeholder.png b/CryptoPortfolio Tracker/Assets/coin-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..d15df46a3279674c92618d3fa5afd1379c106acc GIT binary patch literal 64708 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%0AFG*wGW#B!Rr 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 cm}bX+Cv`|);m EnableWindowDragProperty = + AvaloniaProperty.RegisterAttached( + "EnableWindowDrag", + typeof(WindowDragBehavior)); + + public static bool GetEnableWindowDrag(Control element) => + element.GetValue(EnableWindowDragProperty); + + public static void SetEnableWindowDrag(Control element, bool value) => + element.SetValue(EnableWindowDragProperty, value); + + static WindowDragBehavior() + { + EnableWindowDragProperty.Changed.AddClassHandler(OnEnableWindowDragChanged); + } + + private static void OnEnableWindowDragChanged(Control control, AvaloniaPropertyChangedEventArgs e) + { + if (e.NewValue is true) + { + // Контрол ещё может не быть в визуальном дереве + if (control.IsLoaded) + Attach(control); + else + control.Loaded += OnControlLoaded; + } + else + { + control.Loaded -= OnControlLoaded; + Detach(control); + } + } + + private static void OnControlLoaded(object? sender, RoutedEventArgs e) + { + if (sender is Control control) + { + control.Loaded -= OnControlLoaded; + Attach(control); + } + } + + private static void Attach(Control control) + { + var topBar = FindInVisualTree(control, "PART_NavigationBar"); + if (topBar is null) + return; + + topBar.AddHandler( + InputElement.PointerPressedEvent, + OnTopBarPointerPressed, + RoutingStrategies.Tunnel); + } + + private static void Detach(Control control) + { + var topBar = FindInVisualTree(control, "Border#PART_NavigationBar"); + if (topBar is null) + return; + + topBar.RemoveHandler( + InputElement.PointerPressedEvent, + OnTopBarPointerPressed); + } + + private static void OnTopBarPointerPressed(object? sender, PointerPressedEventArgs e) + { + if (!e.GetCurrentPoint(null).Properties.IsLeftButtonPressed) + return; + + // Проверяем — нажатие было на кнопке или интерактивном элементе? + if (e.Source is Visual source && IsInteractiveElement(source)) + return; + + if (sender is Visual visual && + TopLevel.GetTopLevel(visual) is Window window) + { + window.BeginMoveDrag(e); + } + } + + private static bool IsInteractiveElement(Visual visual) + { + Visual? current = visual; + while (current is not null) + { + if (current is Button or ToggleButton or CheckBox or + RadioButton or Slider or TextBox or ComboBox) + return true; + + if (current is Border { Name: "Border#PART_NavigationBar" }) + break; + + current = current.GetVisualParent(); + } + return false; + } + + private static T? FindInVisualTree(Visual root, string name) where T : Visual + { + if (root is T typed && root.Name == name) + return typed; + + foreach (var child in root.GetVisualChildren()) + { + var result = FindInVisualTree(child, name); + if (result is not null) + return result; + } + + return null; + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Context/CryptoContext.cs b/CryptoPortfolio Tracker/Context/CryptoContext.cs new file mode 100644 index 0000000..af46949 --- /dev/null +++ b/CryptoPortfolio Tracker/Context/CryptoContext.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using CryptoPortfolio_Tracker.Models; +using Microsoft.EntityFrameworkCore; + +namespace CryptoPortfolio_Tracker.Context; + +public partial class CryptoContext : DbContext +{ + public CryptoContext() + { + } + + public CryptoContext(DbContextOptions options) + : base(options) + { + } + + public virtual DbSet CryptoTypes { get; set; } + + public virtual DbSet Cryptocurrencies { get; set; } + + public virtual DbSet Networks { get; set; } + + public virtual DbSet Transactions { get; set; } + + public virtual DbSet TransactionTypes { get; set; } + + public virtual DbSet TransactionsStatuses { get; set; } + + public virtual DbSet Users { get; set; } + + public virtual DbSet UserWallets { get; set; } + + public virtual DbSet WalletTypes { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) +#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. + => optionsBuilder.UseNpgsql("Host=denjir-host.ru;Database=crypto;Username=crypto;Password=crypto;"); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("crypto_types_pkey"); + + entity.ToTable("crypto_types"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name).HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("cryptocurrencies_pkey"); + + entity.ToTable("cryptocurrencies"); + + entity.HasIndex(e => e.CoingeckoId, "cryptocurrencies_coingecko_id_key").IsUnique(); + + entity.HasIndex(e => e.Symbol, "cryptocurrencies_symbol_key").IsUnique(); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.CoingeckoId).HasColumnName("coingecko_id"); + entity.Property(e => e.CryptoTypeId).HasColumnName("crypto_type_id"); + entity.Property(e => e.Name).HasColumnName("name"); + entity.Property(e => e.NetworkId).HasColumnName("network_id"); + entity.Property(e => e.Symbol).HasColumnName("symbol"); + + entity.HasOne(d => d.CryptoType).WithMany(p => p.Cryptocurrencies) + .HasForeignKey(d => d.CryptoTypeId) + .HasConstraintName("cryptocurrencies_crypto_type_id_fkey"); + + entity.HasOne(d => d.Network).WithMany(p => p.Cryptocurrencies) + .HasForeignKey(d => d.NetworkId) + .HasConstraintName("cryptocurrencies_networks_fk"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("networks_pk"); + + entity.ToTable("networks"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name).HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("transactions_pkey"); + + entity.ToTable("transactions"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Amount) + .HasPrecision(30, 18) + .HasColumnName("amount"); + entity.Property(e => e.CryptocurrencyId).HasColumnName("cryptocurrency_id"); + entity.Property(e => e.FeeUsd) + .HasPrecision(30, 2) + .HasColumnName("fee_usd"); + entity.Property(e => e.PriceUsd) + .HasPrecision(24, 10) + .HasColumnName("price_usd"); + entity.Property(e => e.RecipientAddress).HasColumnName("recipient_address"); + entity.Property(e => e.SenderAddress).HasColumnName("sender_address"); + entity.Property(e => e.StatusId).HasColumnName("status_id"); + entity.Property(e => e.TotalUsd) + .HasPrecision(30, 2) + .HasColumnName("total_usd"); + entity.Property(e => e.TransactionDate) + .HasDefaultValueSql("now()") + .HasColumnName("transaction_date"); + entity.Property(e => e.TransactionHash).HasColumnName("transaction_hash"); + entity.Property(e => e.TransactionTypeId).HasColumnName("transaction_type_id"); + entity.Property(e => e.WalletId).HasColumnName("wallet_id"); + + entity.HasOne(d => d.Cryptocurrency).WithMany(p => p.Transactions) + .HasForeignKey(d => d.CryptocurrencyId) + .HasConstraintName("transactions_cryptocurrency_id_fkey"); + + entity.HasOne(d => d.Status).WithMany(p => p.Transactions) + .HasForeignKey(d => d.StatusId) + .HasConstraintName("transactions_status_id_fkey"); + + entity.HasOne(d => d.TransactionType).WithMany(p => p.Transactions) + .HasForeignKey(d => d.TransactionTypeId) + .HasConstraintName("transactions_transaction_type_id_fkey"); + + entity.HasOne(d => d.Wallet).WithMany(p => p.Transactions) + .HasForeignKey(d => d.WalletId) + .HasConstraintName("transactions_wallet_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("transaction_types_pkey"); + + entity.ToTable("transaction_types"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name).HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("transactions_statuses_pkey"); + + entity.ToTable("transactions_statuses"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name).HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("users_pkey"); + + entity.ToTable("users"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Email).HasColumnName("email"); + entity.Property(e => e.Login).HasColumnName("login"); + entity.Property(e => e.Password).HasColumnName("password"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("user_wallets_pkey"); + + entity.ToTable("user_wallets"); + + entity.HasIndex(e => e.Address, "user_wallets_address_key").IsUnique(); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Address).HasColumnName("address"); + entity.Property(e => e.Amount) + .HasPrecision(30, 12) + .HasColumnName("amount"); + entity.Property(e => e.CryptocurrencyId).HasColumnName("cryptocurrency_id"); + entity.Property(e => e.Name).HasColumnName("name"); + entity.Property(e => e.TypeId).HasColumnName("type_id"); + entity.Property(e => e.UserId).HasColumnName("user_id"); + + entity.HasOne(d => d.Cryptocurrency).WithMany(p => p.UserWallets) + .HasForeignKey(d => d.CryptocurrencyId) + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("user_wallets_cryptocurrencies_fk"); + + entity.HasOne(d => d.Type).WithMany(p => p.UserWallets) + .HasForeignKey(d => d.TypeId) + .HasConstraintName("user_wallets_type_id_fkey"); + + entity.HasOne(d => d.User).WithMany(p => p.UserWallets) + .HasForeignKey(d => d.UserId) + .HasConstraintName("user_wallets_user_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("wallet_types_pkey"); + + entity.ToTable("wallet_types"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name).HasColumnName("name"); + }); + + OnModelCreatingPartial(modelBuilder); + } + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder); +} diff --git a/CryptoPortfolio Tracker/Core/AppState.cs b/CryptoPortfolio Tracker/Core/AppState.cs new file mode 100644 index 0000000..73c4d80 --- /dev/null +++ b/CryptoPortfolio Tracker/Core/AppState.cs @@ -0,0 +1,20 @@ +using System.Net.Http; +using System.Net.Http.Headers; +using CryptoPortfolio_Tracker.Models; + +namespace CryptoPortfolio_Tracker.Core; + +public static class AppState +{ + public static User? CurrentUser { get; set; } = null; + + public static HttpClient CryptoHttpClient { get; } + + static AppState() + { + CryptoHttpClient = new HttpClient(); + CryptoHttpClient.DefaultRequestHeaders.Add("x-cg-demo-api-key", "CG-tRuAG4pgWucXgGYSpZMi7ADN"); + CryptoHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + CryptoHttpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("CryptoPortfolioApp", "1.0")); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/CryptoPortfolio Tracker.csproj b/CryptoPortfolio Tracker/CryptoPortfolio Tracker.csproj new file mode 100644 index 0000000..3773536 --- /dev/null +++ b/CryptoPortfolio Tracker/CryptoPortfolio Tracker.csproj @@ -0,0 +1,32 @@ + + + net10.0 + enable + latest + + + + + + + + + + + + None + All + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/CryptoPortfolio Tracker/Models/CryptoType.cs b/CryptoPortfolio Tracker/Models/CryptoType.cs new file mode 100644 index 0000000..3c652ae --- /dev/null +++ b/CryptoPortfolio Tracker/Models/CryptoType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class CryptoType +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection Cryptocurrencies { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/Models/Cryptocurrency.cs b/CryptoPortfolio Tracker/Models/Cryptocurrency.cs new file mode 100644 index 0000000..c48ebeb --- /dev/null +++ b/CryptoPortfolio Tracker/Models/Cryptocurrency.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations.Schema; +using Avalonia.Media.Imaging; +using CommunityToolkit.Mvvm.ComponentModel; +using LiveChartsCore.Defaults; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class Cryptocurrency : ObservableObject +{ + public long Id { get; set; } + + [ObservableProperty] public partial string Symbol { get; set; } = null!; + + [ObservableProperty] public partial string Name { get; set; } = null!; + + [ObservableProperty] public partial int CryptoTypeId { get; set; } + + [ObservableProperty] public partial long NetworkId { get; set; } + + [ObservableProperty] public partial string CoingeckoId { get; set; } = null!; + + [ObservableProperty] public partial CryptoType CryptoType { get; set; } = null!; + + [ObservableProperty] public partial Network Network { get; set; } = null!; + + [ObservableProperty] public partial ICollection Transactions { get; set; } = new List(); + + [ObservableProperty] public partial ICollection UserWallets { get; set; } = new List(); + + [NotMapped] [ObservableProperty] public partial decimal? PriceChange24H { get; set; } + + [NotMapped] + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsPositive))] + [NotifyPropertyChangedFor(nameof(IsNegative))] + public partial decimal? PriceChangePercentage24H { get; set; } + + [NotMapped] [ObservableProperty] public partial decimal CurrentPriceUsd { get; set; } + + [NotMapped] [ObservableProperty] public partial DateTime? PriceUpdatedAt { get; set; } + + [NotMapped] [ObservableProperty] public partial decimal? MarketCapUsd { get; set; } + + [NotMapped] [ObservableProperty] public partial decimal? Volume24HUsd { get; set; } + + [NotMapped] [ObservableProperty] public partial Bitmap? Image { get; set; } + + [NotMapped] public bool IsPositive => PriceChangePercentage24H > 0; + + [NotMapped] public bool IsNegative => PriceChangePercentage24H < 0; + + [NotMapped] public ObservableCollection PriceHistory24H { get; set; } = []; + + [NotMapped] public ObservableCollection PriceHistory7D { get; set; } = []; +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Models/Network.cs b/CryptoPortfolio Tracker/Models/Network.cs new file mode 100644 index 0000000..81e55e2 --- /dev/null +++ b/CryptoPortfolio Tracker/Models/Network.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class Network +{ + public long Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection Cryptocurrencies { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/Models/Transaction.cs b/CryptoPortfolio Tracker/Models/Transaction.cs new file mode 100644 index 0000000..7c2bf5c --- /dev/null +++ b/CryptoPortfolio Tracker/Models/Transaction.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class Transaction +{ + public long Id { get; set; } + + public long CryptocurrencyId { get; set; } + + public long WalletId { get; set; } + + public DateTime TransactionDate { get; set; } + + public int TransactionTypeId { get; set; } + + public decimal Amount { get; set; } + + public decimal PriceUsd { get; set; } + + public decimal TotalUsd { get; set; } + + public decimal FeeUsd { get; set; } + + public string? TransactionHash { get; set; } + + public int StatusId { get; set; } + + public string? SenderAddress { get; set; } + + public string? RecipientAddress { get; set; } + + public virtual Cryptocurrency Cryptocurrency { get; set; } = null!; + + public virtual TransactionsStatus Status { get; set; } = null!; + + public virtual TransactionType TransactionType { get; set; } = null!; + + public virtual UserWallet Wallet { get; set; } = null!; +} diff --git a/CryptoPortfolio Tracker/Models/TransactionType.cs b/CryptoPortfolio Tracker/Models/TransactionType.cs new file mode 100644 index 0000000..9f059ea --- /dev/null +++ b/CryptoPortfolio Tracker/Models/TransactionType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class TransactionType +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection Transactions { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/Models/TransactionsStatus.cs b/CryptoPortfolio Tracker/Models/TransactionsStatus.cs new file mode 100644 index 0000000..86cc3b8 --- /dev/null +++ b/CryptoPortfolio Tracker/Models/TransactionsStatus.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class TransactionsStatus +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection Transactions { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/Models/User.cs b/CryptoPortfolio Tracker/Models/User.cs new file mode 100644 index 0000000..cf8ec9c --- /dev/null +++ b/CryptoPortfolio Tracker/Models/User.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class User +{ + public long Id { get; set; } + + public string Login { get; set; } = null!; + + public string Email { get; set; } = null!; + + public string Password { get; set; } = null!; + + public virtual ICollection UserWallets { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/Models/UserWallet.cs b/CryptoPortfolio Tracker/Models/UserWallet.cs new file mode 100644 index 0000000..2745c01 --- /dev/null +++ b/CryptoPortfolio Tracker/Models/UserWallet.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class UserWallet +{ + public long Id { get; set; } + + public string Name { get; set; } = null!; + + public string Address { get; set; } = null!; + + public int TypeId { get; set; } + + public long UserId { get; set; } + + public long? CryptocurrencyId { get; set; } + + public decimal Amount { get; set; } + + public virtual Cryptocurrency? Cryptocurrency { get; set; } + + public virtual ICollection Transactions { get; set; } = new List(); + + public virtual WalletType Type { get; set; } = null!; + + public virtual User User { get; set; } = null!; +} diff --git a/CryptoPortfolio Tracker/Models/WalletType.cs b/CryptoPortfolio Tracker/Models/WalletType.cs new file mode 100644 index 0000000..6663051 --- /dev/null +++ b/CryptoPortfolio Tracker/Models/WalletType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace CryptoPortfolio_Tracker.Models; + +public partial class WalletType +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection UserWallets { get; set; } = new List(); +} diff --git a/CryptoPortfolio Tracker/ViewModels/CryptoChartViewModel.cs b/CryptoPortfolio Tracker/ViewModels/CryptoChartViewModel.cs new file mode 100644 index 0000000..239fd07 --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/CryptoChartViewModel.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.ObjectModel; +using System.Globalization; +using CommunityToolkit.Mvvm.ComponentModel; +using CryptoPortfolio_Tracker.Models; +using LiveChartsCore; +using LiveChartsCore.Defaults; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore.SkiaSharpView.Painting; +using SkiaSharp; + +namespace CryptoPortfolio_Tracker.ViewModels; + +public partial class CryptoChartViewModel : ViewModelBase +{ + [ObservableProperty] public partial string CryptocurrencyName { get; set; } = null!; + [ObservableProperty] public partial decimal CurrentPrice { get; set; } + [ObservableProperty] public partial decimal PriceChangePercentage24H { get; set; } + [ObservableProperty] public partial decimal PriceChange24H { get; set; } + [ObservableProperty] public partial decimal? MarketCap { get; set; } + [ObservableProperty] public partial decimal? Volume24H { get; set; } + [ObservableProperty] public partial bool IsPositive { get; set; } + [ObservableProperty] public partial bool IsNegative { get; set; } + [ObservableProperty] public partial DateTime StartDate { get; set; } + [ObservableProperty] public partial DateTime EndDate { get; set; } + + public ObservableCollection PriceHistory7D { get; } = []; + + public TimeSpan UnitWidth { get; } = TimeSpan.FromHours(1); + + public Func DateFormatter { get; } = + date => date.ToString("dd.MM HH:mm"); + + public Func PriceFormatter { get; } = + FormatPrice; + + public SolidColorPaint GridPaint { get; } = + new(new SKColor(255, 255, 255, 25)); + + public SolidColorPaint ChartStroke { get; } = + new(new SKColor(0x3B, 0xB3, 0x46)); + + public ISeries[] Series { get; private set; } = []; + + public CryptoChartViewModel(Cryptocurrency cryptocurrency) + { + CryptocurrencyName = cryptocurrency.Name; + CurrentPrice = cryptocurrency.CurrentPriceUsd; + PriceChangePercentage24H = cryptocurrency.PriceChangePercentage24H ?? 0; + PriceChange24H = cryptocurrency.PriceChange24H ?? 0; + MarketCap = cryptocurrency.MarketCapUsd; + Volume24H = cryptocurrency.Volume24HUsd; + + IsPositive = cryptocurrency.PriceChangePercentage24H > 0; + IsNegative = cryptocurrency.PriceChangePercentage24H < 0; + + foreach (var point in cryptocurrency.PriceHistory7D) + { + PriceHistory7D.Add(point); + } + + if (PriceHistory7D.Count > 0) + { + StartDate = PriceHistory7D[0].DateTime; + EndDate = PriceHistory7D[^1].DateTime; + } + + UpdateSeries(); + } + + partial void OnStartDateChanged(DateTime value) + { + UpdateSeries(); + } + + partial void OnEndDateChanged(DateTime value) + { + UpdateSeries(); + } + + private void UpdateSeries() + { + ObservableCollection visiblePoints = []; + + foreach (var point in PriceHistory7D) + { + if (point.DateTime >= StartDate && + point.DateTime <= EndDate) + { + visiblePoints.Add(point); + } + } + + if (visiblePoints.Count == 0) + { + Series = []; + OnPropertyChanged(nameof(Series)); + return; + } + + LineSeries lineSeries = + new() + { + Values = visiblePoints, + GeometrySize = 0, + Fill = null, + GeometryFill = null, + GeometryStroke = null, + Stroke = ChartStroke, + LineSmoothness = 0.2 + }; + + Series = + [ + lineSeries + ]; + + OnPropertyChanged(nameof(Series)); + } + + private static string FormatPrice(double price) + { + return price switch + { + >= 1000 => price.ToString("N0", CultureInfo.InvariantCulture), + >= 1 => price.ToString("N2", CultureInfo.InvariantCulture), + >= 0.01 => price.ToString("N4", CultureInfo.InvariantCulture), + _ => price.ToString("0.########", CultureInfo.InvariantCulture) + }; + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/ViewModels/HomeViewModel.cs b/CryptoPortfolio Tracker/ViewModels/HomeViewModel.cs new file mode 100644 index 0000000..b17f4a2 --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/HomeViewModel.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading; +using System.Threading.Tasks; +using Avalonia.Controls.Notifications; +using Avalonia.Controls.Primitives; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CryptoPortfolio_Tracker.Context; +using CryptoPortfolio_Tracker.Core; +using CryptoPortfolio_Tracker.Models; +using CryptoPortfolio_Tracker.Views; +using LiveChartsCore.Defaults; +using Microsoft.EntityFrameworkCore; +using Ursa.Controls; + +namespace CryptoPortfolio_Tracker.ViewModels; + +public partial class HomeViewModel : ViewModelBase +{ + private readonly Dictionary _imageCache = []; + private readonly Bitmap _placeholderImage; + + public ObservableCollection Cryptocurrencies { get; set; } = []; + + [ObservableProperty] public partial decimal DollarBalance { get; set; } + [ObservableProperty] public partial decimal BitcoinBalance { get; set; } + [ObservableProperty] public partial decimal ProfitLoss { get; set; } + [ObservableProperty] public partial string CoinNames { get; set; } = null!; + + [ObservableProperty] + public partial string UserName { get; set; } = AppState.CurrentUser?.Email ?? "example@mail.com"; + + [ObservableProperty] public partial bool IsCryptoLoading { get; set; } = false; + + public HomeViewModel() + { + _placeholderImage = + new Bitmap(AssetLoader.Open(new Uri("avares://CryptoPortfolio Tracker/Assets/coin-placeholder.png"))); + + _ = LoadCryptocurrenciesCommand.ExecuteAsync(null); + } + + [RelayCommand] + private async Task LoadCryptocurrenciesAsync() + { + IsCryptoLoading = true; + + try + { + await using CryptoContext context = new(); + + var cryptocurrencies = await context.Cryptocurrencies + .Include(x => x.Network) + .ToListAsync(); + + var coinIds = cryptocurrencies + .Select(x => x.CoingeckoId) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .ToList(); + + var ids = string.Join(",", coinIds); + + var url = + "https://api.coingecko.com/api/v3/coins/markets" + + "?vs_currency=usd" + + $"&ids={Uri.EscapeDataString(ids)}" + + "&order=market_cap_desc" + + "&per_page=250" + + "&page=1" + + "&sparkline=false"; + + using var response = await AppState.CryptoHttpClient.GetAsync(url); + var content = await response.Content.ReadAsStringAsync(); + + if (!response.IsSuccessStatusCode) + { + throw new HttpRequestException( + $"API error: {(int)response.StatusCode} " + + $"{response.ReasonPhrase}\n{content}"); + } + + var geckoMarkets = + JsonSerializer.Deserialize>( + content, + new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }) ?? []; + + Cryptocurrencies.Clear(); + + foreach (var r in geckoMarkets) + { + var crypto = cryptocurrencies.First(c => c.CoingeckoId == r.Id); + var currentPrice = r.CurrentPrice ?? 0m; + var changePercentage = r.PriceChangePercentage24H ?? 0m; + + crypto.PriceChange24H = currentPrice * changePercentage / 100m; + crypto.PriceChangePercentage24H = changePercentage; + crypto.CurrentPriceUsd = currentPrice; + crypto.MarketCapUsd = r.MarketCap; + crypto.Volume24HUsd = r.TotalVolume; + crypto.PriceUpdatedAt = r.LastUpdated?.UtcDateTime; + crypto.Image = _placeholderImage; + crypto.PriceHistory24H.Clear(); + crypto.PriceHistory7D.Clear(); + + Cryptocurrencies.Add(crypto); + + _ = LoadImageAsync(crypto, r.Image); + } + + await LoadPriceHistoriesAsync(Cryptocurrencies); + + var wallets = await context.UserWallets + .Include(x => x.Type) + .Include(x => x.Cryptocurrency) + .Where(x => x.UserId == AppState.CurrentUser!.Id) + .ToListAsync(); + + DollarBalance = 0; + BitcoinBalance = 0; + + List names = []; + + foreach (var wallet in wallets) + { + var geckoCurrency = geckoMarkets.First(x => x.Id == wallet.Cryptocurrency!.CoingeckoId); + var geckoBitcoin = geckoMarkets.First(x => x.Id == "bitcoin"); + + var dollarBalance = wallet.Amount * (geckoCurrency.CurrentPrice ?? 0m); + var bitcoinBalance = dollarBalance / (geckoBitcoin.CurrentPrice ?? 1m); + + DollarBalance += dollarBalance; + BitcoinBalance += bitcoinBalance; + + if (!names.Contains(wallet.Cryptocurrency!.Name)) + { + names.Add(wallet.Cryptocurrency.Name); + } + } + + CoinNames = string.Join(", ", names); + } + catch (Exception ex) + { + MainView.Current.ShowToast( + $"Ошибка при загрузке криптовалют: {ex.Message}", + NotificationType.Error); + } + finally + { + IsCryptoLoading = false; + } + } + + private async Task LoadPriceHistoriesAsync( + IEnumerable cryptocurrencies) + { + using SemaphoreSlim semaphore = new(4); + List tasks = []; + + foreach (var cryptocurrency in cryptocurrencies) + { + tasks.Add(LoadPriceHistoryAsync(cryptocurrency, semaphore)); + } + + await Task.WhenAll(tasks); + } + + private async Task LoadPriceHistoryAsync( + Cryptocurrency cryptocurrency, + SemaphoreSlim semaphore) + { + await semaphore.WaitAsync(); + + try + { + if (string.IsNullOrWhiteSpace(cryptocurrency.CoingeckoId)) + { + return; + } + + List prices24H = + await LoadChartAsync(cryptocurrency.CoingeckoId, 1); + + foreach (var point in ReducePricePoints(prices24H, 120)) + { + cryptocurrency.PriceHistory24H.Add(point); + } + + List prices7D = + await LoadChartAsync(cryptocurrency.CoingeckoId, 7); + + foreach (var point in prices7D) + { + cryptocurrency.PriceHistory7D.Add(point); + } + } + catch + { + // Ошибка одного графика не должна ломать загрузку всей таблицы. + } + finally + { + semaphore.Release(); + } + } + + private async Task> LoadChartAsync( + string coingeckoId, + int days) + { + var url = + $"https://api.coingecko.com/api/v3/coins/" + + $"{Uri.EscapeDataString(coingeckoId)}" + + "/market_chart" + + "?vs_currency=usd" + + $"&days={days}"; + + using var response = + await AppState.CryptoHttpClient.GetAsync(url); + + if (!response.IsSuccessStatusCode) + { + return []; + } + + var content = + await response.Content.ReadAsStringAsync(); + + var chart = + JsonSerializer.Deserialize( + content, + new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + + if (chart?.Prices is null || chart.Prices.Count == 0) + { + return []; + } + + List prices = []; + + foreach (var point in chart.Prices) + { + if (point.Count < 2) + { + continue; + } + + long timestamp = Convert.ToInt64(point[0]); + + DateTime date = + DateTimeOffset + .FromUnixTimeMilliseconds(timestamp) + .LocalDateTime; + + prices.Add( + new DateTimePoint( + date, + point[1])); + } + + return prices; + } + + private static List ReducePricePoints( + List points, + int maxPoints) + { + if (points.Count <= maxPoints) + { + return points; + } + + List result = []; + + double step = + (double)(points.Count - 1) / + (maxPoints - 1); + + for (int i = 0; i < maxPoints; i++) + { + int index = + (int)Math.Round(i * step); + + if (index >= points.Count) + { + index = points.Count - 1; + } + + result.Add(points[index]); + } + + return result; + } + + [RelayCommand] + private async Task LogoutAsync() + { + await MainView.Current.ReplaceAsync( + new LoginView + { + DataContext = new LoginViewModel() + }); + } + + private async Task LoadImageAsync( + Cryptocurrency crypto, + string? imageUrl) + { + if (string.IsNullOrWhiteSpace(imageUrl)) + { + return; + } + + if (_imageCache.TryGetValue(imageUrl, out var cachedImage)) + { + crypto.Image = cachedImage; + return; + } + + try + { + var imageBytes = + await AppState.CryptoHttpClient.GetByteArrayAsync(imageUrl); + + await using var stream = + new MemoryStream(imageBytes); + + var bitmap = new Bitmap(stream); + + _imageCache[imageUrl] = bitmap; + crypto.Image = bitmap; + } + catch + { + crypto.Image = _placeholderImage; + } + } + + private class CoinGeckoMarket + { + [JsonPropertyName("id")] public string Id { get; set; } = null!; + + [JsonPropertyName("current_price")] public decimal? CurrentPrice { get; set; } + + [JsonPropertyName("market_cap")] public decimal? MarketCap { get; set; } + + [JsonPropertyName("total_volume")] public decimal? TotalVolume { get; set; } + + [JsonPropertyName("last_updated")] public DateTimeOffset? LastUpdated { get; set; } + + [JsonPropertyName("price_change_percentage_24h")] + public decimal? PriceChangePercentage24H { get; set; } + + [JsonPropertyName("image")] public string? Image { get; set; } + } + + private class CoinGeckoMarketChart + { + [JsonPropertyName("prices")] public List> Prices { get; set; } = []; + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/ViewModels/LoginViewModel.cs b/CryptoPortfolio Tracker/ViewModels/LoginViewModel.cs new file mode 100644 index 0000000..a223b2c --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/LoginViewModel.cs @@ -0,0 +1,53 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CryptoPortfolio_Tracker.Views; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Controls.Notifications; +using CryptoPortfolio_Tracker.Context; +using CryptoPortfolio_Tracker.Core; +using Microsoft.EntityFrameworkCore; + +namespace CryptoPortfolio_Tracker.ViewModels +{ + public partial class LoginViewModel : ObservableValidator + { + [Required] [ObservableProperty] public partial string Login { get; set; } = "admin"; + + [Required] [ObservableProperty] public partial string Password { get; set; } = "admin"; + + [RelayCommand] + private async Task LoginAsync() + { + if (Validate()) + { + await using CryptoContext context = new(); + + var user = await context.Users.FirstOrDefaultAsync(u => + (u.Email == Login || u.Login == Login) && u.Password == Password); + + if (user == null) + { + MainView.Current.ShowToast("Неверный логин или пароль", NotificationType.Error); + return; + } + + AppState.CurrentUser = user; + + await MainView.Current.ReplaceAsync(new HomeView + { + DataContext = new HomeViewModel() + }); + } + } + + private bool Validate() + { + ValidateAllProperties(); + return !HasErrors; + } + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/ViewModels/MainViewModel.cs b/CryptoPortfolio Tracker/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..78ec633 --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/MainViewModel.cs @@ -0,0 +1,8 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace CryptoPortfolio_Tracker.ViewModels; + +public partial class MainViewModel : ViewModelBase +{ + +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/ViewModels/SettingsViewModel.cs b/CryptoPortfolio Tracker/ViewModels/SettingsViewModel.cs new file mode 100644 index 0000000..751f4d7 --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/SettingsViewModel.cs @@ -0,0 +1,8 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace CryptoPortfolio_Tracker.ViewModels; + +public partial class SettingsViewModel : ViewModelBase +{ + [ObservableProperty] public partial string Greeting { get; set; } = "This is Settings"; +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/ViewModels/ViewModelBase.cs b/CryptoPortfolio Tracker/ViewModels/ViewModelBase.cs new file mode 100644 index 0000000..85d7dbc --- /dev/null +++ b/CryptoPortfolio Tracker/ViewModels/ViewModelBase.cs @@ -0,0 +1,7 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace CryptoPortfolio_Tracker.ViewModels; + +public abstract class ViewModelBase : ObservableObject +{ +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Views/CryptoChartView.axaml b/CryptoPortfolio Tracker/Views/CryptoChartView.axaml new file mode 100644 index 0000000..65c16f0 --- /dev/null +++ b/CryptoPortfolio Tracker/Views/CryptoChartView.axaml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Views/CryptoChartView.axaml.cs b/CryptoPortfolio Tracker/Views/CryptoChartView.axaml.cs new file mode 100644 index 0000000..2a456ec --- /dev/null +++ b/CryptoPortfolio Tracker/Views/CryptoChartView.axaml.cs @@ -0,0 +1,13 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace CryptoPortfolio_Tracker.Views; + +public partial class CryptoChartView : UserControl +{ + public CryptoChartView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Views/HomeView.axaml b/CryptoPortfolio Tracker/Views/HomeView.axaml new file mode 100644 index 0000000..4b2b0a0 --- /dev/null +++ b/CryptoPortfolio Tracker/Views/HomeView.axaml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Views/HomeView.axaml.cs b/CryptoPortfolio Tracker/Views/HomeView.axaml.cs new file mode 100644 index 0000000..9d24b78 --- /dev/null +++ b/CryptoPortfolio Tracker/Views/HomeView.axaml.cs @@ -0,0 +1,55 @@ +using Avalonia.Controls; +using CryptoPortfolio_Tracker.Models; +using CryptoPortfolio_Tracker.ViewModels; +using Ursa.Controls; + +namespace CryptoPortfolio_Tracker.Views; + +public partial class HomeView : ContentPage +{ + public HomeView() + { + InitializeComponent(); + } + + private void CryptoTable_OnSelectionChanged( + object? sender, + SelectionChangedEventArgs e) + { + if (sender is not TableView tableView) + { + return; + } + + if (tableView.SelectedItem is not Cryptocurrency cryptocurrency) + { + return; + } + + CryptoChartViewModel viewModel = + new(cryptocurrency); + + tableView.SelectedIndex = -1; + + _ = OverlayDialog.ShowCustomAsync< + CryptoChartView, + CryptoChartViewModel, + object>( + viewModel, + null, + new OverlayDialogOptions + { + Title = cryptocurrency.Name, + CanDragMove = true, + CanResize = true, + CanLightDismiss = true, + IsCloseButtonVisible = true, + HorizontalScrollBarVisibility = + Avalonia.Controls.Primitives.ScrollBarVisibility.Disabled, + VerticalScrollBarVisibility = + Avalonia.Controls.Primitives.ScrollBarVisibility.Disabled, + Buttons = DialogButton.None, + StyleClass = "CryptoChartDialog" + }); + } +} \ No newline at end of file diff --git a/CryptoPortfolio Tracker/Views/LoginView.axaml b/CryptoPortfolio Tracker/Views/LoginView.axaml new file mode 100644 index 0000000..09663ab --- /dev/null +++ b/CryptoPortfolio Tracker/Views/LoginView.axaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + +