cloud/C8: LicenseSettings panel#224
Closed
blueberrycongee wants to merge 2 commits intoloop/cloud-C4from
Closed
Conversation
Standalone settings panel for entering / viewing / removing the Lumina Cloud license. Reads useLicenseStore directly; no dependency on AISettingsModal. Tailwind styled. States: - idle: heading, helper text, textarea, Verify button (disabled while empty or while status is 'loading'). - loading: Verify button label flips to "Verifying…", status line with role="status" mirrors it. - invalid: role="alert" line — "Could not verify this license." - valid: dl with email / SKU / expiry / feature badges, plus a "Remove license" button that opens an inline alertdialog confirmation before calling clearLicense. Tests cover the three status states + idle entry-form rendering + the confirmation flow (Remove and Cancel paths) + ISO date formatting for non-lifetime expiries. 7 tests, all pass. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This was referenced Apr 28, 2026
Owner
Author
|
Closing — re-issued cleanly by integrator. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Standalone settings panel for entering, viewing, and removing the Lumina Cloud license. Reads
useLicenseStoredirectly — explicitly no dependency onAISettingsModal.tsxper the C8 spec, since that file is currently locked behind WIP.Stacked on #220 (C4) because the panel binds to
useLicenseStore. Stack chain: #217 (C1) → #218 (C2) → #220 (C4) → this PR.Behavior by status
idle: heading, helper copy, textarea, Verify button (disabled while empty or loading).loading: button label flips to "Verifying…", status line withrole="status"mirrors it.invalid:role="alert"line — "Could not verify this license. Check the token and try again." The local verify path doesn't surface a granular reason; the online verify in §2.1 does, but that's C5/C9 territory.valid:<dl>with email / SKU / expiry / feature badges + a Remove license button. Click opens an inlinerole="alertdialog"confirmation — Remove callsclearLicense; Cancel just dismisses.Tailwind for styling. Dark-mode classes throughout.
expires_at: null→ "Lifetime"; non-null gets formatted asYYYY-MM-DD.Acceptance criteria
useLicenseStore.setLicense→ shows status (Verifying / Valid / Invalid + reason).clearLicense.AISettingsModal.tsx— verified bygrep; only imports areuseLicenseStore,LicensePayloadtype, and React.How I tested
npm run typecheck: pass.npm test -- --run src/components/settings/LicenseSettings.test.tsx: 7/7 pass.vi.hoistedto mockverifyLicense/saveLicense/removeLicense/loadLicensefrom@/services/luminaCloudand exercise the store from the component side.Touched files outside src/services/luminaCloud/
src/components/settings/LicenseSettings.tsx+ test — both inside the PRD §3 allow-list.cloud/TASKS.md— marked C8[x]and appended Done-log entry.Notes for Lead
window.confirm. Keeps it test-friendly and matches the rest of the app's component-level confirmation patterns.reason; if you want richer feedback later, hook §2.1 into the failure path.