chore: Remove deprecated integration tests, add modern samples, update snippets, CI, and docs#4319
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4319 +/- ##
=======================================
Coverage 89.68% 89.68%
=======================================
Files 251 251
Lines 9571 9571
Branches 1460 1460
=======================================
Hits 8584 8584
Misses 747 747
Partials 240 240 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
Removes the legacy integrationtests/ sample projects targeting deprecated/EOL platforms and replaces them with three modern, .NET 10-based sample apps under src/examples/ that are included in the main reactiveui.slnx solution.
Changes:
- Removed the entire
integrationtests/tree (projects, solutions, assets, and shared test scaffolding). - Added new sample apps: WPF, WinForms, and MAUI login-flow samples under
src/examples/. - Updated
src/reactiveui.slnxto include the new sample projects so they build with the main solution.
Reviewed changes
Copilot reviewed 155 out of 163 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| src/reactiveui.slnx | Adds the new WPF/WinForms/MAUI sample projects to the main solution. |
| src/examples/ReactiveUI.Samples.Wpf/ReactiveUI.Samples.Wpf.csproj | New WPF sample project targeting modern .NET. |
| src/examples/ReactiveUI.Samples.Wpf/MainWindow.xaml.cs | New WPF sample main window code-behind. |
| src/examples/ReactiveUI.Samples.Wpf/MainWindow.xaml | New WPF sample main window XAML hosting the login view. |
| src/examples/ReactiveUI.Samples.Wpf/LoginViewModel.cs | New shared login flow ViewModel for the WPF sample. |
| src/examples/ReactiveUI.Samples.Wpf/LoginView.xaml.cs | New WPF login view with activation/bindings and password marshaling. |
| src/examples/ReactiveUI.Samples.Wpf/LoginView.xaml | New WPF login view layout. |
| src/examples/ReactiveUI.Samples.Wpf/AssemblyInfo.cs | Updates assembly attributes for WPF theme metadata. |
| src/examples/ReactiveUI.Samples.Wpf/App.xaml.cs | WPF sample app startup wiring ReactiveUI builder initialization. |
| src/examples/ReactiveUI.Samples.Wpf/App.xaml | WPF sample application resources. |
| src/examples/ReactiveUI.Samples.Winforms/ReactiveUI.Samples.Winforms.csproj | New WinForms sample project targeting modern .NET. |
| src/examples/ReactiveUI.Samples.Winforms/Program.cs | WinForms sample entry point with builder initialization. |
| src/examples/ReactiveUI.Samples.Winforms/MainForm.cs | WinForms sample main form hosting the login view. |
| src/examples/ReactiveUI.Samples.Winforms/LoginViewModel.cs | New shared login flow ViewModel for the WinForms sample. |
| src/examples/ReactiveUI.Samples.Winforms/LoginView.cs | WinForms login view with activation/bindings and programmatic UI. |
| src/examples/ReactiveUI.Samples.Maui/ReactiveUI.Samples.Maui.csproj | New MAUI sample project targeting modern .NET. |
| src/examples/ReactiveUI.Samples.Maui/MauiProgram.cs | MAUI sample builder initialization using ReactiveUI integration. |
| src/examples/ReactiveUI.Samples.Maui/LoginViewModel.cs | New shared login flow ViewModel for the MAUI sample. |
| src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml.cs | MAUI login page code-behind with activation/bindings and alerts. |
| src/examples/ReactiveUI.Samples.Maui/LoginPage.xaml | MAUI login page XAML layout. |
| src/examples/ReactiveUI.Samples.Maui/App.xaml.cs | MAUI sample app root wiring initial navigation. |
| src/examples/ReactiveUI.Samples.Maui/App.xaml | MAUI app resources (e.g., primary color). |
| integrationtests/README.md | Removed obsolete integrationtests documentation. |
| integrationtests/IntegrationTests.WPF/UserControlExtensions.cs | Removed legacy WPF integration test helper. |
| integrationtests/IntegrationTests.WPF/Properties/Settings.settings | Removed legacy WPF settings file. |
| integrationtests/IntegrationTests.WPF/Properties/Settings.Designer.cs | Removed generated WPF settings designer. |
| integrationtests/IntegrationTests.WPF/Properties/Resources.resx | Removed legacy WPF resources. |
| integrationtests/IntegrationTests.WPF/Properties/Resources.Designer.cs | Removed generated WPF resources designer. |
| integrationtests/IntegrationTests.WPF/Properties/AssemblyInfo.cs | Removed legacy WPF assembly info. |
| integrationtests/IntegrationTests.WPF/MainWindow.xaml.cs | Removed legacy WPF integration app main window. |
| integrationtests/IntegrationTests.WPF/MainWindow.xaml | Removed legacy WPF main window XAML. |
| integrationtests/IntegrationTests.WPF/LoginControl.xaml.cs | Removed legacy WPF login control code-behind. |
| integrationtests/IntegrationTests.WPF/LoginControl.xaml | Removed legacy WPF login control XAML. |
| integrationtests/IntegrationTests.WPF/IntegrationTests.WPF.csproj | Removed legacy WPF integration project. |
| integrationtests/IntegrationTests.WPF/App.xaml.cs | Removed legacy WPF integration app entry. |
| integrationtests/IntegrationTests.WPF/App.xaml | Removed legacy WPF integration app resources. |
| integrationtests/IntegrationTests.WPF/App.config | Removed legacy WPF app config. |
| integrationtests/IntegrationTests.WPF.sln | Removed legacy WPF solution file. |
| integrationtests/IntegrationTests.WinForms/Properties/Settings.settings | Removed legacy WinForms settings file. |
| integrationtests/IntegrationTests.WinForms/Properties/Settings.Designer.cs | Removed generated WinForms settings designer. |
| integrationtests/IntegrationTests.WinForms/Properties/Resources.resx | Removed legacy WinForms resources. |
| integrationtests/IntegrationTests.WinForms/Properties/Resources.Designer.cs | Removed generated WinForms resources designer. |
| integrationtests/IntegrationTests.WinForms/Properties/AssemblyInfo.cs | Removed legacy WinForms assembly info. |
| integrationtests/IntegrationTests.WinForms/Program.cs | Removed legacy WinForms program entry point. |
| integrationtests/IntegrationTests.WinForms/MainForm.resx | Removed legacy WinForms form resources. |
| integrationtests/IntegrationTests.WinForms/MainForm.Designer.cs | Removed legacy WinForms form designer code. |
| integrationtests/IntegrationTests.WinForms/MainForm.cs | Removed legacy WinForms main form code. |
| integrationtests/IntegrationTests.WinForms/LoginControl.resx | Removed legacy WinForms login control resources. |
| integrationtests/IntegrationTests.WinForms/LoginControl.Designer.cs | Removed legacy WinForms login control designer code. |
| integrationtests/IntegrationTests.WinForms/LoginControl.cs | Removed legacy WinForms login control code. |
| integrationtests/IntegrationTests.WinForms/IntegrationTests.WinForms.csproj | Removed legacy WinForms integration project. |
| integrationtests/IntegrationTests.WinForms/App.config | Removed legacy WinForms app config. |
| integrationtests/IntegrationTests.WinForms.sln | Removed legacy WinForms solution file. |
| integrationtests/IntegrationTests.UWP/Properties/Default.rd.xml | Removed legacy UWP runtime directives. |
| integrationtests/IntegrationTests.UWP/Properties/AssemblyInfo.cs | Removed legacy UWP assembly metadata. |
| integrationtests/IntegrationTests.UWP/Package.appxmanifest | Removed legacy UWP app manifest. |
| integrationtests/IntegrationTests.UWP/MainPage.xaml.cs | Removed legacy UWP main page code-behind. |
| integrationtests/IntegrationTests.UWP/MainPage.xaml | Removed legacy UWP main page XAML. |
| integrationtests/IntegrationTests.UWP/LoginControlBase.cs | Removed legacy UWP login control base. |
| integrationtests/IntegrationTests.UWP/LoginControl.xaml.cs | Removed legacy UWP login control code-behind. |
| integrationtests/IntegrationTests.UWP/LoginControl.xaml | Removed legacy UWP login control XAML. |
| integrationtests/IntegrationTests.UWP/IntegrationTests.UWP.csproj | Removed legacy UWP integration project. |
| integrationtests/IntegrationTests.UWP/Assets/Wide310x150Logo.scale-200.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/StoreLogo.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/Square44x44Logo.scale-200.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/Square150x150Logo.scale-200.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/SplashScreen.scale-200.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/Assets/LockScreenLogo.scale-200.png | Removed legacy UWP asset (LFS pointer). |
| integrationtests/IntegrationTests.UWP/App.xaml.cs | Removed legacy UWP application entry code. |
| integrationtests/IntegrationTests.UWP/App.xaml | Removed legacy UWP application XAML. |
| integrationtests/IntegrationTests.UWP.sln | Removed legacy UWP solution file. |
| integrationtests/IntegrationTests.Shared/LoginViewModel.cs | Removed legacy shared integration ViewModel. |
| integrationtests/IntegrationTests.Shared/IntegrationTests.Shared.csproj | Removed legacy shared integration project. |
| integrationtests/IntegrationTests.Shared.Tests/IntegrationTests.Shared.Tests.csproj | Removed legacy shared integration tests project. |
| integrationtests/IntegrationTests.Shared.Tests/IBuilder.cs | Removed legacy test builder interface. |
| integrationtests/IntegrationTests.Shared.Tests/Features/Login/LoginViewModelTests.cs | Removed legacy login ViewModel tests. |
| integrationtests/IntegrationTests.Shared.Tests/Features/Login/LoginViewModelBuilder.cs | Removed legacy test builder implementation. |
| integrationtests/IntegrationTests.Shared.Tests/BuilderExtensions.cs | Removed legacy builder helper extensions. |
| integrationtests/IntegrationTests.Shared.Tests/app.config | Removed legacy test config. |
| integrationtests/IntegrationTests.Shared.Tests.sln | Removed legacy shared tests solution file. |
| integrationtests/IntegrationTests.Mac/Properties/AssemblyInfo.cs | Removed legacy Xamarin.Mac assembly metadata. |
| integrationtests/IntegrationTests.Mac/MainClass.cs | Removed legacy Xamarin.Mac app entry point. |
| integrationtests/IntegrationTests.Mac/Main.storyboard | Removed legacy macOS storyboard UI. |
| integrationtests/IntegrationTests.Mac/LoginViewController.designer.cs | Removed legacy macOS controller designer file. |
| integrationtests/IntegrationTests.Mac/LoginViewController.cs | Removed legacy macOS controller implementation. |
| integrationtests/IntegrationTests.Mac/IntegrationTests.Mac.csproj | Removed legacy Xamarin.Mac project file. |
| integrationtests/IntegrationTests.Mac/Info.plist | Removed legacy macOS app plist. |
| integrationtests/IntegrationTests.Mac/Entitlements.plist | Removed legacy macOS entitlements. |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/Contents.json | Removed legacy macOS assets metadata. |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json | Removed legacy macOS icon set metadata. |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png | Removed legacy macOS icon (LFS pointer). |
| integrationtests/IntegrationTests.Mac/AppDelegate.cs | Removed legacy macOS app delegate. |
| integrationtests/IntegrationTests.Mac.sln | Removed legacy macOS solution file. |
| integrationtests/IntegrationTests.iOS/Resources/LaunchScreen.xib | Removed legacy Xamarin.iOS launch screen. |
| integrationtests/IntegrationTests.iOS/Main.storyboard | Removed legacy iOS storyboard UI. |
| integrationtests/IntegrationTests.iOS/LoginViewController.designer.cs | Removed legacy iOS controller designer file. |
| integrationtests/IntegrationTests.iOS/LoginViewController.cs | Removed legacy iOS controller implementation. |
| integrationtests/IntegrationTests.iOS/LaunchScreen.storyboard | Removed legacy iOS launch storyboard. |
| integrationtests/IntegrationTests.iOS/IntegrationTests.iOS.csproj | Removed legacy Xamarin.iOS project file. |
| integrationtests/IntegrationTests.iOS/Info.plist | Removed legacy iOS app plist. |
| integrationtests/IntegrationTests.iOS/Entitlements.plist | Removed legacy iOS entitlements. |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png | Removed legacy iOS icon (LFS pointer). |
| integrationtests/IntegrationTests.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json | Removed legacy iOS icon set metadata. |
| integrationtests/IntegrationTests.iOS/Application.cs | Removed legacy iOS app entry point. |
| integrationtests/IntegrationTests.iOS/AppDelegate.cs | Removed legacy iOS app delegate. |
| integrationtests/IntegrationTests.iOS.sln | Removed legacy iOS solution file. |
| integrationtests/IntegrationTests.Android/Resources/values/styles.xml | Removed legacy Xamarin.Android styles. |
| integrationtests/IntegrationTests.Android/Resources/values/Strings.xml | Removed legacy Xamarin.Android strings. |
| integrationtests/IntegrationTests.Android/Resources/values/ic_launcher_background.xml | Removed legacy Android launcher background color resource. |
| integrationtests/IntegrationTests.Android/Resources/values/dimens.xml | Removed legacy Android dimensions. |
| integrationtests/IntegrationTests.Android/Resources/values/colors.xml | Removed legacy Android colors. |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher.png | Removed legacy Android launcher icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher_round.png | Removed legacy Android round icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png | Removed legacy Android foreground icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher.png | Removed legacy Android launcher icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher_round.png | Removed legacy Android round icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png | Removed legacy Android foreground icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher.png | Removed legacy Android launcher icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher_round.png | Removed legacy Android round icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png | Removed legacy Android foreground icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher.png | Removed legacy Android launcher icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher_round.png | Removed legacy Android round icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png | Removed legacy Android foreground icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher.png | Removed legacy Android launcher icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher_round.png | Removed legacy Android round icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png | Removed legacy Android foreground icon (LFS pointer). |
| integrationtests/IntegrationTests.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml | Removed legacy adaptive icon XML. |
| integrationtests/IntegrationTests.Android/Resources/mipmap-anydpi-v26/ic_launcher_round.xml | Removed legacy adaptive round icon XML. |
| integrationtests/IntegrationTests.Android/Resources/menu/menu_main.xml | Removed legacy Android menu XML. |
| integrationtests/IntegrationTests.Android/Resources/layout/content_main.axml | Removed legacy Android layout XML. |
| integrationtests/IntegrationTests.Android/Resources/layout/activity_main.axml | Removed legacy Android activity layout XML. |
| integrationtests/IntegrationTests.Android/Resources/AboutResources.txt | Removed legacy Android resource documentation. |
| integrationtests/IntegrationTests.Android/Properties/AssemblyInfo.cs | Removed legacy Xamarin.Android assembly metadata. |
| integrationtests/IntegrationTests.Android/Properties/AndroidManifest.xml | Removed legacy Android manifest. |
| integrationtests/IntegrationTests.Android/MainActivity.cs | Removed legacy Android activity code. |
| integrationtests/IntegrationTests.Android/IntegrationTests.Android.csproj | Removed legacy Xamarin.Android project file. |
| integrationtests/IntegrationTests.Android/Assets/AboutAssets.txt | Removed legacy Android assets documentation. |
| integrationtests/IntegrationTests.Android.sln | Removed legacy Android solution file. |
| integrationtests/global.json | Removed integrationtests SDK extras pinning. |
| integrationtests/Directory.Build.props | Removed integrationtests-specific build configuration. |
Files not reviewed (8)
- integrationtests/IntegrationTests.Mac/LoginViewController.designer.cs: Language not supported
- integrationtests/IntegrationTests.WPF/Properties/Resources.Designer.cs: Language not supported
- integrationtests/IntegrationTests.WPF/Properties/Settings.Designer.cs: Language not supported
- integrationtests/IntegrationTests.WinForms/LoginControl.Designer.cs: Language not supported
- integrationtests/IntegrationTests.WinForms/MainForm.Designer.cs: Language not supported
- integrationtests/IntegrationTests.WinForms/Properties/Resources.Designer.cs: Language not supported
- integrationtests/IntegrationTests.WinForms/Properties/Settings.Designer.cs: Language not supported
- integrationtests/IntegrationTests.iOS/LoginViewController.designer.cs: Language not supported
…T-safe FromEventPattern, MAUI TFMs - Add AppShell.xaml + AppShell.xaml.cs for MAUI Shell navigation - Update App.xaml.cs to use new AppShell() instead of NavigationPage - Fix LoginPage.xaml.cs: replace async void Subscribe with SelectMany/FromAsync + instance DisplayAlert - Fix all three LoginViewModel.cs: Cancel uses Login.IsExecuting as canExecute via Subject<Unit> pattern - Fix WPF LoginView.xaml.cs: use strongly-typed Observable.FromEventPattern overload - Fix MAUI csproj: add proper platform-specific MAUI TFMs + OutputType=Exe Agent-Logs-Url: https://github.com/reactiveui/ReactiveUI/sessions/93dee6e0-8644-4b85-996e-8a19bd5ccf27 Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
…nd MAUI TFMs in sample projects (#4321) Addresses all open review comments on #4319. The MAUI sample used `NavigationPage` while calling `Shell.Current?.DisplayAlert(...)`, guaranteeing a null reference and silent no-op alerts. The `Cancel` command in all three sample ViewModels was always enabled, contradicting its doc comment. The WPF `PasswordChanged` binding used reflection-based `FromEventPattern`, and the MAUI project targeted `net10.0` instead of deployable platform TFMs. ## MAUI: Shell navigation - Added `AppShell.xaml` / `AppShell.xaml.cs`; `App.xaml.cs` now creates `new AppShell()` instead of `new NavigationPage(new LoginPage())` ## MAUI: Alert handling — no more `async void` Replaced the `async void` subscribe + `Shell.Current?.DisplayAlert` pattern with a proper Rx chain using the `ContentPage` instance method: ```csharp ViewModel.Login .SelectMany(success => Observable.FromAsync(() => DisplayAlert( success ? "Login Successful" : "Login Failed", success ? "Welcome!" : "Invalid credentials.", "OK"))) .Subscribe() .DisposeWith(d); ``` ## All three ViewModels: `Cancel` respects `Login.IsExecuting` A `Subject<Unit>` breaks the circular dependency (`Login` needs a cancel signal; `Cancel` needs `Login.IsExecuting`): ```csharp var cancelSubject = new Subject<Unit>(); Login = ReactiveCommand.CreateFromObservable( () => Observable.Return(Password is "secret") .Delay(TimeSpan.FromSeconds(1), scheduler) .TakeUntil(cancelSubject), canLogin, scheduler); Cancel = ReactiveCommand.Create( () => cancelSubject.OnNext(Unit.Default), Login.IsExecuting, scheduler); ``` ## WPF: AOT-safe `FromEventPattern` Swapped the reflection overload for the strongly-typed delegate overload: ```csharp Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>( h => Password.PasswordChanged += h, h => Password.PasswordChanged -= h) ``` ## MAUI csproj: proper platform TFMs Replaced `<TargetFramework>net10.0</TargetFramework>` with platform-specific TFMs (`net10.0-android`; `net10.0-ios`/`net10.0-maccatalyst` on macOS/Windows; `net10.0-windows10.0.19041.0` on Windows), added `<OutputType>Exe</OutputType>`, `SupportedOSPlatformVersion`, and Windows packaging properties. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
…ples - Remove integrationtests/ directory containing deprecated platform projects targeting UWP, Xamarin.iOS, Xamarin.Android, Xamarin.Mac, and legacy net472 WPF/WinForms examples - Add ReactiveUI.Samples.Wpf targeting net10.0 with RxAppBuilder, ReactiveUserControl, WhenActivated, Bind/BindCommand, and manual PasswordBox event marshaling - Add ReactiveUI.Samples.Winforms targeting net10.0 with RxAppBuilder, IViewFor, WhenActivated, Bind/BindCommand, and programmatic UI layout - Add ReactiveUI.Samples.Maui targeting net10.0 with UseReactiveUI builder, ReactiveContentPage, WhenActivated, Bind/BindCommand, and DisplayAlert for user feedback - All samples demonstrate a login flow with reactive validation, async command execution with cancellation, and proper disposal - Add new samples to reactiveui.slnx under /Examples/ folder
…rt` in MAUI sample (#4320)
…nd MAUI TFMs in sample projects (#4321) Addresses all open review comments on #4319. The MAUI sample used `NavigationPage` while calling `Shell.Current?.DisplayAlert(...)`, guaranteeing a null reference and silent no-op alerts. The `Cancel` command in all three sample ViewModels was always enabled, contradicting its doc comment. The WPF `PasswordChanged` binding used reflection-based `FromEventPattern`, and the MAUI project targeted `net10.0` instead of deployable platform TFMs. ## MAUI: Shell navigation - Added `AppShell.xaml` / `AppShell.xaml.cs`; `App.xaml.cs` now creates `new AppShell()` instead of `new NavigationPage(new LoginPage())` ## MAUI: Alert handling — no more `async void` Replaced the `async void` subscribe + `Shell.Current?.DisplayAlert` pattern with a proper Rx chain using the `ContentPage` instance method: ```csharp ViewModel.Login .SelectMany(success => Observable.FromAsync(() => DisplayAlert( success ? "Login Successful" : "Login Failed", success ? "Welcome!" : "Invalid credentials.", "OK"))) .Subscribe() .DisposeWith(d); ``` ## All three ViewModels: `Cancel` respects `Login.IsExecuting` A `Subject<Unit>` breaks the circular dependency (`Login` needs a cancel signal; `Cancel` needs `Login.IsExecuting`): ```csharp var cancelSubject = new Subject<Unit>(); Login = ReactiveCommand.CreateFromObservable( () => Observable.Return(Password is "secret") .Delay(TimeSpan.FromSeconds(1), scheduler) .TakeUntil(cancelSubject), canLogin, scheduler); Cancel = ReactiveCommand.Create( () => cancelSubject.OnNext(Unit.Default), Login.IsExecuting, scheduler); ``` ## WPF: AOT-safe `FromEventPattern` Swapped the reflection overload for the strongly-typed delegate overload: ```csharp Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>( h => Password.PasswordChanged += h, h => Password.PasswordChanged -= h) ``` ## MAUI csproj: proper platform TFMs Replaced `<TargetFramework>net10.0</TargetFramework>` with platform-specific TFMs (`net10.0-android`; `net10.0-ios`/`net10.0-maccatalyst` on macOS/Windows; `net10.0-windows10.0.19041.0` on Windows), added `<OutputType>Exe</OutputType>`, `SupportedOSPlatformVersion`, and Windows packaging properties. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: glennawatson <5834289+glennawatson@users.noreply.github.com>
…ld keyword - Use Shell.Current.DisplayAlertAsync instead of obsolete DisplayAlert - Use C# 13 field keyword for auto-properties with RaiseAndSetIfChanged across all example ViewModels (Samples, Builder.WpfApp, BlazorServer) - Remove explicit backing fields where field keyword replaces them - Add IDisposable to sample LoginViewModels for cancel Subject ownership - Suppress SA1500/SA1513 for field keyword property initializer syntax
The default CodeQL setup uses build-mode 'none' which results in low analysis quality for compiled languages (69% call targets, 82% expression types vs 85% thresholds). Switch to manual build mode with dotnet build to give CodeQL full compilation context. Excludes Android and Apple targets since platform SDKs are not available on the CI runner -- core, WPF, WinForms, WinUI, Blazor, and MAUI (net10.0) targets provide sufficient coverage for security analysis.
The workflow referenced the deleted integrationtests/ directory. Samples are now built as part of the main CI build via reactiveui.slnx.
The Android SDK has a Mono.Cecil XARRA7028 bug where RemoveRegisterAttribute cannot find System.Runtime v10.0.0.0 when building net10.0-android Exe projects on CI Linux runners. On CI Linux, fall back to net10.0 (library build) so the code still compiles and is validated. Locally and on CI Windows/macOS, the full platform TFMs are used including net10.0-android.
7c69530 to
5d16d4d
Compare
… issues Android has Cecil/permission bugs, iOS/Mac need Xcode 26.2 which is not available on CI runners yet. On CI, build as net10.0 library to validate compilation. Locally, full platform TFMs are used.
- Add Examples section to README with links to all sample projects - Remove UWP and Tizen from NuGet packages table - Update MAUI section to list supported .NET 9/10 TFMs - Update ruiprop snippets (VS, Rider, ReSharper) to use C# 13 field keyword - Remove Visual Studio for Mac snippets (platform discontinued)
- Code of Conduct now references the .NET Foundation Code of Conduct directly, matching the standard adopted by dotnet-foundation/foundation - Contributing guidelines simplified to reference the official docs at reactiveui.net/contribute instead of duplicating outdated instructions - Removed references to VS 2019, master branch, Windows 10 SDK 17763, and other stale content
Remove 200+ LFS rules for file types that don't exist in this repo (media, office docs, CAD, game assets, etc.). Keep only rules relevant to a .NET project: source code normalisation, images, fonts, archives, compiled binaries, and documents. Add modern file types: .slnx, .props, .targets, .yml, .yaml, .editorconfig. Set correct eol for .sln (CRLF) and .sh (LF).
…tegration-tests # Conflicts: # integrationtests/IntegrationTests.Android/IntegrationTests.Android.csproj
…platform TFMs Workload restore now handles previous SDK feature bands correctly, so the Android/iOS/Mac platform targets should work on CI.
…tandard platform TFMs" This reverts commit 083bc10.
- Create BuilderTestExecutorBase and BuilderTestExecutor in Executors/ for per-test state reset and core services bootstrap - Set assembly-level executor via [assembly: TestExecutor<BuilderTestExecutor>] - Remove builder init from assembly hooks in WinForms, Tests, Testing, AOT, and Builder test projects (keep ModeDetector only) - Add [assembly: TestExecutor<WinFormsTestExecutor>] for WinForms tests - Add [assembly: TestExecutor<AppBuilderTestExecutor>] for Testing tests - Remove inline ResetBuilderStateForTests/ResetForTesting calls from Builder test methods (executor handles reset) - Add custom RxAppMigrationTestExecutor for tests needing RxCacheSize/ RxState/RxSuspension reset - Add WithBlazorExecutor and WithDrawingExecutor for platform-specific builder configuration - Add global usings for Splat.Builder, TUnit.Core.Executors, TUnit.Core.Interfaces to Builder.Tests csproj
|
This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. |
What this means for you
Most of this PR is behind-the-scenes cleanup, but there are a few things that directly benefit you:
Updated code snippets -- The
ruipropsnippet (available in Visual Studio, Rider, and ReSharper) now generates the modern C# 13fieldkeyword pattern instead of explicit backing fields:New sample applications -- Three self-contained login samples you can use as a starting point or reference for your own projects:
Each sample shows RxAppBuilder initialization, WhenActivated lifecycle, Bind/BindCommand, reactive validation (login button disabled until fields are filled), async command execution with cancellation, and proper subscription disposal.
The existing Builder.WpfApp and Builder.BlazorServer examples have also been updated to use the
fieldkeyword.Visual Studio for Mac snippets removed -- The platform has been discontinued by Microsoft. Rider snippets remain available for macOS users.
Updated README -- Examples section added with links to all sample projects. UWP and Tizen removed from the packages table. MAUI section updated with supported .NET 9/10 TFMs.
Updated project docs -- Code of Conduct now references the .NET Foundation Code of Conduct directly. Contributing guidelines simplified to point to the official docs at reactiveui.net/contribute.
Behind the scenes
integrationtests/directory (UWP, Xamarin.iOS/Android/Mac, net472 WPF/WinForms) -- all targeted deprecated platformsactions-commonreusable workflow (C#, Actions, JavaScript)build-samples.ymlworkflow