Add 60-second replication delay notification#1344
Conversation
Users are now informed via toast notifications that channel settings changes, bundle assignments, and device overrides take up to 60 seconds to propagate globally due to heavy read replication. Changes include: - Add replication delay toasts after successful channel settings updates - Add replication delay toasts after bundle-to-channel assignments - Add replication delay toasts after device-to-channel overrides - Translate the message to all 15 supported languages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis PR replaces the Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labels
Poem
Pre-merge checks✅ Passed checks (3 passed)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
src/pages/app/[package].bundle.[bundle].vue (1)
320-328: Consistent replication-delay messaging on unlink; consider extending to bulk unlink helperAdding the
cloud-replication-delayinfo toast afterchannels-unlinked-successfullykeeps unlink UX consistent with the link path. For full consistency, you might also show the same toast insideunlinkChannels()(lines 572–607) where multiple channels are unlinked in one shot.src/pages/app/[package].channel.[channel].vue (1)
454-459: Consider adding user-facing error notification.The success path now correctly shows the replication delay toast, which is great. However, when an error occurs (line 455), it's only logged to the console without any user-facing feedback.
Consider adding a toast notification in the error path to inform users when the auto-update setting fails to save:
💡 Suggested enhancement
if (error) { console.error(error) + toast.error(t('error-update-channel')) } else { toast.info(t('cloud-replication-delay')) }
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (19)
messages/de.jsonmessages/en.jsonmessages/es.jsonmessages/fr.jsonmessages/hi.jsonmessages/id.jsonmessages/it.jsonmessages/ja.jsonmessages/ko.jsonmessages/pl.jsonmessages/pt-br.jsonmessages/ru.jsonmessages/tr.jsonmessages/vi.jsonmessages/zh-cn.jsonsrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vuesrc/pages/app/[package].device.[device].vue
🧰 Additional context used
📓 Path-based instructions (9)
src/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
src/**/*.vue: Use Vue 3 with Composition API and<script setup>syntax for frontend components
Style components using TailwindCSS with DaisyUI components
src/**/*.vue: Use Vue 3<script setup>syntax exclusively for all Vue component scripts
Use Tailwind utility classes for layout and spacing in Vue components
Use DaisyUI components (d-btn,d-input,d-card) for interactive elements in Vue components
Use Konsta components ONLY for safe area helpers (top/bottom insets) in Vue components; avoid other uses
UseuseRoute()fromvue-routerto access route parameters anduseRouter()for programmatic navigation in Vue componentsUse DaisyUI (
d-prefixed classes) for buttons, inputs, and other interactive primitives to keep behavior and spacing consistent
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
**/*.{ts,tsx,js,jsx,vue}
📄 CodeRabbit inference engine (CLAUDE.md)
Use single quotes and no semicolons per @antfu/eslint-config
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/pages/**/*.vue
📄 CodeRabbit inference engine (CLAUDE.md)
Use file-based routing with unplugin-vue-router for frontend pages
Frontend file-based routing uses
src/pages/directory structure; routes auto-generate withunplugin-vue-routerand types are available insrc/typed-router.d.ts
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
{capacitor.config.{ts,js},src/**/*.{ts,tsx,vue}}
📄 CodeRabbit inference engine (CLAUDE.md)
Mobile apps should use Capacitor with app ID
ee.forgr.capacitor_gofor native mobile functionality
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/**/*.{ts,tsx,vue,js}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use
~/alias for imports fromsrc/directory in frontend TypeScript and Vue components
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/**/*.{vue,ts,js}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Frontend ESLint must pass before commit; run
bun lint:fixto auto-fix issues in frontend files
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/**/*.{vue,css,scss}
📄 CodeRabbit inference engine (AGENTS.md)
The web client is built with Vue.js and Tailwind CSS; lean on utility classes and composition-friendly patterns rather than bespoke CSS
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/**/*.{vue,ts,tsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
Konsta components are reserved for the safe area helpers; avoid importing
konstaanywhere else in the app
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
src/**/*.{css,scss,vue}
📄 CodeRabbit inference engine (AGENTS.md)
Mirror the Capgo design palette from
src/styles/style.css(e.g.,--color-primary-500: #515271,--color-azure-500: #119eff) when introducing new UI, using deep slate bases with the Extract azure highlight and soft radii
Files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
🧠 Learnings (2)
📚 Learning: 2025-05-29T18:21:17.703Z
Learnt from: WcaleNieWolny
Repo: Cap-go/capgo PR: 1107
File: src/components/dashboard/AppSetting.vue:85-182
Timestamp: 2025-05-29T18:21:17.703Z
Learning: In setUpdateChannelSync function in src/components/dashboard/AppSetting.vue, the database update code at the end is intentionally outside the conflict-resolution if block and should run for cases where sync is being toggled without conflicts or after conflicts are resolved. The return statements inside the dialog handling correctly prevent database updates when the user cancels.
Applied to files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
📚 Learning: 2025-12-23T01:19:04.593Z
Learnt from: riderx
Repo: Cap-go/capgo PR: 1297
File: src/components/dashboard/DeploymentBanner.vue:77-79
Timestamp: 2025-12-23T01:19:04.593Z
Learning: In the Cap-go codebase, ensure that app permission checks never include the role 'owner'. App-level permissions should be based on the user_min_right enum with values: read, upload, write, admin, super_admin (and NOT owner). This pattern applies across Vue components that perform permission checks; if you find a check referencing 'owner' for app-level access, replace it with the appropriate user_min_right value and keep organization-level owner handling in organization.ts.
Applied to files:
src/pages/app/[package].device.[device].vuesrc/pages/app/[package].bundle.[bundle].vuesrc/pages/app/[package].channel.[channel].devices.vuesrc/pages/app/[package].channel.[channel].vue
⏰ 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). (1)
- GitHub Check: Run tests
🔇 Additional comments (22)
messages/fr.json (1)
1342-1342: Cloud‑replication delay FR string looks correctLa frase es clara, gramaticalmente correcta y refleja bien “Changes will take up to 60 seconds to propagate globally”. No veo problemas de uso en toasts ni de formato.
messages/it.json (1)
1334-1334: Cloud‑replication delay IT string looks correctTexto natural y correcto: comunica claramente que los cambios tardan hasta 60 segundos en propagarse globalmente, sin problemas de formato.
messages/ja.json (1)
1334-1334: Cloud‑replication delay JA string looks correct日本語として自然で、変更がグローバルに反映されるまで「最大60秒かかる」旨が正しく伝わっています。フォーマット上の問題もありません。
messages/es.json (1)
1342-1342: Cloud‑replication delay ES string looks correctRedacción clara y natural; transmite bien que los cambios tardan hasta 60 segundos en propagarse globalmente, sin riesgos de formato en el i18n.
messages/hi.json (1)
1333-1333: Hindi cloud-replication-delay string is accurate and well-formedThe translation reads naturally, correctly conveys the 60‑second global propagation delay, and JSON structure is valid.
messages/de.json (1)
1342-1342: German cloud-replication-delay translation matches intentThe sentence is idiomatic, correctly reflects the 60‑second global propagation note, and the JSON is syntactically correct.
messages/vi.json (1)
882-882: Vietnamese updates read clearly and match semanticsBoth changes look good:
no-organization-selectednow uses a clear, natural phrasing.cloud-replication-delayaccurately conveys that changes can take up to 60 seconds to propagate globally, and JSON structure is valid.Also applies to: 1333-1333
messages/ko.json (1)
883-883: Korean translations are natural and semantically correctThe revised
no-organization-selectedstring is clear, andcloud-replication-delaygives an idiomatic, accurate description of the 60‑second global replication delay with valid JSON.Also applies to: 1334-1334
src/pages/app/[package].bundle.[bundle].vue (1)
261-265: Replication-delay toast after successful channel link is correctly placedThe info toast is shown only after
setChannelandgetChannelsresolve and after the existinglinked-bundlesuccess toast, which aligns with the new replication-delay UX without affecting control flow.messages/en.json (1)
1403-1404: English replication-delay copy and JSON structure look goodThe new
cloud-replication-delaykey and updatedchannel-disable-auto-update-under-nativelabel are clear and correctly wired for use in toasts, with valid JSON syntax.messages/pl.json (1)
1333-1334: Polish translation for replication delay is aligned with intent
cloud-replication-delayis added with clear wording that mirrors the English meaning, and JSON remains valid.messages/id.json (1)
1333-1334: Indonesian replication-delay translation and JSON look correct
cloud-replication-delayis added with accurate Indonesian phrasing and valid JSON structure.messages/zh-cn.json (1)
1334-1334: LGTM! Translation key added correctly.The new
cloud-replication-delaytranslation key is properly formatted and provides clear messaging about the 60-second propagation delay for cloud changes. The Chinese translation accurately conveys this information to users.src/pages/app/[package].channel.[channel].devices.vue (1)
150-158: LGTM! Proper error handling and user notification flow.The implementation correctly handles both error and success cases:
- Early return on error (line 153) prevents the success logic from executing
- Success path shows the replication delay notification to inform users about propagation time
reload()ensures the UI reflects the updated stateThis pattern is consistent with similar changes across other components in this PR.
messages/ru.json (1)
1333-1333: LGTM! Russian translation added correctly.The
cloud-replication-delaykey is properly formatted with an accurate Russian translation that clearly communicates the 60-second global propagation delay to users.src/pages/app/[package].channel.[channel].vue (2)
153-155: LGTM! Success notification properly implemented.The else block correctly shows the replication delay notification only when the channel update succeeds (no error). This provides users with clear feedback about the expected propagation time.
326-326: LGTM! Replication delay notification added after revert.The toast notification is properly placed after the channel data is refreshed, informing users about the propagation delay following a successful revert to built-in operation.
src/pages/app/[package].device.[device].vue (2)
291-296: LGTM! Unlink notification includes replication delay warning.After successfully unlinking a channel, users receive both a success confirmation and a replication delay notification. This dual-toast pattern is consistent with other components in this PR and clearly communicates both the immediate success and the expected propagation delay.
305-310: LGTM! Link notification includes replication delay warning.The success path properly shows both the channel-linked confirmation and the replication delay notification. This follows the same pattern as the unlink operation and aligns with the PR objectives to inform users about the 60-second propagation delay for cloud changes.
messages/pt-br.json (1)
1334-1334: Translation addition looks good.The new
cloud-replication-delaykey clearly communicates the 60-second propagation delay to users. The Portuguese translation reads naturally.Minor note: The "60 segundos" timeframe is hardcoded in the translation string. If this delay duration ever changes, all language files will need updates. Consider whether this is acceptable or if a parameterized approach would be better for future maintenance.
messages/tr.json (2)
882-882: Verify unrelated translation change.The value for
no-organization-selectedwas updated from "Organizasyon seçilmedi" to "Kuruluş seçilmedi". This change appears unrelated to the PR's stated purpose of adding replication delay notifications.Was this translation refinement intentional, or was it an accidental modification? If intentional, it's fine—just want to confirm this wasn't inadvertently included.
1333-1333: New replication delay translation added successfully.The
cloud-replication-delaykey provides clear notification to Turkish-speaking users about the 60-second propagation delay. The translation reads naturally.Same consideration as with other language files: "60 saniye" is hardcoded, so any future changes to the delay duration will require updating all translation files.
|
…1344) Users are now informed via toast notifications that channel settings changes, bundle assignments, and device overrides take up to 60 seconds to propagate globally due to heavy read replication. Changes include: - Add replication delay toasts after successful channel settings updates - Add replication delay toasts after bundle-to-channel assignments - Add replication delay toasts after device-to-channel overrides - Translate the message to all 15 supported languages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>



Summary
Users are now informed via toast notifications that cloud changes (channel settings, bundle assignments, device overrides) take up to 60 seconds to propagate globally due to heavy read replication infrastructure.
Test plan
Checklist
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.