Skip to content

feat(auth): implement one-click remember me sign-in functionality#3041

Merged
CharlVS merged 20 commits intodevfrom
add/implement-one-click-remember-me-sign-in
Sep 1, 2025
Merged

feat(auth): implement one-click remember me sign-in functionality#3041
CharlVS merged 20 commits intodevfrom
add/implement-one-click-remember-me-sign-in

Conversation

@CharlVS
Copy link
Copy Markdown
Collaborator

@CharlVS CharlVS commented Aug 2, 2025

  • Add automatic sign-in dialog for last logged-in wallet on app start
  • Store and retrieve wallet information in local storage when remember me is enabled
  • Implement remember me checkbox across all wallet flows (login, creation, import)
  • Add session-based dialog prevention to avoid multiple prompts
  • Support backward compatibility for existing stored wallet data

Technical changes:

  • Introduce AppDialog as replacement for deprecated PopupDispatcher
  • Add WalletId JSON storage with pubkey hash for precise wallet matching
  • Update wallet manager widgets to support remember me state
  • Add translations for new UI elements
  • Implement proper storage cleanup when remember me is disabled

This enhancement streamlines the user experience by allowing quick access to
previously used wallets while maintaining security through password requirements.

Summary by CodeRabbit

  • New Features

    • Introduced a "One-click Login" (Quick Login) option across wallet creation, import, and login screens, allowing users to skip wallet selection and enable faster access with biometrics.
    • Added a toggle switch for enabling/disabling Quick Login on relevant wallet flows.
    • The app now remembers the last logged-in wallet and prompts users at startup for quick access if enabled.
  • Improvements

    • Enhanced warnings and clarity in HD wallet mode messaging.
    • Updated dialog styling and introduced a new dialog system for consistent user experience.
  • Deprecations

    • Marked the old popup dialog system as deprecated in favor of the new dialog component.
  • Localization

    • Added and updated translation entries for Quick Login and HD wallet warnings.
  • Developer Experience

    • Added new lint rules and a development dependency for improved code quality.

CharlVS added 2 commits August 2, 2025 17:36
- Add automatic sign-in dialog for last logged-in wallet on app start
- Store and retrieve wallet information in local storage when remember me is enabled
- Implement remember me checkbox across all wallet flows (login, creation, import)
- Add session-based dialog prevention to avoid multiple prompts
- Support backward compatibility for existing stored wallet data

Technical changes:
- Introduce AppDialog as replacement for deprecated PopupDispatcher
- Add WalletId JSON storage with pubkey hash for precise wallet matching
- Update wallet manager widgets to support remember me state
- Add translations for new UI elements
- Implement proper storage cleanup when remember me is disabled

This enhancement streamlines the user experience by allowing quick access to
previously used wallets while maintaining security through password requirements.
@CharlVS CharlVS self-assigned this Aug 2, 2025
@CharlVS CharlVS added the UX Cosmetic or flow efficiency enhancements for improved User Experience label Aug 2, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Aug 2, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

This update introduces a "remember me" or "one-click login" feature for wallets, allowing users to persist their last logged-in wallet and streamline future logins. It adds new UI components, translation strings, and persistent storage logic. The update also deprecates the old popup dialog system in favor of a new AppDialog class, and refines linting configuration.

Changes

Cohort / File(s) Change Summary
Lint Configuration
analysis_options.yaml, pubspec.yaml
Added bloc_lint as a dev dependency and included its ruleset in analysis options, extending linting coverage.
Translations
assets/translations/en.json
Added translation keys for one-click login and updated the HD wallet mode switch subtitle with a warning.
Dialog System Refactor
lib/dispatchers/popup_dispatcher.dart, lib/shared/widgets/app_dialog.dart
Deprecated PopupDispatcher and introduced new AppDialog class with static methods for dialog display and callbacks.
Quick Login UI Component
lib/shared/widgets/quick_login_switch.dart
Added new QuickLoginSwitch widget for toggling one-click login in wallet-related UIs.
Wallet Remember Me Feature (Core Logic & UI)
lib/views/main_layout/main_layout.dart, lib/views/wallets_manager/widgets/wallets_manager.dart, lib/views/wallets_manager/wallets_manager_wrapper.dart, lib/views/wallets_manager/widgets/iguana_wallets_manager.dart, lib/shared/constants.dart
Implemented logic for storing, retrieving, and displaying the remembered wallet dialog; propagated rememberMe parameter through wallet manager components.
Wallet Creation & Import Quick Login Integration
lib/views/wallets_manager/widgets/wallet_creation.dart, lib/views/wallets_manager/widgets/wallet_import_by_file.dart, lib/views/wallets_manager/widgets/wallet_import_wrapper.dart, lib/views/wallets_manager/widgets/wallet_simple_import.dart
Updated wallet creation and import flows to include a quick login toggle and propagate the rememberMe flag through callback signatures and UI.
Wallet Login Quick Login Integration
lib/views/wallets_manager/widgets/wallet_login.dart
Added quick login toggle to wallet login UI and updated callback to include quick login state.
HD Wallet Mode Switch Style Update
lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart
Updated subtitle text style to use theme and removed const from icon instantiation.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant MainLayout
    participant Storage
    participant WalletsManagerWrapper
    participant AppDialog

    User->>MainLayout: App start
    MainLayout->>Storage: Read last_logged_in_wallet
    alt Wallet data exists
        MainLayout->>WalletsManagerWrapper: Parse and match wallet
        alt Wallet found
            MainLayout->>AppDialog: Show remembered wallet dialog
            AppDialog->>User: Display wallet options
        else Wallet not found
            MainLayout->>Storage: Delete invalid wallet data
        end
    end
Loading
sequenceDiagram
    participant User
    participant WalletCreation/Import/Login
    participant QuickLoginSwitch
    participant IguanaWalletsManager
    participant Storage

    User->>WalletCreation/Import/Login: Initiate wallet creation/import/login
    WalletCreation/Import/Login->>QuickLoginSwitch: Toggle quick login
    WalletCreation/Import/Login->>IguanaWalletsManager: Pass rememberMe flag
    IguanaWalletsManager->>Storage: Store or remove last_logged_in_wallet based on rememberMe
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

enhancement, QA

Suggested reviewers

  • smk762
  • AndrewDelaney

Poem

A bunny hops with nimble glee,
For wallets now remember me!
With one quick click, you’re in the flow—
No more searching, off you go!
Dialogs new and lints refined,
The code is neat, the UX kind.
🐇✨

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch add/implement-one-click-remember-me-sign-in

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@CharlVS
Copy link
Copy Markdown
Collaborator Author

CharlVS commented Aug 2, 2025

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Aug 2, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Aug 2, 2025

Visit the preview URL for this PR (updated for commit 5eb3f99):

https://walletrc--pull-3041-merge-ri6n088r.web.app

(expires Mon, 08 Sep 2025 11:08:08 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: f66a4ff03faa546f12f0ae5a841bd9eff2714dcc

cursor[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
lib/shared/widgets/app_dialog.dart (1)

134-162: Consider improving the callback design in showWithCallback.

The showWithCallback method always passes null to the onSuccess callback (line 158), which may not provide useful information to the caller about the dialog result.

Consider allowing the child to provide a result value:

-      child: childBuilder(() {
-        Navigator.of(context).pop();
-        if (onSuccess != null) {
-          onSuccess(null); // Pass null since we don't have a specific result
-        }
-      }),
+      child: childBuilder((T? result) {
+        Navigator.of(context).pop(result);
+        if (onSuccess != null) {
+          onSuccess(result);
+        }
+      }),

And update the callback type:

-    required Widget Function(VoidCallback onSuccess) childBuilder,
+    required Widget Function(void Function(T?) onSuccess) childBuilder,
lib/views/main_layout/main_layout.dart (1)

141-149: Wallet matching logic with TODO.

The wallet matching logic currently only matches by name, with a TODO comment indicating future enhancement for pubkey hash verification. This is a reasonable approach for initial implementation.

Consider implementing the pubkey hash verification mentioned in the TODO comment for more precise wallet matching:

// If we have a pubkey hash in the stored WalletId, ensure it matches
if (walletId.hasFullIdentity && w.config.pubKey != null) {
  // Convert pubKey to hash and compare with walletId.pubkeyHash
  final pubKeyHash = /* implement hash calculation */;
  return pubKeyHash == walletId.pubkeyHash;
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 976943a and 3a3f88b.

⛔ Files ignored due to path filters (2)
  • lib/generated/codegen_loader.g.dart is excluded by !**/generated/**
  • pubspec.lock is excluded by !**/*.lock
📒 Files selected for processing (17)
  • analysis_options.yaml (1 hunks)
  • assets/translations/en.json (3 hunks)
  • lib/dispatchers/popup_dispatcher.dart (4 hunks)
  • lib/shared/constants.dart (2 hunks)
  • lib/shared/widgets/app_dialog.dart (1 hunks)
  • lib/shared/widgets/quick_login_switch.dart (1 hunks)
  • lib/views/main_layout/main_layout.dart (9 hunks)
  • lib/views/wallets_manager/wallets_manager_wrapper.dart (3 hunks)
  • lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart (1 hunks)
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart (13 hunks)
  • lib/views/wallets_manager/widgets/wallet_creation.dart (5 hunks)
  • lib/views/wallets_manager/widgets/wallet_import_by_file.dart (6 hunks)
  • lib/views/wallets_manager/widgets/wallet_import_wrapper.dart (2 hunks)
  • lib/views/wallets_manager/widgets/wallet_login.dart (6 hunks)
  • lib/views/wallets_manager/widgets/wallet_simple_import.dart (7 hunks)
  • lib/views/wallets_manager/widgets/wallets_manager.dart (2 hunks)
  • pubspec.yaml (1 hunks)
🧰 Additional context used
🧠 Learnings (6)
📚 Learning: in the komodo wallet project, part files share imports with their parent files. the import for `app_...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2566
File: lib/bloc/coins_bloc/coins_bloc.dart:10-10
Timestamp: 2025-04-01T15:51:37.060Z
Learning: In the Komodo Wallet project, part files share imports with their parent files. The import for `app_config.dart` in `coins_bloc.dart` is necessary because the part file `coins_state.dart` uses `excludedAssetList` from that package.

Applied to files:

  • lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart
  • pubspec.yaml
  • lib/views/wallets_manager/widgets/wallet_import_wrapper.dart
  • analysis_options.yaml
  • lib/views/wallets_manager/wallets_manager_wrapper.dart
  • lib/views/wallets_manager/widgets/wallet_creation.dart
  • lib/views/wallets_manager/widgets/wallet_import_by_file.dart
  • lib/views/wallets_manager/widgets/wallet_login.dart
  • lib/views/wallets_manager/widgets/wallet_simple_import.dart
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart
  • lib/views/main_layout/main_layout.dart
📚 Learning: the `excludedassetlist` from `app_config.dart` is used in the `_filterexcludedassets` method in `coi...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2566
File: lib/bloc/coins_bloc/coins_bloc.dart:10-10
Timestamp: 2025-04-01T15:51:37.060Z
Learning: The `excludedAssetList` from `app_config.dart` is used in the `_filterExcludedAssets` method in `coins_state.dart`. Since `coins_state.dart` is a part file of `coins_bloc.dart`, the import needs to be in the parent file even though it's not directly used there. In Dart, part files share the namespace and imports of their parent files.

Applied to files:

  • pubspec.yaml
  • lib/views/wallets_manager/widgets/wallet_import_wrapper.dart
  • analysis_options.yaml
  • lib/views/wallets_manager/widgets/wallet_creation.dart
  • lib/views/wallets_manager/widgets/wallet_import_by_file.dart
  • lib/views/wallets_manager/widgets/wallet_login.dart
  • lib/views/wallets_manager/widgets/wallet_simple_import.dart
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart
  • lib/views/main_layout/main_layout.dart
📚 Learning: it's acceptable to use unconditional `dart:io` imports in the komodo wallet codebase when the usage ...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2608
File: lib/bloc/fiat/fiat_onramp_form/fiat_form_bloc.dart:2-3
Timestamp: 2025-05-01T21:00:36.970Z
Learning: It's acceptable to use unconditional `dart:io` imports in the Komodo wallet codebase when the usage is guarded by `!kIsWeb` conditional checks that prevent the platform-specific code from being executed in web environments.

Applied to files:

  • lib/views/wallets_manager/widgets/wallet_import_wrapper.dart
  • lib/views/wallets_manager/widgets/wallet_creation.dart
  • lib/views/wallets_manager/widgets/wallet_import_by_file.dart
  • lib/views/wallets_manager/widgets/wallet_login.dart
  • lib/views/wallets_manager/widgets/wallet_simple_import.dart
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart
  • lib/views/main_layout/main_layout.dart
📚 Learning: in the komodo wallet project, test functions are defined in individual files under `test_units/tests...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2611
File: test_units/tests/system_health/http_head_time_provider_test.dart:8-24
Timestamp: 2025-05-08T19:05:13.083Z
Learning: In the Komodo Wallet project, test functions are defined in individual files under `test_units/tests/` but are executed through the central entry point in `test_units/main.dart`, so individual test files don't need their own `main()` function.

Applied to files:

  • lib/views/wallets_manager/widgets/wallet_creation.dart
  • lib/views/wallets_manager/widgets/wallet_login.dart
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart
  • lib/views/main_layout/main_layout.dart
📚 Learning: in the komodo wallet project, test files are structured to define test functions that are called fro...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2611
File: test_units/tests/system_health/system_clock_repository_test.dart:7-8
Timestamp: 2025-05-08T19:07:13.442Z
Learning: In the Komodo Wallet project, test files are structured to define test functions that are called from a central test runner in test_units/main.dart, rather than each test file having its own main() function.

Applied to files:

  • lib/views/wallets_manager/widgets/wallet_creation.dart
  • lib/views/wallets_manager/widgets/wallet_login.dart
  • lib/views/wallets_manager/widgets/iguana_wallets_manager.dart
  • lib/views/main_layout/main_layout.dart
📚 Learning: in the coinsmanagerbloc, `state.selectedcoins` is used separately from `state.coins` to indicate whe...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2976
File: lib/bloc/coins_manager/coins_manager_bloc.dart:82-83
Timestamp: 2025-07-23T09:31:17.738Z
Learning: In the CoinsManagerBloc, `state.selectedCoins` is used separately from `state.coins` to indicate whether a coin is enabled or not in the UI. The order of Set deduplication when merging coin lists doesn't affect UI behavior because selection state is tracked independently from the coin list used for filtering and sorting.

Applied to files:

  • lib/views/main_layout/main_layout.dart
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (17)
  • GitHub Check: Test web-app-linux-profile
  • GitHub Check: Test web-app-macos
  • GitHub Check: validate_code_guidelines
  • GitHub Check: Cursor Bugbot
  • GitHub Check: unit_tests
  • GitHub Check: build_and_preview
  • GitHub Check: Build Mobile (Android)
  • GitHub Check: Build Mobile (iOS)
  • GitHub Check: Build Desktop (macos)
  • GitHub Check: Build Desktop (windows)
  • GitHub Check: Build Desktop (linux)
  • GitHub Check: build-android-docker
  • GitHub Check: build-android-docker
  • GitHub Check: Build Desktop (linux)
  • GitHub Check: Build Desktop (windows)
  • GitHub Check: Build Mobile (iOS)
  • GitHub Check: Build Mobile (Android)
🔇 Additional comments (57)
pubspec.yaml (1)

175-175: LGTM! Good addition for code quality.

Adding bloc_lint as a dev dependency will help enforce Bloc-specific coding standards and best practices throughout the codebase, which is valuable given the existing use of flutter_bloc.

lib/shared/constants.dart (2)

11-11: LGTM! Well-defined constant for wallet persistence.

The new lastLoggedInWalletKey constant provides a clean approach for storing/retrieving the last logged-in wallet, supporting the "remember me" functionality.


42-44: LGTM! Improved code formatting.

The multi-line formatting with trailing commas improves readability while maintaining the same functionality.

assets/translations/en.json (2)

134-136: LGTM! Clear and informative translations for the one-click login feature.

The new translation keys provide clear, user-friendly descriptions of the one-click login functionality with helpful tooltips and guidance about biometrics.


447-447: LGTM! Improved warning clarity for HD wallet mode.

The updated subtitle text provides a stronger warning about the implications of switching to HD mode, making it clearer to users that addresses and balances will be different (while reassuring that coins aren't lost).

lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart (2)

24-24: Const removal noted.

The const modifier was removed from the Icon widget. This may be necessary for dynamic behavior, though it results in a minor performance cost as the widget can no longer be cached at compile time.


30-30: LGTM! Improved theming approach.

Replacing the hardcoded TextStyle(fontSize: 14) with Theme.of(context).textTheme.bodySmall provides better consistency with the app's design system and allows the text to adapt to theme changes.

analysis_options.yaml (1)

10-12: LGTM! Enhanced linting with Bloc-specific rules.

Adding bloc_lint/recommended.yaml alongside the existing Flutter lints will help enforce Bloc best practices and catch potential issues in state management code. The list structure is the correct YAML syntax for multiple includes.

lib/views/wallets_manager/wallets_manager_wrapper.dart (2)

15-16: LGTM! Clean integration of remember me functionality.

The rememberMe parameter is properly added with a sensible default value and correctly propagated through the widget hierarchy to WalletsManager.

Also applies to: 23-23, 66-66


45-47: Minor formatting improvements.

The formatting changes to the Text widget style and WalletsTypeList instantiation improve code readability without affecting functionality.

Also applies to: 51-51

lib/views/wallets_manager/widgets/wallets_manager.dart (2)

16-17: LGTM! Appropriate selective implementation of remember me.

The rememberMe parameter is correctly added and passed only to IguanaWalletsManager for iguana/hdwallet types, which makes sense as hardware wallets likely have different authentication flows.

Also applies to: 24-24, 37-37


41-41: Minor formatting improvement.

The formatting change to HardwareWalletsManager improves code consistency.

lib/views/wallets_manager/widgets/wallet_import_wrapper.dart (2)

17-19: LGTM! Correct interface update for remember me functionality.

The onImport callback signature is properly updated to include the required rememberMe parameter, ensuring consistent handling across the wallet import flow.


78-78: Minor formatting improvement.

The enum declaration formatting change improves code conciseness.

lib/dispatchers/popup_dispatcher.dart (2)

11-36: Excellent deprecation documentation and approach.

The comprehensive deprecation notice with migration examples and proper @Deprecated annotation follows best practices. This will help developers transition smoothly to the new AppDialog while maintaining backward compatibility.


81-82: Minor formatting improvements.

The formatting changes to padding parameters improve code readability without affecting functionality.

Also applies to: 93-94, 104-104

lib/views/wallets_manager/widgets/wallet_creation.dart (2)

13-13: LGTM! Complete integration of remember me functionality.

The implementation correctly:

  • Imports and uses the QuickLoginSwitch widget
  • Updates the onCreate callback signature to include rememberMe
  • Manages local state for the remember me option
  • Integrates the UI component appropriately in the form
  • Passes the remember me state through the callback

The widget key for testing is also properly provided.

Also applies to: 30-32, 48-48, 172-179, 211-211


217-219: Minor formatting improvement.

The formatting change to the validateWalletName call improves code readability.

lib/shared/widgets/quick_login_switch.dart (1)

5-36: Well-designed reusable widget for quick login toggle.

The implementation follows Flutter best practices with a clean, focused responsibility. The inclusion of a tooltip with info icon enhances user experience by providing additional context about the feature.

lib/views/wallets_manager/widgets/wallet_import_by_file.dart (5)

15-15: LGTM: Clean import addition.

The import of the new QuickLoginSwitch widget is properly added.


34-40: LGTM: Callback signature extension for remember me feature.

The onImport callback signature is properly extended to include the rememberMe parameter, maintaining consistency with the feature implementation across the codebase.


55-55: LGTM: Appropriate state initialization.

The _rememberMe state variable is properly initialized to false, providing a sensible default.


189-194: LGTM: Clean UI integration.

The QuickLoginSwitch is properly integrated into the UI with appropriate state management and callback handling.


285-285: LGTM: Consistent parameter passing.

The rememberMe parameter is correctly passed to the onImport callback, completing the feature integration.

lib/views/wallets_manager/widgets/wallet_simple_import.dart (5)

18-18: LGTM: Consistent import pattern.

The QuickLoginSwitch import follows the same pattern as other widget imports in the project.


31-37: LGTM: Consistent callback signature extension.

The onImport callback signature extension matches the pattern established in other import widgets, maintaining consistency across the codebase.


63-63: LGTM: Proper state initialization.

The _rememberMe boolean state is appropriately initialized to false.


201-207: LGTM: Well-placed UI integration.

The QuickLoginSwitch is logically placed in the password step, allowing users to set their preference during the import process.


353-353: LGTM: Complete feature integration.

The rememberMe parameter is correctly passed to complete the feature implementation flow.

lib/views/wallets_manager/widgets/wallet_login.dart (6)

15-15: LGTM: Consistent import addition.

The QuickLoginSwitch import is properly added following project conventions.


24-24: LGTM: Well-designed constructor parameter.

The initialQuickLogin parameter allows parent components to control the initial state of the quick login toggle, providing good flexibility for the feature.

Also applies to: 32-32


29-29: LGTM: Callback signature extension for login flow.

The onLogin callback is properly extended to include the boolean parameter for quick login state, maintaining consistency with the feature implementation.


42-42: LGTM: Proper state management.

The _isQuickLoginEnabled state is correctly initialized from the constructor parameter, allowing external control while maintaining internal state management.

Also applies to: 49-49


129-134: LGTM: Strategic UI placement.

The QuickLoginSwitch is well-positioned between the password field and HD wallet mode switch, providing a logical flow for user interaction.


89-89: LGTM: Complete callback integration.

The _isQuickLoginEnabled state is correctly passed to the onLogin callback, completing the feature integration in the login flow.

lib/shared/widgets/app_dialog.dart (2)

5-62: Excellent documentation and migration guidance.

The comprehensive documentation with clear migration examples will help developers transition from the deprecated PopupDispatcher. This is a great example of how to document breaking changes.


76-128: Well-implemented dialog with responsive design.

The show method properly leverages Flutter's native showDialog with appropriate styling and responsive considerations. The parameter defaults and theming integration look solid.

lib/views/wallets_manager/widgets/iguana_wallets_manager.dart (10)

1-1: New import for async operations.

The dart:async import is correctly added to support the new asynchronous _updateRememberedWallet method and the unawaited function call.


11-11: New imports for storage functionality.

The imports for WalletsRepository, GetStorage, and Constants are properly added to support the remember me feature's storage requirements.

Also applies to: 17-18


34-34: Constructor parameter for remember me functionality.

The rememberMe parameter is correctly added with a default value of false, maintaining backward compatibility.

Also applies to: 43-43


56-56: State initialization for remember me.

The _rememberMe state variable is properly initialized from the widget parameter in initState.

Also applies to: 65-65


177-177: Integration with WalletLogIn widget.

The initialQuickLogin parameter is correctly passed to the WalletLogIn widget, enabling the UI to reflect the current remember me state.


251-256: Remember me parameter in wallet creation.

The rememberMe parameter is properly added to the _createWallet method and the state is correctly updated. This ensures the remember me preference is captured during wallet creation.


271-276: Remember me parameter in wallet import.

The rememberMe parameter is properly added to the _importWallet method with correct state management. This maintains consistency across all wallet operations.


291-298: Method signature update for login.

The _logInToWallet method signature is correctly updated to accept the rememberMe parameter and properly updates the state. The async nature is appropriate for the storage operations that follow.


343-343: Async storage update call.

Using unawaited for the _updateRememberedWallet call is appropriate here since this is a fire-and-forget storage operation that shouldn't block the UI flow. The operation happens after successful authentication.


353-368: Storage key definition verified

I’ve confirmed that lastLoggedInWalletKey is defined in lib/shared/constants.dart, so the storage reads and writes here are using a valid key. No further changes needed.

lib/views/main_layout/main_layout.dart (10)

20-21: New imports for remember me functionality.

The imports are correctly added to support:

  • Storage operations (GetStorage)
  • Constants for storage keys
  • Wallet repository and types
  • Dialog presentation (AppDialog)

All imports appear necessary for the implemented functionality.

Also applies to: 27-31


41-41: Dialog prevention mechanism.

The _hasShownRememberMeDialog flag is a good approach to prevent multiple dialog presentations within a session. This ensures a clean user experience.


54-54: Integration with initialization flow.

The _maybeShowRememberedWallet call is properly placed in the post-frame callback, ensuring the widget tree is fully built before attempting to show dialogs.


68-71: Dispose method implementation.

The dispose method is added but only calls super.dispose(). This is acceptable as the current implementation doesn't require additional cleanup.


75-82: Dialog reset on logout.

The BlocConsumer correctly resets the _hasShownRememberMeDialog flag when the user logs out, allowing the dialog to be shown again on subsequent sessions. This is essential for proper functionality.


110-119: Remember me dialog conditions.

The method correctly checks:

  • User is logged out (AuthorizeMode.noLogin)
  • Dialog hasn't been shown yet
  • Storage data exists

These conditions ensure the dialog only appears when appropriate.


121-134: Backward compatibility handling.

The implementation correctly handles both new JSON format (WalletId) and legacy string format (wallet name). This maintains compatibility with existing stored data while supporting the enhanced storage format.


159-168: Dialog presentation using AppDialog.

The implementation correctly uses the new AppDialog class to replace the deprecated PopupDispatcher. The dialog configuration looks appropriate with proper width constraint and callback handling.


169-173: Error handling for invalid data.

The try-catch block appropriately handles parsing errors by clearing invalid stored data. This prevents the app from getting stuck with corrupted storage data.


212-216: MainLayoutFab constructor cleanup.

The constructor parameters are properly organized with explicit parameter names and types. This improves code readability and maintainability.

cursor[bot]

This comment was marked as outdated.

@CharlVS CharlVS closed this Aug 2, 2025
@CharlVS CharlVS reopened this Aug 2, 2025
cursor[bot]

This comment was marked as outdated.

@CharlVS CharlVS force-pushed the add/implement-one-click-remember-me-sign-in branch from 3cdd8a9 to 7f1a0a6 Compare August 3, 2025 13:13
cursor[bot]

This comment was marked as outdated.

TODO(@takenagain): Refactor remember-me feature to bloc
cursor[bot]

This comment was marked as outdated.

@smk762 smk762 self-requested a review August 4, 2025 07:05
@smk762
Copy link
Copy Markdown
Collaborator

smk762 commented Aug 4, 2025

There is a problem with this PR which leads to a crash (confirmed on both web and linux desktop).

To replicate:

  • create/import a wallet, and set it to be the default for quick login.
  • log out / reload app / tab and create a second wallet, and set it to be the default.
  • log out / reload app / tab. Second wallet login should be up as the default.
  • cancel to get back to wallet menu
  • select the first wallet, and log in (with it set to be the default).
  • see a grey / white screen of sadness.
image

Overall desktop responsiveness feels more degraded than usual on initial import of mature wallet also. The only logs I could see were captured on my final replication run (previous runs appeared to stop logging after the first null check error
)


[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Null check operator used on a null value
#0      State.context (package:flutter/src/widgets/framework.dart:959)
#1      _ConnectWalletButtonState._createPopupDispatcher.<anonymous closure> (package:web_dex/shared/widgets/connect_wallet/connect_wallet_button.dart:113)
#2      _IguanaWalletsManagerState._onLogIn (package:web_dex/views/wallets_manager/widgets/iguana_wallets_manager.dart:346)
#3      _IguanaWalletsManagerState.build.<anonymous closure> (package:web_dex/views/wallets_manager/widgets/iguana_wallets_manager.dart:77)
#4      _BlocListenerBaseState._subscribe.<anonymous closure> (package:flutter_bloc/src/bloc_listener.dart:216)
#5      _rootRunUnary (dart:async/zone.dart:1538)
#6      _CustomZone.runUnary (dart:async/zone.dart:1429)
#7      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1329)
#8      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:381)
#9      _DelayedData.perform (dart:async/stream_impl.dart:573)
#10     _PendingEvents.handleNext (dart:async/stream_impl.dart:678)
#11     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:649)
#12     _rootRun (dart:async/zone.dart:1517)
#13     _CustomZone.run (dart:async/zone.dart:1422)
#14     _CustomZone.runGuarded (dart:async/zone.dart:1321)
#15     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
#16     _rootRun (dart:async/zone.dart:1525)
#17     _CustomZone.run (dart:async/zone.dart:1422)
#18     _CustomZone.runGuarded (dart:async/zone.dart:1321)
#19     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
#20     _microtaskLoop (dart:async/schedule_microtask.dart:40)
#21     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49)

Failed to pre-cache balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
Failed to pre-cache balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
Failed to pre-cache balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
Failed to pre-cache balance for Cosmos: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection closed before full header was received"}}
Failed to pre-cache balance for Cosmos: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection closed before full header was received"}}
Failed to pre-cache balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Failed to get balance for Polygon: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
#0      BalanceManager.getBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:182)
<asynchronous suspension>
#1      BalanceManager._startWatchingBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:292)
<asynchronous suspension>

[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Failed to get balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
#0      BalanceManager.getBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:182)
<asynchronous suspension>
#1      BalanceManager._startWatchingBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:292)
<asynchronous suspension>

[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Failed to get balance for USD Coin: GeneralErrorResponse: {"mmrpc":"","error":null,"error_path":null,"error_type":null,"error_data":null,"error_trace":null,"object":{"code":-1,"error":"ConnectionError","message":"Connection refused"}}
#0      BalanceManager.getBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:182)
<asynchronous suspension>
#1      BalanceManager._startWatchingBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:292)
<asynchronous suspension>

Error getting version: ConnectionError
[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Null check operator used on a null value
#0      TransactionHistoryManager.watchTransactions.<anonymous closure>.<anonymous closure> (package:komodo_defi_sdk/src/transaction_history/transaction_history_manager.dart:257)
#1      _runGuarded (dart:async/stream_controller.dart:838)
#2      _BroadcastStreamController._callOnCancel (dart:async/broadcast_stream_controller.dart:357)
#3      _BroadcastStreamController._recordCancel (dart:async/broadcast_stream_controller.dart:236)
#4      _ControllerSubscription._onCancel (dart:async/stream_controller.dart:881)
#5      _BufferingStreamSubscription._cancel (dart:async/stream_impl.dart:293)
#6      _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:438)
#7      _DelayedDone.perform (dart:async/stream_impl.dart:592)
#8      _PendingEvents.handleNext (dart:async/stream_impl.dart:678)
#9      _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:649)
#10     _rootRun (dart:async/zone.dart:1517)
#11     _CustomZone.run (dart:async/zone.dart:1422)
#12     _CustomZone.runGuarded (dart:async/zone.dart:1321)
#13     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
#14     _rootRun (dart:async/zone.dart:1525)
#15     _CustomZone.run (dart:async/zone.dart:1422)
#16     _CustomZone.runGuarded (dart:async/zone.dart:1321)
#17     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
#18     _microtaskLoop (dart:async/schedule_microtask.dart:40)
#19     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49)

[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Concurrent modification during iteration: _Map len:0.
#0      _CompactIterator.moveNext (dart:_compact_hash:862)
#1      BalanceManager._resetState (package:komodo_defi_sdk/src/balances/balance_manager.dart:123)
<asynchronous suspension>
#2      BalanceManager._handleAuthStateChanged (package:komodo_defi_sdk/src/balances/balance_manager.dart:115)
<asynchronous suspension>

Error getting version: ConnectionError
Error getting version: ConnectionError
Failed to pre-cache balance for USD Coin: AuthException{type: AuthExceptionType.unauthorized, message: Not signed in, details: {}}
Error getting version: ConnectionError
Failed to pre-cache balance for USD Coin: AuthException{type: AuthExceptionType.unauthorized, message: Not signed in, details: {}}
Error getting version: ConnectionError
[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Failed to get balance for Avalanche: AuthException{type: AuthExceptionType.unauthorized, message: Not signed in, details: {}}
#0      BalanceManager.getBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:182)
<asynchronous suspension>
#1      BalanceManager._startWatchingBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:292)
<asynchronous suspension>

Error getting version: ConnectionError
[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Failed to get balance for USD Coin (OLD): AuthException{type: AuthExceptionType.unauthorized, message: Not signed in, details: {}}
#0      BalanceManager.getBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:182)
<asynchronous suspension>
#1      BalanceManager._startWatchingBalance (package:komodo_defi_sdk/src/balances/balance_manager.dart:292)
<asynchronous suspension>

Error getting version: ConnectionError
Error getting version: ConnectionError
Failed to pre-cache balance for Binance USD: AuthException{type: AuthExceptionType.unauthorized, message: Not signed in, details: {}}

Strangely though, from the grey / white screen of sadness - if you resize the browser tab or desktop app window - the UI elements are once again visible, and respond to user interaction. This indicates the fault is not a fatal crash, but more of a draw / state fail.

cursor[bot]

This comment was marked as outdated.

@CharlVS CharlVS force-pushed the add/implement-one-click-remember-me-sign-in branch from a6fb374 to 49b0919 Compare August 4, 2025 17:42
cursor[bot]

This comment was marked as outdated.

@CharlVS CharlVS added the QA Ready for QA Testing label Aug 6, 2025
@CharlVS CharlVS force-pushed the add/implement-one-click-remember-me-sign-in branch from 1235ebf to 28351f6 Compare August 6, 2025 12:40
@CharlVS
Copy link
Copy Markdown
Collaborator Author

CharlVS commented Aug 6, 2025

@smk762, please give it a whiz now. If this doesn't resolve the issue, please attach a video. The problem stems from my attempt to refactor the current flawed navigation/dialog system. We're missing out on cool goodies like page transitions, and it unnecessarily complicates things when it can easily be handled using the built-in navigation system.

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@smk762
Copy link
Copy Markdown
Collaborator

smk762 commented Aug 12, 2025

@smk762, please give it a whiz now. If this doesn't resolve the issue, please attach a video. The problem stems from my attempt to refactor the current flawed navigation/dialog system. We're missing out on cool goodies like page transitions, and it unnecessarily complicates things when it can easily be handled using the built-in navigation system.

Current build no longer autoselects any wallet on launch.

…dd rememberMe param and updated mnemonic validation errors
…ogin to restore password manager saving\n\n- Remove premature TextInput.finishAutofillContext(shouldSave: true) on submit\n- Call finishAutofillContext(shouldSave: true) in onLogIn() after AuthBloc signals logged-in\n\nThis resolves the regression introduced with one-click login that prevented credential managers from saving/recalling credentials.
@CharlVS CharlVS requested review from gcharang and smk762 and removed request for smk762 August 14, 2025 21:07
@smk762
Copy link
Copy Markdown
Collaborator

smk762 commented Aug 15, 2025

functioning as expected on web ✔️
functioning as expected on linux desktop ✔️

@smk762
Copy link
Copy Markdown
Collaborator

smk762 commented Aug 15, 2025

Android also confirmed functioning as expected, with a caveat. In first tests today, I did encounter the grey screen of lassitude once again.
First time, it seemed to fix itself in under 30 seconds as I looked away and looked back to see it on the home screen, and functional.
Second time, to replicate, it got well and truly stuck, with the following logs

I/flutter ( 4007): FEEDBACK_API_KEY not found. Trading disabled.
I/flutter ( 4007): AppBlocObserver -> onError
I/flutter ( 4007): AuthBloc: AuthException{type: AuthExceptionType.generalAuthError, message: An unexpected error occurred while signing out: Exception: Error stopping KDF: KDF did not stop in time., details: {}}
I/flutter ( 4007): Trace: #0      KomodoDefiLocalAuth.signOut (package:komodo_defi_local_auth/src/komodo_defi_local_auth.dart:508)
I/flutter ( 4007): <asynchronous suspension>
I/flutter ( 4007): #1      AuthBloc._onLogout (package:web_dex/bloc/auth_bloc/auth_bloc.dart:67)
I/flutter ( 4007): <asynchronous suspension>
I/flutter ( 4007): #2      Bloc.on.<anonymous closure>.handleEvent (package:bloc/src/bloc.dart:226)
I/flutter ( 4007): <asynchronous suspension>
I/flutter ( 4007): 
E/flutter ( 4007): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: AuthException{type: AuthExceptionType.generalAuthError, message: An unexpected error occurred while signing out: Exception: Error stopping KDF: KDF did not stop in time., details: {}}
E/flutter ( 4007): #0      KomodoDefiLocalAuth.signOut (package:komodo_defi_local_auth/src/komodo_defi_local_auth.dart:508)
E/flutter ( 4007): <asynchronous suspension>
E/flutter ( 4007): #1      AuthBloc._onLogout (package:web_dex/bloc/auth_bloc/auth_bloc.dart:67)
E/flutter ( 4007): <asynchronous suspension>
E/flutter ( 4007): #2      Bloc.on.<anonymous closure>.handleEvent (package:bloc/src/bloc.dart:226)
E/flutter ( 4007): <asynchronous suspension>
E/flutter ( 4007): 
E/flutter ( 4007): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: No element
E/flutter ( 4007): #0      Iterable.lastWhere (dart:core/iterable.dart:753)
E/flutter ( 4007): #1      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:5578)
E/flutter ( 4007): #2      AppDialog.showWithCallback.<anonymous closure>.<anonymous closure> (package:web_dex/shared/widgets/app_dialog.dart:194)
E/flutter ( 4007): #3      RememberWalletService.maybeShowRememberedWallet.<anonymous closure>.<anonymous closure> (package:web_dex/shared/widgets/remember_wallet_service.dart:100)
E/flutter ( 4007): #4      _IguanaWalletsManagerState._onLogIn (package:web_dex/views/wallets_manager/widgets/iguana_wallets_manager.dart:350)
E/flutter ( 4007): #5      _IguanaWalletsManagerState.build.<anonymous closure> (package:web_dex/views/wallets_manager/widgets/iguana_wallets_manager.dart:78)
E/flutter ( 4007): #6      _BlocListenerBaseState._subscribe.<anonymous closure> (package:flutter_bloc/src/bloc_listener.dart:216)
E/flutter ( 4007): #7      _rootRunUnary (dart:async/zone.dart:1538)
E/flutter ( 4007): #8      _CustomZone.runUnary (dart:async/zone.dart:1429)
E/flutter ( 4007): #9      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1329)
E/flutter ( 4007): #10     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:381)
E/flutter ( 4007): #11     _DelayedData.perform (dart:async/stream_impl.dart:573)
E/flutter ( 4007): #12     _PendingEvents.handleNext (dart:async/stream_impl.dart:678)
E/flutter ( 4007): #13     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:649)
E/flutter ( 4007): #14     _rootRun (dart:async/zone.dart:1517)
E/flutter ( 4007): #15     _CustomZone.run (dart:async/zone.dart:1422)
E/flutter ( 4007): #16     _CustomZone.runGuarded (dart:async/zone.dart:1321)
E/flutter ( 4007): #17     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
E/flutter ( 4007): #18     _rootRun (dart:async/zone.dart:1525)
E/flutter ( 4007): #19     _CustomZone.run (dart:async/zone.dart:1422)
E/flutter ( 4007): #20     _CustomZone.runGuarded (dart:async/zone.dart:1321)
E/flutter ( 4007): #21     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1362)
E/flutter ( 4007): #22     _microtaskLoop (dart:async/schedule_microtask.dart:40)
E/flutter ( 4007): #23     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49)
E/flutter ( 4007): 

At this point I was unsure if prior build/install had been completely removed from device, so to avoid a false positive, I made sure to uninstall, rebuild and retry. This third attempt was successful but I did briefly (approx 0.217 seconds) see the grey screen of lassitude as it transitioned from login form to active wallet.

…prevent Android grey screen

- Make AppDialog close idempotent and use navigator.maybePop() to avoid 'Bad state: No element' during 1-click login transitions
- Wrap KDF signOut in try/catch so UI resets even if KDF stop times out
- Align deprecated PopupDispatcher.close() to use maybePop()
Copy link
Copy Markdown
Collaborator

@smk762 smk762 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be functioning as expected, thanks!

@CharlVS CharlVS linked an issue Sep 1, 2025 that may be closed by this pull request
@CharlVS CharlVS added this to the v0.9.3 Release milestone Sep 1, 2025
@CharlVS CharlVS merged commit c15fdbe into dev Sep 1, 2025
11 of 15 checks passed
@CharlVS CharlVS deleted the add/implement-one-click-remember-me-sign-in branch September 1, 2025 11:04
@CharlVS CharlVS mentioned this pull request Oct 5, 2025
@smk762 smk762 mentioned this pull request Nov 23, 2025
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

QA Ready for QA Testing UX Cosmetic or flow efficiency enhancements for improved User Experience

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UX: Quick Login (remember me) across login/import/create

3 participants