All notes

PR 10879-grok-4-7

Leave this draft unmerged. The token trick is right, and three livestream checkout opens still throw the moment the modal comes back.

Reviewed 1 October 2026Draft33 files629 additions, 143 deletions

PR 10879 · Base 5449fe850e on hotfix/release-0.0.23/wls-21-priority · Head a073ce250cff

Should I merge it now? No.

No.

GitHub still has it as a draft, with a clean merge state and zero check runs. The description says tests were skipped. I would not put that on a hotfix branch today.

The code change is the right shape for this bug. I would merge a later revision after the three closeModal subscriptions below are gone or real, and after one signed-in pass of Send Tip plus a mobile livestream checkout.

What the tokens fix

ng-bootstrap 20 creates the modal component with options.injector as the parent injector. A token provided there is visible to inject() while field initializers run. input(default) then keeps that value, because these modals are not opened with a template binding.

The old code did modalRef.componentInstance.isModalView = true after open(). That replaces the signal function with a boolean. The next isModalView() throws is not a function. Same failure for loggedInUserData, userType, showMessageArea, priorTipCloseResult, and the livestream preview inputs.

Send Tip now reads SEND_TIP_MODAL_DATA. Checkout and preview modals each have their own token. Routed pages inject with optional: true and fall back to the old defaults, so a normal page visit stays unchanged.

data on the tip dialog is still a decorator @Input(). Minimum tip and monetization can keep assigning componentInstance.data. currencyConversionData is a plain field. Reels still opens the same dialog through the Material bottom sheet and MAT_BOTTOM_SHEET_DATA.

The fundraiser store picker binds modalHeader and apiEndPoint in the template and types the viewChild. Those two are signal inputs, so writing them on the component instance was the same class of bug. Livestream and messages still assign disabledOptionsByTab, which is a decorator @Input().

Three opens still throw

After open() returns, the active livestream screen subscribes to componentInstance.closeModal for order payment, customer information, and shipping options. Those three classes have no closeModal output. The subscription throws before the click handler finishes.

That line is already on the base commit 5449fe850e. It was easy to miss because the signal assignment threw first, on a later change detection. This pull request removes that throw, so execution now reaches closeModal.subscribe. The modal node is already in the document. The handler still errors, and nothing is listening for dismiss.

OpenerComponentcloseModal
Order paymentOrderPaymentComponentMissing. Subscribe at line 851.
Merchandise customer infoCustomerInformationComponentMissing. Subscribe at line 952.
Shipping optionsShippingOptionsComponentMissing. Subscribe at line 987.
Customize experience, ticket preview, ticket customer info, portfolio, share detailsThose five componentsoutput() is declared. Subscribe is valid.

Livestream checkout opens

The other componentInstance writes in that block are decorator inputs: product ids, userProfile, queryParamData, redirect, paymentType, creatorId, contentSk. Those assignments do not replace a signal.

Send Tip callers

Seven NgbModal.open(SendtipdialogComponent) sites now pass the token. I compared each payload with the assignments it replaced.

CallerToken fields
Home, forum, forum post, searchdata, loggedInUserData
Post detail, profileThose, plus userType and priorTipCloseResult
Livestream chatThose, plus userType and showMessageArea: false

Profile's LocalCommonEnums is an import alias of CommonEnums, so guest vs logged still matches the dialog's comparison. Passing priorTipCloseResult ?? null matches the old input default when the reopen payload is absent.

Chat tips and the three livestream post-payment opens pass POST_PAYMENT_MODAL_DATA. Chat sets isModalView only. Livestream also sets isActiveLiveStreaming. That matches the old assignments.

What I did not run

  • I read the pull request diff at a073ce250cff and the ng-bootstrap 20 modal stack in node_modules. The custom injector is the parent of the component injector.
  • I did not run ngc, the unit tests, a browser session, or a white-label build. The pull request has no status checks.
  • A dirty local environment.ts is not in the pull request.

Before a yes, drop or implement those three closeModal subscriptions, mark the pull request ready, and click through Send Tip on home, a livestream chat tip with the message box hidden, and a phone-width merchandise checkout.