Gate embedded checkout design rollout - #14496
Conversation
Amp-Thread-ID: https://ampcode.com/threads/T-019fb97f-9f7b-7208-aff7-f11d99d7fdb5 Co-authored-by: Amp <amp@ampcode.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughAdds the ChangesEmbedded checkout gating
Estimated code review effort: 2 (Simple) | ~10 minutes Sequence Diagram(s)sequenceDiagram
participant RemoteConfig
participant useFeatureFlags
participant SubscriptionRequiredDialogContentUnified
participant PaymentPreview
RemoteConfig->>useFeatureFlags: provide embedded_checkout_enabled
useFeatureFlags->>SubscriptionRequiredDialogContentUnified: expose embeddedCheckoutEnabled
SubscriptionRequiredDialogContentUnified->>PaymentPreview: pass usePaymentElement
PaymentPreview-->>SubscriptionRequiredDialogContentUnified: render checkout preview
Possibly related PRs
Suggested labels: Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (5 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
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 |
📄 Knowledge reviewDosu skipped reviewing this PR because your organization has used its |
🎭 Playwright: ❌ 1755 passed, 5 failed · 3 flaky❌ Failed Tests📊 Browser Reports
🎨 Storybook: ✅ Built — View Storybook📦 Bundle Size
⚡ Performance Report
Absolute values
Raw data{
"timestamp": "2026-07-31T19:43:31.341Z",
"gitSha": "f59a077e52dca9256a7e7f8edef7c60217a53617",
"branch": "jaewon/fe-1467-embedded-checkout-flag",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2122.109000000023,
"styleRecalcs": 7,
"styleRecalcDurationMs": 8.654000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 805.7149999999999,
"heapDeltaBytes": 5147480,
"heapUsedBytes": 77023444,
"domNodes": 14,
"jsHeapTotalBytes": 19521536,
"scriptDurationMs": 27.961999999999996,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-idle",
"durationMs": 2086.06199999997,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.113999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 735.05,
"heapDeltaBytes": 5122308,
"heapUsedBytes": 76647080,
"domNodes": 16,
"jsHeapTotalBytes": 19521536,
"scriptDurationMs": 27.722,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2079.2879999999627,
"styleRecalcs": 78,
"styleRecalcDurationMs": 48.773,
"layouts": 12,
"layoutDurationMs": 4.1659999999999995,
"taskDurationMs": 1189.632,
"heapDeltaBytes": -20690272,
"heapUsedBytes": 50782016,
"domNodes": -291,
"jsHeapTotalBytes": 19910656,
"scriptDurationMs": 160.93699999999998,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2001.423999999929,
"styleRecalcs": 81,
"styleRecalcDurationMs": 51.43599999999999,
"layouts": 12,
"layoutDurationMs": 3.8249999999999993,
"taskDurationMs": 1112.806,
"heapDeltaBytes": -250288,
"heapUsedBytes": 71166532,
"domNodes": 64,
"jsHeapTotalBytes": 20570112,
"scriptDurationMs": 157.622,
"eventListeners": 9,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1752.7109999999766,
"styleRecalcs": 30,
"styleRecalcDurationMs": 20.464000000000002,
"layouts": 6,
"layoutDurationMs": 0.7749999999999999,
"taskDurationMs": 562.067,
"heapDeltaBytes": 8281108,
"heapUsedBytes": 80072880,
"domNodes": 74,
"jsHeapTotalBytes": 19521536,
"scriptDurationMs": 29.619000000000003,
"eventListeners": 21,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1765.912999999955,
"styleRecalcs": 31,
"styleRecalcDurationMs": 19.954000000000004,
"layouts": 6,
"layoutDurationMs": 0.8200000000000002,
"taskDurationMs": 584.821,
"heapDeltaBytes": 8373912,
"heapUsedBytes": 79946640,
"domNodes": 75,
"jsHeapTotalBytes": 19783680,
"scriptDurationMs": 30.632,
"eventListeners": 21,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 700.9499999999775,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.61,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 456.22300000000007,
"heapDeltaBytes": -11469940,
"heapUsedBytes": 60299196,
"domNodes": 18,
"jsHeapTotalBytes": 20045824,
"scriptDurationMs": 63.888,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 761.9700000000194,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.754999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 495.923,
"heapDeltaBytes": -11153112,
"heapUsedBytes": 60217568,
"domNodes": 16,
"jsHeapTotalBytes": 20307968,
"scriptDurationMs": 70.353,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2058.530000000019,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.300000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1012.688,
"heapDeltaBytes": 7182436,
"heapUsedBytes": 69326164,
"domNodes": -295,
"jsHeapTotalBytes": 5038080,
"scriptDurationMs": 144.81700000000004,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2056.6929999999957,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.611,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 988.383,
"heapDeltaBytes": 7184184,
"heapUsedBytes": 69694212,
"domNodes": -290,
"jsHeapTotalBytes": 5300224,
"scriptDurationMs": 147.94899999999998,
"eventListeners": -146,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2544.001000000037,
"styleRecalcs": 67,
"styleRecalcDurationMs": 13.315000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1637.8129999999999,
"heapDeltaBytes": 6073872,
"heapUsedBytes": 69579320,
"domNodes": -297,
"jsHeapTotalBytes": 4718592,
"scriptDurationMs": 542.256,
"eventListeners": -143,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2524.357999999893,
"styleRecalcs": 66,
"styleRecalcDurationMs": 12.629000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1632.6660000000002,
"heapDeltaBytes": -5868892,
"heapUsedBytes": 58417188,
"domNodes": -297,
"jsHeapTotalBytes": 5038080,
"scriptDurationMs": 532.5640000000001,
"eventListeners": -175,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3731.956000000025,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.873000000000001,
"layouts": 60,
"layoutDurationMs": 8.433,
"taskDurationMs": 1926.3960000000002,
"heapDeltaBytes": -4686188,
"heapUsedBytes": 60338120,
"domNodes": -303,
"jsHeapTotalBytes": 6873088,
"scriptDurationMs": 677.611,
"eventListeners": -150,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3599.3799999999965,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.423999999999996,
"layouts": 60,
"layoutDurationMs": 7.86,
"taskDurationMs": 1840.388,
"heapDeltaBytes": -8707216,
"heapUsedBytes": 56387432,
"domNodes": -298,
"jsHeapTotalBytes": 7921664,
"scriptDurationMs": 631.9,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2045.1600000000099,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.833,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 981.848,
"heapDeltaBytes": 7517376,
"heapUsedBytes": 71554104,
"domNodes": -294,
"jsHeapTotalBytes": 4513792,
"scriptDurationMs": 141.316,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2040.7470000000103,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.847999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 998.059,
"heapDeltaBytes": 6889700,
"heapUsedBytes": 71193772,
"domNodes": -291,
"jsHeapTotalBytes": 4775936,
"scriptDurationMs": 142.588,
"eventListeners": -176,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 753.3000000000243,
"styleRecalcs": 45,
"styleRecalcDurationMs": 13.351999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 498.54099999999994,
"heapDeltaBytes": -10467908,
"heapUsedBytes": 61479676,
"domNodes": 16,
"jsHeapTotalBytes": 19259392,
"scriptDurationMs": 131.954,
"eventListeners": 11,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 697.714000000019,
"styleRecalcs": 47,
"styleRecalcDurationMs": 12.288,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 478.165,
"heapDeltaBytes": -10286004,
"heapUsedBytes": 61591308,
"domNodes": 20,
"jsHeapTotalBytes": 19521536,
"scriptDurationMs": 126.23899999999999,
"eventListeners": 10,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2014.8310000000151,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.601,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 701.773,
"heapDeltaBytes": 4743008,
"heapUsedBytes": 76499292,
"domNodes": 16,
"jsHeapTotalBytes": 19259392,
"scriptDurationMs": 23.317,
"eventListeners": 7,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2019.5660000000544,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.954,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 685.3000000000001,
"heapDeltaBytes": 4767356,
"heapUsedBytes": 76472480,
"domNodes": 16,
"jsHeapTotalBytes": 20045824,
"scriptDurationMs": 22.165,
"eventListeners": 7,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1785.9770000000026,
"styleRecalcs": 77,
"styleRecalcDurationMs": 45.89699999999999,
"layouts": 16,
"layoutDurationMs": 5.050000000000001,
"taskDurationMs": 999.104,
"heapDeltaBytes": -3746084,
"heapUsedBytes": 67564140,
"domNodes": 64,
"jsHeapTotalBytes": 19783680,
"scriptDurationMs": 115.17399999999998,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1787.1399999999085,
"styleRecalcs": 76,
"styleRecalcDurationMs": 45.016,
"layouts": 16,
"layoutDurationMs": 4.9319999999999995,
"taskDurationMs": 1009.371,
"heapDeltaBytes": -4157296,
"heapUsedBytes": 67574416,
"domNodes": 63,
"jsHeapTotalBytes": 20045824,
"scriptDurationMs": 113.01899999999998,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1468.9149999999245,
"styleRecalcs": 18,
"styleRecalcDurationMs": 34.29599999999999,
"layouts": 14,
"layoutDurationMs": 14.110999999999999,
"taskDurationMs": 1137.4930000000002,
"heapDeltaBytes": 29808292,
"heapUsedBytes": 102718444,
"domNodes": 13673,
"jsHeapTotalBytes": 17039360,
"scriptDurationMs": 42.95400000000001,
"eventListeners": 2371,
"totalBlockingTimeMs": 160,
"frameDurationMs": 16.669999999999952,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 9438.342999999975,
"styleRecalcs": 249,
"styleRecalcDurationMs": 41.956999999999994,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 5954.758,
"heapDeltaBytes": 20989360,
"heapUsedBytes": 83495756,
"domNodes": -294,
"jsHeapTotalBytes": 6524928,
"scriptDurationMs": 1816.0029999999997,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 9385.453999999982,
"styleRecalcs": 250,
"styleRecalcDurationMs": 42.24999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 5764.448,
"heapDeltaBytes": 23766584,
"heapUsedBytes": 85734656,
"domNodes": -291,
"jsHeapTotalBytes": 7573504,
"scriptDurationMs": 1750.0690000000002,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 18745.758999999965,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18476.202999999998,
"heapDeltaBytes": -49130788,
"heapUsedBytes": 180845756,
"domNodes": -8312,
"jsHeapTotalBytes": -11939840,
"scriptDurationMs": 738.085,
"eventListeners": -16385,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 18924.387000000024,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18663.493000000002,
"heapDeltaBytes": -55030004,
"heapUsedBytes": 174100096,
"domNodes": -8312,
"jsHeapTotalBytes": -6754304,
"scriptDurationMs": 733.3829999999999,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 24105.150000000038,
"styleRecalcs": 180,
"styleRecalcDurationMs": 29.367000000000033,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 23868.146,
"heapDeltaBytes": -38254084,
"heapUsedBytes": 177067948,
"domNodes": -8312,
"jsHeapTotalBytes": -14675968,
"scriptDurationMs": 1196.283,
"eventListeners": -16385,
"totalBlockingTimeMs": 1144,
"frameDurationMs": 18.889999999999905,
"p95FrameDurationMs": 16.799999999995634
},
{
"name": "vue-large-graph-pan",
"durationMs": 24044.45599999997,
"styleRecalcs": 182,
"styleRecalcDurationMs": 29.986999999999988,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 23766.134000000002,
"heapDeltaBytes": -43577892,
"heapUsedBytes": 179935756,
"domNodes": -8312,
"jsHeapTotalBytes": -9981952,
"scriptDurationMs": 1201.5339999999999,
"eventListeners": -16381,
"totalBlockingTimeMs": 1122,
"frameDurationMs": 18.330000000000048,
"p95FrameDurationMs": 16.799999999995634
},
{
"name": "workflow-execution",
"durationMs": 508.8349999999764,
"styleRecalcs": 19,
"styleRecalcDurationMs": 27.534000000000002,
"layouts": 4,
"layoutDurationMs": 1.644,
"taskDurationMs": 174.07799999999995,
"heapDeltaBytes": -15676300,
"heapUsedBytes": 54973620,
"domNodes": 154,
"jsHeapTotalBytes": 6676480,
"scriptDurationMs": 15.247,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 477.5910000000749,
"styleRecalcs": 11,
"styleRecalcDurationMs": 19.903000000000002,
"layouts": 3,
"layoutDurationMs": 0.678,
"taskDurationMs": 131.34400000000002,
"heapDeltaBytes": -16454132,
"heapUsedBytes": 54341640,
"domNodes": 115,
"jsHeapTotalBytes": 6938624,
"scriptDurationMs": 10.821,
"eventListeners": 68,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Amp-Thread-ID: https://ampcode.com/threads/T-019fb97f-9f7b-7208-aff7-f11d99d7fdb5 Co-authored-by: Amp <amp@ampcode.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/platform/workspace/components/SubscriptionRequiredDialogContentUnified.test.ts`:
- Around line 89-94: Update SubscriptionAddPaymentPreviewWorkspaceStub to render
distinct semantic hosted or embedded checkout content based on
usePaymentElement, rather than exposing the raw prop via data-testid. Revise the
affected tests around the stub to query the rendered checkout state by
accessible role or name, preserving assertions for both payment-element modes.
- Line 119: Move the VITE_STRIPE_PUBLISHABLE_KEY stub out of the shared setup
around the suite and into the specific test that requires it, or restore it in
that test’s afterEach cleanup. Update the test setup containing vi.stubEnv so
the environment variable is not left stubbed after the test completes, without
relying on unstubEnvs.
- Around line 12-18: Move the reactive mock bindings mockCheckoutStep,
mockPreviewVariant, and mockEmbeddedCheckoutEnabled into a vi.hoisted()
initializer placed before the vi.mock calls, and create or import the required
Vue ref API within that hoisted initializer as well. Update the
useSubscriptionCheckout mock factory to reference the hoisted state so module
initialization cannot access bindings in the temporal dead zone.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 1b131b38-89d8-4d73-a726-cbe714581684
📒 Files selected for processing (4)
src/composables/useFeatureFlags.tssrc/platform/remoteConfig/types.tssrc/platform/workspace/components/SubscriptionRequiredDialogContentUnified.test.tssrc/platform/workspace/components/SubscriptionRequiredDialogContentUnified.vue
Amp-Thread-ID: https://ampcode.com/threads/T-019fb97f-9f7b-7208-aff7-f11d99d7fdb5 Co-authored-by: Amp <amp@ampcode.com>
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## comfydesigner/saved-method-confirm #14496 +/- ##
=====================================================================
Coverage ? 79.07%
=====================================================================
Files ? 1762
Lines ? 104552
Branches ? 35437
=====================================================================
Hits ? 82679
Misses ? 21419
Partials ? 454
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
|
CI follow-up:
|
|
Follow-up on the remaining red checks: the stacked base PR #14449 currently has the exact same failures ( |
Summary
Gate the stacked embedded checkout UI behind the server feature flag
embedded_checkout_enabledso rollout defaults to the existing hosted checkout while the backend dependencies land.Changes
false) and applies it at the existingusePaymentElementactivation seam. Disabled keeps the legacy checkout path; enabled activates the complete embedded Payment Element layout whenVITE_STRIPE_PUBLISHABLE_KEYis configured.Review Focus
The design stack previously enabled the Payment Element whenever a publishable key existed, leaving no rollout escape hatch. This is intentionally one gate at the checkout boundary rather than flag checks throughout the design components.
Backend readiness:
confirmation_tokenforwarding, exact first-invoice PaymentIntent confirmation, 3DS/Alipay handling, and saving the resulting default payment method. Keep the flag off until that contract is deployed and verified.promotion_code, but preview/requote does not accept it, so the UI cannot show a validated discounted total before consent. Keep promo dark/disabled until preview support lands.null, so saved-method selection stays dark and does not block collecting a new method through Payment Element.Verified with:
pnpm test:unit src/platform/workspace/components/SubscriptionRequiredDialogContentUnified.test.ts src/platform/workspace/components/SubscriptionAddPaymentPreviewWorkspace.test.ts src/platform/workspace/components/UnifiedStripePaymentSelector.test.ts(18 passed)pnpm test:unit src/composables/useFeatureFlags.test.ts(28 passed)pnpm typecheckReal cloud/payment screenshots were not available in this workspace; routing evidence is covered by the focused component tests. Do not merge until #14449/#14447 and cloud#5859 are safe for rollout.
Screenshots (if applicable)
Not available: this isolated workspace has no authenticated billing account or deployed cloud#5859 backend.