mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-14 01:36:14 +00:00
## Summary `CancelSubscriptionDialogContent` calls `new Date(dateStr)` directly on both `cancelAt` and `subscription.value?.endDate`. Strict ISO 8601 parsers (Safari and some WebViews) reject fractional seconds whose length is anything other than 3 digits, so a Go-style backend timestamp such as `2026-04-18T10:04:55.6513Z` rendered as `Your access continues until Invalid Date.` in a destructive billing flow. PR #11358 already added the tolerant `parseIsoDateSafe` helper and applied it to the Secrets panel. This PR closes the same gap in the cancellation dialog and adds regression coverage that exercises the strict-parser code path (V8 alone is too lenient to fail without it). ## Changes - `CancelSubscriptionDialogContent.vue` — pipe both date sources through `parseIsoDateSafe`; collapse the two-step null check into one. When the value is missing OR unparseable, fall back to the existing `subscription.cancelDialog.endOfBillingPeriod` translation instead of emitting `Invalid Date`. - `CancelSubscriptionDialogContent.test.ts` (new) — wraps the assertions in the same `withStrictMillisecondParser` shim used by `dateTimeUtil.test.ts`, so 1-, 4-, and 9-digit fractional inputs actually exercise the broken path. Also covers the missing/unparseable fallbacks and the `cancelAt`-takes-precedence ordering. ## Red-green proof (local) Confirmed locally before splitting the commits: | Commit | `pnpm exec vitest run …CancelSubscriptionDialogContent.test.ts` | |---|---| | `c8aecd07f test: regression cover …` (test-only) | 5 failed / 1 passed — DOM rendered `"Your access continues until Invalid Date."` | | `f24cb903f fix: parse cancel-subscription dialog ISO timestamps …` | 6 passed | CI on this branch only runs on PR HEAD; happy to force-push a transient red commit if you want a recorded red CI run alongside the green one. ## Test plan - [x] `pnpm exec vitest run src/components/dialog/content/subscription/CancelSubscriptionDialogContent.test.ts` (6 passing on green) - [x] `pnpm typecheck` - [x] `pnpm exec eslint src/components/dialog/content/subscription/CancelSubscriptionDialogContent.{vue,test.ts}` - [x] `pnpm exec oxfmt --check` on changed files - [ ] Manual repro on Safari with a Go-emitted cancel timestamp (out of scope here; the unit test asserts the equivalent strict-parser behavior) ## Origin Surfaced by `/codex:adversarial-review` as the gap left after PR #11358 (Secrets panel) — the same `new Date(...)` hazard survived in a destructive billing flow with no regression coverage. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-11539-fix-cancel-subscription-dialog-renders-Invalid-Date-for-ISO-fractional-seconds-34a6d73d365081e4bdd6c941afd8cef3) by [Unito](https://www.unito.io)