Skip to content

settings: say what the trial countdown means and what subscribing does - #54

Merged
max-tet merged 1 commit into
mainfrom
settings-trial-explains-itself
Sep 5, 2026
Merged

max-tet merged 1 commit into
mainfrom
settings-trial-explains-itself

Conversation

@ClaydeCode

Copy link
Copy Markdown
Contributor

Closes #53.

What changed

Content only, inside the subscriptionState === 'trial' branch of the Subscription card in src/views/Settings.vue. Nothing was moved, merged or restyled — the layout rework stays with #50.

What #52 already provided vs. what this adds

#52 already covers most of point 3 of the issue. It fetches GET /core/protected/management/api/shards/self/prices once in mounted() and renders, in this same trial branch:

Plan: XS — €12.34/month
Includes 100 GB disk, incl. 19% VAT (€1.97)

Those two lines are left exactly as they are. No second fetch, no second price line, no reimplemented formatting. What point 3 was still missing is the terms, which this PR adds as one muted line.

Points 1 and 2 of the issue were not present at all and are new here.

The copy

With delete_after set, the card now reads:

Your shard will be deleted in a day. That happens on its own if you do nothing: you are not charged, and there is nothing to cancel.

Subscribing is a separate step. It keeps this shard and its data, and removes the deletion date.

Plan: XS — €12.34/month
Includes 100 GB disk, incl. 19% VAT (€1.97)

Billed monthly, cancel any time.

[PayPal button]

Reasoning per sentence:

  • "That happens on its own if you do nothing: you are not charged, and there is nothing to cancel." — this is the sentence the reported confusion is about. The colon puts the two possible readings of the countdown side by side and settles it: the date is deletion, not billing. "Nothing to cancel" is the no-action-required half, phrased as something the reader can check rather than a reassurance.
  • "Subscribing is a separate step. It keeps this shard and its data, and removes the deletion date." — "separate step" so it is clear the countdown does not turn into a charge by itself. "Removes the deletion date" is stated as fact because it is one: the controller writes delete_after=None on activation (api/paypal.py), so subscribing on the last day keeps the shard.
  • "Billed monthly, cancel any time." — the terms, in the muted small style the active branch uses for its VAT line, so the two states present price and terms the same way.

Two judgement calls worth a reviewer's eye:

  • Nothing claims the data is destroyed. "Your shard will be deleted" is the existing wording and stays. I did not add "and its data" to that sentence, because the Backup card on this same page says backups outlive the shard, and the two lines would contradict each other.
  • The v-else case (a trial with no delete_after) gets a shortened second sentence, "Subscribing keeps this shard and its data.", since there is no deletion date to remove there. Its first line, "Subscribe to keep your shard running.", is untouched.

Degraded price lookup

#52 established that a failed price fetch degrades silently: refreshPricing() catches, sets pricing = null, and the price block is behind v-if="currentSizePriceCents !== null". That is preserved. The new terms line sits outside that block on purpose — "Billed monthly, cancel any time." is true regardless of whether the price loaded, and it claims no figure. So with the fetch failed the card still renders, still explains the countdown and what subscribing does, still names the terms, and simply shows no price.

Verified

Command Result
npm ci clean install
npx vue-cli-service lint --no-fix DONE No lint errors found!
npx vue-cli-service test:unit 28 passed, 3 suites — unchanged from main
NODE_OPTIONS=--openssl-legacy-provider npx vue-cli-service build DONE Build complete.

Not verified

This repo has no component-test harness for views, so the change itself has no automated coverage. The 28 passing tests cover src/lib/pricing.js, the PayPal SDK loader and the store; none of them render Settings.vue. What the build proves is that the template compiles, not that the branch renders as described. I introduced no new function, so there was nothing new to unit-test.

The five subscription states and the two delete_after cases were read off the template, not clicked through against a live shard. Worth a look on a real trial shard before release.

The trial branch of the Subscription card rendered only "Your shard will be
deleted <date>." A reader could not tell whether that was a countdown to
losing the shard or to being charged, and nothing named the terms.

State the three things a reader is deciding on: doing nothing deletes the
shard with no charge and nothing to cancel; subscribing is a separate step
that keeps the shard and its data and removes the deletion date (the
controller writes delete_after=None on activation); and the terms are
monthly and cancellable.

The price, plan, disk and VAT lines came with #52 and are left as they are.
The terms line sits outside the price block so the card still says what the
terms are when the price lookup failed, without claiming a price it does not
have.

Closes #53
@ClaydeCode
ClaydeCode requested a review from max-tet September 5, 2026 20:09
@max-tet
max-tet merged commit 5601bad into main Sep 5, 2026
2 checks passed
@max-tet
max-tet deleted the settings-trial-explains-itself branch September 5, 2026 20:15
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.

Trial shards: the Subscription card counts down to deletion without saying what happens next

2 participants