Skip to content

feat(billing): add membership renewal extension flow#3555

Merged
rohitpaulk merged 3 commits intomainfrom
feat-membership-renewal-extension
Jan 10, 2026
Merged

feat(billing): add membership renewal extension flow#3555
rohitpaulk merged 3 commits intomainfrom
feat-membership-renewal-extension

Conversation

@rohitpaulk
Copy link
Copy Markdown
Member

@rohitpaulk rohitpaulk commented Jan 5, 2026

Add ability to extend active subscriptions within 45 days of expiry by
introducing canBeExtended getter on Subscription model. Update renewal
section to reflect membership renewal status and conditionally enable the
extend membership button with tooltip showing the earliest extension date.
Pass active subscription to renewal section and handle button click action.


Note

Introduces an extend-membership flow on the Billing page and related UX tweaks.

  • Adds RenewalSection UI with explanatory text and an "Extend membership" button that opens ChooseMembershipPlanModal
  • Renders modal with checkout paths (/settings/billing cancel, /settings/billing?action=membership_extended success) and loads regionalDiscount
  • Shows a dismissible "membership extended" success notice when visiting with ?action=membership_extended and clears the query param
  • Adds subscription.isLifetimeMembership and hides renewal section when no active subscription or lifetime membership
  • Updates controller (settings/billing) to manage modal state, query param, success notice, and discount loading
  • Adds acceptance tests for extend flow, notice behavior, and conditional visibility; updates page objects

Written by Cursor Bugbot for commit 0c1ef76. This will update automatically on new commits. Configure here.

Comment thread app/components/settings/billing-page/renewal-section.hbs Outdated
Comment thread app/components/settings/billing-page/renewal-section.ts Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jan 5, 2026

Test Results

  1 files  ±0    1 suites  ±0   6m 47s ⏱️ -6s
693 tests +6  633 ✅ +7  55 💤 ±0  0 ❌ ±0  5 🔥  - 1 
708 runs  +6  643 ✅ +8  55 💤 ±0  5 ❌  - 1  5 🔥  - 1 

For more details on these errors, see this check.

Results for commit 0c1ef76. ± Comparison against base commit 8d5325a.

♻️ This comment has been updated with latest results.

@codecov
Copy link
Copy Markdown

codecov Bot commented Jan 5, 2026

❌ 5 Tests Failed:

Tests completed Failed Passed Skipped
638 5 633 55
View the top 3 failed test(s) by shortest run time
Chrome 142.0::Acceptance | concepts-test: can use Delete and Backspace keys in the feedback popup
Stack Traces | 0.354s run time
Promise rejected during "can use Delete and Backspace keys in the feedback popup": Element not found.

PageObject: 'page.questionCards[0].focusedOption'
  Selector: '[data-test-question-card]:eq(0) [data-test-question-card-option]:focus'

PageObject: 'page.questionCards[0].focusedOption.click()'
  Selector: '[data-test-question-card]:eq(0) [data-test-question-card-option]:focus'
Chrome 142.0::Acceptance | concepts-test: can navigate using j/k and select option using enter
Stack Traces | 0.39s run time
Promise rejected during "can navigate using j/k and select option using enter": Element not found.

PageObject: 'page.questionCards[0].focusedOption.text'
  Selector: '[data-test-question-card]:eq(0) [data-test-question-card-option]:focus'
Chrome 142.0::Acceptance | concepts-test: can navigate using arrow keys and select option using enter
Stack Traces | 0.396s run time
Promise rejected during "can navigate using arrow keys and select option using enter": Element not found.

PageObject: 'page.questionCards[0].focusedOption.text'
  Selector: '[data-test-question-card]:eq(0) [data-test-question-card-option]:focus'
Chrome 142.0::Acceptance | concepts-test: navigating options wraps around the list for the current question card only
Stack Traces | 0.709s run time
Promise rejected during "navigating options wraps around the list for the current question card only": Element not found.

PageObject: 'page.questionCards[1].focusedOption.text'
  Selector: '[data-test-question-card]:eq(1) [data-test-question-card-option]:focus'
Chrome 142.0::Acceptance | concepts-test: while navigating using keys, options are traversed one at a time
Stack Traces | 1.14s run time
Promise rejected during "while navigating using keys, options are traversed one at a time": Element not found.

PageObject: 'page.questionCards[2].focusedOption.text'
  Selector: '[data-test-question-card]:eq(2) [data-test-question-card-option]:focus'

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@codecov
Copy link
Copy Markdown

codecov Bot commented Jan 5, 2026

Bundle Report

Changes will decrease total bundle size by 229.63kB (-0.59%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
client-array-push 38.97MB -229.63kB (-0.59%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: client-array-push

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/chunk.*.js -576 bytes 18.79kB -2.97%
assets/chunk.*.js -576 bytes 72.34kB -0.79%
assets/chunk.*.js -576 bytes 22.37kB -2.51%
assets/chunk.*.js -576 bytes 29.07kB -1.94%
assets/chunk.*.js -576 bytes 1.6kB -26.51%
assets/chunk.*.js -576 bytes 40.99kB -1.39%
assets/chunk.*.js -576 bytes 9.28kB -5.85%
assets/chunk.*.js -576 bytes 37.06kB -1.53%
assets/chunk.*.js -576 bytes 1.99kB -22.48%
assets/chunk.*.js -576 bytes 10.56kB -5.17%
assets/chunk.*.js -576 bytes 2.73kB -17.42%
assets/chunk.*.js -576 bytes 780.04kB -0.07%
assets/chunk.*.js -576 bytes 29.76kB -1.9%
assets/chunk.*.js -576 bytes 29.72kB -1.9%
assets/chunk.*.js -576 bytes 10.7kB -5.11%
assets/chunk.*.js -578 bytes 305.18kB -0.19%
assets/chunk.*.js -576 bytes 14.61kB -3.79%
assets/chunk.*.js -576 bytes 1.93kB -23.01%
assets/chunk.*.js -576 bytes 18.81kB -2.97%
assets/chunk.*.js -576 bytes 25.97kB -2.17%
assets/chunk.*.js -576 bytes 20.95kB -2.68%
assets/chunk.*.js -576 bytes 13.94kB -3.97%
assets/chunk.*.js -576 bytes 43.98kB -1.29%
assets/chunk.*.js -576 bytes 13.22kB -4.17%
assets/chunk.*.js -576 bytes 31.57kB -1.79%
assets/chunk.*.js -576 bytes 1.15kB -33.37%
assets/chunk.*.js -576 bytes 28.33kB -1.99%
assets/chunk.*.js -576 bytes 38.77kB -1.46%
assets/chunk.*.js -589 bytes 230.96kB -0.25%
assets/chunk.*.js -576 bytes 44.98kB -1.26%
assets/chunk.*.js -576 bytes 13.38kB -4.13%
assets/chunk.*.js -576 bytes 27.72kB -2.04%
assets/chunk.*.js -576 bytes 23.3kB -2.41%
assets/chunk.*.js -576 bytes 11.68kB -4.7%
assets/chunk.*.js -576 bytes 1.99kB -22.48%
assets/chunk.*.js -575 bytes 18.12kB -3.08%
assets/chunk.*.js -576 bytes 30.78kB -1.84%
assets/chunk.*.js -576 bytes 1.1kB -34.27%
assets/chunk.*.js -576 bytes 26.9kB -2.1%
assets/chunk.*.js -576 bytes 1.24kB -31.72%
assets/chunk.*.js 500 bytes 409.36kB 0.12%
assets/chunk.*.js -576 bytes 113.95kB -0.5%
assets/chunk.*.js -576 bytes 13.86kB -3.99%
assets/chunk.*.js -576 bytes 3.2kB -15.27%
assets/chunk.*.js -576 bytes 32.29kB -1.75%
assets/chunk.*.js -576 bytes 21.06kB -2.66%
assets/chunk.*.js -576 bytes 1.71kB -25.17%
assets/chunk.*.js -576 bytes 48.68kB -1.17%
assets/chunk.*.js -576 bytes 25.61kB -2.2%
assets/chunk.*.js -576 bytes 21.65kB -2.59%
assets/chunk.*.js -576 bytes 8.65kB -6.24%
assets/chunk.*.js -576 bytes 14.45kB -3.83%
assets/chunk.*.js -576 bytes 9.53kB -5.7%
assets/chunk.*.js -576 bytes 1.05kB -35.32%
assets/chunk.*.js -576 bytes 7.95kB -6.76%
assets/chunk.*.js -576 bytes 47.43kB -1.2%
assets/chunk.*.js -576 bytes 47.18kB -1.21%
assets/chunk.*.js -576 bytes 31.07kB -1.82%
assets/chunk.*.js -576 bytes 22.77kB -2.47%
assets/chunk.*.js -576 bytes 2.19kB -20.86%
assets/chunk.*.js -576 bytes 41.66kB -1.36%
assets/chunk.*.js -576 bytes 23.59kB -2.38%
assets/chunk.*.js -576 bytes 57.17kB -1.0%
assets/chunk.*.js -576 bytes 24.2kB -2.32%
assets/chunk.*.js -576 bytes 37.1kB -1.53%
assets/chunk.*.js -576 bytes 10.67kB -5.12%
assets/chunk.*.js -576 bytes 19.87kB -2.82%
assets/chunk.*.js -576 bytes 16.41kB -3.39%
assets/chunk.*.js -576 bytes 74.99kB -0.76%
assets/chunk.*.js -576 bytes 24.21kB -2.32%
assets/chunk.*.js -576 bytes 13.79kB -4.01%
assets/chunk.*.js -576 bytes 47.44kB -1.2%
assets/chunk.*.js -576 bytes 11.62kB -4.72%
assets/chunk.*.js -576 bytes 175.01kB -0.33%
assets/chunk.*.js -576 bytes 22.82kB -2.46%
assets/chunk.*.js -576 bytes 16.46kB -3.38%
assets/chunk.*.js -576 bytes 11.01kB -4.97%
assets/chunk.*.js -576 bytes 2.21kB -20.68%
assets/chunk.*.js -576 bytes 21.25kB -2.64%
assets/chunk.*.js -576 bytes 31.01kB -1.82%
assets/chunk.*.js -576 bytes 33.67kB -1.68%
assets/chunk.*.js -576 bytes 19.18kB -2.92%
assets/chunk.*.js -576 bytes 622.58kB -0.09%
assets/chunk.*.js -576 bytes 262.58kB -0.22%
assets/chunk.*.js -576 bytes 18.81kB -2.97%
assets/chunk.*.js -576 bytes 21.06kB -2.66%
assets/chunk.*.js -576 bytes 9.73kB -5.59%
assets/chunk.*.js -576 bytes 22.81kB -2.46%
assets/chunk.*.js 488 bytes 334.69kB 0.15%
assets/chunk.*.js -578 bytes 65.13kB -0.88%
assets/chunk.*.js -576 bytes 33.97kB -1.67%
assets/chunk.*.js -576 bytes 20.63kB -2.72%
assets/chunk.*.js -576 bytes 24.56kB -2.29%
assets/chunk.*.js -576 bytes 2.29kB -20.09%
assets/chunk.*.js -576 bytes 47.44kB -1.2%
assets/chunk.*.js -576 bytes 136.3kB -0.42%
assets/chunk.*.js -576 bytes 16.74kB -3.33%
assets/chunk.*.js -576 bytes 2.75kB -17.33%
assets/chunk.*.js -576 bytes 15.74kB -3.53%
assets/chunk.*.js -576 bytes 2.44kB -19.09%
assets/chunk.*.js -576 bytes 2.08kB -21.71%
assets/chunk.*.js -576 bytes 177.98kB -0.32%
assets/chunk.*.js -576 bytes 24.99kB -2.25%
assets/chunk.*.js -576 bytes 2.25kB -20.37%
assets/chunk.*.js -576 bytes 21.25kB -2.64%
assets/chunk.*.js -576 bytes 57.51kB -0.99%
assets/chunk.*.js -576 bytes 14.34kB -3.86%
assets/chunk.*.js -576 bytes 1.01kB -36.23%
assets/chunk.*.js -576 bytes 31.26kB -1.81%
assets/chunk.*.js -574 bytes 190.01kB -0.3%
assets/chunk.*.js -576 bytes 16.04kB -3.47%
assets/chunk.*.js -576 bytes 12.64kB -4.36%
assets/chunk.*.js -576 bytes 968 bytes -37.31%
assets/chunk.*.js -576 bytes 10.12kB -5.39%
assets/chunk.*.js -576 bytes 20.55kB -2.73%
assets/chunk.*.js -576 bytes 10.24kB -5.33%
assets/chunk.*.js -576 bytes 11.36kB -4.82%
assets/chunk.*.js -576 bytes 20.34kB -2.75%
assets/chunk.*.js -576 bytes 9.24kB -5.87%
assets/chunk.*.js -576 bytes 13.99kB -3.95%
assets/chunk.*.js -576 bytes 1.82kB -23.99%
assets/chunk.*.js -576 bytes 25.07kB -2.25%
assets/chunk.*.js -576 bytes 2.43kB -19.19%
assets/chunk.*.js -576 bytes 878 bytes -39.61%
assets/chunk.*.js -576 bytes 20.19kB -2.77%
assets/chunk.*.js -576 bytes 14.97kB -3.7%
assets/chunk.*.js -576 bytes 515 bytes -52.8%
assets/chunk.*.js -576 bytes 21.02kB -2.67%
assets/chunk.*.js -576 bytes 638.49kB -0.09%
assets/chunk.*.js -576 bytes 2.54kB -18.46%
assets/chunk.*.js -576 bytes 14.77kB -3.75%
assets/chunk.*.js -576 bytes 14.78kB -3.75%
assets/chunk.*.js -576 bytes 97.75kB -0.59%
assets/chunk.*.js -576 bytes 1.61kB -26.35%
assets/chunk.*.js -576 bytes 27.41kB -2.06%
assets/chunk.*.js -576 bytes 172.26kB -0.33%
assets/chunk.*.js -576 bytes 22.82kB -2.46%
assets/chunk.*.js -576 bytes 14.46kB -3.83%
assets/chunk.*.js -576 bytes 973 bytes -37.19%
assets/chunk.*.js -576 bytes 49.22kB -1.16%
assets/chunk.*.js -576 bytes 33.4kB -1.7%
assets/chunk.*.js -576 bytes 9.27kB -5.85%
assets/chunk.*.js -576 bytes 15.36kB -3.61%
assets/chunk.*.js -576 bytes 10.66kB -5.13%
assets/chunk.*.js -576 bytes 37.7kB -1.5%
assets/chunk.*.js -576 bytes 18.81kB -2.97%
assets/chunk.*.js -576 bytes 35.6kB -1.59%
assets/chunk.*.js -576 bytes 17.31kB -3.22%
assets/chunk.*.js -576 bytes 27.6kB -2.04%
assets/chunk.*.js -576 bytes 26.39kB -2.14%
assets/chunk.*.js -576 bytes 181.26kB -0.32%
assets/chunk.*.js -576 bytes 16.41kB -3.39%
assets/chunk.*.js 6.62kB 3.38MB 0.2%
assets/chunk.*.js -576 bytes 59.53kB -0.96%
assets/chunk.*.js -576 bytes 20.02kB -2.8%
assets/chunk.*.js -576 bytes 1.94kB -22.91%
assets/chunk.*.js -576 bytes 20.19kB -2.77%
assets/chunk.*.js -576 bytes 10.37kB -5.26%
assets/chunk.*.js -576 bytes 62.73kB -0.91%
assets/chunk.*.js -576 bytes 14.22kB -3.89%
assets/chunk.*.js -576 bytes 2.15kB -21.16%
assets/chunk.*.js -576 bytes 18.81kB -2.97%
assets/chunk.*.js -576 bytes 14.15kB -3.91%
assets/chunk.*.js -576 bytes 2.48kB -18.84%
assets/chunk.*.js -576 bytes 22.81kB -2.46%
assets/chunk.*.js -576 bytes 2.25kB -20.4%
assets/chunk.*.js -573 bytes 71.58kB -0.79%
assets/chunk.*.js -576 bytes 9.61kB -5.65%
assets/chunk.*.js -576 bytes 14.24kB -3.89%
assets/chunk.*.js -576 bytes 35.84kB -1.58%
assets/chunk.*.js -576 bytes 1.88kB -23.5%
assets/chunk.*.js -576 bytes 50.88kB -1.12%
assets/chunk.*.js -576 bytes 21.93kB -2.56%
assets/chunk.*.js -576 bytes 924 bytes -38.4%
assets/chunk.*.js -576 bytes 1.17kB -32.91%
assets/chunk.*.js -576 bytes 40.9kB -1.39%
assets/chunk.*.js -576 bytes 10.56kB -5.17%
assets/chunk.*.js -576 bytes 25.48kB -2.21%
assets/chunk.*.js -576 bytes 17.3kB -3.22%
assets/chunk.*.js -576 bytes 97.83kB -0.59%
assets/chunk.*.js -576 bytes 22.82kB -2.46%
assets/chunk.*.js -576 bytes 27.03kB -2.09%
assets/chunk.*.js -576 bytes 16.3kB -3.41%
assets/chunk.*.js -576 bytes 20.97kB -2.67%
assets/chunk.*.js -576 bytes 131.7kB -0.44%
assets/chunk.*.js -576 bytes 3.2kB -15.27%
assets/chunk.*.js -576 bytes 2.02kB -22.21%
assets/chunk.*.js -576 bytes 47.43kB -1.2%
assets/chunk.*.js -576 bytes 29.5kB -1.92%
assets/chunk.*.js -576 bytes 35.35kB -1.6%
assets/chunk.*.js -576 bytes 13.4kB -4.12%
assets/chunk.*.js -576 bytes 41.82kB -1.36%
assets/chunk.*.js -576 bytes 53.92kB -1.06%
assets/chunk.*.js -576 bytes 17.3kB -3.22%
assets/chunk.*.js -576 bytes 114.16kB -0.5%
assets/chunk.*.js -576 bytes 16.46kB -3.38%
assets/chunk.*.js -576 bytes 15.39kB -3.61%
assets/chunk.*.js -576 bytes 1.03kB -35.91%
assets/chunk.*.js -576 bytes 15.26kB -3.64%
assets/chunk.*.js -576 bytes 18.16kB -3.07%
assets/chunk.*.js -575 bytes 10.22kB -5.33%
assets/chunk.*.js -576 bytes 48.27kB -1.18%
assets/chunk.*.js -576 bytes 23.86kB -2.36%
assets/chunk.*.js -576 bytes 53.93kB -1.06%
assets/chunk.*.js -576 bytes 24.46kB -2.3%
assets/chunk.*.js -576 bytes 21.92kB -2.56%
assets/chunk.*.js -576 bytes 27.07kB -2.08%
assets/chunk.*.js -576 bytes 105.65kB -0.54%
assets/chunk.*.js -576 bytes 69.62kB -0.82%
assets/chunk.*.js -576 bytes 22.82kB -2.46%
assets/chunk.*.js -576 bytes 183.96kB -0.31%
assets/chunk.*.js -576 bytes 29.09kB -1.94%
assets/chunk.*.js -576 bytes 873 bytes -39.75%
assets/chunk.*.js -576 bytes 96.03kB -0.6%
assets/chunk.*.js -576 bytes 23.12kB -2.43%
assets/chunk.*.js -576 bytes 37.68kB -1.51%
assets/chunk.*.js -576 bytes 24.62kB -2.29%
assets/chunk.*.js -576 bytes 25.48kB -2.21%
assets/chunk.*.js -576 bytes 14.81kB -3.74%
assets/chunk.*.js -576 bytes 22.82kB -2.46%
assets/chunk.*.js -576 bytes 19.37kB -2.89%
assets/chunk.*.js -576 bytes 175.72kB -0.33%
assets/chunk.*.js -576 bytes 32.39kB -1.75%
assets/chunk.*.js -576 bytes 39.27kB -1.45%
assets/chunk.*.js -576 bytes 769 bytes -42.83%
assets/chunk.*.js -576 bytes 17.52kB -3.18%
assets/chunk.*.js -576 bytes 5.57kB -9.37%
assets/chunk.*.js -576 bytes 2.11kB -21.48%
assets/chunk.*.js -576 bytes 196.59kB -0.29%
assets/chunk.*.js -576 bytes 14.61kB -3.79%
assets/chunk.*.js -576 bytes 21.93kB -2.56%
assets/chunk.*.js -576 bytes 1.83kB -23.91%
assets/chunk.*.js -576 bytes 12.27kB -4.48%
assets/chunk.*.js -576 bytes 58.88kB -0.97%
assets/chunk.*.js -576 bytes 27.39kB -2.06%
assets/chunk.*.js -576 bytes 2.34kB -19.74%
assets/chunk.*.js -576 bytes 16.26kB -3.42%
assets/chunk.*.js -576 bytes 27.61kB -2.04%
assets/chunk.*.js -576 bytes 1.59kB -26.64%
assets/chunk.*.js -576 bytes 89.2kB -0.64%
assets/chunk.*.js -576 bytes 3.01kB -16.06%
assets/chunk.*.js -576 bytes 4.71kB -10.89%
assets/chunk.*.js -576 bytes 5.57kB -9.37%
assets/chunk.*.js -576 bytes 92.58kB -0.62%
assets/chunk.*.js -576 bytes 7.03kB -7.58%
assets/chunk.*.js -576 bytes 3.55kB -13.96%
assets/chunk.*.js -576 bytes 2.2kB -20.77%
assets/chunk.*.js -576 bytes 8.57kB -6.3%
assets/chunk.*.js -576 bytes 80.37kB -0.71%
assets/chunk.*.js -576 bytes 4.4kB -11.57%
assets/chunk.*.js -576 bytes 5.72kB -9.14%
assets/chunk.*.js -576 bytes 71.02kB -0.8%
assets/chunk.*.js -576 bytes 8.38kB -6.43%
assets/chunk.*.js -576 bytes 6.51kB -8.12%
assets/chunk.*.js -576 bytes 50.12kB -1.14%
assets/chunk.*.js -576 bytes 5.96kB -8.82%
assets/chunk.*.js -576 bytes 1.33kB -30.25%
assets/chunk.*.js -576 bytes 6.55kB -8.08%
assets/chunk.*.js -576 bytes 3.06kB -15.85%
assets/chunk.*.js -576 bytes 86.79kB -0.66%
assets/chunk.*.js -576 bytes 4.34kB -11.72%
assets/chunk.*.js -576 bytes 87.92kB -0.65%
assets/chunk.*.js -576 bytes 8.97kB -6.03%
assets/chunk.*.js -576 bytes 4.1kB -12.32%
assets/chunk.*.js -576 bytes 4.3kB -11.81%
assets/chunk.*.js -576 bytes 6.66kB -7.96%
assets/chunk.*.js -576 bytes 4.98kB -10.37%
assets/chunk.*.js -576 bytes 56.19kB -1.01%
assets/chunk.*.js -576 bytes 2.35kB -19.69%
assets/chunk.*.js -576 bytes 12.2kB -4.51%
assets/chunk.*.js -576 bytes 3.51kB -14.09%
assets/chunk.*.js -576 bytes 5.07kB -10.21%
assets/chunk.*.js -576 bytes 1.35kB -29.97%
assets/chunk.*.js -576 bytes 88.59kB -0.65%
assets/chunk.*.js -575 bytes 12.78kB -4.31%
assets/chunk.*.js -576 bytes 3.81kB -13.13%
assets/chunk.*.js -576 bytes 6.95kB -7.66%
assets/chunk.*.js -576 bytes 3.47kB -14.23%
assets/chunk.*.js -575 bytes 85.16kB -0.67%
assets/chunk.*.js -576 bytes 8.14kB -6.61%
assets/chunk.*.js -576 bytes 5.37kB -9.68%
assets/chunk.*.js -576 bytes 5.04kB -10.25%
assets/chunk.*.js -576 bytes 9.3kB -5.83%
assets/chunk.*.js -576 bytes 3.44kB -14.33%
assets/chunk.*.js -576 bytes 70.29kB -0.81%
assets/chunk.*.js -576 bytes 4.08kB -12.37%
assets/chunk.*.js -576 bytes 7.15kB -7.46%
assets/chunk.*.js -576 bytes 2.7kB -17.57%
assets/chunk.*.js -576 bytes 4.33kB -11.74%
assets/chunk.*.js -576 bytes 8.06kB -6.67%
assets/chunk.*.js -576 bytes 6.09kB -8.64%
assets/chunk.*.js -576 bytes 3.79kB -13.18%
assets/chunk.*.js -576 bytes 6.57kB -8.06%
assets/chunk.*.js -576 bytes 5.22kB -9.93%
assets/chunk.*.js -576 bytes 6.73kB -7.88%
assets/chunk.*.js -576 bytes 6.76kB -7.85%
assets/chunk.*.js -576 bytes 3.44kB -14.34%
assets/chunk.*.js -576 bytes 2.71kB -17.51%
assets/chunk.*.js -576 bytes 5.16kB -10.04%
assets/chunk.*.js -576 bytes 4.6kB -11.12%
assets/chunk.*.js -576 bytes 3.77kB -13.26%
assets/chunk.*.js -576 bytes 3.11kB -15.62%
assets/chunk.*.js -576 bytes 3.86kB -12.99%
assets/chunk.*.js -576 bytes 6.94kB -7.66%
assets/chunk.*.js -576 bytes 4.37kB -11.66%
assets/chunk.*.js -576 bytes 11.6kB -4.73%
assets/chunk.*.js -576 bytes 7.66kB -6.99%
assets/chunk.*.js -576 bytes 4.95kB -10.43%
assets/chunk.*.js -576 bytes 3.79kB -13.19%
assets/chunk.*.js -576 bytes 5.33kB -9.75%
assets/chunk.*.js -576 bytes 3.54kB -13.98%
assets/chunk.*.js -576 bytes 4.61kB -11.11%
assets/chunk.*.js -576 bytes 6.55kB -8.08%
assets/chunk.*.js -576 bytes 4.95kB -10.42%
assets/chunk.*.js -576 bytes 5.53kB -9.43%
assets/chunk.*.js -576 bytes 5.31kB -9.79%
assets/chunk.*.js -576 bytes 4.89kB -10.54%
assets/chunk.*.js -576 bytes 6.51kB -8.13%
assets/chunk.*.js -576 bytes 3.29kB -14.88%
assets/chunk.*.js -576 bytes 6.38kB -8.28%
assets/chunk.*.js -576 bytes 5.65kB -9.26%
assets/chunk.*.js -576 bytes 5.33kB -9.75%
assets/chunk.*.js -576 bytes 6.47kB -8.17%
assets/chunk.*.js -576 bytes 6.28kB -8.4%
assets/chunk.*.js -576 bytes 4.86kB -10.6%
assets/chunk.*.js -576 bytes 4.24kB -11.95%
assets/chunk.*.js -576 bytes 5.53kB -9.43%
assets/chunk.*.js -576 bytes 4.3kB -11.82%
assets/chunk.*.js -576 bytes 4.13kB -12.24%
assets/chunk.*.js -576 bytes 2.75kB -17.3%
assets/chunk.*.js -576 bytes 5.83kB -9.0%
assets/chunk.*.js -576 bytes 5.51kB -9.47%
assets/chunk.*.js -576 bytes 5.31kB -9.79%
assets/chunk.*.js -576 bytes 6.63kB -8.0%
assets/chunk.*.js -576 bytes 9.47kB -5.73%
assets/chunk.*.js -576 bytes 2.87kB -16.72%
assets/chunk.*.js -576 bytes 4.73kB -10.85%
assets/chunk.*.js -576 bytes 3.31kB -14.82%
assets/chunk.*.js -576 bytes 3.37kB -14.6%
assets/chunk.*.js -576 bytes 3.9kB -12.86%
assets/chunk.*.js -576 bytes 13.84kB -4.0%
assets/chunk.*.js -576 bytes 4.8kB -10.72%
assets/chunk.*.js -576 bytes 3.0kB -16.09%
assets/chunk.*.js -576 bytes 2.76kB -17.26%
assets/chunk.*.js -576 bytes 10.04kB -5.43%
assets/chunk.*.js -576 bytes 3.73kB -13.38%
assets/chunk.*.js -576 bytes 5.55kB -9.4%
assets/chunk.*.js -576 bytes 3.89kB -12.91%
assets/chunk.*.js -576 bytes 7.45kB -7.18%
assets/chunk.*.js -576 bytes 4.17kB -12.13%
assets/chunk.*.js -576 bytes 4.05kB -12.44%
assets/chunk.*.js -576 bytes 3.09kB -15.73%
assets/chunk.*.js -576 bytes 3.51kB -14.09%
assets/chunk.*.js -576 bytes 5.72kB -9.15%
assets/chunk.*.js -576 bytes 7.5kB -7.14%
assets/chunk.*.js -576 bytes 2.53kB -18.56%
assets/chunk.*.js -576 bytes 3.3kB -14.85%
assets/chunk.*.js -576 bytes 9.48kB -5.73%
assets/chunk.*.js -576 bytes 3.99kB -12.61%
assets/chunk.*.js -576 bytes 5.98kB -8.79%
assets/chunk.*.js -576 bytes 2.83kB -16.89%
assets/chunk.*.js -576 bytes 6.14kB -8.57%
assets/chunk.*.js -576 bytes 5.59kB -9.34%
assets/chunk.*.js -576 bytes 11.57kB -4.74%
assets/chunk.*.js -576 bytes 2.79kB -17.13%
assets/chunk.*.js -576 bytes 7.94kB -6.76%
assets/chunk.*.js -576 bytes 12.87kB -4.28%
assets/chunk.*.js -576 bytes 3.01kB -16.07%
assets/chunk.*.js -576 bytes 4.17kB -12.14%
assets/chunk.*.js -576 bytes 8.06kB -6.67%
assets/chunk.*.js -576 bytes 101.56kB -0.56%
assets/chunk.*.js -576 bytes 9.15kB -5.92%
assets/chunk.*.js -576 bytes 6.6kB -8.03%
assets/chunk.*.js -576 bytes 3.55kB -13.95%
assets/chunk.*.js -576 bytes 8.42kB -6.4%
assets/chunk.*.js -576 bytes 6.44kB -8.21%
assets/chunk.*.js -576 bytes 732 bytes -44.04%
assets/chunk.*.js -576 bytes 2.53kB -18.52%
assets/chunk.*.js -576 bytes 2.52kB -18.62%
assets/chunk.*.js -576 bytes 3.42kB -14.4%
assets/chunk.*.js -577 bytes 7.36kB -7.27%
assets/chunk.*.js -576 bytes 3.81kB -13.12%
assets/chunk.*.js -576 bytes 9.15kB -5.92%
assets/chunk.*.js -576 bytes 6.13kB -8.59%
assets/chunk.*.js -576 bytes 2.75kB -17.3%
assets/chunk.*.js -576 bytes 6.73kB -7.88%
assets/chunk.*.js -576 bytes 3.81kB -13.14%
assets/chunk.*.js -576 bytes 4.19kB -12.09%
assets/chunk.*.js -576 bytes 4.2kB -12.07%
assets/chunk.*.js -576 bytes 11.55kB -4.75%
assets/chunk.*.js -576 bytes 6.6kB -8.02%
assets/chunk.*.js -576 bytes 12.15kB -4.52%
assets/chunk.*.js -576 bytes 13.07kB -4.22%
assets/chunk.*.js -576 bytes 8.17kB -6.58%
assets/chunk.*.js -576 bytes 8.7kB -6.21%
assets/chunk.*.js -576 bytes 3.8kB -13.16%
assets/chunk.*.js -576 bytes 7.1kB -7.5%
assets/chunk.*.js -576 bytes 3.28kB -14.94%
assets/chunk.*.js -576 bytes 6.78kB -7.83%
assets/chunk.*.js -576 bytes 3.62kB -13.73%
assets/chunk.*.js -576 bytes 11.9kB -4.62%
assets/chunk.*.js -576 bytes 4.61kB -11.1%
assets/chunk.*.js -504 bytes 41.17kB -1.21%
assets/chunk.*.js -576 bytes 3.04kB -15.93%
assets/chunk.*.js -576 bytes 8.0kB -6.72%
assets/chunk.*.js -576 bytes 11.58kB -4.74%
assets/chunk.*.js -576 bytes 2.99kB -16.15%
assets/chunk.*.js -576 bytes 6.12kB -8.61%
assets/chunk.*.js -576 bytes 1.19kB -32.67%
assets/chunk.*.js -576 bytes 46.96kB -1.21%
assets/chunk.*.js -576 bytes 9.86kB -5.52%
assets/chunk.*.js -576 bytes 3.56kB -13.94%
assets/chunk.*.js -575 bytes 11.69kB -4.69%
assets/chunk.*.js -576 bytes 7.1kB -7.51%
assets/chunk.*.js -576 bytes 6.95kB -7.66%

Files in assets/chunk.*.js:

  • ./controllers/settings/billing.ts → Total Size: 3.87kB

  • ./models/subscription.ts → Total Size: 3.3kB

Comment thread app/controllers/settings/billing.ts
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch 2 times, most recently from a8696f0 to 0c104c9 Compare January 5, 2026 16:42
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch from 0c104c9 to 1e27abb Compare January 6, 2026 10:44
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch from 1e27abb to 7473fc7 Compare January 6, 2026 17:35
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch from 7473fc7 to ba01b36 Compare January 9, 2026 10:20
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch 2 times, most recently from 2020a6e to ac9817f Compare January 9, 2026 10:33
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch from ac9817f to e07ced6 Compare January 9, 2026 10:36
Comment thread tests/pages/settings/billing-page.ts

Args: {
onExtendMembershipButtonClick: () => void;
subscription: SubscriptionModel;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Unused subscription argument indicates incomplete conditional logic

Medium Severity

The subscription argument is declared as required in the component signature and is passed from billing.hbs, but it's never used in the RenewalSection component. The PR description mentions implementing a canBeExtended getter and conditionally enabling the button with a tooltip showing the earliest extension date, but none of this logic exists. The "Extend membership" button is always enabled regardless of subscription state, which may allow users to attempt extensions outside the intended 45-day window mentioned in the PR description.

Additional Locations (1)

Fix in Cursor Fix in Web

Comment thread tests/acceptance/settings-page/extend-membership-test.js Outdated
Comment thread app/controllers/settings/billing.ts
Comment thread app/controllers/settings/billing.ts
Comment thread app/controllers/settings/billing.ts
rohitpaulk and others added 3 commits January 10, 2026 12:47
Add ability to extend active subscriptions within 45 days of expiry by 
introducing `canBeExtended` getter on Subscription model. Update renewal 
section to reflect membership renewal status and conditionally enable the 
extend membership button with tooltip showing the earliest extension date. 
Pass active subscription to renewal section and handle button click action.
Co-authored-by: rohitpaulk <rohitpaulk@gmail.com>
@rohitpaulk rohitpaulk force-pushed the feat-membership-renewal-extension branch from 71f76ed to 0c1ef76 Compare January 10, 2026 07:18
@rohitpaulk rohitpaulk merged commit 5ff01bd into main Jan 10, 2026
5 of 6 checks passed
@rohitpaulk rohitpaulk deleted the feat-membership-renewal-extension branch January 10, 2026 08:28
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.

2 participants