Add enable-notifications banner above Concierge composer#92244
Add enable-notifications banner above Concierge composer#92244justinpersaud wants to merge 8 commits into
Conversation
Split permission-status checks from the request so the UI can decide when to prompt instead of prompting implicitly on first notification.
RAM-only flag so dismissal lasts the session without persisting.
Shows only when notification permission is still undecided and the banner has not been dismissed this session.
Keep the original composer tree untouched when the banner is hidden, so full-size compose still fills the footer. When the banner shows, wrap the composer in a view that keeps flex:1 in full-size mode. The reverted PR #90365 wrapped the composer unconditionally, which broke the flex chain and collapsed the expanded composer (App #92038).
This comment has been minimized.
This comment has been minimized.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
Take the report object from ReportFooter instead of re-subscribing to the same Onyx key, and re-probe notification permission on window focus so the banner hides if permission is granted in browser settings while the tab stays open.
|
@codex review |
|
Codex Review: Didn't find any major issues. Swish! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@thelullabyy @Gonals there was a regression introduced with this in #90365 so I have re-implemented it along with a fix. Assigning you both to look at it again |
|
@gijoe0295 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeScreen.Recording.2026-06-07.at.02.38.50.moviOS: HybridAppiOS: mWeb SafariScreen.Recording.2026-06-04.at.00.52.12.movMacOS: Chrome / SafariScreen.Recording.2026-06-04.at.00.49.38.mov |
|
bump @thelullabyy |
|
Checking now. Sorry for the delay, I was OOO yesterday |
|
BUG: Composer-expand layout issue when keyboard is open/close on iOS Screen.Recording.2026-06-04.at.00.54.58.mov |
…ment-concierge-notifications-banner
|
I think that issue is separate and fixed in #92207 I just merged main |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/es.ts b/src/languages/es.ts
index 97bd038d7a0..d549314d8fc 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -464,10 +464,7 @@ const translations: TranslationDeepObject<typeof en> = {
concierge: {
collapseReasoning: 'Contraer razonamiento',
expandReasoning: 'Expandir razonamiento',
- enableNotifications: {
- prompt: '¿Quieres que te avisemos cuando Concierge responda?',
- cta: 'Notificar',
- },
+ enableNotifications: {prompt: '¿Quieres que se te avise cuando Concierge responda?', cta: 'Notificar'},
},
supportalNoAccess: {
title: 'No tan rápido',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index ee8532bce60..29e7f66ebb4 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -512,7 +512,7 @@ const translations: TranslationDeepObject<typeof en> = {
concierge: {
collapseReasoning: 'Réduire le raisonnement',
expandReasoning: 'Développer le raisonnement',
- enableNotifications: {prompt: 'Vous souhaitez être averti lorsque Concierge répond ?', cta: 'Notifier'},
+ enableNotifications: {prompt: 'Souhaitez-vous être averti lorsque Concierge répond ?', cta: 'Notifier'},
},
supportalNoAccess: {
title: 'Pas si vite',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 97655b6bd43..ff7b9a9f66f 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -508,14 +508,7 @@ const translations: TranslationDeepObject<typeof en> = {
facebook: 'Facebookでフォロー',
linkedin: 'LinkedInでフォロー',
},
- concierge: {
- collapseReasoning: '推論を折りたたむ',
- expandReasoning: '推論を展開',
- enableNotifications: {
- prompt: 'Conciergeから返信があったときに通知を受け取りますか?',
- cta: '通知',
- },
- },
+ concierge: {collapseReasoning: '推論を折りたたむ', expandReasoning: '推論を展開', enableNotifications: {prompt: 'Concierge からの返信通知を受け取りますか?', cta: '通知'}},
supportalNoAccess: {
title: 'ちょっと待ってください',
descriptionWithCommand: (command?: string) =>
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index af959ba4b10..9d710208ebf 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -504,14 +504,7 @@ const translations: TranslationDeepObject<typeof en> = {
facebook: '在Facebook上关注我们',
linkedin: '在LinkedIn上关注我们',
},
- concierge: {
- collapseReasoning: '收起推理',
- expandReasoning: '展开推理',
- enableNotifications: {
- prompt: '希望在Concierge回复时收到通知吗?',
- cta: '通知',
- },
- },
+ concierge: {collapseReasoning: '收起推理', expandReasoning: '展开推理', enableNotifications: {prompt: '希望在 Concierge 回复时收到通知吗?', cta: '通知'}},
supportalNoAccess: {
title: '先别急',
descriptionWithCommand: (command?: string) => `当以支持身份登录时,你无权执行此操作(命令:${command ?? ''})。如果你认为 Success 应该能够执行此操作,请在 Slack 中发起一次会话。`,
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
bump @Gonals |
Explanation of Change
Reimplements the enable-notifications banner above the Concierge composer from the reverted #90365.
The banner is web-only (native notification permission resolves to
denied) and shows in the Concierge chat when the browser's notification permission is still undecided and the user hasn't dismissed it for the session.To tuck the composer under the banner's rounded bottom corners, the composer is wrapped only when the banner is shown; that wrapper keeps
flex: 1in full-size compose mode so expanding the composer still fills the footer. When the banner is hidden, the composer tree is unchanged frommain.Note: the general composer-expand layout issue (#92038) is being fixed separately in #92207. This PR only adds the banner and is structured to coexist with that change.
Fixed Issues
$ #90136
PROPOSAL:
Tests
Offline tests
n/a
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps./** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Verified locally: banner renders above the Concierge composer; expanding the composer fills the chat area (banner stays pinned, send button visible) in both the Concierge chat and a non-Concierge chat.