From 3c0bd4ff51201a0e54d619d4eb579da2b17fa16e Mon Sep 17 00:00:00 2001 From: Nick Smirnoff Date: Mon, 2 Dec 2019 22:45:03 +0000 Subject: [PATCH] Dotnet core (#23) * Removed project * Updated docs to barebones * Updated project title * Added issue templates * Updated README * Created a CONTRIBUTING document * Created PR template * Moved templates to docs folder * Created solution file * Added WPF project * Created authentication web application project * Updated azure pipelines build to basic .NET Desktop template * Added prism packages * Updated to prism application * Updated project metadata * Updated version * Created packaging project * Removed packaging project * Added code analyser * Renamed shell to remove conflict * Configured prism automatic view model locator * Created resource manifest * Added replace tokens step to build pipeline * Added archive files step to build pipeline * Updated archive files build step to publish drop * Updated vsbuild build step to dotnet core cli * Added desktop application location variable * Added full desktop app path * Updated dotnet core build step * Updated dotnet core build step * Updated dotnet core build step to use variable * Added web application build step * Updated README docs * Added spotify client id and secret app settings * Added testing text to check app settings post CI build * Created smallify core project * Created smallify settings module project * Updated text formatting * Added prism dependencies * Created settings shell * Created settings button view * Updated settings shell formatting * Created region name configuration for settings module * Registered settings module * Updated app formatting * Added settings module content region * Updated settings module region * Added editorconfig to appropriate projects * Removed boilerplate comments * Created settings button view model and registered with the view * Created clean outputs script * Updated README * Updated README * Created group names config * Renamed region names * Created settings shell view model * Created section names config * Added basic content to setting shell * Added section names to settings shell * Created general section view * Registered general section view * Registered default view for section region * Created authentication section view * Registered authentication section view * Added dependency on smallify core project * Created simple general settings * Created smallify settings * Registered smallify settings as a singleton * Updated settings shell to manage new region * Created general section view model * Created authentication settings * Removed smallify settings * Updated general settings * Registered setting instances * Updated settings shell width * Removed testing text from smallify shell * Updated smallify shell layout * Registered general settings view model * Registered authentication settings view model * Added authentication settings to view * Installed app center packages * Start app center with provided id * Hooked up property changed events to settings * Subscribed to access token changes * Added jot to track and persist settings * Created notifications module * Created notification region names * Registered notifications button launch region * Created notifications button view model * Created notifications shell * Updated notifications button to shell * Created notifications shell view model * Created notifications content view * Created notifications content view model * Created notifications event * Created player model * Created player view * Created player region names * Registered player content region * Created player view model * Added authorisation code setting * Added authentication token to settings * Enabled csharp 8 and non-nullable types * Updated authentication setting view * Updated assembly name * Added redirect uri config property * Added spotify api wrapper library * Created basic spotify service with authentication * Registered spotify service * Added to authentication settings view * Set default always on top to be false * Added display name and username properties to authentication view * Updated styling * Added application setting changes to git ignore * Updated git ignore * Updated documentation * Updated authentication view * Updated notifications view * Created default theme resource * Updated shell view * Created button styles * Updated title buttons * Added clean outputs script to solution * Created windows style * Updated shell style * Updated settings shell style * Created window border style * Updated notifications shell style * Updated window styles and applied templates to shell and notifications * Updated settings style * Updated notifications view * Updated authentication view and flow * Updated dependencies * Updated authentication view to display action based on user * Updated default style names and colours * Created basic buttons in the spotify style * Updated buttons to use templates * Created about section view * Updated notifications view * Updated colour styles * Created icons dictionary with smallify logo * Updated nullable feature and set general settings * Added player functionality * Updated player commands * Updated player view with icons * Initial spotify service refactor to remove external model dependencies * Interfaced spotify service * Updated player view * Added authentication events * Updated dependencies * Setup react project * Added app layout to react project * Updated home and callback pages * Updated pages * Updated footer * Added github SPA scripts * Updated pipeline * Updated config * Updated msbuild publish step * Updated the web build step to publish * Updated build pipeline * Removed testing function * Updated spa root * Updated csproj root * Updated target files for token replace * Added smallify icon svg to docs * Updated favicon * Updated svg data paths * Added smallify icon to desktop application * Updated desktop app to publish as a single exe * Updated application variables * Updated build pipeline * Updated README * Updated README * Updated docs * Updated version * Updated build trigger --- .github/ISSUE_TEMPLATE/bug_report.md | 36 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .gitignore | 8 +- README.md | 34 +- Smallify.sln | 80 +- build/azure-pipelines-Smallify-CI.yml | 62 - build/azure-pipelines.yml | 54 + docs/.assets/project-title.png | Bin 0 -> 49032 bytes docs/.assets/smallify-icon.svg | 5 + docs/.assets/smallify-screenshot.png | Bin 0 -> 24060 bytes CODE_OF_CONDUCT.md => docs/CODE_OF_CONDUCT.md | 0 docs/CONTRIBUTING.md | 19 + docs/DEVELOPMENT_GUIDE.md | 23 + docs/PULL_REQUEST_TEMPLATE.md | 7 + docs/assets/project-title.png | Bin 28554 -> 0 bytes docs/assets/screenshots/player-screenshot.png | Bin 19508 -> 0 bytes docs/assets/smallify-icon.svg | 38 - scripts/Clean-Outputs.ps1 | 4 + src/Smallify.Authentication.Web/.eslintrc | 40 + src/Smallify.Authentication.Web/.stylelintrc | 9 + .../ClientApp/App.jsx | 52 + .../ClientApp/assets/images/favicon.png | Bin 0 -> 31669 bytes .../ClientApp/components/layout/AppLayout.jsx | 29 + .../ClientApp/components/layout/Footer.jsx | 24 + .../ClientApp/components/layout/Header.jsx | 20 + .../ClientApp/components/layout/Main.jsx | 30 + .../ClientApp/components/layout/Separator.jsx | 15 + .../components/pages/Callback/Callback.jsx | 30 + .../components/pages/Callback/Code.jsx | 47 + .../components/pages/Callback/Error.jsx | 14 + .../components/pages/Callback/index.js | 1 + .../ClientApp/components/pages/Home/Home.jsx | 22 + .../ClientApp/components/pages/Home/index.js | 1 + .../components/pages/NotFound/NotFound.jsx | 23 + .../components/pages/NotFound/index.js | 1 + .../components/routers/AppRouter.jsx | 32 + .../components/shared/ConnectButton.jsx | 10 + .../ClientApp/components/shared/Loader.jsx | 40 + .../components/shared/PrimaryButton.jsx | 62 + .../ClientApp/components/shared/Text.jsx | 23 + .../ClientApp/components/shared/TextArea.jsx | 65 + .../ClientApp/index.jsx | 9 + .../ClientApp/lib/spotify.js | 18 + .../ClientApp/template.html | 45 + .../ClientApp/utils/history.js | 3 + .../ClientApp/utils/style/GlobalStyle.js | 34 + .../ClientApp/utils/style/variables.js | 9 + src/Smallify.Authentication.Web/Program.cs | 19 + .../Properties/launchSettings.json | 12 + .../Smallify.Authentication.Web.csproj | 48 + src/Smallify.Authentication.Web/Startup.cs | 41 + .../appsettings.json | 12 + .../babel.config.js | 24 + .../package-lock.json | 14323 ++++++++++++++++ src/Smallify.Authentication.Web/package.json | 63 + .../webpack.config.js | 209 + .../wwwroot/404.html | 40 + src/Smallify.Authentication.Web/wwwroot/CNAME | 1 + .../fonts/open-sans-v16-latin-regular.woff | Bin 0 -> 18100 bytes .../fonts/open-sans-v16-latin-regular.woff2 | Bin 0 -> 14380 bytes .../Configuration/AuthenticationSettings.cs | 52 + .../Configuration/AuthenticationToken.cs | 25 + .../Configuration/GeneralSettings.cs | 32 + .../Events/Authentication/OnLoginEvent.cs | 8 + .../Events/Authentication/OnLogoutEvent.cs | 8 + .../OnNotificationCreatedEvent.cs | 8 + src/Smallify.Core/Smallify.Core.csproj | 14 + src/Smallify.Core/Spotify/ISpotifyService.cs | 17 + src/Smallify.Core/Spotify/Mapping.cs | 71 + .../Spotify/Models/BasicResponse.cs | 22 + .../Spotify/Models/PlaybackResponse.cs | 23 + .../Spotify/Models/ProfileResponse.cs | 20 + .../Spotify/Models/TokenResponse.cs | 20 + src/Smallify.Core/Spotify/Models/Track.cs | 29 + src/Smallify.Core/Spotify/SpotifyService.cs | 124 + src/Smallify.GUI/.editorconfig | 4 + src/Smallify.GUI/App.config | 43 - src/Smallify.GUI/App.xaml | 19 +- src/Smallify.GUI/App.xaml.cs | 75 +- src/Smallify.GUI/Configuration.cs | 56 - src/Smallify.GUI/Elements/Buttons.xaml | 147 + src/Smallify.GUI/Elements/Icons.xaml | 49 + src/Smallify.GUI/Elements/Windows.xaml | 154 + src/Smallify.GUI/Properties/AssemblyInfo.cs | 55 - .../Properties/Resources.Designer.cs | 46 +- src/Smallify.GUI/Properties/Resources.resx | 16 +- .../Properties/Settings.Designer.cs | 59 - src/Smallify.GUI/Properties/Settings.settings | 15 - src/Smallify.GUI/Resources/icon.ico | Bin 123035 -> 0 bytes src/Smallify.GUI/Resources/smallify-icon.ico | Bin 0 -> 321870 bytes .../Samples/ShellViewModelData.cs | 15 - src/Smallify.GUI/Smallify.GUI.csproj | 175 +- src/Smallify.GUI/Themes/Default.xaml | 74 + .../ViewModels/IShellViewModel.cs | 14 - src/Smallify.GUI/ViewModels/ShellViewModel.cs | 32 - .../ViewModels/SmallifyShellViewModel.cs | 42 + src/Smallify.GUI/Views/Shell.xaml | 100 - src/Smallify.GUI/Views/Shell.xaml.cs | 14 - src/Smallify.GUI/Views/SmallifyShell.xaml | 81 + src/Smallify.GUI/Views/SmallifyShell.xaml.cs | 12 + src/Smallify.GUI/packages.config | 9 - .../ConfigurationChangedEventArgs.cs | 17 - .../OnConfigurationChangedEvent.cs | 8 - .../OnNotificationCreatedEvent.cs | 8 - src/Smallify.Module.Core/IConfiguration.cs | 13 - .../Properties/AssemblyInfo.cs | 36 - .../Smallify.Module.Core.csproj | 84 - .../UI/Elements/Buttons.xaml | 172 - .../UI/Elements/ContentControl.xaml | 27 - .../UI/Icons/PlaybackButtons.xaml | 22 - .../UI/Icons/Smallify.xaml | 14 - .../UI/Themes/Spotify.xaml | 129 - src/Smallify.Module.Core/packages.config | 4 - .../.editorconfig | 7 + .../Configuration/RegionNames.cs | 8 + .../Constants/RegionNames.cs | 9 - .../Models/INotification.cs | 11 - .../Models/Notification.cs | 21 +- .../NotificationsModule.cs | 35 +- .../Properties/AssemblyInfo.cs | 36 - .../NotificationsButtonViewModelData.cs | 21 - .../NotificationsShellViewModelData.cs | 29 - .../Services/NotificationCollectionService.cs | 24 + .../Smallify.Module.Notifications.csproj | 125 +- .../INotificationsButtonViewModel.cs | 13 - .../INotificationsShellViewModel.cs | 20 - .../NotificationsButtonViewModel.cs | 73 +- .../NotificationsContentViewModel.cs | 33 + .../ViewModels/NotificationsShellViewModel.cs | 50 +- .../Views/NotificationsButtonView.xaml | 92 +- .../Views/NotificationsButtonView.xaml.cs | 18 +- .../Views/NotificationsContentView.xaml | 154 + .../Views/NotificationsContentView.xaml.cs | 12 + .../Views/NotificationsShell.xaml | 91 +- .../Views/NotificationsShell.xaml.cs | 23 +- .../Views/Sections/NotificationsView.xaml | 92 - .../Views/Sections/NotificationsView.xaml.cs | 12 - src/Smallify.Module.Notifications/app.config | 11 - .../packages.config | 9 - src/Smallify.Module.Player/.editorconfig | 7 + .../Configuration/RegionNames.cs | 7 + .../Constants/RegionNames.cs | 7 - src/Smallify.Module.Player/PlayerModule.cs | 30 +- .../Properties/AssemblyInfo.cs | 36 - .../Samples/PlayerViewModelData.cs | 48 - .../Services/ISpotifyService.cs | 18 - .../Services/SpotifyService.cs | 104 - .../Smallify.Module.Player.csproj | 112 +- .../ViewModels/IPlayerViewModel.cs | 27 - .../ViewModels/PlayerViewModel.cs | 305 +- .../Views/PlayerView.xaml | 213 +- .../Views/PlayerView.xaml.cs | 18 +- src/Smallify.Module.Player/app.config | 15 - src/Smallify.Module.Player/packages.config | 11 - src/Smallify.Module.Settings/.editorconfig | 7 + .../Configuration/GroupNames.cs | 7 + .../Configuration/RegionNames.cs | 8 + .../Configuration/SectionNames.cs | 11 + .../Constants/GroupNames.cs | 7 - .../Constants/RegionNames.cs | 9 - .../Properties/AssemblyInfo.cs | 36 - .../Samples/AboutViewModelData.cs | 12 - .../Samples/AuthenticationViewModelData.cs | 18 - .../Samples/GeneralViewModelData.cs | 14 - .../Samples/SettingsButtonViewModelData.cs | 10 - .../Samples/SettingsShellViewModelData.cs | 15 - .../SettingsModule.cs | 44 +- .../Smallify.Module.Settings.csproj | 145 +- .../ViewModels/AboutSectionViewModel.cs | 46 + .../AuthenticationSectionViewModel.cs | 107 + .../ViewModels/GeneralSectionViewModel.cs | 28 + .../ViewModels/ISettingsButtonViewModel.cs | 9 - .../ViewModels/ISettingsShellViewModel.cs | 14 - .../ViewModels/Sections/AboutViewModel.cs | 27 - .../Sections/AuthenticationViewModel.cs | 57 - .../ViewModels/Sections/GeneralViewModel.cs | 31 - .../ViewModels/Sections/IAboutViewModel.cs | 11 - .../Sections/IAuthenticationViewModel.cs | 13 - .../ViewModels/Sections/IGeneralViewModel.cs | 7 - .../ViewModels/SettingsButtonViewModel.cs | 50 +- .../ViewModels/SettingsShellViewModel.cs | 44 +- .../Views/AboutSectionView.xaml | 71 + .../Views/AboutSectionView.xaml.cs | 12 + .../Views/AuthenticationSectionView.xaml | 119 + .../Views/AuthenticationSectionView.xaml.cs | 12 + .../Views/GeneralSectionView.xaml | 41 + .../Views/GeneralSectionView.xaml.cs | 12 + .../Views/Sections/About.xaml | 43 - .../Views/Sections/About.xaml.cs | 14 - .../Views/Sections/Authentication.xaml | 41 - .../Views/Sections/Authentication.xaml.cs | 14 - .../Views/Sections/General.xaml | 21 - .../Views/Sections/General.xaml.cs | 14 - .../Views/SettingsButtonView.xaml | 44 +- .../Views/SettingsButtonView.xaml.cs | 18 +- .../Views/SettingsShell.xaml | 152 +- .../Views/SettingsShell.xaml.cs | 19 +- src/Smallify.Module.Settings/app.config | 11 - src/Smallify.Module.Settings/packages.config | 9 - 199 files changed, 18383 insertions(+), 3261 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 build/azure-pipelines-Smallify-CI.yml create mode 100644 build/azure-pipelines.yml create mode 100644 docs/.assets/project-title.png create mode 100644 docs/.assets/smallify-icon.svg create mode 100644 docs/.assets/smallify-screenshot.png rename CODE_OF_CONDUCT.md => docs/CODE_OF_CONDUCT.md (100%) create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/DEVELOPMENT_GUIDE.md create mode 100644 docs/PULL_REQUEST_TEMPLATE.md delete mode 100644 docs/assets/project-title.png delete mode 100644 docs/assets/screenshots/player-screenshot.png delete mode 100644 docs/assets/smallify-icon.svg create mode 100644 scripts/Clean-Outputs.ps1 create mode 100644 src/Smallify.Authentication.Web/.eslintrc create mode 100644 src/Smallify.Authentication.Web/.stylelintrc create mode 100644 src/Smallify.Authentication.Web/ClientApp/App.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/assets/images/favicon.png create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/layout/AppLayout.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/layout/Footer.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/layout/Header.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/layout/Main.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/layout/Separator.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Callback/Callback.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Callback/Code.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Callback/Error.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Callback/index.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Home/Home.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/Home/index.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/NotFound/NotFound.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/pages/NotFound/index.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/routers/AppRouter.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/shared/ConnectButton.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/shared/Loader.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/shared/PrimaryButton.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/shared/Text.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/components/shared/TextArea.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/index.jsx create mode 100644 src/Smallify.Authentication.Web/ClientApp/lib/spotify.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/template.html create mode 100644 src/Smallify.Authentication.Web/ClientApp/utils/history.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/utils/style/GlobalStyle.js create mode 100644 src/Smallify.Authentication.Web/ClientApp/utils/style/variables.js create mode 100644 src/Smallify.Authentication.Web/Program.cs create mode 100644 src/Smallify.Authentication.Web/Properties/launchSettings.json create mode 100644 src/Smallify.Authentication.Web/Smallify.Authentication.Web.csproj create mode 100644 src/Smallify.Authentication.Web/Startup.cs create mode 100644 src/Smallify.Authentication.Web/appsettings.json create mode 100644 src/Smallify.Authentication.Web/babel.config.js create mode 100644 src/Smallify.Authentication.Web/package-lock.json create mode 100644 src/Smallify.Authentication.Web/package.json create mode 100644 src/Smallify.Authentication.Web/webpack.config.js create mode 100644 src/Smallify.Authentication.Web/wwwroot/404.html create mode 100644 src/Smallify.Authentication.Web/wwwroot/CNAME create mode 100644 src/Smallify.Authentication.Web/wwwroot/fonts/open-sans-v16-latin-regular.woff create mode 100644 src/Smallify.Authentication.Web/wwwroot/fonts/open-sans-v16-latin-regular.woff2 create mode 100644 src/Smallify.Core/Configuration/AuthenticationSettings.cs create mode 100644 src/Smallify.Core/Configuration/AuthenticationToken.cs create mode 100644 src/Smallify.Core/Configuration/GeneralSettings.cs create mode 100644 src/Smallify.Core/Events/Authentication/OnLoginEvent.cs create mode 100644 src/Smallify.Core/Events/Authentication/OnLogoutEvent.cs create mode 100644 src/Smallify.Core/Events/Notifications/OnNotificationCreatedEvent.cs create mode 100644 src/Smallify.Core/Smallify.Core.csproj create mode 100644 src/Smallify.Core/Spotify/ISpotifyService.cs create mode 100644 src/Smallify.Core/Spotify/Mapping.cs create mode 100644 src/Smallify.Core/Spotify/Models/BasicResponse.cs create mode 100644 src/Smallify.Core/Spotify/Models/PlaybackResponse.cs create mode 100644 src/Smallify.Core/Spotify/Models/ProfileResponse.cs create mode 100644 src/Smallify.Core/Spotify/Models/TokenResponse.cs create mode 100644 src/Smallify.Core/Spotify/Models/Track.cs create mode 100644 src/Smallify.Core/Spotify/SpotifyService.cs create mode 100644 src/Smallify.GUI/.editorconfig delete mode 100644 src/Smallify.GUI/App.config delete mode 100644 src/Smallify.GUI/Configuration.cs create mode 100644 src/Smallify.GUI/Elements/Buttons.xaml create mode 100644 src/Smallify.GUI/Elements/Icons.xaml create mode 100644 src/Smallify.GUI/Elements/Windows.xaml delete mode 100644 src/Smallify.GUI/Properties/AssemblyInfo.cs delete mode 100644 src/Smallify.GUI/Properties/Settings.Designer.cs delete mode 100644 src/Smallify.GUI/Properties/Settings.settings delete mode 100644 src/Smallify.GUI/Resources/icon.ico create mode 100644 src/Smallify.GUI/Resources/smallify-icon.ico delete mode 100644 src/Smallify.GUI/Samples/ShellViewModelData.cs create mode 100644 src/Smallify.GUI/Themes/Default.xaml delete mode 100644 src/Smallify.GUI/ViewModels/IShellViewModel.cs delete mode 100644 src/Smallify.GUI/ViewModels/ShellViewModel.cs create mode 100644 src/Smallify.GUI/ViewModels/SmallifyShellViewModel.cs delete mode 100644 src/Smallify.GUI/Views/Shell.xaml delete mode 100644 src/Smallify.GUI/Views/Shell.xaml.cs create mode 100644 src/Smallify.GUI/Views/SmallifyShell.xaml create mode 100644 src/Smallify.GUI/Views/SmallifyShell.xaml.cs delete mode 100644 src/Smallify.GUI/packages.config delete mode 100644 src/Smallify.Module.Core/Events/Configuration/ConfigurationChangedEventArgs.cs delete mode 100644 src/Smallify.Module.Core/Events/Configuration/OnConfigurationChangedEvent.cs delete mode 100644 src/Smallify.Module.Core/Events/Notifications/OnNotificationCreatedEvent.cs delete mode 100644 src/Smallify.Module.Core/IConfiguration.cs delete mode 100644 src/Smallify.Module.Core/Properties/AssemblyInfo.cs delete mode 100644 src/Smallify.Module.Core/Smallify.Module.Core.csproj delete mode 100644 src/Smallify.Module.Core/UI/Elements/Buttons.xaml delete mode 100644 src/Smallify.Module.Core/UI/Elements/ContentControl.xaml delete mode 100644 src/Smallify.Module.Core/UI/Icons/PlaybackButtons.xaml delete mode 100644 src/Smallify.Module.Core/UI/Icons/Smallify.xaml delete mode 100644 src/Smallify.Module.Core/UI/Themes/Spotify.xaml delete mode 100644 src/Smallify.Module.Core/packages.config create mode 100644 src/Smallify.Module.Notifications/.editorconfig create mode 100644 src/Smallify.Module.Notifications/Configuration/RegionNames.cs delete mode 100644 src/Smallify.Module.Notifications/Constants/RegionNames.cs delete mode 100644 src/Smallify.Module.Notifications/Models/INotification.cs delete mode 100644 src/Smallify.Module.Notifications/Properties/AssemblyInfo.cs delete mode 100644 src/Smallify.Module.Notifications/Samples/NotificationsButtonViewModelData.cs delete mode 100644 src/Smallify.Module.Notifications/Samples/NotificationsShellViewModelData.cs create mode 100644 src/Smallify.Module.Notifications/Services/NotificationCollectionService.cs delete mode 100644 src/Smallify.Module.Notifications/ViewModels/INotificationsButtonViewModel.cs delete mode 100644 src/Smallify.Module.Notifications/ViewModels/INotificationsShellViewModel.cs create mode 100644 src/Smallify.Module.Notifications/ViewModels/NotificationsContentViewModel.cs create mode 100644 src/Smallify.Module.Notifications/Views/NotificationsContentView.xaml create mode 100644 src/Smallify.Module.Notifications/Views/NotificationsContentView.xaml.cs delete mode 100644 src/Smallify.Module.Notifications/Views/Sections/NotificationsView.xaml delete mode 100644 src/Smallify.Module.Notifications/Views/Sections/NotificationsView.xaml.cs delete mode 100644 src/Smallify.Module.Notifications/app.config delete mode 100644 src/Smallify.Module.Notifications/packages.config create mode 100644 src/Smallify.Module.Player/.editorconfig create mode 100644 src/Smallify.Module.Player/Configuration/RegionNames.cs delete mode 100644 src/Smallify.Module.Player/Constants/RegionNames.cs delete mode 100644 src/Smallify.Module.Player/Properties/AssemblyInfo.cs delete mode 100644 src/Smallify.Module.Player/Samples/PlayerViewModelData.cs delete mode 100644 src/Smallify.Module.Player/Services/ISpotifyService.cs delete mode 100644 src/Smallify.Module.Player/Services/SpotifyService.cs delete mode 100644 src/Smallify.Module.Player/ViewModels/IPlayerViewModel.cs delete mode 100644 src/Smallify.Module.Player/app.config delete mode 100644 src/Smallify.Module.Player/packages.config create mode 100644 src/Smallify.Module.Settings/.editorconfig create mode 100644 src/Smallify.Module.Settings/Configuration/GroupNames.cs create mode 100644 src/Smallify.Module.Settings/Configuration/RegionNames.cs create mode 100644 src/Smallify.Module.Settings/Configuration/SectionNames.cs delete mode 100644 src/Smallify.Module.Settings/Constants/GroupNames.cs delete mode 100644 src/Smallify.Module.Settings/Constants/RegionNames.cs delete mode 100644 src/Smallify.Module.Settings/Properties/AssemblyInfo.cs delete mode 100644 src/Smallify.Module.Settings/Samples/AboutViewModelData.cs delete mode 100644 src/Smallify.Module.Settings/Samples/AuthenticationViewModelData.cs delete mode 100644 src/Smallify.Module.Settings/Samples/GeneralViewModelData.cs delete mode 100644 src/Smallify.Module.Settings/Samples/SettingsButtonViewModelData.cs delete mode 100644 src/Smallify.Module.Settings/Samples/SettingsShellViewModelData.cs create mode 100644 src/Smallify.Module.Settings/ViewModels/AboutSectionViewModel.cs create mode 100644 src/Smallify.Module.Settings/ViewModels/AuthenticationSectionViewModel.cs create mode 100644 src/Smallify.Module.Settings/ViewModels/GeneralSectionViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/ISettingsButtonViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/ISettingsShellViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/AboutViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/AuthenticationViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/GeneralViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/IAboutViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/IAuthenticationViewModel.cs delete mode 100644 src/Smallify.Module.Settings/ViewModels/Sections/IGeneralViewModel.cs create mode 100644 src/Smallify.Module.Settings/Views/AboutSectionView.xaml create mode 100644 src/Smallify.Module.Settings/Views/AboutSectionView.xaml.cs create mode 100644 src/Smallify.Module.Settings/Views/AuthenticationSectionView.xaml create mode 100644 src/Smallify.Module.Settings/Views/AuthenticationSectionView.xaml.cs create mode 100644 src/Smallify.Module.Settings/Views/GeneralSectionView.xaml create mode 100644 src/Smallify.Module.Settings/Views/GeneralSectionView.xaml.cs delete mode 100644 src/Smallify.Module.Settings/Views/Sections/About.xaml delete mode 100644 src/Smallify.Module.Settings/Views/Sections/About.xaml.cs delete mode 100644 src/Smallify.Module.Settings/Views/Sections/Authentication.xaml delete mode 100644 src/Smallify.Module.Settings/Views/Sections/Authentication.xaml.cs delete mode 100644 src/Smallify.Module.Settings/Views/Sections/General.xaml delete mode 100644 src/Smallify.Module.Settings/Views/Sections/General.xaml.cs delete mode 100644 src/Smallify.Module.Settings/app.config delete mode 100644 src/Smallify.Module.Settings/packages.config diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..ef81db0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,36 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: hypzeh + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..b03d6e8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE]" +labels: enhancement +assignees: hypzeh + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore index 9581691..5020ac4 100644 --- a/.gitignore +++ b/.gitignore @@ -260,6 +260,8 @@ paket-files/ __pycache__/ *.pyc -# React build outputs -**/wwwroot/index.html -**/wwwroot/main.js +# wwwroot output +**/wwwroot/ +!**/wwwroot/fonts/ +!**/wwwroot/404.html +!**/wwwroot/CNAME diff --git a/README.md b/README.md index b5f79ed..d6a12dc 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,29 @@ -![Smallify](./docs/assets/project-title.png) +![Smallify](./docs/.assets/project-title.png) + [![Build Status](https://nick-smirnoff.visualstudio.com/smallify/_apis/build/status/build/smallify-CI?branchName=master)](https://nick-smirnoff.visualstudio.com/smallify/_build/latest?definitionId=13?branchName=master) + --- -Smallify is a simple WPF application built to provide a small music player for Spotify. +_Smallify is a WPF application built with .NET Core 3, aiming to provide a simple and minimalistic Spotify experience._ -## Usage +![Smallify Screenshot](./docs/.assets/smallify-screenshot.png) -Smallify requires an `Access Token`, which can be generated on user request from `Spotify Accounts Service`, by connecting to a Spotify account, see [Smallify authentication site](https://hypzeh.github.io/smallify). +## Installation -### Requirements +Download the latest [Smallify release](https://github.com/hypzeh/smallify/releases/latest). + +## Usage -- Windows 10 -- .NET Framework v4.7.2 -- Spotify Premium +Smallify is **NOT** a standalone Spotify device, this means that an official Spotify client will be required for audio playback. Spotify Premium is required for modifying playback state. -### Notes +Smallify uses the [Authorization Code Flow](https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow) for authentication. Connect to a Spotify account through the authentication tab in the settings menu. -- Smallify is **NOT** a standalone Spotify device, users will need to have an official Spotify device/application on standby (this will be the audio source) -- Smallify uses [Implicit grant flow](https://developer.spotify.com/documentation/general/guides/authorization-guide/#implicit-grant-flow) for authentication - - Users are directed to `Spotify Accounts Service` with a request for the following permission scopes: - - `user-modify-playback-state` - - `user-read-playback-state` - - `user-read-currently-playing` - - Tokens last one hour +## Contributing -## Screenshots +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. -![player-screenshot](./docs/assets/screenshots/player-screenshot.png) +Please reference the [contributing](docs/CONTRIBUTING.md) docs for more information. -## Related Projects +## Similar Projects - ['Spofy' by eltoncezar](https://github.com/eltoncezar/Spofy) - A Spotify mini player and notifier for Windows diff --git a/Smallify.sln b/Smallify.sln index a5c0178..1fd57dc 100644 --- a/Smallify.sln +++ b/Smallify.sln @@ -1,19 +1,26 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.168 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29209.152 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E3F7BEFD-5048-4056-A38D-F2A38C3CFE53}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smallify.GUI", "src\Smallify.GUI\Smallify.GUI.csproj", "{03065F69-11F8-423D-9E67-0259127D36AE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.GUI", "src\Smallify.GUI\Smallify.GUI.csproj", "{07C9AE95-D5D9-4F94-9198-A7AAFE9B0396}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smallify.Module.Player", "src\Smallify.Module.Player\Smallify.Module.Player.csproj", "{162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.Authentication.Web", "src\Smallify.Authentication.Web\Smallify.Authentication.Web.csproj", "{9F79A448-5AD1-444C-85E4-2903DE8333BB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smallify.Module.Core", "src\Smallify.Module.Core\Smallify.Module.Core.csproj", "{5F8C2791-3D5F-420F-9AB7-4874E2CB5C77}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.Core", "src\Smallify.Core\Smallify.Core.csproj", "{94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smallify.Module.Notifications", "src\Smallify.Module.Notifications\Smallify.Module.Notifications.csproj", "{519018FC-B512-4CCF-AE34-809524E9DF85}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.Module.Settings", "src\Smallify.Module.Settings\Smallify.Module.Settings.csproj", "{DDC591BD-B04C-4D30-851C-60BB8D4455F5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Smallify.Module.Settings", "src\Smallify.Module.Settings\Smallify.Module.Settings.csproj", "{167A71C7-F26F-4B84-8BE8-78149BE03FA4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.Module.Notifications", "src\Smallify.Module.Notifications\Smallify.Module.Notifications.csproj", "{DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Smallify.Module.Player", "src\Smallify.Module.Player\Smallify.Module.Player.csproj", "{21AD1154-2491-4C21-9D12-A7C9CCA687EE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{74AA8BAB-9651-474B-8A8C-BBCDBC328A87}" + ProjectSection(SolutionItems) = preProject + scripts\Clean-Outputs.ps1 = scripts\Clean-Outputs.ps1 + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,38 +28,43 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {03065F69-11F8-423D-9E67-0259127D36AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03065F69-11F8-423D-9E67-0259127D36AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03065F69-11F8-423D-9E67-0259127D36AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03065F69-11F8-423D-9E67-0259127D36AE}.Release|Any CPU.Build.0 = Release|Any CPU - {162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C}.Release|Any CPU.Build.0 = Release|Any CPU - {5F8C2791-3D5F-420F-9AB7-4874E2CB5C77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F8C2791-3D5F-420F-9AB7-4874E2CB5C77}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F8C2791-3D5F-420F-9AB7-4874E2CB5C77}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F8C2791-3D5F-420F-9AB7-4874E2CB5C77}.Release|Any CPU.Build.0 = Release|Any CPU - {519018FC-B512-4CCF-AE34-809524E9DF85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {519018FC-B512-4CCF-AE34-809524E9DF85}.Debug|Any CPU.Build.0 = Debug|Any CPU - {519018FC-B512-4CCF-AE34-809524E9DF85}.Release|Any CPU.ActiveCfg = Release|Any CPU - {519018FC-B512-4CCF-AE34-809524E9DF85}.Release|Any CPU.Build.0 = Release|Any CPU - {167A71C7-F26F-4B84-8BE8-78149BE03FA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {167A71C7-F26F-4B84-8BE8-78149BE03FA4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {167A71C7-F26F-4B84-8BE8-78149BE03FA4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {167A71C7-F26F-4B84-8BE8-78149BE03FA4}.Release|Any CPU.Build.0 = Release|Any CPU + {07C9AE95-D5D9-4F94-9198-A7AAFE9B0396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07C9AE95-D5D9-4F94-9198-A7AAFE9B0396}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07C9AE95-D5D9-4F94-9198-A7AAFE9B0396}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07C9AE95-D5D9-4F94-9198-A7AAFE9B0396}.Release|Any CPU.Build.0 = Release|Any CPU + {9F79A448-5AD1-444C-85E4-2903DE8333BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F79A448-5AD1-444C-85E4-2903DE8333BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F79A448-5AD1-444C-85E4-2903DE8333BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F79A448-5AD1-444C-85E4-2903DE8333BB}.Release|Any CPU.Build.0 = Release|Any CPU + {94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3}.Release|Any CPU.Build.0 = Release|Any CPU + {DDC591BD-B04C-4D30-851C-60BB8D4455F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDC591BD-B04C-4D30-851C-60BB8D4455F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDC591BD-B04C-4D30-851C-60BB8D4455F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDC591BD-B04C-4D30-851C-60BB8D4455F5}.Release|Any CPU.Build.0 = Release|Any CPU + {DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB}.Release|Any CPU.Build.0 = Release|Any CPU + {21AD1154-2491-4C21-9D12-A7C9CCA687EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21AD1154-2491-4C21-9D12-A7C9CCA687EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21AD1154-2491-4C21-9D12-A7C9CCA687EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21AD1154-2491-4C21-9D12-A7C9CCA687EE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {03065F69-11F8-423D-9E67-0259127D36AE} = {E3F7BEFD-5048-4056-A38D-F2A38C3CFE53} - {162BD37B-7BF9-43E0-AF85-2D8B9C5ABD1C} = {E3F7BEFD-5048-4056-A38D-F2A38C3CFE53} - {5F8C2791-3D5F-420F-9AB7-4874E2CB5C77} = {E3F7BEFD-5048-4056-A38D-F2A38C3CFE53} - {519018FC-B512-4CCF-AE34-809524E9DF85} = {E3F7BEFD-5048-4056-A38D-F2A38C3CFE53} - {167A71C7-F26F-4B84-8BE8-78149BE03FA4} = {E3F7BEFD-5048-4056-A38D-F2A38C3CFE53} + {07C9AE95-D5D9-4F94-9198-A7AAFE9B0396} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} + {9F79A448-5AD1-444C-85E4-2903DE8333BB} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} + {94E0BA7A-ABC5-4A5A-9BC5-8F71D4BD64F3} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} + {DDC591BD-B04C-4D30-851C-60BB8D4455F5} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} + {DF0DCE0F-4297-4DA1-B1EC-7622348CD0DB} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} + {21AD1154-2491-4C21-9D12-A7C9CCA687EE} = {A2A3FE0C-3833-4203-8A56-DE7DBCFA28BE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0F0DB0EE-6F81-4007-AF03-CB550E87ACB9} + SolutionGuid = {A1064F61-12D7-4255-92BC-71BF30D4D828} EndGlobalSection EndGlobal diff --git a/build/azure-pipelines-Smallify-CI.yml b/build/azure-pipelines-Smallify-CI.yml deleted file mode 100644 index ed5566e..0000000 --- a/build/azure-pipelines-Smallify-CI.yml +++ /dev/null @@ -1,62 +0,0 @@ -trigger: - - master - -pr: - - master - -pool: - vmImage: 'VS2017-Win2016' - demands: - - msbuild - - visualstudio - -variables: - solution: './*.sln' - buildPlatform: 'Any CPU' - buildConfiguration: 'Release' - -steps: -- task: NuGetToolInstaller@0 - displayName: 'Use NuGet 4.4.1' - inputs: - versionSpec: 4.4.1 - -- task: NuGetCommand@2 - displayName: 'NuGet restore' - inputs: - restoreSolution: '$(solution)' - -- task: VSBuild@1 - displayName: 'Build solution' - inputs: - solution: '$(solution)' - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' - -- task: PublishSymbols@2 - displayName: 'Publish symbols path' - inputs: - SearchPattern: '**\bin\**\*.pdb' - PublishSymbols: false - continueOnError: true - -- task: qetza.replacetokens.replacetokens-task.replacetokens@3 - displayName: 'Replace tokens in **/*.config' - inputs: - rootDirectory: '$(build.sourcesdirectory)' - targetFiles: '**/*.config' - keepToken: true - tokenPrefix: '#{' - tokenSuffix: '}' - -- task: CopyFiles@2 - displayName: 'Copy Files to: $(build.artifactstagingdirectory)' - inputs: - SourceFolder: '$(build.sourcesdirectory)' - Contents: '**\bin\$(buildConfiguration)\**' - TargetFolder: '$(build.artifactstagingdirectory)' - -- task: PublishBuildArtifacts@1 - displayName: 'Publish Artifact: drop' - inputs: - PathtoPublish: '$(build.artifactstagingdirectory)' diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml new file mode 100644 index 0000000..79156af --- /dev/null +++ b/build/azure-pipelines.yml @@ -0,0 +1,54 @@ +trigger: +- master + +pool: + vmImage: 'windows-latest' + +variables: + solution: '**/*.sln' + desktopApplication: '**/Smallify.GUI.csproj' + webApplication: '**/Smallify.Authentication.Web.csproj' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + +steps: +- task: replacetokens@3 + displayName: 'Replace Tokens' + inputs: + targetFiles: '**/Resources.resx, **/appsettings.json' + encoding: 'auto' + writeBOM: true + actionOnMissing: 'warn' + keepToken: true + tokenPrefix: '#{' + tokenSuffix: '}' + +- task: NuGetToolInstaller@1 + displayName: 'Install NuGet tool' + +- task: NuGetCommand@2 + displayName: 'Restore solution' + inputs: + restoreSolution: '$(solution)' + +- task: DotNetCoreCLI@2 + displayName: 'Publish desktop application' + inputs: + command: 'publish' + publishWebProjects: false + projects: '$(desktopApplication)' + arguments: '--nologo --no-restore --configuration $(buildConfiguration) --output $(build.artifactStagingDirectory)/desktop' + +- task: DotNetCoreCLI@2 + displayName: 'Publish web application' + inputs: + command: 'publish' + projects: '$(webApplication)' + arguments: '--nologo --no-restore --configuration $(buildConfiguration) --output $(build.artifactStagingDirectory)/web' + +- task: PublishBuildArtifacts@1 + displayName: 'Save build artifacts' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'drop' + publishLocation: 'Container' diff --git a/docs/.assets/project-title.png b/docs/.assets/project-title.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3d7c345870ed9a8e5208b8bf3338f844caeeb2 GIT binary patch literal 49032 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 k{qcWzApYNJc0CS#;Fj5o!bP}jsKY%w5B!n2 + + + + diff --git a/docs/.assets/smallify-screenshot.png b/docs/.assets/smallify-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f48fd3c942c9b575f45b9a86dd6b89837a7a55a5 GIT binary patch literal 24060 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 V^q%P&Kw~?WnzDvcxq^Af{{zRIufhNT literal 0 HcmV?d00001 diff --git a/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to docs/CODE_OF_CONDUCT.md diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..18fa58f --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing to Smallify + +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + +## Getting started + +Make sure to check out the [development guide](DEVELOPMENT_GUIDE.md). + +## Create a Pull Request + +We use [Github Flow](https://guides.github.com/introduction/flow/index.html), so all code changes will happen through pull requests; they are the best way to propose changes to the codebase. + +1. Fork the repo and create your branch from `master`. +2. Update the documentation. +3. Create that pull request! + +## Any contributions you make will be under the MIT Software License + +In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. diff --git a/docs/DEVELOPMENT_GUIDE.md b/docs/DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000..305db8e --- /dev/null +++ b/docs/DEVELOPMENT_GUIDE.md @@ -0,0 +1,23 @@ +# Development Guide + +## Application Settings + +Ensure to provide relevant values to the application settings defined in `Resources.resx` and `appsettings.json`, but keep your values secret and out of source control. The CI pipeline replaces token values with a `#{` prefix and a `}` suffix. + +- `APP_CENTER_CLIENT_ID` - _(Optional)_ You can get this from [App Center](https://appcenter.ms/) +- `SPOTIFY_CLIENT_ID` - _(Required)_ You can get this from [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/) by registering your personal development client +- `SPOTIFY_CLIENT_SECRET` - _(Required)_ You can get this from [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/) by registering your personal development client +- `SPOTIFY_REDIRECT_URI` - _(Required)_ You define this from [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/) whilst registering your personal development client + +You can use the following commands to include/exclude a path from Git's management, this can help keep your secrets out of source control. + +```shell +git update-index --skip-worktree src/Smallify.GUI/Properties/* +git update-index --no-skip-worktree src/Smallify.GUI/Properties/* +``` + +## Scripts + +Useful scripts can be found in the `/scripts` folder. + +- `Clean-Outputs.ps1` - Run this to clean out all the `bin` and `obj` folders \ No newline at end of file diff --git a/docs/PULL_REQUEST_TEMPLATE.md b/docs/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..149916c --- /dev/null +++ b/docs/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +## Changes + + + +## Screenshots + + diff --git a/docs/assets/project-title.png b/docs/assets/project-title.png deleted file mode 100644 index 44da700d40c52f1f3c669e0cd040a535de0fce8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28554 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 diff --git a/docs/assets/screenshots/player-screenshot.png b/docs/assets/screenshots/player-screenshot.png deleted file mode 100644 index 0db6dd027a62a8fd552a68ca101662db10034b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19508 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 X=sGZ^n#yVs00000NkvXXu0mjf9U1t> diff --git a/docs/assets/smallify-icon.svg b/docs/assets/smallify-icon.svg deleted file mode 100644 index 1f37db4..0000000 --- a/docs/assets/smallify-icon.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - diff --git a/scripts/Clean-Outputs.ps1 b/scripts/Clean-Outputs.ps1 new file mode 100644 index 0000000..6617dfa --- /dev/null +++ b/scripts/Clean-Outputs.ps1 @@ -0,0 +1,4 @@ +Get-ChildItem ..\src -include bin,obj -Recurse | foreach ($_) { + Write-Host "DELETING:" $_.fullname + Remove-Item $_.fullname -Force -Recurse +} \ No newline at end of file diff --git a/src/Smallify.Authentication.Web/.eslintrc b/src/Smallify.Authentication.Web/.eslintrc new file mode 100644 index 0000000..24251d0 --- /dev/null +++ b/src/Smallify.Authentication.Web/.eslintrc @@ -0,0 +1,40 @@ +{ + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "extends": [ + "airbnb", + "airbnb/hooks" + ], + "env": { + "es6": true, + "browser": true, + "node": true + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + "modules": true + } + }, + "settings": { + "react": { + "version": "16.12" + } + }, + "rules": { + "linebreak-style": [ + "error", + "windows" + ] + }, + "overrides": [ + { + "files": ["webpack.config.js"], + "rules": { + "global-require": "off" + } + } + ] +} \ No newline at end of file diff --git a/src/Smallify.Authentication.Web/.stylelintrc b/src/Smallify.Authentication.Web/.stylelintrc new file mode 100644 index 0000000..7bde962 --- /dev/null +++ b/src/Smallify.Authentication.Web/.stylelintrc @@ -0,0 +1,9 @@ +{ + "processors": [ + "stylelint-processor-styled-components" + ], + "extends": [ + "stylelint-config-recommended", + "stylelint-config-styled-components" + ] +} \ No newline at end of file diff --git a/src/Smallify.Authentication.Web/ClientApp/App.jsx b/src/Smallify.Authentication.Web/ClientApp/App.jsx new file mode 100644 index 0000000..a0d3bc3 --- /dev/null +++ b/src/Smallify.Authentication.Web/ClientApp/App.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Helmet } from 'react-helmet'; +import { Router } from 'react-router-dom'; +import { hot } from 'react-hot-loader/root'; + +import history from './utils/history'; +import { PRIMARY } from './utils/style/variables'; +import GlobalStyle from './utils/style/GlobalStyle'; +import AppLayout from './components/layout/AppLayout'; +import AppRouter from './components/routers/AppRouter'; + +const Wrapper = styled.div` + height: 100vh; + width: 100vw; + flex: 1 1 auto; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: stretch; + background-color: ${PRIMARY.background}; +`; + +const App = () => { + if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('/sw.js') + .then((registration) => { + // eslint-disable-next-line no-console + console.log('SW registered:', registration); + }).catch((error) => { + // eslint-disable-next-line no-console + console.log('SW registration failed:', error); + }); + }); + } + + return ( + + + + + + + + + + ); +}; + +export default hot(App); diff --git a/src/Smallify.Authentication.Web/ClientApp/assets/images/favicon.png b/src/Smallify.Authentication.Web/ClientApp/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a75c952b11fa8d5ba1e68aa7c520f5ba3153a929 GIT binary patch literal 31669 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 ( + <> +
+
+ {children} +
+ +