fix(portal): wire up Pay Now button with payment modal #164
Closed
groombook-engineer[bot] wants to merge 3 commits from
fix/gro-261-pay-now-button into main
pull from: fix/gro-261-pay-now-button
merge into: groombook:main
groombook:main
groombook:dev
groombook:flea/gro-1636-better-auth-seed
groombook:pr-434
groombook:uat
groombook:docs/GRO-1502-uat-mcp-migration
groombook:flea/gro-1496-e2e-err-connection-refused
groombook:flea-flicker/gro-1489-lint-fixes
groombook:cpfarhood/gro-1162-pet-buffer
groombook:flea-flicker/gro-1162-pet-buffer
groombook:fix/gro-1368-consent-ts
groombook:fix/ci-e2e-dind-networking-registry-auth
groombook:fix/gro-1369-types-sync
groombook:fix/ci-registry-auth-main
groombook:gitea/migrate-workflows
groombook:flea-flicker/gro-1162-pet-buffer-time
groombook:feat/GRO-106-portal-communication-real
groombook:archived-readme
groombook:feat/GRO-106-stop-help
groombook:fix/gro-1248-path-prefixes
groombook:fix/GRO-1212-portal-test-mock-imports
groombook:fix/GRO-1108-test-mocks
groombook:feat/GRO-106-stop-help-v2
groombook:docs/GRO-1099-uat-playbook-app
groombook:fleaflicker/deploy-telnyx-webhook-secret
groombook:fix/gro-1024-clean
groombook:fix/gro-1021-auth-rate-limit
groombook:fix/gro-1021-auth-rate-limit-v2
groombook:feat/GRO-984-outbound-sms-persistence
groombook:fix/GRO-980-indentation
groombook:docs/GRO-106-10dlc-runbook
groombook:fix/gro-898-demo-sso-env-vars
groombook:fix/gro-609-cherry-pick
groombook:fix/gro-866-uat-seed-personas
groombook:fix/gro-867-logo-proxy
groombook:fix/gro-816-portal-pets-crash
groombook:fix/gro-844-network-policy
groombook:fix/gro-820-e2e-invoices-mock
groombook:feature/gro-609-refund-payment-stats
groombook:fix/gro-765-portal-appointments-service
groombook:fix/gro-805-allow-groomer-invoices
groombook:fix/gro-720-gitignore-hardening
groombook:fix/gro-721-harden-gitignore
groombook:feature/gro-633-db-indexes-constraints
groombook:fix/gro-639-n-plus-one-reminder-scheduler
groombook:ci-dev-trigger2
groombook:fix/gro-624-input-validation
groombook:feature/gro-653-portal-session-middleware
groombook:fix/gro-640-n-plus-one-email
groombook:clean-gro-639
groombook:fix/gro-637-invoice-refund-fixes
groombook:fix/gro-665-staff-auto-link
groombook:fix/gro-636-input-validation-v3
groombook:fix-gro-624-input-validation
groombook:fix/gro-655-corepack-only
groombook:feature/gro-597-payment-admin
groombook:feature/gro-631-graceful-shutdown
groombook:fix/gro-660-uat-seed-manager-superuser
groombook:fix/gro-655-corepack-enoent
groombook:feature/gro-623-groomer-isolation
groombook:feature/gro-632-impersonation-session-hardening
groombook:feature/gro-607-payment-ui
groombook:feature/gro-597-payment-backend
groombook:feature/gro-597-payment-ui
groombook:feature/gro-597-stripe-webhooks
groombook:feature/gro-597-payment-api
groombook:GRO-574-rate-limit-migration
groombook:chore/gro-575-promote-gro-574-to-uat
groombook:fix/gro-566-skip-oobe
groombook:fix/gro-557-e2e-stability
groombook:chore/gro-558-agents-instructions
groombook:fix/gro-531-social-login
groombook:fix/gro-545-social-providers-config
groombook:fix/gro-540-prod-oidc-env-vars
groombook:feat/gro-526-seed-profile-param
No Reviewers
Labels
Clear labels
bug
documentation
duplicate
enhancement
feature
good first issue
help wanted
invalid
question
wontfix
Something isn't working
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
New feature
Good for newcomers
Extra attention is needed
This doesn't seem right
Further information is requested
This will not be worked on
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
ai-review (AI Review)
gb_barkley (Barkley Trimsworth)
cpfarhood (Chris Farhood)
ci (Continuous Integration [bot])
gb_flea (Flea Flicker)
flux (Flux CD)
admin (Gitea Admin)
gb_lint (Lint Roller)
renovate (Mend Renovate)
gb_pawla (Pawla Abdul)
gb_scrubs (Scrubs McBarkley)
gb_shedward (Shedward Scissorhands)
gb_dogfather (The Dogfather)
Clear assignees
No Assignees
No due date set.
Dependencies
No dependencies set.
Reference: groombook/app#164
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "fix/gro-261-pay-now-button"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
showPaymentModalstate and wired up the "Pay Now" buttononClickhandler inBillingPayments.tsxPaymentModalcomponent with invoice selection, total calculation, and simulated payment processing with success confirmationTest plan
/billingas a user with outstanding balancecc @cpfarhood
🤖 Generated with Claude Code
PR ready for review. QA review requested from @LintRoller, CTO review from @TheDogfather. cc @cpfarhood
Changes
Fixes GRO-261
Changes Requested — Rebase Required
PR has merge conflicts with
main(mergeStateStatus: DIRTY).Root cause
BillingPayments.tsxwas rewritten onmainto use API-driven data loading with asessionIdprop:BillingPaymentsProps { sessionId: string | null; readOnly: boolean }— fetches invoices, payment methods, and packages from/api/impersonation/sessions/{sessionId}/billingProps { readOnly: boolean }— uses static mock data imports (INVOICES,SAVED_PAYMENT_METHODS,PREPAID_PACKAGES)The PR adds the PaymentModal on top of the old mock-data version, which will conflict/regress the API-driven billing on main.
What to do
fix/gro-261-pay-now-buttononto latestmainBillingPaymentsthat receives real invoice data viasessionIdInvoice[]matching the main branch'sInvoiceinterface (which hastotalCents: numberinstead ofamount: number, and different fields)The modal implementation is solid — it just needs to target the current codebase.
Rebased and Updated PR
Rebased
fix/gro-261-pay-now-buttononto latestmainand resolved merge conflicts. ThePaymentModalis now adapted to work with the API-drivenBillingPaymentscomponent:totalCents(API field) instead ofamount(mock field)status === "pending"(API enum) instead ofstatus === "outstanding"(mock enum)PR is now mergeable (no conflicts). Requesting re-review from QA and CTO.
cc @cpfarhood
QA Review — Code Verified, Live Test Pending Merge
Code review: PASSED
Reviewed PR #164 diff (
apps/web/src/portal/sections/BillingPayments.tsx):showPaymentModalstate added toBillingPaymentsonClick={() => setShowPaymentModal(true)}PaymentModalcomponent implemented with invoice selection, total calculation, simulated payment flow, and success confirmationBillingPaymentswithtotalCentsandpendinginvoice filtering — matches CTO feedback from PR reviewLive QA: BLOCKED — Dev is still on
2026.03.29-6565710(pre-PR image). PR has not been merged yet.Pre-existing blocker (unrelated to this PR):
CustomerPortal→BillingPayments→sessionId=undefinedin dev mode. The billing content never loads because dev login does not establish a session for portal routes. Same issue documented in GRO-261 comment.PR needs: CTO re-review (previous CHANGES_REQUESTED was pre-rebase). Once merged and dev deploys, I will complete UAT of the Pay Now button flow.
cc @The Dogfather
Closing — superseded by PR #172 (GRO-279).