Feat/one off charge#12
Conversation
`createSumitChargeRoute` previously hardcoded the recurring endpoint and required `item.durationMonths`. It now accepts `mode: "recurring" | "oneOff"` (default `"recurring"` for back-compat). One-off mode: - Targets `POST /billing/payments/charge/` instead of `/billing/recurring/charge/`. - Calls `buildOneOffChargePayload` from sumit-api — Items omit `Duration_Months` / `Recurrence`. - Drops the `durationMonths` validation requirement. Same `<SumitCheckout />`, same `SingleUseToken` — only the route's `mode` changes. Switches the response normalizer to the new `normalizeChargeResponse` alias (was `normalizeRecurringChargeResponse`); behaviour is identical since the underlying logic always handled both shapes. 3 new tests cover the oneOff happy path, the relaxed durationMonths requirement, and the still-enforced recurring requirement. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Additive release: createSumitChargeRoute now accepts mode: "recurring" | "oneOff" (default recurring). Bumps the sumit-api peer dep to >=0.2.0 because one-off mode imports buildOneOffChargePayload. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 55a9ef071b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| oneOff: "/billing/payments/charge/", | ||
| } as const; | ||
|
|
||
| export type SumitChargeMode = "recurring" | "oneOff"; |
There was a problem hiding this comment.
Export SumitChargeMode from the public next API
SumitChargeMode is declared as an exported type here, but the package’s public ./next entrypoint only exposes types re-exported from src/next/index.ts. Because that barrel was not updated in this change, consumers cannot actually import SumitChargeMode from sumit-react/next, so the new API advertised in this release is not reachable through the supported import path.
Useful? React with 👍 / 👎.
| const mode: SumitChargeMode = config.mode ?? "recurring"; | ||
| const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, ""); | ||
| const path = config.path ?? DEFAULT_PATH; | ||
| const path = config.path ?? DEFAULT_PATHS[mode]; |
There was a problem hiding this comment.
Validate mode before using it to select default endpoint
mode is taken directly from runtime config and used to index DEFAULT_PATHS without a runtime guard. In JavaScript consumers (or TS callers using as any), a typo like "oneoff" makes DEFAULT_PATHS[mode] undefined, so requests are sent to https://api.sumit.co.ilundefined and fail later as opaque upstream errors. Adding an explicit mode check would fail fast with a clear configuration error.
Useful? React with 👍 / 👎.
No description provided.