From 97a743ed315d115443e48cf21c5667a4b23e0ead Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Mon, 3 May 2021 22:00:50 -0700 Subject: [PATCH] Setup clean sln --- .../BlazorWeather.Maui.WinUI3.csproj | 7 +- BlazorWeather.Maui/BlazorWeather.Maui.csproj | 4 +- BlazorWeather.Maui/Main.razor | 4 +- BlazorWeather.Maui/MainPage.xaml.cs | 19 +- .../_content/BlazorWeather2021.bundle.scp.css | 14 +- BlazorWeather.Maui/wwwroot/index.html | 6 +- .../BlazorWeather.Server.csproj | 2 +- BlazorWeather.Server/Pages/_Host.cshtml | 7 +- BlazorWeather.Server/Startup.cs | 2 +- .../BlazorWeather.WindowsForms.csproj | 27 - BlazorWeather.WindowsForms/Form1.Designer.cs | 41 -- BlazorWeather.WindowsForms/Form1.cs | 42 -- BlazorWeather.WindowsForms/Form1.resx | 120 ---- BlazorWeather.WindowsForms/Program.cs | 23 - BlazorWeather.WindowsForms/wwwroot/index.html | 20 - BlazorWeather.sln | 201 ++---- BlazorWeather/BlazorWeather.csproj | 5 +- BlazorWeather/Components/LocationSearch.razor | 109 --- .../Components/LocationSearch.razor.css | 1 - BlazorWeather/Components/PushPin.razor | 15 - BlazorWeather/Components/PushPin.razor.css | 2 - .../Components/TemperatureUnitPicker.razor | 18 - .../TemperatureUnitPicker.razor.css | 1 - .../Pages/Favorites/Favorites.razor | 4 +- .../Pages/Favorites/Favorites.razor.css | 0 BlazorWeather/Pages/Forecast.razor | 170 ----- BlazorWeather/Pages/Forecast.razor.css | 1 - .../Pages/Home/Home.razor | 12 +- .../Pages/Home/Home.razor.css | 0 .../Pages/Home/Next14Days.razor | 4 +- .../Pages/Home/Next14Days.razor.css | 0 .../Pages/Home/Next24Hours.razor | 0 .../Pages/Home/Next7Days.razor | 0 BlazorWeather/Pages/Home/StatBoxes.razor | 28 + BlazorWeather/Pages/Home/StatBoxes.razor.css | 12 + .../Pages/Home/WeatherStationStat.razor | 54 ++ .../Pages/Home/WeatherStationStat.razor.css | 15 +- .../Pages/Map/Map.razor | 0 .../Pages/Settings/Settings.razor | 6 +- .../Pages/Settings/Settings.razor.css | 0 .../Properties/launchSettings.json | 0 BlazorWeather/ServiceCollectionExtensions.cs | 6 +- .../Services/PinnedLocationsService.cs | 2 +- BlazorWeather/Shared/MainLayout.razor | 11 +- BlazorWeather/Shared/MainLayout.razor.css | 1 - .../Shared/NavMenu.razor | 0 .../Shared/NavMenu.razor.css | 0 .../WeatherIcons.cs | 5 +- BlazorWeather/_Imports.razor | 10 +- .../wwwroot/css/app.css | 0 .../wwwroot/css/tailwind.min.css | 0 BlazorWeather/wwwroot/css/weather.css | 333 --------- BlazorWeather/wwwroot/icons/caret-left.svg | 3 - BlazorWeather/wwwroot/icons/caret-right.svg | 3 - BlazorWeather/wwwroot/icons/loop-circular.svg | 3 - .../wwwroot/icons/magnifying-glass.svg | 4 - BlazorWeather/wwwroot/icons/pin.svg | 3 - BlazorWeather/wwwroot/icons/target.svg | 3 - BlazorWeather/wwwroot/images/locations/hi.png | Bin 22517 -> 0 bytes BlazorWeather/wwwroot/images/locations/il.png | Bin 7677 -> 0 bytes BlazorWeather/wwwroot/images/locations/mo.png | Bin 16740 -> 0 bytes BlazorWeather/wwwroot/images/locations/ny.png | Bin 6456 -> 0 bytes BlazorWeather/wwwroot/images/locations/wa.png | Bin 11563 -> 0 bytes .../wwwroot/index.html | 4 +- .../wwwroot/weather-icons/clear-night.svg | 0 .../wwwroot/weather-icons/clear.svg | 0 .../wwwroot/weather-icons/cloud-sun.svg | 0 .../wwwroot/weather-icons/cloudy-night.svg | 0 .../wwwroot/weather-icons/cloudy.svg | 0 .../wwwroot/weather-icons/drizzle.svg | 0 .../wwwroot/weather-icons/fog.svg | 0 .../wwwroot/weather-icons/hail-night.svg | 0 .../wwwroot/weather-icons/hail.svg | 0 .../wwwroot/weather-icons/haze-night.svg | 0 .../wwwroot/weather-icons/haze.svg | 0 .../wwwroot/weather-icons/moon-off.svg | 0 .../weather-icons/partly-cloudy-night.svg | 0 .../wwwroot/weather-icons/partly-cloudy.svg | 0 .../wwwroot/weather-icons/rain-snow.svg | 0 .../wwwroot/weather-icons/rain.svg | 0 .../wwwroot/weather-icons/showers-night.svg | 0 .../wwwroot/weather-icons/showers.svg | 0 .../weather-icons/snow-shower-night.svg | 0 .../wwwroot/weather-icons/snow-shower.svg | 0 .../wwwroot/weather-icons/snow.svg | 0 .../wwwroot/weather-icons/snowflake.svg | 0 .../wwwroot/weather-icons/sunny-high.svg | 0 .../wwwroot/weather-icons/sunny-low.svg | 0 .../wwwroot/weather-icons/sunny.svg | 0 .../weather-icons/thunderstorms-night.svg | 0 .../wwwroot/weather-icons/thunderstorms.svg | 0 .../wwwroot/weather-icons/windy.svg | 0 .../BlazorWeather2021.Client.csproj | 16 - BlazorWeather2021.Client/Program.cs | 26 - BlazorWeather2021.Client/wwwroot/favicon.ico | Bin 5430 -> 0 bytes BlazorWeather2021.Client/wwwroot/index.html | 25 - .../BlazorWeather2021.Server.csproj | 12 - BlazorWeather2021.Server/Pages/Error.cshtml | 42 -- .../Pages/Error.cshtml.cs | 32 - BlazorWeather2021.Server/Pages/_Host.cshtml | 35 - BlazorWeather2021.Server/Program.cs | 26 - .../Properties/launchSettings.json | 29 - BlazorWeather2021.Server/Startup.cs | 59 -- .../appsettings.Development.json | 10 - BlazorWeather2021.Server/appsettings.json | 10 - BlazorWeather2021.Server/wwwroot/favicon.ico | Bin 5430 -> 0 bytes BlazorWeather2021/App.razor | 10 - BlazorWeather2021/BlazorWeather2021.csproj | 23 - BlazorWeather2021/Pages/Home/StatBoxes.razor | 44 -- .../Properties/launchSettings.json | 31 - .../ServiceCollectionExtensions.cs | 24 - .../Services/LocalStorageConfiguration.cs | 39 - .../Services/PinnedLocationsService.cs | 38 - BlazorWeather2021/Shared/MainLayout.razor | 7 - BlazorWeather2021/Shared/MainLayout.razor.css | 0 BlazorWeather2021/_Imports.razor | 10 - .../IWeatherService.cs | 0 .../WeatherClient.csproj | 0 .../WeatherModel.cs | 31 +- .../WeatherService.cs | 0 .../HttpWeatherForecastService.cs | 67 -- WeatherClientLib/IWeatherForecastService.cs | 18 - WeatherClientLib/Model/LocationModel.cs | 82 --- WeatherClientLib/Model/WeatherModel.cs | 664 ------------------ WeatherClientLib/Model/WeatherResponse.cs | 55 -- WeatherClientLib/WeatherClientLib.csproj | 12 - 126 files changed, 254 insertions(+), 2610 deletions(-) delete mode 100644 BlazorWeather.WindowsForms/BlazorWeather.WindowsForms.csproj delete mode 100644 BlazorWeather.WindowsForms/Form1.Designer.cs delete mode 100644 BlazorWeather.WindowsForms/Form1.cs delete mode 100644 BlazorWeather.WindowsForms/Form1.resx delete mode 100644 BlazorWeather.WindowsForms/Program.cs delete mode 100644 BlazorWeather.WindowsForms/wwwroot/index.html delete mode 100644 BlazorWeather/Components/LocationSearch.razor delete mode 100644 BlazorWeather/Components/LocationSearch.razor.css delete mode 100644 BlazorWeather/Components/PushPin.razor delete mode 100644 BlazorWeather/Components/PushPin.razor.css delete mode 100644 BlazorWeather/Components/TemperatureUnitPicker.razor delete mode 100644 BlazorWeather/Components/TemperatureUnitPicker.razor.css rename {BlazorWeather2021 => BlazorWeather}/Pages/Favorites/Favorites.razor (99%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Favorites/Favorites.razor.css (100%) delete mode 100644 BlazorWeather/Pages/Forecast.razor delete mode 100644 BlazorWeather/Pages/Forecast.razor.css rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Home.razor (98%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Home.razor.css (100%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Next14Days.razor (97%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Next14Days.razor.css (100%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Next24Hours.razor (100%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Home/Next7Days.razor (100%) create mode 100644 BlazorWeather/Pages/Home/StatBoxes.razor create mode 100644 BlazorWeather/Pages/Home/StatBoxes.razor.css create mode 100644 BlazorWeather/Pages/Home/WeatherStationStat.razor rename BlazorWeather2021/Pages/Home/StatBoxes.razor.css => BlazorWeather/Pages/Home/WeatherStationStat.razor.css (59%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Map/Map.razor (100%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Settings/Settings.razor (98%) rename {BlazorWeather2021 => BlazorWeather}/Pages/Settings/Settings.razor.css (100%) rename {BlazorWeather2021.Client => BlazorWeather}/Properties/launchSettings.json (100%) rename {BlazorWeather2021 => BlazorWeather}/Shared/NavMenu.razor (100%) rename {BlazorWeather2021 => BlazorWeather}/Shared/NavMenu.razor.css (100%) rename {BlazorWeather2021 => BlazorWeather}/WeatherIcons.cs (93%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/css/app.css (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/css/tailwind.min.css (100%) delete mode 100644 BlazorWeather/wwwroot/css/weather.css delete mode 100644 BlazorWeather/wwwroot/icons/caret-left.svg delete mode 100644 BlazorWeather/wwwroot/icons/caret-right.svg delete mode 100644 BlazorWeather/wwwroot/icons/loop-circular.svg delete mode 100644 BlazorWeather/wwwroot/icons/magnifying-glass.svg delete mode 100644 BlazorWeather/wwwroot/icons/pin.svg delete mode 100644 BlazorWeather/wwwroot/icons/target.svg delete mode 100644 BlazorWeather/wwwroot/images/locations/hi.png delete mode 100644 BlazorWeather/wwwroot/images/locations/il.png delete mode 100644 BlazorWeather/wwwroot/images/locations/mo.png delete mode 100644 BlazorWeather/wwwroot/images/locations/ny.png delete mode 100644 BlazorWeather/wwwroot/images/locations/wa.png rename {BlazorWeather2021 => BlazorWeather}/wwwroot/index.html (85%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/clear-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/clear.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/cloud-sun.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/cloudy-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/cloudy.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/drizzle.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/fog.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/hail-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/hail.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/haze-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/haze.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/moon-off.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/partly-cloudy-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/partly-cloudy.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/rain-snow.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/rain.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/showers-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/showers.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/snow-shower-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/snow-shower.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/snow.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/snowflake.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/sunny-high.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/sunny-low.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/sunny.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/thunderstorms-night.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/thunderstorms.svg (100%) rename {BlazorWeather2021 => BlazorWeather}/wwwroot/weather-icons/windy.svg (100%) delete mode 100644 BlazorWeather2021.Client/BlazorWeather2021.Client.csproj delete mode 100644 BlazorWeather2021.Client/Program.cs delete mode 100644 BlazorWeather2021.Client/wwwroot/favicon.ico delete mode 100644 BlazorWeather2021.Client/wwwroot/index.html delete mode 100644 BlazorWeather2021.Server/BlazorWeather2021.Server.csproj delete mode 100644 BlazorWeather2021.Server/Pages/Error.cshtml delete mode 100644 BlazorWeather2021.Server/Pages/Error.cshtml.cs delete mode 100644 BlazorWeather2021.Server/Pages/_Host.cshtml delete mode 100644 BlazorWeather2021.Server/Program.cs delete mode 100644 BlazorWeather2021.Server/Properties/launchSettings.json delete mode 100644 BlazorWeather2021.Server/Startup.cs delete mode 100644 BlazorWeather2021.Server/appsettings.Development.json delete mode 100644 BlazorWeather2021.Server/appsettings.json delete mode 100644 BlazorWeather2021.Server/wwwroot/favicon.ico delete mode 100644 BlazorWeather2021/App.razor delete mode 100644 BlazorWeather2021/BlazorWeather2021.csproj delete mode 100644 BlazorWeather2021/Pages/Home/StatBoxes.razor delete mode 100644 BlazorWeather2021/Properties/launchSettings.json delete mode 100644 BlazorWeather2021/ServiceCollectionExtensions.cs delete mode 100644 BlazorWeather2021/Services/LocalStorageConfiguration.cs delete mode 100644 BlazorWeather2021/Services/PinnedLocationsService.cs delete mode 100644 BlazorWeather2021/Shared/MainLayout.razor delete mode 100644 BlazorWeather2021/Shared/MainLayout.razor.css delete mode 100644 BlazorWeather2021/_Imports.razor rename {WeatherClient2021 => WeatherClient}/IWeatherService.cs (100%) rename WeatherClient2021/WeatherClient2021.csproj => WeatherClient/WeatherClient.csproj (100%) rename {WeatherClient2021 => WeatherClient}/WeatherModel.cs (73%) rename {WeatherClient2021 => WeatherClient}/WeatherService.cs (100%) delete mode 100644 WeatherClientLib/HttpWeatherForecastService.cs delete mode 100644 WeatherClientLib/IWeatherForecastService.cs delete mode 100644 WeatherClientLib/Model/LocationModel.cs delete mode 100644 WeatherClientLib/Model/WeatherModel.cs delete mode 100644 WeatherClientLib/Model/WeatherResponse.cs delete mode 100644 WeatherClientLib/WeatherClientLib.csproj diff --git a/BlazorWeather.Maui.WinUI3/BlazorWeather.Maui.WinUI3.csproj b/BlazorWeather.Maui.WinUI3/BlazorWeather.Maui.WinUI3.csproj index 322eadf..bfa3c09 100644 --- a/BlazorWeather.Maui.WinUI3/BlazorWeather.Maui.WinUI3.csproj +++ b/BlazorWeather.Maui.WinUI3/BlazorWeather.Maui.WinUI3.csproj @@ -40,6 +40,10 @@ + + + + @@ -70,9 +74,6 @@ - - - diff --git a/BlazorWeather.Maui/BlazorWeather.Maui.csproj b/BlazorWeather.Maui/BlazorWeather.Maui.csproj index de9c519..3c8bd45 100644 --- a/BlazorWeather.Maui/BlazorWeather.Maui.csproj +++ b/BlazorWeather.Maui/BlazorWeather.Maui.csproj @@ -24,9 +24,9 @@ - + - + diff --git a/BlazorWeather.Maui/Main.razor b/BlazorWeather.Maui/Main.razor index 73161f2..c6ec87c 100644 --- a/BlazorWeather.Maui/Main.razor +++ b/BlazorWeather.Maui/Main.razor @@ -1 +1,3 @@ - \ No newline at end of file +@namespace BlazorWeather.Maui + + \ No newline at end of file diff --git a/BlazorWeather.Maui/MainPage.xaml.cs b/BlazorWeather.Maui/MainPage.xaml.cs index 38d67b8..5f9aa60 100644 --- a/BlazorWeather.Maui/MainPage.xaml.cs +++ b/BlazorWeather.Maui/MainPage.xaml.cs @@ -1,4 +1,4 @@ -using BlazorWeather2021; +using BlazorWeather; using Microsoft.AspNetCore.Components.WebView.Maui; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -17,25 +17,32 @@ namespace BlazorWeather.Maui { InitializeComponent(); + // Setup configuration var configBuilder = new ConfigurationBuilder(); configBuilder.AddUserSecrets(this.GetType().Assembly); var config = configBuilder.Build(); + // Configure services var serviceCollection = new ServiceCollection(); serviceCollection.AddBlazorWebView(); serviceCollection.AddBlazorWeather(config["WeatherBaseUri"]); + // Create the BlazorWebView var blazorWebView = new BlazorWebView() { VerticalOptions = LayoutOptions.FillAndExpand, HostPage = @"wwwroot/index.html", Services = serviceCollection.BuildServiceProvider(), + RootComponents = + { + new RootComponent + { + Selector = "#app", + ComponentType = Type.GetType("BlazorWeather.Maui.Main") + } + } }; - - var componentType = Type.GetType("BlazorWeather.Maui.Main") - ?? Type.GetType("BlazorWeather.Maui.WinUI3.Main"); - blazorWebView.RootComponents.Add(new RootComponent { Selector = "#app", ComponentType = componentType, }); - + Content = blazorWebView; SetupTrayIcon(); diff --git a/BlazorWeather.Maui/wwwroot/_content/BlazorWeather2021.bundle.scp.css b/BlazorWeather.Maui/wwwroot/_content/BlazorWeather2021.bundle.scp.css index c4ff3e3..c9de879 100644 --- a/BlazorWeather.Maui/wwwroot/_content/BlazorWeather2021.bundle.scp.css +++ b/BlazorWeather.Maui/wwwroot/_content/BlazorWeather2021.bundle.scp.css @@ -1,6 +1,6 @@ @import ''; -/* _content/BlazorWeather2021/Pages/Favorites/Favorites.razor.rz.scp.css */ +/* _content/BlazorWeather/Pages/Favorites/Favorites.razor.rz.scp.css */ .grid[b-94j5n3mwyr] { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); grid-auto-rows: 1fr; @@ -35,7 +35,7 @@ a[b-94j5n3mwyr] { a:hover[b-94j5n3mwyr] { color: white; } -/* _content/BlazorWeather2021/Pages/Home/Home.razor.rz.scp.css */ +/* _content/BlazorWeather/Pages/Home/Home.razor.rz.scp.css */ .desktop h3[b-cgs33b3v3l], .desktop .right-col[b-cgs33b3v3l] { border-color: #152C39; } @@ -67,7 +67,7 @@ a:hover[b-94j5n3mwyr] { 50% { transform: rotate(-22deg) } 100% { transform: rotate(-28deg) } } -/* _content/BlazorWeather2021/Pages/Home/Next14Days.razor.rz.scp.css */ +/* _content/BlazorWeather/Pages/Home/Next14Days.razor.rz.scp.css */ .temperature-gradient[b-nlww04gcqp] { background: linear-gradient(180deg, #7014E8 0%, rgba(73, 49, 222, 0) 100%); border-radius: 5px; @@ -77,7 +77,7 @@ a:hover[b-94j5n3mwyr] { color: #91A7B7; border-color: #91A7B7; } -/* _content/BlazorWeather2021/Pages/Home/StatBoxes.razor.rz.scp.css */ +/* _content/BlazorWeather/Pages/Home/StatBoxes.razor.rz.scp.css */ .grid[b-qorhpl6y3o] { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); grid-auto-rows: 1fr; @@ -105,7 +105,7 @@ a[b-qorhpl6y3o] { a:hover[b-qorhpl6y3o] { color: white; } -/* _content/BlazorWeather2021/Pages/Settings/Settings.razor.rz.scp.css */ +/* _content/BlazorWeather/Pages/Settings/Settings.razor.rz.scp.css */ label:hover[b-wte9vde8oz] { background-color: var(--mid-background); } @@ -131,8 +131,8 @@ label > svg[b-wte9vde8oz] { input[type=radio]:checked + div + svg[b-wte9vde8oz] { display: block; } -/* _content/BlazorWeather2021/Shared/MainLayout.razor.rz.scp.css */ -/* _content/BlazorWeather2021/Shared/NavMenu.razor.rz.scp.css */ +/* _content/BlazorWeather/Shared/MainLayout.razor.rz.scp.css */ +/* _content/BlazorWeather/Shared/NavMenu.razor.rz.scp.css */ nav[b-sphds4i9k6] { background-color: var(--mid-background); z-index: 1; diff --git a/BlazorWeather.Maui/wwwroot/index.html b/BlazorWeather.Maui/wwwroot/index.html index 6377ac1..2f1eb64 100644 --- a/BlazorWeather.Maui/wwwroot/index.html +++ b/BlazorWeather.Maui/wwwroot/index.html @@ -5,9 +5,9 @@ Blazor Android app - - - + + + diff --git a/BlazorWeather.Server/BlazorWeather.Server.csproj b/BlazorWeather.Server/BlazorWeather.Server.csproj index efc8042..5df1153 100644 --- a/BlazorWeather.Server/BlazorWeather.Server.csproj +++ b/BlazorWeather.Server/BlazorWeather.Server.csproj @@ -2,7 +2,7 @@ net6.0 - 99cc6bcb-dbb2-493e-8f6e-04c9d2d10a3f + 6da98b65-8ce9-42d6-b26b-84b7c4b3051a diff --git a/BlazorWeather.Server/Pages/_Host.cshtml b/BlazorWeather.Server/Pages/_Host.cshtml index 1c75a97..aa64181 100644 --- a/BlazorWeather.Server/Pages/_Host.cshtml +++ b/BlazorWeather.Server/Pages/_Host.cshtml @@ -10,9 +10,10 @@ - BlazorWeather.Server + Blazor Weather 2021 - + + @@ -31,4 +32,4 @@ - + \ No newline at end of file diff --git a/BlazorWeather.Server/Startup.cs b/BlazorWeather.Server/Startup.cs index a29b4a4..f2192b0 100644 --- a/BlazorWeather.Server/Startup.cs +++ b/BlazorWeather.Server/Startup.cs @@ -26,7 +26,7 @@ namespace BlazorWeather.Server { services.AddRazorPages(); services.AddServerSideBlazor(); - services.AddBlazorWeather(); + services.AddBlazorWeather(Configuration["WeatherBaseUri"]); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/BlazorWeather.WindowsForms/BlazorWeather.WindowsForms.csproj b/BlazorWeather.WindowsForms/BlazorWeather.WindowsForms.csproj deleted file mode 100644 index ecd0401..0000000 --- a/BlazorWeather.WindowsForms/BlazorWeather.WindowsForms.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - WinExe - net6.0-windows - true - 99cc6bcb-dbb2-493e-8f6e-04c9d2d10a3f - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - \ No newline at end of file diff --git a/BlazorWeather.WindowsForms/Form1.Designer.cs b/BlazorWeather.WindowsForms/Form1.Designer.cs deleted file mode 100644 index 0a30d6d..0000000 --- a/BlazorWeather.WindowsForms/Form1.Designer.cs +++ /dev/null @@ -1,41 +0,0 @@ - -namespace BlazorWeather.WindowsForms -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} - diff --git a/BlazorWeather.WindowsForms/Form1.cs b/BlazorWeather.WindowsForms/Form1.cs deleted file mode 100644 index 85887ed..0000000 --- a/BlazorWeather.WindowsForms/Form1.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Microsoft.AspNetCore.Components.WebView.WindowsForms; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace BlazorWeather.WindowsForms -{ - public partial class Form1 : Form - { - public Form1() - { - var services = new ServiceCollection(); - services.AddBlazorWebView(); - services.AddBlazorWeather(); - - var builder = new ConfigurationBuilder() - .AddUserSecrets(); - var configuration = builder.Build(); - services.AddSingleton(_ => configuration); - - var blazor = new BlazorWebView() - { - Dock = DockStyle.Fill, - HostPage = "wwwroot/index.html", - Services = services.BuildServiceProvider(), - }; - blazor.RootComponents.Add("#app"); - Controls.Add(blazor); - - InitializeComponent(); - } - - } -} diff --git a/BlazorWeather.WindowsForms/Form1.resx b/BlazorWeather.WindowsForms/Form1.resx deleted file mode 100644 index 1af7de1..0000000 --- a/BlazorWeather.WindowsForms/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/BlazorWeather.WindowsForms/Program.cs b/BlazorWeather.WindowsForms/Program.cs deleted file mode 100644 index 3c9c0b2..0000000 --- a/BlazorWeather.WindowsForms/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace BlazorWeather.WindowsForms -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.SetHighDpiMode(HighDpiMode.SystemAware); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} diff --git a/BlazorWeather.WindowsForms/wwwroot/index.html b/BlazorWeather.WindowsForms/wwwroot/index.html deleted file mode 100644 index 9b1b6b2..0000000 --- a/BlazorWeather.WindowsForms/wwwroot/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - BlazorWeather - - - -
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - \ No newline at end of file diff --git a/BlazorWeather.sln b/BlazorWeather.sln index f014e78..9962ea4 100644 --- a/BlazorWeather.sln +++ b/BlazorWeather.sln @@ -3,27 +3,19 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29311.281 MinimumVisualStudioVersion = 15.0.26124.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WeatherClientLib", "WeatherClientLib\WeatherClientLib.csproj", "{E7DC79FD-C066-43B9-8D91-6AB167540C29}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather.Server", "BlazorWeather.Server\BlazorWeather.Server.csproj", "{7B73AE56-8A04-4C40-A168-0624BDE6E777}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather", "BlazorWeather\BlazorWeather.csproj", "{75932D29-0317-4E1D-9718-56FBD1D4CA37}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather.WindowsForms", "BlazorWeather.WindowsForms\BlazorWeather.WindowsForms.csproj", "{CAE64143-966B-43B3-8D52-06EEB2EE355A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather2021", "BlazorWeather2021\BlazorWeather2021.csproj", "{BB52D8A0-A330-4678-8ADD-F3E4EBE28691}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather.Maui", "BlazorWeather.Maui\BlazorWeather.Maui.csproj", "{AD4262EF-94A3-4248-A261-16EB23FF03AC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WeatherClient2021", "WeatherClient2021\WeatherClient2021.csproj", "{9BE9C852-9F23-48F2-AF18-3359E6762B6C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather.Maui.WinUI3", "BlazorWeather.Maui.WinUI3\BlazorWeather.Maui.WinUI3.csproj", "{34FC8854-83D8-4B30-A8BF-33AB4F4CC6E8}" EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "BlazorWeather.Maui.WinUI3 (Package)", "BlazorWeather.Maui.WinUI3 (Package)\BlazorWeather.Maui.WinUI3 (Package).wapproj", "{A88FCF8C-EC35-4623-B126-C591EEF99C70}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather2021.Client", "BlazorWeather2021.Client\BlazorWeather2021.Client.csproj", "{C7E9EFA3-B797-4A97-92AA-D1E99607E237}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "native", "native", "{C2147996-A910-4375-9ED1-3EF5C744D6EF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather2021.Server", "BlazorWeather2021.Server\BlazorWeather2021.Server.csproj", "{D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WeatherClient", "WeatherClient\WeatherClient.csproj", "{4464A83F-1E70-4372-A620-0E4FA3DF5CFE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather", "BlazorWeather\BlazorWeather.csproj", "{ECC6086F-BF11-4E90-90EB-55B496429B09}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorWeather.Server", "BlazorWeather.Server\BlazorWeather.Server.csproj", "{6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -37,86 +29,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|arm64.ActiveCfg = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|arm64.Build.0 = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|x64.ActiveCfg = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|x64.Build.0 = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|x86.ActiveCfg = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Debug|x86.Build.0 = Debug|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|Any CPU.Build.0 = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|arm64.ActiveCfg = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|arm64.Build.0 = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|x64.ActiveCfg = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|x64.Build.0 = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|x86.ActiveCfg = Release|Any CPU - {E7DC79FD-C066-43B9-8D91-6AB167540C29}.Release|x86.Build.0 = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|arm64.ActiveCfg = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|arm64.Build.0 = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|x64.ActiveCfg = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|x64.Build.0 = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|x86.ActiveCfg = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Debug|x86.Build.0 = Debug|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|Any CPU.Build.0 = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|arm64.ActiveCfg = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|arm64.Build.0 = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|x64.ActiveCfg = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|x64.Build.0 = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|x86.ActiveCfg = Release|Any CPU - {7B73AE56-8A04-4C40-A168-0624BDE6E777}.Release|x86.Build.0 = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|arm64.ActiveCfg = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|arm64.Build.0 = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|x64.ActiveCfg = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|x64.Build.0 = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|x86.ActiveCfg = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Debug|x86.Build.0 = Debug|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|Any CPU.Build.0 = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|arm64.ActiveCfg = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|arm64.Build.0 = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|x64.ActiveCfg = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|x64.Build.0 = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|x86.ActiveCfg = Release|Any CPU - {75932D29-0317-4E1D-9718-56FBD1D4CA37}.Release|x86.Build.0 = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|arm64.ActiveCfg = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|arm64.Build.0 = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|x64.ActiveCfg = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|x64.Build.0 = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|x86.ActiveCfg = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Debug|x86.Build.0 = Debug|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|Any CPU.Build.0 = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|arm64.ActiveCfg = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|arm64.Build.0 = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|x64.ActiveCfg = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|x64.Build.0 = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|x86.ActiveCfg = Release|Any CPU - {CAE64143-966B-43B3-8D52-06EEB2EE355A}.Release|x86.Build.0 = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|arm64.ActiveCfg = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|arm64.Build.0 = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|x64.ActiveCfg = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|x64.Build.0 = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|x86.ActiveCfg = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Debug|x86.Build.0 = Debug|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|Any CPU.Build.0 = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|arm64.ActiveCfg = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|arm64.Build.0 = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|x64.ActiveCfg = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|x64.Build.0 = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|x86.ActiveCfg = Release|Any CPU - {BB52D8A0-A330-4678-8ADD-F3E4EBE28691}.Release|x86.Build.0 = Release|Any CPU {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Debug|arm64.ActiveCfg = Debug|arm64 @@ -132,22 +44,6 @@ Global {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Release|x64.Build.0 = Release|x64 {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Release|x86.ActiveCfg = Release|x86 {AD4262EF-94A3-4248-A261-16EB23FF03AC}.Release|x86.Build.0 = Release|x86 - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|arm64.ActiveCfg = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|arm64.Build.0 = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|x64.ActiveCfg = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|x64.Build.0 = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|x86.ActiveCfg = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Debug|x86.Build.0 = Debug|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|Any CPU.Build.0 = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|arm64.ActiveCfg = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|arm64.Build.0 = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|x64.ActiveCfg = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|x64.Build.0 = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|x86.ActiveCfg = Release|Any CPU - {9BE9C852-9F23-48F2-AF18-3359E6762B6C}.Release|x86.Build.0 = Release|Any CPU {34FC8854-83D8-4B30-A8BF-33AB4F4CC6E8}.Debug|Any CPU.ActiveCfg = Debug|x86 {34FC8854-83D8-4B30-A8BF-33AB4F4CC6E8}.Debug|arm64.ActiveCfg = Debug|arm64 {34FC8854-83D8-4B30-A8BF-33AB4F4CC6E8}.Debug|arm64.Build.0 = Debug|arm64 @@ -182,42 +78,63 @@ Global {A88FCF8C-EC35-4623-B126-C591EEF99C70}.Release|x86.ActiveCfg = Release|x86 {A88FCF8C-EC35-4623-B126-C591EEF99C70}.Release|x86.Build.0 = Release|x86 {A88FCF8C-EC35-4623-B126-C591EEF99C70}.Release|x86.Deploy.0 = Release|x86 - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|arm64.ActiveCfg = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|arm64.Build.0 = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|x64.ActiveCfg = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|x64.Build.0 = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|x86.ActiveCfg = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Debug|x86.Build.0 = Debug|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|Any CPU.Build.0 = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|arm64.ActiveCfg = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|arm64.Build.0 = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|x64.ActiveCfg = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|x64.Build.0 = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|x86.ActiveCfg = Release|Any CPU - {C7E9EFA3-B797-4A97-92AA-D1E99607E237}.Release|x86.Build.0 = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|arm64.ActiveCfg = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|arm64.Build.0 = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|x64.ActiveCfg = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|x64.Build.0 = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|x86.ActiveCfg = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Debug|x86.Build.0 = Debug|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|Any CPU.Build.0 = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|arm64.ActiveCfg = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|arm64.Build.0 = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|x64.ActiveCfg = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|x64.Build.0 = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|x86.ActiveCfg = Release|Any CPU - {D95183C5-8B1F-4BFE-971A-1F22EB6BD89E}.Release|x86.Build.0 = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|arm64.ActiveCfg = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|arm64.Build.0 = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|x64.ActiveCfg = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|x64.Build.0 = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|x86.ActiveCfg = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Debug|x86.Build.0 = Debug|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|Any CPU.Build.0 = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|arm64.ActiveCfg = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|arm64.Build.0 = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|x64.ActiveCfg = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|x64.Build.0 = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|x86.ActiveCfg = Release|Any CPU + {4464A83F-1E70-4372-A620-0E4FA3DF5CFE}.Release|x86.Build.0 = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|arm64.ActiveCfg = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|arm64.Build.0 = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|x64.Build.0 = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Debug|x86.Build.0 = Debug|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|Any CPU.Build.0 = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|arm64.ActiveCfg = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|arm64.Build.0 = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|x64.ActiveCfg = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|x64.Build.0 = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|x86.ActiveCfg = Release|Any CPU + {ECC6086F-BF11-4E90-90EB-55B496429B09}.Release|x86.Build.0 = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|arm64.ActiveCfg = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|arm64.Build.0 = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|x64.Build.0 = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Debug|x86.Build.0 = Debug|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|Any CPU.Build.0 = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|arm64.ActiveCfg = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|arm64.Build.0 = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|x64.ActiveCfg = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|x64.Build.0 = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|x86.ActiveCfg = Release|Any CPU + {6A7E0E01-1D24-41EF-8640-FE0DE8F784DE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {AD4262EF-94A3-4248-A261-16EB23FF03AC} = {C2147996-A910-4375-9ED1-3EF5C744D6EF} + {34FC8854-83D8-4B30-A8BF-33AB4F4CC6E8} = {C2147996-A910-4375-9ED1-3EF5C744D6EF} + {A88FCF8C-EC35-4623-B126-C591EEF99C70} = {C2147996-A910-4375-9ED1-3EF5C744D6EF} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DDBF187C-B0CA-4286-A745-0345D7BEDF9F} EndGlobalSection diff --git a/BlazorWeather/BlazorWeather.csproj b/BlazorWeather/BlazorWeather.csproj index f57bec6..94d920a 100644 --- a/BlazorWeather/BlazorWeather.csproj +++ b/BlazorWeather/BlazorWeather.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -13,10 +13,11 @@ +
- + diff --git a/BlazorWeather/Components/LocationSearch.razor b/BlazorWeather/Components/LocationSearch.razor deleted file mode 100644 index 3afd2ca..0000000 --- a/BlazorWeather/Components/LocationSearch.razor +++ /dev/null @@ -1,109 +0,0 @@ -@inject IWeatherForecastService WeatherForecastService -@inject IGeolocationService GeolocationService -@using System.Threading.Tasks - -
- - - -
- - - @foreach (var location in locations.Take(10)) - { - - } - - -

-@if (noResults) -{ - No results. -} -

- -@code { - string searchQuery; - bool isSearching; - CancellationTokenSource currentSearchCts; - Location[] locations = new Location[0]; - bool noResults; - - string SearchQuery - { - get => searchQuery; - set - { - searchQuery = value; - if (!string.IsNullOrEmpty(searchQuery)) - { - _ = SearchDebounced(searchQuery); - } - } - } - - bool IsSearching => isSearching || currentSearchCts != null; - - [Parameter] - public EventCallback LocationChanged { get; set; } - - async Task GetLocalWeather() - { - isSearching = true; - var result = await GeolocationService.GetCurrentPosition(); - var geolocation = result.Position.Coords; - var currentLocation = await WeatherForecastService.GetLocationByGeolocation(geolocation.Latitude, geolocation.Longitude); - isSearching = false; - await LocationChanged.InvokeAsync(currentLocation); - } - - async Task SearchDebounced(string query) - { - try - { - // Cancel any existing pending search, and begin a new one - noResults = false; - currentSearchCts?.Cancel(); - currentSearchCts = new CancellationTokenSource(); - var cancellationToken = currentSearchCts.Token; - - await Task.Delay(500); - if (!cancellationToken.IsCancellationRequested) - { - var results = await WeatherForecastService.GetLocationsByText(query, cancellationToken); - if (!cancellationToken.IsCancellationRequested) - { - locations = results; - noResults = locations.Length == 0; - currentSearchCts = null; - } - } - - StateHasChanged(); - } - catch (OperationCanceledException) { } - catch (Exception ex) - { - Console.Error.WriteLine(ex.StackTrace); - } - } - - void LocationSelected(ChangeEventArgs e) - { - var locationName = (string)e.Value; - var selectedLocation = locations.FirstOrDefault(l => CityState(l) == locationName); - if (selectedLocation != null) - { - searchQuery = null; - noResults = false; - locations = new Location[0]; - LocationChanged.InvokeAsync(selectedLocation); - } - } - - string CityState(Location location) => $"{location.LocalizedName}, {location.AdministrativeArea.ID}"; - - string GetSearchClass() => IsSearching ? "search-icon spinning" : "search-icon"; - - string GetSearchIcon() => IsSearching ? "_content/BlazorWeather/icons/loop-circular.svg" : "_content/BlazorWeather/icons/magnifying-glass.svg"; -} diff --git a/BlazorWeather/Components/LocationSearch.razor.css b/BlazorWeather/Components/LocationSearch.razor.css deleted file mode 100644 index 5f28270..0000000 --- a/BlazorWeather/Components/LocationSearch.razor.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/BlazorWeather/Components/PushPin.razor b/BlazorWeather/Components/PushPin.razor deleted file mode 100644 index 401d0dd..0000000 --- a/BlazorWeather/Components/PushPin.razor +++ /dev/null @@ -1,15 +0,0 @@ - - -@code { - [Parameter] - public string Label { get; set; } - - [Parameter] - public bool IsChecked { get; set; } - - [Parameter] - public EventCallback IsCheckedChanged { get; set; } -} \ No newline at end of file diff --git a/BlazorWeather/Components/PushPin.razor.css b/BlazorWeather/Components/PushPin.razor.css deleted file mode 100644 index 46800d1..0000000 --- a/BlazorWeather/Components/PushPin.razor.css +++ /dev/null @@ -1,2 +0,0 @@ -body { -} diff --git a/BlazorWeather/Components/TemperatureUnitPicker.razor b/BlazorWeather/Components/TemperatureUnitPicker.razor deleted file mode 100644 index 53db616..0000000 --- a/BlazorWeather/Components/TemperatureUnitPicker.razor +++ /dev/null @@ -1,18 +0,0 @@ -
- @TemperatureUnit - / @(TemperatureUnit == "F" ? "C" : "F") -
- -@code { - [Parameter] - public string TemperatureUnit { get; set; } = "F"; - - [Parameter] - public EventCallback TemperatureUnitChanged { get; set; } - - Task SwitchTemperatureUnit() - { - TemperatureUnit = TemperatureUnit == "F" ? "C" : "F"; - return TemperatureUnitChanged.InvokeAsync(TemperatureUnit); - } -} \ No newline at end of file diff --git a/BlazorWeather/Components/TemperatureUnitPicker.razor.css b/BlazorWeather/Components/TemperatureUnitPicker.razor.css deleted file mode 100644 index 5f28270..0000000 --- a/BlazorWeather/Components/TemperatureUnitPicker.razor.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/BlazorWeather2021/Pages/Favorites/Favorites.razor b/BlazorWeather/Pages/Favorites/Favorites.razor similarity index 99% rename from BlazorWeather2021/Pages/Favorites/Favorites.razor rename to BlazorWeather/Pages/Favorites/Favorites.razor index a0774c6..4a2b5a8 100644 --- a/BlazorWeather2021/Pages/Favorites/Favorites.razor +++ b/BlazorWeather/Pages/Favorites/Favorites.razor @@ -12,7 +12,7 @@ @for (var i = 0; i < 5; i++) {
- +
18˚
St. Louis @@ -25,7 +25,7 @@
- 9 km/h + 9 mph
diff --git a/BlazorWeather2021/Pages/Favorites/Favorites.razor.css b/BlazorWeather/Pages/Favorites/Favorites.razor.css similarity index 100% rename from BlazorWeather2021/Pages/Favorites/Favorites.razor.css rename to BlazorWeather/Pages/Favorites/Favorites.razor.css diff --git a/BlazorWeather/Pages/Forecast.razor b/BlazorWeather/Pages/Forecast.razor deleted file mode 100644 index 153c818..0000000 --- a/BlazorWeather/Pages/Forecast.razor +++ /dev/null @@ -1,170 +0,0 @@ -@page "/" -@implements IDisposable -@inject IWeatherForecastService WeatherForecastService -@inject PinnedLocationsService PinnedLocationsService - -
-
-

BLAZOR WEATHER

- - - - @if (currentWeather == null) - { -

Search for a city, or use your current location.

- } - else - { -
-

@currentLocation.LocalizedName.ToUpper()

- -
- - - -
- @GetTemperature() - -
-
- @currentWeather.WeatherText - @currentWeather.WeatherText -
-
Updated @GetTimeToDisplay()
-
-
UV index

@currentWeather.UVIndex

-
Barometer

@currentWeather.Pressure

-
Humidity

@currentWeather.RelativeHumidity%

-
Wind

@currentWeather.WindSpeed mph @currentWeather.WindDirection

-
- } -
-
- -@code { - WeatherResponse currentWeather; - string temperatureUnit = "F"; - Location currentLocation; - IList pinnedLocations; - int pinnedLocationIndex; - - CancellationTokenSource streamingWeatherCTS = new CancellationTokenSource(); - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - pinnedLocations = await PinnedLocationsService.LoadPinnedLocations(); - currentLocation = pinnedLocations.FirstOrDefault(); - if (currentLocation != null) - { - _ = GetWeatherUpdates(); - } - } - } - - async Task GetWeatherUpdates() - { - await foreach (var weatherResponse in WeatherForecastService.GetStreamingWeather(currentLocation.Key, streamingWeatherCTS.Token)) - { - currentWeather = weatherResponse; - StateHasChanged(); - } - } - - void LocationChanged(Location newLocation) - { - currentLocation = pinnedLocations.FirstOrDefault(l => l.Key == newLocation.Key) ?? newLocation; - streamingWeatherCTS.Cancel(); - streamingWeatherCTS.Dispose(); - streamingWeatherCTS = new CancellationTokenSource(); - _ = GetWeatherUpdates(); - } - - async Task PinLocation(ChangeEventArgs e) - { - currentLocation.IsPinned = (bool)e.Value; - if (currentLocation.IsPinned) - { - pinnedLocations.Add(currentLocation); - pinnedLocationIndex = pinnedLocations.Count() - 1; - } - else - { - pinnedLocations.Remove(currentLocation); - } - await PinnedLocationsService.SavePinnedLocations(pinnedLocations); - } - - bool ShowPinnedLocations() => pinnedLocations.Any() && !currentLocation.IsPinned || pinnedLocations.Count() > 1; - - void NextPinnedLocation() - { - pinnedLocationIndex = (pinnedLocationIndex + 1) % pinnedLocations.Count(); - LocationChanged(pinnedLocations[pinnedLocationIndex]); - } - - void PreviousPinnedLocation() - { - int count = pinnedLocations.Count(); - pinnedLocationIndex = (pinnedLocationIndex + count - 1) % count; - LocationChanged(pinnedLocations[pinnedLocationIndex]); - } - - string GetBackgroundClass() - { - if (currentWeather == null) - { - return "warm"; - } - else if (!currentWeather.IsDayTime) - { - return "night"; - } - else if (currentWeather.Temperature > 60) - { - return "warm"; - } - else - { - return "cold"; - } - } - - void SwitchTemperatureUnit() => temperatureUnit = temperatureUnit == "F" ? "C" : "F"; - - float GetTemperature() - => temperatureUnit == "F" ? currentWeather.Temperature : TemperatureAsCelsius(currentWeather.Temperature); - - float TemperatureAsCelsius(float f) => (float)Math.Round((f - 23f) / 1.8f); - - string GetTimeToDisplay() - => currentWeather.RetrievedTime.ToLocalTime().ToString("T"); - - string GetCurrentLocationImage() - { - switch (currentLocation.AdministrativeArea.ID) - { - case "WA": - case "NY": - case "MO": - case "IL": - case "HI": - return $"_content/BlazorWeather/images/locations/{currentLocation.AdministrativeArea.ID}.png"; - default: - return "_content/BlazorWeather/images/locations/wa.png"; - } - } - - void IDisposable.Dispose() - { - streamingWeatherCTS.Cancel(); - } -} diff --git a/BlazorWeather/Pages/Forecast.razor.css b/BlazorWeather/Pages/Forecast.razor.css deleted file mode 100644 index 5f28270..0000000 --- a/BlazorWeather/Pages/Forecast.razor.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/BlazorWeather2021/Pages/Home/Home.razor b/BlazorWeather/Pages/Home/Home.razor similarity index 98% rename from BlazorWeather2021/Pages/Home/Home.razor rename to BlazorWeather/Pages/Home/Home.razor index 76d7499..adf7494 100644 --- a/BlazorWeather2021/Pages/Home/Home.razor +++ b/BlazorWeather/Pages/Home/Home.razor @@ -19,11 +19,11 @@ else {
-
@weather.CurrentWeather.ChanceOfPercipitation%
+
@weather.CurrentWeather.PrecipitationProbability%
-
9km/h
+
9mph
-
9km/h
+
9mph
@@ -62,13 +62,13 @@ else { -
+

Winds

-

14 | 25

+

@weather.CurrentWeather.WindSpeed | @(weather.CurrentWeather.WindSpeed + 10)

@@ -78,7 +78,7 @@ else {
- +
diff --git a/BlazorWeather2021/Pages/Home/Home.razor.css b/BlazorWeather/Pages/Home/Home.razor.css similarity index 100% rename from BlazorWeather2021/Pages/Home/Home.razor.css rename to BlazorWeather/Pages/Home/Home.razor.css diff --git a/BlazorWeather2021/Pages/Home/Next14Days.razor b/BlazorWeather/Pages/Home/Next14Days.razor similarity index 97% rename from BlazorWeather2021/Pages/Home/Next14Days.razor rename to BlazorWeather/Pages/Home/Next14Days.razor index 84f5228..2047cd1 100644 --- a/BlazorWeather2021/Pages/Home/Next14Days.razor +++ b/BlazorWeather/Pages/Home/Next14Days.razor @@ -1,4 +1,4 @@ -

Daily Forecasts

+

Daily

@foreach (var forecast in DailyForecasts) { @@ -15,7 +15,7 @@
@min
- @forecast.ChanceOfPercipitation% + @forecast.Day.PrecipitationProbability%
} diff --git a/BlazorWeather2021/Pages/Home/Next14Days.razor.css b/BlazorWeather/Pages/Home/Next14Days.razor.css similarity index 100% rename from BlazorWeather2021/Pages/Home/Next14Days.razor.css rename to BlazorWeather/Pages/Home/Next14Days.razor.css diff --git a/BlazorWeather2021/Pages/Home/Next24Hours.razor b/BlazorWeather/Pages/Home/Next24Hours.razor similarity index 100% rename from BlazorWeather2021/Pages/Home/Next24Hours.razor rename to BlazorWeather/Pages/Home/Next24Hours.razor diff --git a/BlazorWeather2021/Pages/Home/Next7Days.razor b/BlazorWeather/Pages/Home/Next7Days.razor similarity index 100% rename from BlazorWeather2021/Pages/Home/Next7Days.razor rename to BlazorWeather/Pages/Home/Next7Days.razor diff --git a/BlazorWeather/Pages/Home/StatBoxes.razor b/BlazorWeather/Pages/Home/StatBoxes.razor new file mode 100644 index 0000000..aead4c9 --- /dev/null +++ b/BlazorWeather/Pages/Home/StatBoxes.razor @@ -0,0 +1,28 @@ +
+ @foreach (var weatherStation in weatherStations) + { + + } +
+ + + +
+
+ +@code { + IList weatherStations; + + [Parameter] + public WeatherSnapshot CurrentWeather { get; set; } + + protected override void OnParametersSet() + { + weatherStations = new List(CurrentWeather.GetWeatherStations()); + } + + void AddWeatherStation() + { + weatherStations.Add(new WeatherStation { CurrentWeather = CurrentWeather }); + } +} diff --git a/BlazorWeather/Pages/Home/StatBoxes.razor.css b/BlazorWeather/Pages/Home/StatBoxes.razor.css new file mode 100644 index 0000000..1216b3d --- /dev/null +++ b/BlazorWeather/Pages/Home/StatBoxes.razor.css @@ -0,0 +1,12 @@ +.grid { + grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); + grid-auto-rows: 1fr; +} + +a { + color: #637989; +} + +a:hover { + color: white; +} diff --git a/BlazorWeather/Pages/Home/WeatherStationStat.razor b/BlazorWeather/Pages/Home/WeatherStationStat.razor new file mode 100644 index 0000000..2bbfbb1 --- /dev/null +++ b/BlazorWeather/Pages/Home/WeatherStationStat.razor @@ -0,0 +1,54 @@ +
+ @switch (stat) + { + case WeatherStat.WindSpeed: + +
+ @WeatherStation.CurrentWeather.WindSpeed mph +
+ break; + case WeatherStat.Temperature: + +
+ @WeatherStation.CurrentWeather.Temperature +
+ break; + case WeatherStat.RelativeHumidity: + +
+ @WeatherStation.CurrentWeather.RelativeHumidity% +
+ break; + } + +
+ From +
@WeatherStation.Name
+
+
+ +@code { + static WeatherStat defaultStat = WeatherStat.Temperature; + + WeatherStat stat = defaultStat; + + [Parameter] + public WeatherStation WeatherStation { get; set; } + + protected override void OnInitialized() + { + defaultStat = NextStat(defaultStat); + } + + public void SwitchStat() => stat = NextStat(stat); + + static WeatherStat NextStat(WeatherStat stat) + => (WeatherStat)(((int) stat + 1) % Enum.GetNames().Length); + + enum WeatherStat + { + Temperature, + RelativeHumidity, + WindSpeed + } +} \ No newline at end of file diff --git a/BlazorWeather2021/Pages/Home/StatBoxes.razor.css b/BlazorWeather/Pages/Home/WeatherStationStat.razor.css similarity index 59% rename from BlazorWeather2021/Pages/Home/StatBoxes.razor.css rename to BlazorWeather/Pages/Home/WeatherStationStat.razor.css index 2b833d3..4b3a637 100644 --- a/BlazorWeather2021/Pages/Home/StatBoxes.razor.css +++ b/BlazorWeather/Pages/Home/WeatherStationStat.razor.css @@ -1,9 +1,4 @@ -.grid { - grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); - grid-auto-rows: 1fr; -} - -.stat-box { +.stat-box { background-color: var(--mid-background); aspect-ratio: 1; max-width: 11rem; @@ -17,11 +12,3 @@ .stat-source { color: #91A7B7; } - -a { - color: #637989; -} - -a:hover { - color: white; -} diff --git a/BlazorWeather2021/Pages/Map/Map.razor b/BlazorWeather/Pages/Map/Map.razor similarity index 100% rename from BlazorWeather2021/Pages/Map/Map.razor rename to BlazorWeather/Pages/Map/Map.razor diff --git a/BlazorWeather2021/Pages/Settings/Settings.razor b/BlazorWeather/Pages/Settings/Settings.razor similarity index 98% rename from BlazorWeather2021/Pages/Settings/Settings.razor rename to BlazorWeather/Pages/Settings/Settings.razor index de6c7c1..7b55a91 100644 --- a/BlazorWeather2021/Pages/Settings/Settings.razor +++ b/BlazorWeather/Pages/Settings/Settings.razor @@ -3,7 +3,7 @@

Your Location Now

St. Louis, Missouri, USA

- +

18˚

Cloudy @@ -11,9 +11,9 @@
13%
-
9km/h
+
9mph
-
9km/h
+
7%
diff --git a/BlazorWeather2021/Pages/Settings/Settings.razor.css b/BlazorWeather/Pages/Settings/Settings.razor.css similarity index 100% rename from BlazorWeather2021/Pages/Settings/Settings.razor.css rename to BlazorWeather/Pages/Settings/Settings.razor.css diff --git a/BlazorWeather2021.Client/Properties/launchSettings.json b/BlazorWeather/Properties/launchSettings.json similarity index 100% rename from BlazorWeather2021.Client/Properties/launchSettings.json rename to BlazorWeather/Properties/launchSettings.json diff --git a/BlazorWeather/ServiceCollectionExtensions.cs b/BlazorWeather/ServiceCollectionExtensions.cs index c890139..61ac629 100644 --- a/BlazorWeather/ServiceCollectionExtensions.cs +++ b/BlazorWeather/ServiceCollectionExtensions.cs @@ -6,15 +6,15 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using WeatherClientLib; +using WeatherClient2021; namespace BlazorWeather { public static class ServiceCollectionExtensions { - public static IServiceCollection AddBlazorWeather(this IServiceCollection services) + public static IServiceCollection AddBlazorWeather(this IServiceCollection services, string baseUri) { - services.AddHttpClient(); + services.AddHttpClient(httpClient => httpClient.BaseAddress = new Uri(baseUri)); services.AddScoped(); services.AddBlazoredLocalStorage(); services.AddScoped(); diff --git a/BlazorWeather/Services/PinnedLocationsService.cs b/BlazorWeather/Services/PinnedLocationsService.cs index 2e7c2a3..57b633a 100644 --- a/BlazorWeather/Services/PinnedLocationsService.cs +++ b/BlazorWeather/Services/PinnedLocationsService.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using WeatherClientLib.Model; +using WeatherClient2021; namespace BlazorWeather { diff --git a/BlazorWeather/Shared/MainLayout.razor b/BlazorWeather/Shared/MainLayout.razor index 7ea1402..1bd6f5e 100644 --- a/BlazorWeather/Shared/MainLayout.razor +++ b/BlazorWeather/Shared/MainLayout.razor @@ -1,4 +1,7 @@ -@inherits LayoutComponentBase - -@Body - +@inherits LayoutComponentBase +
+ +
+ @Body +
+
diff --git a/BlazorWeather/Shared/MainLayout.razor.css b/BlazorWeather/Shared/MainLayout.razor.css index 5f28270..e69de29 100644 --- a/BlazorWeather/Shared/MainLayout.razor.css +++ b/BlazorWeather/Shared/MainLayout.razor.css @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/BlazorWeather2021/Shared/NavMenu.razor b/BlazorWeather/Shared/NavMenu.razor similarity index 100% rename from BlazorWeather2021/Shared/NavMenu.razor rename to BlazorWeather/Shared/NavMenu.razor diff --git a/BlazorWeather2021/Shared/NavMenu.razor.css b/BlazorWeather/Shared/NavMenu.razor.css similarity index 100% rename from BlazorWeather2021/Shared/NavMenu.razor.css rename to BlazorWeather/Shared/NavMenu.razor.css diff --git a/BlazorWeather2021/WeatherIcons.cs b/BlazorWeather/WeatherIcons.cs similarity index 93% rename from BlazorWeather2021/WeatherIcons.cs rename to BlazorWeather/WeatherIcons.cs index 9d61c77..453646c 100644 --- a/BlazorWeather2021/WeatherIcons.cs +++ b/BlazorWeather/WeatherIcons.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using WeatherClient2021; -namespace BlazorWeather2021 +namespace BlazorWeather { public static class WeatherIcons { @@ -24,7 +24,8 @@ namespace BlazorWeather2021 { "Showers", "showers" }, { "Thunderstorms", "thunderstorms" }, { "Mostly cloudy w/ t-storms", "thunderstorms" }, - { "Partly sunny w/ t-storms", "thunderstorms" } + { "Partly sunny w/ t-storms", "thunderstorms" }, + { "Clouds and sun", "partly-cloudy" } }; public static string GetIconUrl(this WeatherSnapshot weather) diff --git a/BlazorWeather/_Imports.razor b/BlazorWeather/_Imports.razor index 6243bc5..558e352 100644 --- a/BlazorWeather/_Imports.razor +++ b/BlazorWeather/_Imports.razor @@ -1,14 +1,10 @@ @using System.Net.Http -@using System.Threading -@using Microsoft.AspNetCore.Authorization +@using System.Net.Http.Json @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using BlazorWeather @using BlazorWeather.Shared -@using BlazorWeather.Components -@using WeatherClientLib -@using WeatherClientLib.Model -@using Blazored.LocalStorage -@using Darnton.Blazor.DeviceInterop.Geolocation \ No newline at end of file +@using WeatherClient2021 \ No newline at end of file diff --git a/BlazorWeather2021/wwwroot/css/app.css b/BlazorWeather/wwwroot/css/app.css similarity index 100% rename from BlazorWeather2021/wwwroot/css/app.css rename to BlazorWeather/wwwroot/css/app.css diff --git a/BlazorWeather2021/wwwroot/css/tailwind.min.css b/BlazorWeather/wwwroot/css/tailwind.min.css similarity index 100% rename from BlazorWeather2021/wwwroot/css/tailwind.min.css rename to BlazorWeather/wwwroot/css/tailwind.min.css diff --git a/BlazorWeather/wwwroot/css/weather.css b/BlazorWeather/wwwroot/css/weather.css deleted file mode 100644 index 7a77783..0000000 --- a/BlazorWeather/wwwroot/css/weather.css +++ /dev/null @@ -1,333 +0,0 @@ -* { - box-sizing: border-box; -} - -html, body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - color: white; - height: 100%; - margin: 0; -} - -#main { - min-height: 100%; - display: flex; - flex-direction: row; - justify-content: space-between; - padding: 1.5rem; -} - -.weather-now, .weather-graph { - flex-grow: 1; - margin: 1.5rem; - width: calc(50% - 3rem); -} - -.weather-now { - display: flex; - flex-direction: column; - align-items: center; -} - - .weather-now h1 { - font-size: 1.5rem; - font-weight: 200; - letter-spacing: 1px; - text-align: center; - margin: 0 0 1rem 0; - } - - .weather-now .page-title { - font-size: 2rem; - } - -.location-carousel { - display: flex; - flex-direction: row; - align-items: center; -} - - .location-carousel .previous { - order: 1; - height: 30px; - } - - .location-carousel img { - order: 2; - } - - .location-carousel .next { - order: 3; - height: 30px; - } - -.temperature { - font-size: 6rem; - display: inline-block; - position: relative; -} - - .temperature::after { - content: "°"; - position: absolute; - font-size: 5rem; - top: 0.3rem; - left: 100%; - } - -.unit-switch { - position: absolute; - bottom: 0.75rem; - left: calc(100% + 2rem); - width: 200px; - font-size: 3rem; - cursor: pointer; -} - -.temp-unit-option { - font-size: 1.5rem; - opacity: 0.5; -} - -.summary { - text-transform: uppercase; - font-size: 2rem; - margin-bottom: 0.5rem; - display: flex; - align-items: center; - padding-right: 20px; -} - -.weather-img { - margin-right: 10px; - margin-top: 2px; -} - -.metrics { - display: flex; - margin-top: 2rem; -} - - .metrics > div { - background: linear-gradient(-45deg, rgba(255,255,255,0.05), rgba(255,255,255,0.35)); - padding: 0.75rem; - text-align: center; - font-size: 0.8rem; - font-weight: 600; - border-radius: 1rem; - border-bottom-right-radius: 0; - } - - .metrics > div:not(:last-of-type) { - margin-right: 1rem; - } - - .metrics > div p { - margin: 0; - font-weight: 200; - font-size: 1.2rem; - } - -.update-info { - text-transform: uppercase; -} - -.warm { - background-image: linear-gradient(#F6CC66, #FCA184); -} - -.cold { - background-image: linear-gradient(#BDE3FA, #A5C9FD); -} - -.night { - background-image: linear-gradient(#172941, #3C6683); -} - -@media (max-width: 767.98px) { - #main { - flex-direction: column; - } - - .weather-now, .weather-graph { - width: unset; - } - - .location-img { - min-height: 30vh; - } - - .wind-details { - display: none; /* not enough space on mobile */ - } -} - -.btn-link { - background: transparent; - border: 1px solid #fff; - padding: 12px; - font-size: 15px; - /*optional*/ - /*input has OS specific font-family*/ - border-radius: 1rem; - border-bottom-right-radius: 0; - text-decoration: none; - cursor: pointer; - color: #fff; - margin-bottom: 10px; -} - - .btn-link.selected { - background: linear-gradient(-45deg, rgba(255,255,255,0.05), rgba(255,255,255,0.35)); - font-weight: bold; - } - -.image-predictor { - margin-top: 20px; - display: flex; -} - -.result-label { - float: left; - position: absolute; - top: 0; - left: 0; - width: 100%; - background: rgba(0,0,0,0.5); - text-align: center; - font-size: 1.25rem; - padding: 12px; - border-radius: 1rem 1rem 0 0; -} - -.result-pane { - float: left; - position: relative; -} - - .result-pane img { - border-radius: 1rem; - border-bottom-right-radius: 0; - } - -.image-selector { - display: flex; - flex-direction: column; - margin-right: 10px; - width: 200px; - margin-left: -200px; -} - -h3 { - margin-top: 40px; - font-size: 2rem; - margin-bottom: 0; -} - -.search { - margin-bottom: 10px; -} - -.cycle-pins { - margin-bottom: 10px; -} - -.search-icon { - width: 17px; - vertical-align: middle; -} - - .search-icon.spinning { - animation: spin 4s linear infinite; - } - -@keyframes spin { - 100% { - transform: rotate(-360deg); - } -} - -/* Customize the pushpin container */ -.pushpin-container { - display: block; - position: relative; - margin-bottom: 12px; - cursor: pointer; - user-select: none; -} - - /* Hide the browser's default checkbox */ - .pushpin-container input { - position: absolute; - opacity: 0; - cursor: pointer; - height: 0; - width: 0; - } - -/* Create a custom checkbox */ -.pushpin { - position: absolute; - top: 0; - left: 0; - height: 15px; - width: 15px; - background-image: url(../icons/pin.svg); - background-repeat: no-repeat; - background-size: contain; - transform: rotate(90deg) -} - -/* Show the checkmark when checked */ -.pushpin-container input:checked ~ .pushpin { - transform: none; -} - -.pinnable-location { - position: relative; -} - -.pinnable-location h1 { - display: inline-block; -} - -.pinnable-location .pushpin-container { - position: absolute; - top: 0.4rem; - left: 100%; - margin-left: 0.5rem; -} - -.current-location { - width: 17px; - vertical-align: middle; -} - -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - -.blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; -} - - .blazor-error-boundary::after { - content: "An error has occurred." - } diff --git a/BlazorWeather/wwwroot/icons/caret-left.svg b/BlazorWeather/wwwroot/icons/caret-left.svg deleted file mode 100644 index 4e4c3bf..0000000 --- a/BlazorWeather/wwwroot/icons/caret-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/icons/caret-right.svg b/BlazorWeather/wwwroot/icons/caret-right.svg deleted file mode 100644 index b999977..0000000 --- a/BlazorWeather/wwwroot/icons/caret-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/icons/loop-circular.svg b/BlazorWeather/wwwroot/icons/loop-circular.svg deleted file mode 100644 index 64f13f0..0000000 --- a/BlazorWeather/wwwroot/icons/loop-circular.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/icons/magnifying-glass.svg b/BlazorWeather/wwwroot/icons/magnifying-glass.svg deleted file mode 100644 index c0c4df4..0000000 --- a/BlazorWeather/wwwroot/icons/magnifying-glass.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/icons/pin.svg b/BlazorWeather/wwwroot/icons/pin.svg deleted file mode 100644 index dbc6bd6..0000000 --- a/BlazorWeather/wwwroot/icons/pin.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/icons/target.svg b/BlazorWeather/wwwroot/icons/target.svg deleted file mode 100644 index b83750d..0000000 --- a/BlazorWeather/wwwroot/icons/target.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/BlazorWeather/wwwroot/images/locations/hi.png b/BlazorWeather/wwwroot/images/locations/hi.png deleted file mode 100644 index 1c2bdce5f95dda02afa2a6386442171ec689226d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22517 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 PUIt53Tay|iuf+cYdOlCM diff --git a/BlazorWeather/wwwroot/images/locations/il.png b/BlazorWeather/wwwroot/images/locations/il.png deleted file mode 100644 index 5694b838e54d233a05d4c6c55b491742a561f305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7677 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 O0SfR7^rh@PkpDM!laJE? diff --git a/BlazorWeather/wwwroot/images/locations/wa.png b/BlazorWeather/wwwroot/images/locations/wa.png deleted file mode 100644 index f8d7c35ee48e3f153853d6c6c6a9e3e5f4ec204c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11563 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 L*H)=iwhH+l`*0oU diff --git a/BlazorWeather2021/wwwroot/index.html b/BlazorWeather/wwwroot/index.html similarity index 85% rename from BlazorWeather2021/wwwroot/index.html rename to BlazorWeather/wwwroot/index.html index 514f2d3..0e19ba6 100644 --- a/BlazorWeather2021/wwwroot/index.html +++ b/BlazorWeather/wwwroot/index.html @@ -4,11 +4,11 @@ - BlazorWeather2021 + BlazorWeather - + diff --git a/BlazorWeather2021/wwwroot/weather-icons/clear-night.svg b/BlazorWeather/wwwroot/weather-icons/clear-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/clear-night.svg rename to BlazorWeather/wwwroot/weather-icons/clear-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/clear.svg b/BlazorWeather/wwwroot/weather-icons/clear.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/clear.svg rename to BlazorWeather/wwwroot/weather-icons/clear.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/cloud-sun.svg b/BlazorWeather/wwwroot/weather-icons/cloud-sun.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/cloud-sun.svg rename to BlazorWeather/wwwroot/weather-icons/cloud-sun.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/cloudy-night.svg b/BlazorWeather/wwwroot/weather-icons/cloudy-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/cloudy-night.svg rename to BlazorWeather/wwwroot/weather-icons/cloudy-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/cloudy.svg b/BlazorWeather/wwwroot/weather-icons/cloudy.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/cloudy.svg rename to BlazorWeather/wwwroot/weather-icons/cloudy.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/drizzle.svg b/BlazorWeather/wwwroot/weather-icons/drizzle.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/drizzle.svg rename to BlazorWeather/wwwroot/weather-icons/drizzle.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/fog.svg b/BlazorWeather/wwwroot/weather-icons/fog.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/fog.svg rename to BlazorWeather/wwwroot/weather-icons/fog.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/hail-night.svg b/BlazorWeather/wwwroot/weather-icons/hail-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/hail-night.svg rename to BlazorWeather/wwwroot/weather-icons/hail-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/hail.svg b/BlazorWeather/wwwroot/weather-icons/hail.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/hail.svg rename to BlazorWeather/wwwroot/weather-icons/hail.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/haze-night.svg b/BlazorWeather/wwwroot/weather-icons/haze-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/haze-night.svg rename to BlazorWeather/wwwroot/weather-icons/haze-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/haze.svg b/BlazorWeather/wwwroot/weather-icons/haze.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/haze.svg rename to BlazorWeather/wwwroot/weather-icons/haze.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/moon-off.svg b/BlazorWeather/wwwroot/weather-icons/moon-off.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/moon-off.svg rename to BlazorWeather/wwwroot/weather-icons/moon-off.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/partly-cloudy-night.svg b/BlazorWeather/wwwroot/weather-icons/partly-cloudy-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/partly-cloudy-night.svg rename to BlazorWeather/wwwroot/weather-icons/partly-cloudy-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/partly-cloudy.svg b/BlazorWeather/wwwroot/weather-icons/partly-cloudy.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/partly-cloudy.svg rename to BlazorWeather/wwwroot/weather-icons/partly-cloudy.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/rain-snow.svg b/BlazorWeather/wwwroot/weather-icons/rain-snow.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/rain-snow.svg rename to BlazorWeather/wwwroot/weather-icons/rain-snow.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/rain.svg b/BlazorWeather/wwwroot/weather-icons/rain.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/rain.svg rename to BlazorWeather/wwwroot/weather-icons/rain.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/showers-night.svg b/BlazorWeather/wwwroot/weather-icons/showers-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/showers-night.svg rename to BlazorWeather/wwwroot/weather-icons/showers-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/showers.svg b/BlazorWeather/wwwroot/weather-icons/showers.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/showers.svg rename to BlazorWeather/wwwroot/weather-icons/showers.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/snow-shower-night.svg b/BlazorWeather/wwwroot/weather-icons/snow-shower-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/snow-shower-night.svg rename to BlazorWeather/wwwroot/weather-icons/snow-shower-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/snow-shower.svg b/BlazorWeather/wwwroot/weather-icons/snow-shower.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/snow-shower.svg rename to BlazorWeather/wwwroot/weather-icons/snow-shower.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/snow.svg b/BlazorWeather/wwwroot/weather-icons/snow.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/snow.svg rename to BlazorWeather/wwwroot/weather-icons/snow.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/snowflake.svg b/BlazorWeather/wwwroot/weather-icons/snowflake.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/snowflake.svg rename to BlazorWeather/wwwroot/weather-icons/snowflake.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/sunny-high.svg b/BlazorWeather/wwwroot/weather-icons/sunny-high.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/sunny-high.svg rename to BlazorWeather/wwwroot/weather-icons/sunny-high.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/sunny-low.svg b/BlazorWeather/wwwroot/weather-icons/sunny-low.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/sunny-low.svg rename to BlazorWeather/wwwroot/weather-icons/sunny-low.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/sunny.svg b/BlazorWeather/wwwroot/weather-icons/sunny.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/sunny.svg rename to BlazorWeather/wwwroot/weather-icons/sunny.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/thunderstorms-night.svg b/BlazorWeather/wwwroot/weather-icons/thunderstorms-night.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/thunderstorms-night.svg rename to BlazorWeather/wwwroot/weather-icons/thunderstorms-night.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/thunderstorms.svg b/BlazorWeather/wwwroot/weather-icons/thunderstorms.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/thunderstorms.svg rename to BlazorWeather/wwwroot/weather-icons/thunderstorms.svg diff --git a/BlazorWeather2021/wwwroot/weather-icons/windy.svg b/BlazorWeather/wwwroot/weather-icons/windy.svg similarity index 100% rename from BlazorWeather2021/wwwroot/weather-icons/windy.svg rename to BlazorWeather/wwwroot/weather-icons/windy.svg diff --git a/BlazorWeather2021.Client/BlazorWeather2021.Client.csproj b/BlazorWeather2021.Client/BlazorWeather2021.Client.csproj deleted file mode 100644 index 6ea5f29..0000000 --- a/BlazorWeather2021.Client/BlazorWeather2021.Client.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net6.0 - - - - - - - - - - - - diff --git a/BlazorWeather2021.Client/Program.cs b/BlazorWeather2021.Client/Program.cs deleted file mode 100644 index ec835ab..0000000 --- a/BlazorWeather2021.Client/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Net.Http; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Text; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace BlazorWeather2021 -{ - public class Program - { - public static async Task Main(string[] args) - { - var builder = WebAssemblyHostBuilder.CreateDefault(args); - builder.RootComponents.Add("#app"); - - builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); - builder.Services.AddBlazorWeather(baseUri: "[Weather base URI]"); - - await builder.Build().RunAsync(); - } - } -} diff --git a/BlazorWeather2021.Client/wwwroot/favicon.ico b/BlazorWeather2021.Client/wwwroot/favicon.ico deleted file mode 100644 index 63e859b476eff5055e0e557aaa151ca8223fbeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 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 - - - - - - BlazorWeather2021 - - - - - - - -

Loading...
- -
- An unhandled error has occurred. - Reload - 🗙 -
- - - - diff --git a/BlazorWeather2021.Server/BlazorWeather2021.Server.csproj b/BlazorWeather2021.Server/BlazorWeather2021.Server.csproj deleted file mode 100644 index 4e701ab..0000000 --- a/BlazorWeather2021.Server/BlazorWeather2021.Server.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net6.0 - 6da98b65-8ce9-42d6-b26b-84b7c4b3051a - - - - - - - diff --git a/BlazorWeather2021.Server/Pages/Error.cshtml b/BlazorWeather2021.Server/Pages/Error.cshtml deleted file mode 100644 index 526aa9a..0000000 --- a/BlazorWeather2021.Server/Pages/Error.cshtml +++ /dev/null @@ -1,42 +0,0 @@ -@page -@model BlazorWeather2021.Server.Pages.ErrorModel - - - - - - - - Error - - - - - -
-
-

Error.

-

An error occurred while processing your request.

- - @if (Model.ShowRequestId) - { -

- Request ID: @Model.RequestId -

- } - -

Development Mode

-

- Swapping to the Development environment displays detailed information about the error that occurred. -

-

- The Development environment shouldn't be enabled for deployed applications. - It can result in displaying sensitive information from exceptions to end users. - For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development - and restarting the app. -

-
-
- - - diff --git a/BlazorWeather2021.Server/Pages/Error.cshtml.cs b/BlazorWeather2021.Server/Pages/Error.cshtml.cs deleted file mode 100644 index a8189bd..0000000 --- a/BlazorWeather2021.Server/Pages/Error.cshtml.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; - -namespace BlazorWeather2021.Server.Pages -{ - [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - [IgnoreAntiforgeryToken] - public class ErrorModel : PageModel - { - public string RequestId { get; set; } - - public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); - - private readonly ILogger _logger; - - public ErrorModel(ILogger logger) - { - _logger = logger; - } - - public void OnGet() - { - RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; - } - } -} diff --git a/BlazorWeather2021.Server/Pages/_Host.cshtml b/BlazorWeather2021.Server/Pages/_Host.cshtml deleted file mode 100644 index 4562dc6..0000000 --- a/BlazorWeather2021.Server/Pages/_Host.cshtml +++ /dev/null @@ -1,35 +0,0 @@ -@page "/" -@namespace BlazorWeather2021.Server.Pages -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@{ - Layout = null; -} - - - - - - - Blazor Weather 2021 - - - - - - - - -
- - An error has occurred. This application may no longer respond until reloaded. - - - An unhandled exception has occurred. See browser dev tools for details. - - Reload - 🗙 -
- - - - diff --git a/BlazorWeather2021.Server/Program.cs b/BlazorWeather2021.Server/Program.cs deleted file mode 100644 index 0c01d89..0000000 --- a/BlazorWeather2021.Server/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace BlazorWeather2021.Server -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/BlazorWeather2021.Server/Properties/launchSettings.json b/BlazorWeather2021.Server/Properties/launchSettings.json deleted file mode 100644 index 5635bc7..0000000 --- a/BlazorWeather2021.Server/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56641", - "sslPort": 44385 - } - }, - "profiles": { - "BlazorWeather2021.Server": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "hotReloadProfile": "aspnetcore", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/BlazorWeather2021.Server/Startup.cs b/BlazorWeather2021.Server/Startup.cs deleted file mode 100644 index b9afe41..0000000 --- a/BlazorWeather2021.Server/Startup.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace BlazorWeather2021.Server -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) - { - services.AddRazorPages(); - services.AddServerSideBlazor(); - services.AddBlazorWeather(baseUri: Configuration["WeatherBaseUri"]); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - app.UseHttpsRedirection(); - app.UseStaticFiles(); - - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - endpoints.MapBlazorHub(); - endpoints.MapFallbackToPage("/_Host"); - }); - } - } -} diff --git a/BlazorWeather2021.Server/appsettings.Development.json b/BlazorWeather2021.Server/appsettings.Development.json deleted file mode 100644 index 5173757..0000000 --- a/BlazorWeather2021.Server/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DetailedErrors": true, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/BlazorWeather2021.Server/appsettings.json b/BlazorWeather2021.Server/appsettings.json deleted file mode 100644 index d9d9a9b..0000000 --- a/BlazorWeather2021.Server/appsettings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*" -} diff --git a/BlazorWeather2021.Server/wwwroot/favicon.ico b/BlazorWeather2021.Server/wwwroot/favicon.ico deleted file mode 100644 index 63e859b476eff5055e0e557aaa151ca8223fbeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmc&&Yj2xp8Fqnv;>&(QB_ve7>^E#o2mu=cO~A%R>DU-_hfbSRv1t;m7zJ_AMrntN zy0+^f&8be>q&YYzH%(88lQ?#KwiCzaCO*ZEo%j&v;<}&Lj_stKTKK>#U3nin@AF>w zb3ONSAFR{u(S1d?cdw53y}Gt1b-Hirbh;;bm(Rcbnoc*%@jiaXM|4jU^1WO~`TYZ~ zC-~jh9~b-f?fX`DmwvcguQzn*uV}c^Vd&~?H|RUs4Epv~gTAfR(B0lT&?RWQOtduM z^1vUD9{HQsW!{a9|0crA34m7Z6lpG^}f6f?={zD+ zXAzk^i^aKN_}s2$eX81wjSMONE#WVdzf|MT)Ap*}Vsn!XbvsI#6o&ij{87^d%$|A{ z=F{KB%)g%@z76yBzbb7seW**Ju8r4e*Z3PWNX3_tTDgzZatz7)Q6ytwB%@&@A|XT; zecM`Snxx5po$C)%yCP!KEtos~eOS)@2=kX-RIm)4glMCoagTEFxrBeSX%Euz734Fk z%7)x(k~T!@Hbg_37NSQL!vlTBXoURSzt~I**Zw`&F24fH*&kx=%nvZv|49SC*daD( zIw<~%#=lk8{2-l(BcIjy^Q$Q&m#KlWL9?UG{b8@qhlD z;umc+6p%|NsAT~0@DgV4-NKgQuWPWrmPIK&&XhV&n%`{l zOl^bbWYjQNuVXTXESO)@|iUKVmErPUDfz2Wh`4dF@OFiaCW|d`3paV^@|r^8T_ZxM)Z+$p5qx# z#K=z@%;aBPO=C4JNNGqVv6@UGolIz;KZsAro``Rz8X%vq_gpi^qEV&evgHb_=Y9-l z`)imdx0UC>GWZYj)3+3aKh?zVb}=@%oNzg7a8%kfVl)SV-Amp1Okw&+hEZ3|v(k8vRjXW9?ih`&FFM zV$~{j3IzhtcXk?Mu_!12;=+I7XK-IR2>Yd%VB^?oI9c^E&Chb&&je$NV0P-R;ujkP z;cbLCCPEF6|22NDj=S`F^2e~XwT1ZnRX8ra0#DaFa9-X|8(xNW_+JhD75WnSd7cxo z2>I_J5{c|WPfrgl7E2R)^c}F7ry()Z>$Jhk9CzZxiPKL#_0%`&{MX>P_%b~Dx0D^S z7xP1(DQ!d_Icpk!RN3I1w@~|O1ru#CO==h#9M~S4Chx*@?=EKUPGBv$tmU+7Zs_al z`!jR?6T&Z7(%uVq>#yLu`abWk!FBlnY{RFNHlj~6zh*;@u}+}viRKsD`IIxN#R-X3 z@vxu#EA_m}I503U(8Qmx^}u;)KfGP`O9E1H1Q|xeeksX8jC%@!{YT1)!lWgO=+Y3*jr=iSxvOW1}^HSy=y){tOMQJ@an>sOl4FYniE z;GOxd7AqxZNbYFNqobpv&HVO$c-w!Y*6r;$2oJ~h(a#(Bp<-)dg*mNigX~9rPqcHv z^;c*|Md?tD)$y?6FO$DWl$jUGV`F1G_^E&E>sY*YnA~ruv3=z9F8&&~Xpm<<75?N3 z>x~`I&M9q)O1=zWZHN9hZWx>RQ}zLP+iL57Q)%&_^$Sme^^G7;e-P~CR?kqU#Io#( z(nH1Wn*Ig)|M>WLGrxoU?FZrS`4GO&w;+39A3f8w{{Q7eg|$+dIlNFPAe+tN=FOYU z{A&Fg|H73+w1IK(W=j*L>JQgz$g0 z7JpKXLHIh}#$wm|N`s}o-@|L_`>*(gTQ~)wr3Eap7g%PVNisKw82im;Gdv#85x#s+ zoqqtnwu4ycd>cOQgRh-=aEJbnvVK`}ja%+FZx}&ehtX)n(9nVfe4{mn0bgijUbNr7Tf5X^$*{qh2%`?--%+sbSrjE^;1e3>% zqa%jdY16{Y)a1hSy*mr0JGU05Z%=qlx5vGvTjSpTt6k%nR06q}1DU`SQh_ZAeJ}A@`hL~xvv05U?0%=spP`R>dk?cOWM9^KNb7B?xjex>OZo%JMQQ1Q zB|q@}8RiP@DWn-(fB;phPaIOP2Yp)XN3-Fsn)S3w($4&+p8f5W_f%gac}QvmkHfCj$2=!t`boCvQ zCW;&Dto=f8v##}dy^wg3VNaBy&kCe3N;1|@n@pUaMPT?(aJ9b*(gJ28$}(2qFt$H~u5z94xcIQkcOI++)*exzbrk?WOOOf*|%k5#KV zL=&ky3)Eirv$wbRJ2F2s_ILQY--D~~7>^f}W|Aw^e7inXr#WLI{@h`0|jHud2Y~cI~Yn{r_kU^Vo{1gja - - - - - -

Sorry, there's nothing at this address.

-
-
- diff --git a/BlazorWeather2021/BlazorWeather2021.csproj b/BlazorWeather2021/BlazorWeather2021.csproj deleted file mode 100644 index 345f548..0000000 --- a/BlazorWeather2021/BlazorWeather2021.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net6.0 - - - - - - - - - - - - - - - - - - - diff --git a/BlazorWeather2021/Pages/Home/StatBoxes.razor b/BlazorWeather2021/Pages/Home/StatBoxes.razor deleted file mode 100644 index 584d499..0000000 --- a/BlazorWeather2021/Pages/Home/StatBoxes.razor +++ /dev/null @@ -1,44 +0,0 @@ -
- @for (var i = 0; i < 5; i++) - { -
- @switch (i % 4) - { - case 0: - -
- 9 km/h -
- break; - case 1: - -
- 0.2 cm -
- break; - case 2: - -
- 42 % -
- break; - case 3: - -
- 2 % -
- break; - } - -
- From -
Pond Elementary
-
-
- } -
- - - -
-
diff --git a/BlazorWeather2021/Properties/launchSettings.json b/BlazorWeather2021/Properties/launchSettings.json deleted file mode 100644 index 1932ab9..0000000 --- a/BlazorWeather2021/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:51690", - "sslPort": 44344 - } - }, - "profiles": { - "BlazorWeather2021": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "hotReloadProfile": "blazorwasm", - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/BlazorWeather2021/ServiceCollectionExtensions.cs b/BlazorWeather2021/ServiceCollectionExtensions.cs deleted file mode 100644 index 04553f4..0000000 --- a/BlazorWeather2021/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Blazored.LocalStorage; -using Darnton.Blazor.DeviceInterop.Geolocation; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using WeatherClient2021; - -namespace BlazorWeather2021 -{ - public static class ServiceCollectionExtensions - { - public static IServiceCollection AddBlazorWeather(this IServiceCollection services, string baseUri) - { - services.AddHttpClient(httpClient => httpClient.BaseAddress = new Uri(baseUri)); - services.AddScoped(); - services.AddBlazoredLocalStorage(); - services.AddScoped(); - return services; - } - } -} diff --git a/BlazorWeather2021/Services/LocalStorageConfiguration.cs b/BlazorWeather2021/Services/LocalStorageConfiguration.cs deleted file mode 100644 index e6634ba..0000000 --- a/BlazorWeather2021/Services/LocalStorageConfiguration.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Blazored.LocalStorage; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Primitives; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BlazorWeather2021 -{ - public class LocalStorageConfiguration : IConfiguration - { - private readonly ISyncLocalStorageService _localStorage; - - public LocalStorageConfiguration(ISyncLocalStorageService localStorage) - { - _localStorage = localStorage; - } - - public string this[string key] { - get => _localStorage.GetItem(key); - set => throw new NotImplementedException(); - } - - public IEnumerable GetChildren() - { - throw new NotImplementedException(); - } - - public IChangeToken GetReloadToken() - { - throw new NotImplementedException(); - } - - public IConfigurationSection GetSection(string key) - { - throw new NotImplementedException(); - } - } -} diff --git a/BlazorWeather2021/Services/PinnedLocationsService.cs b/BlazorWeather2021/Services/PinnedLocationsService.cs deleted file mode 100644 index cfc40f6..0000000 --- a/BlazorWeather2021/Services/PinnedLocationsService.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Blazored.LocalStorage; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using WeatherClient2021; - -namespace BlazorWeather2021 -{ - public class PinnedLocationsService - { - private const string PinnedLocationsKey = "PINNED_LOCATIONS"; - private readonly ILocalStorageService _localStorage; - - public PinnedLocationsService(ILocalStorageService localStorage) - { - _localStorage = localStorage; - } - - public async Task> LoadPinnedLocations() - { - if (await _localStorage.ContainKeyAsync(PinnedLocationsKey)) - { - var pinnedLocations = await _localStorage.GetItemAsync(PinnedLocationsKey); - return new List(pinnedLocations); - } - else - { - return new List(); - } - } - - public Task SavePinnedLocations(IEnumerable pinnedLocations) - { - return _localStorage.SetItemAsync(PinnedLocationsKey, pinnedLocations).AsTask(); - } - } -} diff --git a/BlazorWeather2021/Shared/MainLayout.razor b/BlazorWeather2021/Shared/MainLayout.razor deleted file mode 100644 index 1bd6f5e..0000000 --- a/BlazorWeather2021/Shared/MainLayout.razor +++ /dev/null @@ -1,7 +0,0 @@ -@inherits LayoutComponentBase -
- -
- @Body -
-
diff --git a/BlazorWeather2021/Shared/MainLayout.razor.css b/BlazorWeather2021/Shared/MainLayout.razor.css deleted file mode 100644 index e69de29..0000000 diff --git a/BlazorWeather2021/_Imports.razor b/BlazorWeather2021/_Imports.razor deleted file mode 100644 index 612c529..0000000 --- a/BlazorWeather2021/_Imports.razor +++ /dev/null @@ -1,10 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.JSInterop -@using BlazorWeather2021 -@using BlazorWeather2021.Shared -@using WeatherClient2021 \ No newline at end of file diff --git a/WeatherClient2021/IWeatherService.cs b/WeatherClient/IWeatherService.cs similarity index 100% rename from WeatherClient2021/IWeatherService.cs rename to WeatherClient/IWeatherService.cs diff --git a/WeatherClient2021/WeatherClient2021.csproj b/WeatherClient/WeatherClient.csproj similarity index 100% rename from WeatherClient2021/WeatherClient2021.csproj rename to WeatherClient/WeatherClient.csproj diff --git a/WeatherClient2021/WeatherModel.cs b/WeatherClient/WeatherModel.cs similarity index 73% rename from WeatherClient2021/WeatherModel.cs rename to WeatherClient/WeatherModel.cs index 7068147..05c6d30 100644 --- a/WeatherClient2021/WeatherModel.cs +++ b/WeatherClient/WeatherModel.cs @@ -17,7 +17,10 @@ namespace WeatherClient2021 public DateTimeOffset DateTime { get; set; } public string Phrase { get; set; } public Temperature Temperature { get; set; } - public int ChanceOfPercipitation { get; } = new Random().Next(0, 100); + public int RelativeHumidity { get; set; } + public int? PrecipitationProbability { get; set; } + public int WindSpeed { get; set; } = new Random().Next(0, 40); + public int WindDirection { get; set; } = new Random().Next(0, 360); public DateTimeOffset Date { @@ -43,9 +46,10 @@ namespace WeatherClient2021 public Temperature Maximum { get; set; } } - public class PhraseOnly + public class DayOrNight { public string Phrase { get; set; } + public int PrecipitationProbability { get; set; } public string IconPhrase { @@ -58,8 +62,8 @@ namespace WeatherClient2021 public DateTimeOffset DateTime { get; set; } public MinMaxTemperature Temperature { get; set; } - public PhraseOnly Day { get; set; } - public PhraseOnly Night { get; set; } + public DayOrNight Day { get; set; } + public DayOrNight Night { get; set; } public int ChanceOfPercipitation { get; } = new Random().Next(0, 100); @@ -121,4 +125,23 @@ namespace WeatherClient2021 public string Name { get; set; } public Coordinate Coordinate { get; set; } } + + public static class WeatherStations + { + public static IEnumerable GetWeatherStations(this WeatherSnapshot weather) + { + var rand = new Random(); + var n = rand.Next(1, 5); + for (var i = 0; i < n; i++) + { + yield return new WeatherStation { CurrentWeather = weather }; + } + } + } + + public class WeatherStation + { + public string Name { get; set; } = $"Weather station {new Random().Next(1, 300)}"; + public WeatherSnapshot CurrentWeather { get; set; } + } } \ No newline at end of file diff --git a/WeatherClient2021/WeatherService.cs b/WeatherClient/WeatherService.cs similarity index 100% rename from WeatherClient2021/WeatherService.cs rename to WeatherClient/WeatherService.cs diff --git a/WeatherClientLib/HttpWeatherForecastService.cs b/WeatherClientLib/HttpWeatherForecastService.cs deleted file mode 100644 index d47323f..0000000 --- a/WeatherClientLib/HttpWeatherForecastService.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Runtime.CompilerServices; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using WeatherClientLib.Model; - -namespace WeatherClientLib -{ - public class HttpWeatherForecastService : IWeatherForecastService - { - private readonly HttpClient _httpClient; - private string apiKey; - - public HttpWeatherForecastService(HttpClient httpClient, IConfiguration configuration) - { - _httpClient = httpClient; - _httpClient.BaseAddress = new Uri("https://dataservice.accuweather.com/"); - - apiKey = configuration["accuweathertoken"]; - } - - public async Task GetLocationsByText(string search, CancellationToken cancellationToken) - { - using var response = await _httpClient.GetAsync($"locations/v1/cities/US/autocomplete?{GetApiKey()}&q={search}", cancellationToken); - using var responseStream = await response.Content.ReadAsStreamAsync(); - return await JsonSerializer.DeserializeAsync(responseStream, cancellationToken: cancellationToken); - } - - public async Task GetLocationByGeolocation(double latitude, double longitude) - { - return await JsonSerializer.DeserializeAsync(await _httpClient.GetStreamAsync($"locations/v1/cities/geoposition/search?{GetApiKey()}&q={latitude},{longitude}")); - } - - public async IAsyncEnumerable GetStreamingWeather(string locationKey, [EnumeratorCancellation] CancellationToken token) - { - while (!token.IsCancellationRequested) - { - var weather = await GetWeatherCore(locationKey); - yield return weather.WeatherResponse; - await Task.Delay(weather.Expires); - } - } - - public async Task GetWeather(string locationKey) - { - var weather = await GetWeatherCore(locationKey); - return weather.WeatherResponse; - } - - async Task<(WeatherResponse WeatherResponse, TimeSpan Expires)> GetWeatherCore(string locationKey) - { - var response = await _httpClient.GetAsync($"currentconditions/v1/{locationKey}?{GetApiKey()}&details=true"); - var model = await JsonSerializer.DeserializeAsync(await response.Content.ReadAsStreamAsync()); - var weather = new WeatherResponse(model.First()); - var expiresHeader = response.Content.Headers.Expires; - var expires = expiresHeader.HasValue ? expiresHeader.Value.UtcDateTime.Subtract(DateTime.UtcNow) : TimeSpan.FromSeconds(2); - return (weather, expires); - } - - string GetApiKey() => $"apikey={apiKey}"; - } -} diff --git a/WeatherClientLib/IWeatherForecastService.cs b/WeatherClientLib/IWeatherForecastService.cs deleted file mode 100644 index 2c11eed..0000000 --- a/WeatherClientLib/IWeatherForecastService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using WeatherClientLib.Model; - -namespace WeatherClientLib -{ - public interface IWeatherForecastService - { - Task GetLocationByGeolocation(double latitude, double longitude); - - Task GetLocationsByText(string search, CancellationToken cancellationToken); - - IAsyncEnumerable GetStreamingWeather(string locationKey, CancellationToken token); - - Task GetWeather(string locationKey); - } -} \ No newline at end of file diff --git a/WeatherClientLib/Model/LocationModel.cs b/WeatherClientLib/Model/LocationModel.cs deleted file mode 100644 index 618a443..0000000 --- a/WeatherClientLib/Model/LocationModel.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace WeatherClientLib.Model -{ - - public class Location - { - public int Version { get; set; } - public string Key { get; set; } - public string Type { get; set; } - public int Rank { get; set; } - public string LocalizedName { get; set; } - public string EnglishName { get; set; } - public string PrimaryPostalCode { get; set; } - public Region Region { get; set; } - public Country Country { get; set; } - public Administrativearea AdministrativeArea { get; set; } - public Timezone TimeZone { get; set; } - public Geoposition GeoPosition { get; set; } - public bool IsAlias { get; set; } - public Supplementaladminarea[] SupplementalAdminAreas { get; set; } - public string[] DataSets { get; set; } - public bool IsPinned { get; set; } - } - - public class Region - { - public string ID { get; set; } - public string LocalizedName { get; set; } - public string EnglishName { get; set; } - } - - public class Country - { - public string ID { get; set; } - public string LocalizedName { get; set; } - public string EnglishName { get; set; } - } - - public class Administrativearea - { - public string ID { get; set; } - public string LocalizedName { get; set; } - public string EnglishName { get; set; } - public int Level { get; set; } - public string LocalizedType { get; set; } - public string EnglishType { get; set; } - public string CountryID { get; set; } - } - - public class Timezone - { - public string Code { get; set; } - public string Name { get; set; } - public float GmtOffset { get; set; } - public bool IsDaylightSaving { get; set; } - public DateTime? NextOffsetChange { get; set; } - } - - public class Geoposition - { - public float Latitude { get; set; } - public float Longitude { get; set; } - public Elevation Elevation { get; set; } - } - - public class Elevation - { - public Metric Metric { get; set; } - public Imperial Imperial { get; set; } - } - - public class Supplementaladminarea - { - public int Level { get; set; } - public string LocalizedName { get; set; } - public string EnglishName { get; set; } - } - -} diff --git a/WeatherClientLib/Model/WeatherModel.cs b/WeatherClientLib/Model/WeatherModel.cs deleted file mode 100644 index 153e674..0000000 --- a/WeatherClientLib/Model/WeatherModel.cs +++ /dev/null @@ -1,664 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace WeatherClientLib.Model -{ - public class Forecast - { - public DateTime LocalObservationDateTime { get; set; } - public int EpochTime { get; set; } - public string WeatherText { get; set; } - public int WeatherIcon { get; set; } - public bool HasPrecipitation { get; set; } - public object PrecipitationType { get; set; } - public bool IsDayTime { get; set; } - public Temperature Temperature { get; set; } - public Realfeeltemperature RealFeelTemperature { get; set; } - public Realfeeltemperatureshade RealFeelTemperatureShade { get; set; } - public int RelativeHumidity { get; set; } - public Dewpoint DewPoint { get; set; } - public Wind Wind { get; set; } - public Windgust WindGust { get; set; } - public int UVIndex { get; set; } - public string UVIndexText { get; set; } - public Visibility Visibility { get; set; } - public string ObstructionsToVisibility { get; set; } - public int CloudCover { get; set; } - public Ceiling Ceiling { get; set; } - public Pressure Pressure { get; set; } - public Pressuretendency PressureTendency { get; set; } - public Past24hourtemperaturedeparture Past24HourTemperatureDeparture { get; set; } - public Apparenttemperature ApparentTemperature { get; set; } - public Windchilltemperature WindChillTemperature { get; set; } - public Wetbulbtemperature WetBulbTemperature { get; set; } - public Precip1hr Precip1hr { get; set; } - public Precipitationsummary PrecipitationSummary { get; set; } - public Temperaturesummary TemperatureSummary { get; set; } - public string MobileLink { get; set; } - public string Link { get; set; } - } - - public class Temperature - { - public Metric Metric { get; set; } - public Imperial Imperial { get; set; } - } - - public class Metric - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Realfeeltemperature - { - public Metric1 Metric { get; set; } - public Imperial1 Imperial { get; set; } - } - - public class Metric1 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial1 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Realfeeltemperatureshade - { - public Metric2 Metric { get; set; } - public Imperial2 Imperial { get; set; } - } - - public class Metric2 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial2 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Dewpoint - { - public Metric3 Metric { get; set; } - public Imperial3 Imperial { get; set; } - } - - public class Metric3 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial3 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Wind - { - public Direction Direction { get; set; } - public Speed Speed { get; set; } - } - - public class Direction - { - public int Degrees { get; set; } - public string Localized { get; set; } - public string English { get; set; } - } - - public class Speed - { - public Metric4 Metric { get; set; } - public Imperial4 Imperial { get; set; } - } - - public class Metric4 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial4 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Windgust - { - public Speed1 Speed { get; set; } - } - - public class Speed1 - { - public Metric5 Metric { get; set; } - public Imperial5 Imperial { get; set; } - } - - public class Metric5 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial5 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Visibility - { - public Metric6 Metric { get; set; } - public Imperial6 Imperial { get; set; } - } - - public class Metric6 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial6 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Ceiling - { - public Metric7 Metric { get; set; } - public Imperial7 Imperial { get; set; } - } - - public class Metric7 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial7 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Pressure - { - public Metric8 Metric { get; set; } - public Imperial8 Imperial { get; set; } - } - - public class Metric8 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial8 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Pressuretendency - { - public string LocalizedText { get; set; } - public string Code { get; set; } - } - - public class Past24hourtemperaturedeparture - { - public Metric9 Metric { get; set; } - public Imperial9 Imperial { get; set; } - } - - public class Metric9 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial9 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Apparenttemperature - { - public Metric10 Metric { get; set; } - public Imperial10 Imperial { get; set; } - } - - public class Metric10 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial10 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Windchilltemperature - { - public Metric11 Metric { get; set; } - public Imperial11 Imperial { get; set; } - } - - public class Metric11 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial11 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Wetbulbtemperature - { - public Metric12 Metric { get; set; } - public Imperial12 Imperial { get; set; } - } - - public class Metric12 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial12 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Precip1hr - { - public Metric13 Metric { get; set; } - public Imperial13 Imperial { get; set; } - } - - public class Metric13 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial13 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Precipitationsummary - { - public Precipitation Precipitation { get; set; } - public Pasthour PastHour { get; set; } - public Past3hours Past3Hours { get; set; } - public Past6hours Past6Hours { get; set; } - public Past9hours Past9Hours { get; set; } - public Past12hours Past12Hours { get; set; } - public Past18hours Past18Hours { get; set; } - public Past24hours Past24Hours { get; set; } - } - - public class Precipitation - { - public Metric14 Metric { get; set; } - public Imperial14 Imperial { get; set; } - } - - public class Metric14 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial14 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Pasthour - { - public Metric15 Metric { get; set; } - public Imperial15 Imperial { get; set; } - } - - public class Metric15 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial15 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past3hours - { - public Metric16 Metric { get; set; } - public Imperial16 Imperial { get; set; } - } - - public class Metric16 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial16 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past6hours - { - public Metric17 Metric { get; set; } - public Imperial17 Imperial { get; set; } - } - - public class Metric17 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial17 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past9hours - { - public Metric18 Metric { get; set; } - public Imperial18 Imperial { get; set; } - } - - public class Metric18 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial18 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past12hours - { - public Metric19 Metric { get; set; } - public Imperial19 Imperial { get; set; } - } - - public class Metric19 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial19 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past18hours - { - public Metric20 Metric { get; set; } - public Imperial20 Imperial { get; set; } - } - - public class Metric20 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial20 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past24hours - { - public Metric21 Metric { get; set; } - public Imperial21 Imperial { get; set; } - } - - public class Metric21 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial21 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Temperaturesummary - { - public Past6hourrange Past6HourRange { get; set; } - public Past12hourrange Past12HourRange { get; set; } - public Past24hourrange Past24HourRange { get; set; } - } - - public class Past6hourrange - { - public Minimum Minimum { get; set; } - public Maximum Maximum { get; set; } - } - - public class Minimum - { - public Metric22 Metric { get; set; } - public Imperial22 Imperial { get; set; } - } - - public class Metric22 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial22 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Maximum - { - public Metric23 Metric { get; set; } - public Imperial23 Imperial { get; set; } - } - - public class Metric23 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial23 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past12hourrange - { - public Minimum1 Minimum { get; set; } - public Maximum1 Maximum { get; set; } - } - - public class Minimum1 - { - public Metric24 Metric { get; set; } - public Imperial24 Imperial { get; set; } - } - - public class Metric24 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial24 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Maximum1 - { - public Metric25 Metric { get; set; } - public Imperial25 Imperial { get; set; } - } - - public class Metric25 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial25 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Past24hourrange - { - public Minimum2 Minimum { get; set; } - public Maximum2 Maximum { get; set; } - } - - public class Minimum2 - { - public Metric26 Metric { get; set; } - public Imperial26 Imperial { get; set; } - } - - public class Metric26 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial26 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Maximum2 - { - public Metric27 Metric { get; set; } - public Imperial27 Imperial { get; set; } - } - - public class Metric27 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - - public class Imperial27 - { - public float Value { get; set; } - public string Unit { get; set; } - public int UnitType { get; set; } - } - -} diff --git a/WeatherClientLib/Model/WeatherResponse.cs b/WeatherClientLib/Model/WeatherResponse.cs deleted file mode 100644 index 2e525af..0000000 --- a/WeatherClientLib/Model/WeatherResponse.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace WeatherClientLib.Model -{ - - public class WeatherResponse - { - public WeatherResponse() - { - } - - public WeatherResponse(Forecast forecast) - { - WeatherText = forecast.WeatherText; - IsDayTime = forecast.IsDayTime; - Pressure = forecast.Pressure.Imperial.Value; - RelativeHumidity = forecast.RelativeHumidity; - RetrievedTime = DateTime.UtcNow; - Temperature = forecast.Temperature.Imperial.Value; - UVIndex = forecast.UVIndex; - WeatherIcon = forecast.WeatherIcon; - WeatherUri = $"https://developer.accuweather.com/sites/default/files/{forecast.WeatherIcon:D2}-s.png"; - WindSpeed = forecast.Wind.Speed.Imperial.Value; - WindDirection = forecast.Wind.Direction.English; - Past6HourMax = forecast.TemperatureSummary.Past6HourRange.Maximum.Imperial.Value; - Past6HourMin = forecast.TemperatureSummary.Past6HourRange.Minimum.Imperial.Value; - } - - public string WeatherText { get; set; } - - public int WeatherIcon { get; set; } - - public string WeatherUri { get; set; } - - public bool IsDayTime { get; set; } - - public float Temperature { get; set; } - - public float RelativeHumidity { get; set; } - - public float WindSpeed { get; set; } - - public string WindDirection { get; set; } - - public int UVIndex { get; set; } - - public float Pressure { get; set; } - - public float Past6HourMin { get; set; } - - public float Past6HourMax { get; set; } - - public DateTime RetrievedTime { get; set; } - } -} diff --git a/WeatherClientLib/WeatherClientLib.csproj b/WeatherClientLib/WeatherClientLib.csproj deleted file mode 100644 index 08b2400..0000000 --- a/WeatherClientLib/WeatherClientLib.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net6.0 - - - - - - - -