Skip to content

Conversation

@Catrya
Copy link
Member

@Catrya Catrya commented Jan 20, 2026

fix #397

  • Display SnackBars at the top of the screen using floating behavior
  • Prevent SnackBars from overlapping the bottom navigation bar
  • Allow uninterrupted navigation while notifications are visible
  • Centralize SnackBar configuration via a shared helper
  • Ensure consistent notification behavior across the app

This PR touches 23 files (22 updates + 1 new), but the changes are minimal and repetitive. Each file was updated to use the new shared SnackBar helper, ensuring consistent top-positioned SnackBars and preventing navigation blocking.

Summary by CodeRabbit

  • New Features

    • Added a reusable top-positioned SnackBar helper with sync and async-safe APIs for floating notifications.
  • Refactor

    • Unified in-app notifications to use the new top SnackBar helper across the app, replacing scattered SnackBar usages for errors, confirmations, and alerts to provide consistent placement, timing, and styling.

✏️ Tip: You can customize this high-level summary in your review settings.

- Display SnackBars at the top of the screen using floating behavior
- Prevent SnackBars from overlapping the bottom navigation bar
- Allow uninterrupted navigation while notifications are visible
- Centralize SnackBar configuration via a shared helper
- Ensure consistent notification behavior across the app
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 20, 2026

Walkthrough

Centralizes SnackBar presentation by adding a new SnackBarHelper and replacing direct ScaffoldMessenger SnackBar usages across the app so snackbars render as top-floating notifications instead of bottom SnackBars. (29 words)

Changes

Cohort / File(s) Summary
SnackBar Helper Utility
lib/shared/utils/snack_bar_helper.dart
Added SnackBarHelper with showTopSnackBar, showTopSnackBarAsync, and internal logic to compute top margin, clear existing snackbars, and show a floating top-aligned SnackBar.
Auth Screens
lib/features/auth/screens/login_screen.dart, lib/features/auth/screens/register_screen.dart
Replaced ScaffoldMessenger SnackBars with SnackBarHelper.showTopSnackBar for AuthFailure error display.
Chat UI
lib/features/chat/widgets/encrypted_file_message.dart, lib/features/chat/widgets/encrypted_image_message.dart, lib/features/chat/widgets/message_bubble.dart, lib/features/chat/widgets/message_input.dart
Replaced inline SnackBar calls with SnackBarHelper for file/image open flows, upload errors, and clipboard copy feedback.
Disputes UI
lib/features/disputes/widgets/dispute_input_section.dart, lib/features/disputes/widgets/dispute_message_bubble.dart
Swapped bottom SnackBars for top SnackBarHelper usage on send success/error and clipboard copy.
Core & Settings
lib/core/deep_link_handler.dart, lib/features/settings/about_screen.dart
Error and copy-to-clipboard snackbars now use SnackBarHelper.showTopSnackBar.
Key Management & Logs
lib/features/key_manager/key_management_screen.dart, lib/features/logs/screens/logs_screen.dart
Mnemonic import and logs-cleared confirmations switched to SnackBarHelper.showTopSnackBar.
Notifications
lib/features/notifications/widgets/notifications_actions_menu.dart
Mark-all-read and clear-all success/error feedback now use SnackBarHelper.showTopSnackBar.
Orders & Invoices
lib/features/order/screens/add_lightning_invoice_screen.dart, lib/features/order/screens/add_order_screen.dart
Validation and error snackbars replaced with SnackBarHelper.showTopSnackBar.
Relays
lib/features/relays/widgets/relay_selector.dart
Relay add success feedback switched to SnackBarHelper.showTopSnackBar.
Trades
lib/features/trades/screens/trade_detail_screen.dart
Dispute creation success/failure/exception messages now use SnackBarHelper.showTopSnackBar.
Shared Widgets
lib/shared/widgets/clickable_text_widget.dart, lib/shared/widgets/exchange_rate_widget.dart, lib/shared/widgets/notification_listener_widget.dart, lib/shared/widgets/order_cards.dart, lib/shared/widgets/pay_lightning_invoice_widget.dart
Clipboard copy, refresh notifications, invoice share/copy feedback, and notification listener messages now call SnackBarHelper (includes async-safe helper usage in share flow).
Miscellaneous
lib/core/..., lib/features/... (various files listed above)
Added imports for snack_bar_helper.dart; preserved existing mounted/context guards and public APIs; purely presentation changes.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • grunch

Poem

🐇
I hopped to the top with a tiny cheer,
Pushed little snacks so the nav stays clear.
No more blocked taps, just a cheerful ping,
Messages float up—how delightful to spring!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Move SnackBars to top to avoid blocking bottom navigation' directly and clearly summarizes the main objective of the PR.
Linked Issues check ✅ Passed PR successfully implements all requirements from issue #397: SnackBars now appear at top via SnackBarHelper with floating behavior, bottom navigation remains accessible, and consistent behavior is applied across 22 updated files.
Out of Scope Changes check ✅ Passed All changes are within scope: a new SnackBarHelper utility is created and consistently applied across files for top-positioned SnackBars. No unrelated changes detected in the file modifications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
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: 9

🤖 Fix all issues with AI agents
In `@lib/features/chat/widgets/encrypted_file_message.dart`:
- Around line 496-514: Replace the hardcoded SnackBar messages in the error
handling of open file logic by using localized strings from S.of(context)!;
update the two calls to SnackBarHelper.showTopSnackBar in
encrypted_file_message.dart to use S.of(context)!.couldNotOpenFile (with
result.message interpolated) and S.of(context)!.errorOpeningFile (with the error
interpolated) instead of the literal strings, and add the corresponding
keys/values to the ARB/localization files so translations include placeholders
for the interpolated message/error; keep the same duration/backgroundColor and
preserve the checks for mounted.

In `@lib/features/chat/widgets/message_input.dart`:
- Around line 131-135: Replace the raw exception text shown in
SnackBarHelper.showTopSnackBar inside message_input.dart with a localized
user-facing string (use S.of(context).<appropriateKey> like errorUploadingFile
or uploadError) and move the exception details to a log/diagnostic call (e.g.,
debugPrint or your logger) so the UI only displays the localized message while
the actual exception $e is logged for troubleshooting; update the
SnackBarHelper.showTopSnackBar call and add a nearby log statement (referencing
SnackBarHelper.showTopSnackBar and the surrounding upload/error handling code)
to implement this change.

In `@lib/features/disputes/widgets/dispute_input_section.dart`:
- Around line 130-144: Replace the hardcoded SnackBar strings with localized
strings from S.of(context)!: update the two calls to
SnackBarHelper.showTopSnackBar in the success and catch blocks to use
S.of(context)!.<yourKey>(...) (e.g., messageSent and failedToSendMessage) that
accept the message or error as parameters, or use S.of(context)!.<yourKey> with
string interpolation if you added keys without params; keep the same call sites
(SnackBarHelper.showTopSnackBar, inside the mounted checks) and add new
localization keys (or parameterized keys) to the arb/localization files to
provide "Message sent: {message}" and "Failed to send message: {error}"
translations.

In `@lib/features/disputes/widgets/dispute_message_bubble.dart`:
- Line 5: Replace the nullable localization access and hardcoded fallback with
the non-nullable localized string: locate where AppLocalizations.of(context)? or
similar is used to read messageCopiedToClipboard in dispute_message_bubble.dart
and change it to use the non-nullable accessor (e.g.,
AppLocalizations.of(context)!.messageCopiedToClipboard) and remove the "??
'...'" fallback so the code uses the ARB-provided string directly.

In `@lib/features/order/screens/add_lightning_invoice_screen.dart`:
- Around line 83-86: Replace the hardcoded error string passed to
SnackBarHelper.showTopSnackBar with a localized message from S.of(context)!,
e.g. use a new key like cancelOrderFailed (or similar) combined with the
exception text; update the call in add_lightning_invoice_screen.dart where
SnackBarHelper.showTopSnackBar(...) is invoked to use
S.of(context)!.cancelOrderFailed and concatenate or format the exception, and
add the corresponding cancelOrderFailed entry to the ARB localization files (and
regenerate localization artifacts) so the message is available at runtime.
- Around line 67-70: Replace the hardcoded error string passed to
SnackBarHelper.showTopSnackBar with a localized message: use S.of(context)! to
fetch a new localization key (e.g., failedUpdateInvoice) and include the
exception text via string interpolation or formatting; add the corresponding
key/value to the ARB localization files and regenerate localization classes so
S.of(context)!.failedUpdateInvoice can be used in the
SnackBarHelper.showTopSnackBar call in add_lightning_invoice_screen.dart.

In `@lib/shared/utils/snack_bar_helper.dart`:
- Around line 18-33: The current SnackBar positioning uses hardcoded pixels
(top: 96 and bottomMargin = mediaQuery.size.height - 96 - 70) which breaks on
devices with notches or different AppBar heights; change the layout to compute
the top offset using MediaQuery.of(context).padding.top for the status bar and
accept an optional appBarHeight parameter (or default to kToolbarHeight) to
compute margin.top = mediaQuery.padding.top + (appBarHeight ?? kToolbarHeight) +
16, replace bottomMargin calculation to mediaQuery.size.height - margin.top -
estimatedSnackBarHeight (or use a Positioned overlay for precise control), and
call ScaffoldMessenger.of(context).clearSnackBars() before
ScaffoldMessenger.of(context).showSnackBar(...) so multiple notifications don’t
stack; adjust references to bottomMargin and top margin in the SnackBar margin
block accordingly.

In `@lib/shared/widgets/clickable_text_widget.dart`:
- Around line 38-44: Replace the hardcoded SnackBar message in _handleTap by
using the localization helper S.of(context)! instead of the literal string:
build the message with the appropriate localization key (e.g.,
S.of(context)!.copiedToClipboard) combined with widget.leftText and
widget.clickableText, and pass that to SnackBarHelper.showTopSnackBar; also add
the import for l10n.dart at the top and ensure the corresponding ARB key (e.g.,
"copiedToClipboard": "{prefix} {value} copied to clipboard" or a suitable key
name) exists and is generated so S.of(context)! can be used.

In `@lib/shared/widgets/exchange_rate_widget.dart`:
- Line 6: Import the generated localization file and replace the hardcoded
SnackBar string with the localized key: add import
'package:mostro_mobile/generated/l10n.dart' at the top of
lib/shared/widgets/exchange_rate_widget.dart, update the SnackBar message
creation in the widget (where it currently uses "Refreshing exchange rate...")
to use S.of(context)!.refreshingExchangeRate, and add the key
refreshingExchangeRate: "Refreshing exchange rate..." to the three ARB files
(en, es, it) so the localized string is available.
🧹 Nitpick comments (3)
lib/features/auth/screens/register_screen.dart (1)

12-12: Defer SnackBar side effect to a post-frame callback.
In screens, show SnackBars after the current frame to keep build/side-effects separated.

♻️ Suggested change
-        SnackBarHelper.showTopSnackBar(
-          context,
-          state.error,
-        );
+        WidgetsBinding.instance.addPostFrameCallback((_) {
+          SnackBarHelper.showTopSnackBar(
+            context,
+            state.error,
+          );
+        });

Based on learnings, prefer post-frame callbacks for SnackBars in screen widgets.

Also applies to: 42-46

lib/features/order/screens/add_order_screen.dart (1)

395-399: Defer SnackBars to a post-frame callback in this screen.
This keeps UI side effects out of synchronous flow per screen guidelines.

♻️ Suggested pattern (apply to all three SnackBarHelper calls)
-      SnackBarHelper.showTopSnackBar(
-        context,
-        S.of(context)!.pleaseSelectCurrency,
-      );
+      WidgetsBinding.instance.addPostFrameCallback((_) {
+        if (!mounted) return;
+        SnackBarHelper.showTopSnackBar(
+          context,
+          S.of(context)!.pleaseSelectCurrency,
+        );
+      });

As per coding guidelines, use post-frame callbacks for SnackBars in screens.

Also applies to: 407-410, 430-434

lib/features/trades/screens/trade_detail_screen.dart (1)

726-744: Defer dispute SnackBars to a post-frame callback.
Keeps side effects out of synchronous UI flow.

♻️ Suggested pattern
-            if (success && context.mounted) {
-              SnackBarHelper.showTopSnackBar(
-                context,
-                S.of(context)!.disputeCreatedSuccessfully,
-                backgroundColor: AppTheme.mostroGreen,
-              );
-            } else if (context.mounted) {
-              SnackBarHelper.showTopSnackBar(
-                context,
-                S.of(context)!.disputeCreationFailed,
-                backgroundColor: AppTheme.red1,
-              );
-            }
+            WidgetsBinding.instance.addPostFrameCallback((_) {
+              if (!context.mounted) return;
+              if (success) {
+                SnackBarHelper.showTopSnackBar(
+                  context,
+                  S.of(context)!.disputeCreatedSuccessfully,
+                  backgroundColor: AppTheme.mostroGreen,
+                );
+              } else {
+                SnackBarHelper.showTopSnackBar(
+                  context,
+                  S.of(context)!.disputeCreationFailed,
+                  backgroundColor: AppTheme.red1,
+                );
+              }
+            });

As per coding guidelines, use post-frame callbacks for SnackBars in screens.

- Remove hardcoded pixel values flagged in code review
- Use system-provided metrics for layout calculations
- Prevent multiple SnackBars from stacking
@Catrya
Copy link
Member Author

Catrya commented Jan 21, 2026

@coderabbitai
While your comments about hardcoded text and internationalization are valid, they're not the focus of this pull request, which is about moving the snackbar up. No new text was generated here; what you're pointing out is old text in main branch. I'd like you to create a new issue in the repo with all the cases you mentioned of text that needs internationalization, so it can be addressed in another pull request.

Copy link
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: 1

🤖 Fix all issues with AI agents
In `@lib/shared/utils/snack_bar_helper.dart`:
- Around line 60-82: The computed bottomMargin can be negative on compact
screens; update the calculation that defines bottomMargin (currently
screenHeight - topMargin - estimatedSnackBarHeight) to clamp it to a minimum of
0.0 (e.g., use a max operation) before passing it into the SnackBar margin in
messenger.showSnackBar so EdgeInsets.only(bottom: bottomMargin) never receives a
negative value; adjust the variable near topMargin/estimatedSnackBarHeight and
ensure the clamped bottomMargin is used in the SnackBar constructor.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 21, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Fetch review comments from PR `#413` to identify internationalization-related feedback
gh pr view 413 --json reviews --jq '.reviews[] | select(.author.login == "coderabbitai") | .body' | head -50

Length of output: 2841


🏁 Script executed:

#!/bin/bash
# Also fetch review comments on specific files
gh api repos/MostroP2P/mobile/pulls/413/comments --jq '.[] | select(.user.login == "coderabbitai") | {path: .path, body: .body, line: .line}'

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Get more complete review comment data from PR `#413`
gh api repos/MostroP2P/mobile/pulls/413/reviews --jq '.[] | select(.user.login == "coderabbitai") | .body' | head -100

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Also search for review threads/comments that mention "hardcoded" or "internationalization" or "localization"
gh api repos/MostroP2P/mobile/pulls/413/comments --jq '.[] | select(.user.login == "coderabbitai" and (.body | test("hardcoded|internationalization|localization|localized|i18n"; "i"))) | {path: .path, body: .body}'

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Let's search for hardcoded strings in the files modified in this PR
# Get list of files changed in PR `#413`
gh pr view 413 --json files --jq '.files[].path' > /tmp/pr_files.txt

echo "Files modified in PR `#413`:"
cat /tmp/pr_files.txt

Length of output: 1149


🏁 Script executed:

#!/bin/bash
# Search for SnackBarHelper.showTopSnackBar calls with hardcoded strings in the PR files
echo "=== Hardcoded strings in SnackBarHelper calls ==="
while IFS= read -r file; do
  if [ -f "$file" ]; then
    echo "--- $file ---"
    grep -n "SnackBarHelper.showTopSnackBar" "$file" || true
  fi
done < /tmp/pr_files.txt

Length of output: 2966


🏁 Script executed:

#!/bin/bash
# Also look for any hardcoded user-facing strings in error messages
echo "=== Additional hardcoded error messages ==="
rg -n "showTopSnackBar.*['\"]" --type dart -g "lib/**" | head -50

Length of output: 43


🏁 Script executed:

#!/bin/bash
# Let's look at the actual hardcoded strings in key files mentioned in the review
echo "=== encrypted_file_message.dart (lines 495-515) ==="
sed -n '495,515p' lib/features/chat/widgets/encrypted_file_message.dart

echo -e "\n=== message_input.dart (lines 128-135) ==="
sed -n '128,135p' lib/features/chat/widgets/message_input.dart

echo -e "\n=== dispute_input_section.dart (lines 128-145) ==="
sed -n '128,145p' lib/features/disputes/widgets/dispute_input_section.dart

echo -e "\n=== dispute_message_bubble.dart (lines 90-95) ==="
sed -n '90,95p' lib/features/disputes/widgets/dispute_message_bubble.dart

echo -e "\n=== add_lightning_invoice_screen.dart (lines 80-88) ==="
sed -n '80,88p' lib/features/order/screens/add_lightning_invoice_screen.dart

Length of output: 2129


🏁 Script executed:

#!/bin/bash
# Get more files with hardcoded strings
echo "=== add_order_screen.dart (lines 393-432) ==="
sed -n '393,432p' lib/features/order/screens/add_order_screen.dart

echo -e "\n=== trade_detail_screen.dart (lines 723-743) ==="
sed -n '723,743p' lib/features/trades/screens/trade_detail_screen.dart

echo -e "\n=== clickable_text_widget.dart (lines 37-42) ==="
sed -n '37,42p' lib/shared/widgets/clickable_text_widget.dart

echo -e "\n=== exchange_rate_widget.dart (lines 47-52) ==="
sed -n '47,52p' lib/shared/widgets/exchange_rate_widget.dart

Length of output: 3052


🏁 Script executed:

#!/bin/bash
# Check remaining files for hardcoded strings
echo "=== encrypted_image_message.dart (lines 375-390) ==="
sed -n '375,390p' lib/features/chat/widgets/encrypted_image_message.dart

echo -e "\n=== message_bubble.dart (lines 156-162) ==="
sed -n '156,162p' lib/features/chat/widgets/message_bubble.dart

echo -e "\n=== relay_selector.dart (lines 497-502) ==="
sed -n '497,502p' lib/features/relays/widgets/relay_selector.dart

echo -e "\n=== order_cards.dart (lines 232-237) ==="
sed -n '232,237p' lib/shared/widgets/order_cards.dart

echo -e "\n=== pay_lightning_invoice_widget.dart (lines 79-85, 115-120) ==="
sed -n '79,85p' lib/shared/widgets/pay_lightning_invoice_widget.dart
echo "---"
sed -n '115,120p' lib/shared/widgets/pay_lightning_invoice_widget.dart

Length of output: 2277


🏁 Script executed:

#!/bin/bash
# Check if there's already an i18n/localization setup in the project
echo "=== Checking for existing localization files ==="
fd -e arb . | head -20
echo -e "\n=== Looking for generated localization class ==="
fd "app_localizations.dart" .

Length of output: 161


🏁 Script executed:

#!/bin/bash
# Create a GitHub issue for internationalization of hardcoded strings
gh issue create \
  --title "Internationalize hardcoded SnackBar messages" \
  --body "## Description

Several SnackBar messages in the codebase use hardcoded English strings instead of localized strings from the ARB files. These should be internationalized to support the existing Spanish and Italian translations.

## Context

This issue was identified during the review of PR `#413` (moving SnackBars to top). While that PR focused on SnackBar positioning, it revealed pre-existing hardcoded text that should be localized.

## Files and strings requiring internationalization

### lib/features/chat/widgets/encrypted_file_message.dart
**Lines 498-509:**
- \`'Could not open file: \${result.message}'\`
- \`'Error opening file: \$e'\`

**Suggested keys:**
- \`couldNotOpenFile\` with parameter for result.message
- \`errorOpeningFile\` with parameter for error

---

### lib/features/chat/widgets/message_input.dart
**Line 131:**
- \`'Error uploading file: \$e'\`

**Suggested keys:**
- \`errorUploadingFile\` with parameter for error
- Consider logging raw exception to console/logs instead of showing to user

---

### lib/features/disputes/widgets/dispute_input_section.dart
**Lines 131, 139:**
- \`'Message sent: \$message'\`
- \`'Failed to send message: \$error'\`

**Suggested keys:**
- \`messageSent\` with parameter for message content
- \`failedToSendMessage\` with parameter for error

---

### lib/features/disputes/widgets/dispute_message_bubble.dart
**Line 92:**
- Uses nullable access \`S.of(context)?.messageCopiedToClipboard\` with fallback \`'Message copied to clipboard'\`

**Action needed:**
- Change to non-nullable: \`S.of(context)!.messageCopiedToClipboard\`
- Remove the \`?? 'Message copied to clipboard'\` fallback

---

### lib/features/order/screens/add_lightning_invoice_screen.dart
**Line 84:**
- \`'Failed to cancel order: \${e.toString()}'\`

**Suggested keys:**
- \`failedToCancelOrder\` with parameter for error message

---

### lib/shared/widgets/clickable_text_widget.dart
**Line 39:**
- \`'\${widget.leftText} \${widget.clickableText} copied to clipboard'\`

**Suggested keys:**
- \`textCopiedToClipboard\` with parameters for the concatenated text, or
- A more generic \`copiedToClipboard\` message

---

### lib/shared/widgets/exchange_rate_widget.dart
**Line 49:**
- \`'Refreshing exchange rate...'\`

**Suggested keys:**
- \`refreshingExchangeRate\`

---

## Implementation checklist

- [ ] Add new keys to \`lib/l10n/intl_en.arb\` with English text
- [ ] Add corresponding translations to \`lib/l10n/intl_es.arb\` (Spanish)
- [ ] Add corresponding translations to \`lib/l10n/intl_it.arb\` (Italian)
- [ ] Update each file to use \`S.of(context)!.<key>\` instead of hardcoded strings
- [ ] For messages with dynamic content (errors, file names), use parameterized localization keys
- [ ] Consider logging technical error details separately from user-facing messages

## Notes

Several files in PR `#413` already use proper localization (e.g., \`add_order_screen.dart\`, \`trade_detail_screen.dart\`, \`message_bubble.dart\`), so follow those patterns.

## Related

- PR `#413`: https://github.com/MostroP2P/mobile/pull/413
- Issue `#397`: https://github.com/MostroP2P/mobile/issues/397

cc `@Catrya`" \
  --assignee "Catrya" \
  --repo "MostroP2P/mobile"

Length of output: 46


@Catrya I've created issue #414 to track the internationalization work: #414

The issue documents all 7 files with hardcoded SnackBar messages that need localization:

  • encrypted_file_message.dart - file open errors
  • message_input.dart - file upload errors
  • dispute_input_section.dart - message send feedback
  • dispute_message_bubble.dart - nullable localization access
  • add_lightning_invoice_screen.dart - order cancellation errors
  • clickable_text_widget.dart - clipboard copy confirmation
  • exchange_rate_widget.dart - refresh status message

Each entry includes the specific line numbers, current hardcoded strings, and suggested localization keys to add to your existing ARB files (I noticed you already have intl_en.arb, intl_es.arb, and intl_it.arb set up).

The issue is assigned to you and includes an implementation checklist. You're absolutely right that these are pre-existing strings—your PR #413 correctly focuses on the SnackBar positioning, and this i18n work can be handled separately. 👍

@Catrya Catrya requested a review from grunch January 21, 2026 17:06
@Catrya
Copy link
Member Author

Catrya commented Jan 21, 2026

@grunch la mayoría de los comentarios de coderabbit eran sobre mensajes harcodeados que salían en la snackbar y ya estaban desde antes en la rama main, aquí no fue agregado ningún mensaje nuevo. Como el objetivo de este PR es solo mover la snackbar hacia arriba y ya tiene 23 archivos cambiados, le dije a coderabbit que creara un issue con todos esos mensajes, para resolverlos en otro PR, no en este.
Los demás señalamientos de coderrabit ya fueron resueltos.

Copy link
Member

@grunch grunch left a comment

Choose a reason for hiding this comment

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

great job!

@grunch grunch merged commit 3158bc4 into main Jan 21, 2026
2 checks passed
@grunch grunch deleted the snackbar branch January 21, 2026 19:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Replace bottom snackbar with top snackBar

3 participants