Skip to content

refactor(payment): Pay/Checkout/Tip の送信ガードをフォーム別の純関数に、手数料内訳を行モデルに (R14・掟 15) - #632

Merged
cipherwebllc merged 1 commit into
mainfrom
fix/r6-r14-payment-guards
Sep 24, 2026
Merged

cipherwebllc merged 1 commit into
mainfrom
fix/r6-r14-payment-guards

Conversation

@cipherwebllc

Copy link
Copy Markdown
Owner

概要

第 6 回レビュー Phase 6 (完全リファクタ) の R14 です (指摘 F14・F8)。挙動を変えない抽出だけです。
#607 (A2c) の上に積んだ PR で、base は A2c のブランチです。A2c の merge 後に main へ付け替わります。

送信ガード

PaymentForm・CheckoutForm・TipForm の送信可否の式を、フォーム別の純関数 lib/paymentFlowGuards/{pay,checkout,tip}.ts に移しました (型だけ types.ts で共有)。各フォームは自分の policy を毎 render で 1 回呼びます。

  • 移した宣言 (12・11・12) は byte 単位で同一で、コメントも原本のままです。
  • 意図的な差はそのままです: Tip は曖昧/復元のロックを表示中の route に限り、別の試行の復元成功では止めず、動的な standard engine の準備を待ちます。Checkout は注文の受付中に canSubmit だけを閉じ、paymentReady (A2c の同じ店の停止を含む) は onSubmit が await の後に読み直します。Pay は FX の期限を見ます。
  • onSubmit の中の click 時の処理 (ref・await・setState) は純関数の seam がないため残し、競合テストで固定しました。

手数料の内訳行

components/PaymentBreakdownRows.tsx に行モデル {label, value, tooltip?, strong?} と breakdownRow() を置き、同じ <Row>/<InfoTooltip> を同じ位置に返します。ラベル・金額・wrapper は各フォームに残し、Checkout のモバイル gasless の gas 行は従来どおり出しません。手数料の計算や文言のセットは共有していません (掟 14)。

⚠️ 掟 15: 決済の送信ガードに触れます。merge 前に user の明示レビューをお願いします。 公開文言・DOM・開示の行は変わりません。

固定と検証 (base = A2c @ 776e6c8)

  • 旧コードで採った pin (1,634 件): 既存の真理値表 (harness だけ変更・期待値は同じ)、フォームごとの送信 43 行 (二重送信・pending の混在・復元状態・await 後の受付)、Checkout の競合 (double click・await 中の chain 切替/切断/同じ店の停止)、Pay/Tip の送信中の double click、ja/en の内訳 snapshot 144 (負担者・gas 提供者・mobile・split・Arc・tooltip 開閉)、呼び出しの引数が省略記法であること、Tip が返す UI 用の欄。
  • 別セッションの Opus 5.5 のレビュー: approve (0 blocker)。わざと壊した変更 (await 後の再確認の削除・ref の付け替え・Tip の route 限定の削除・行順の入れ替え・tooltip の削除 等) をすべて検出しました。指摘の should-fix (引数の省略記法の検証) と nit も反映済みです。
  • typecheck 0 / eslint 0 / full vitest 15,818 pass / build OK (/pay 413/448・/tip 411/446・/checkout 418/451 kB・A2c 比 +1 kB 以内)

🤖 Generated with Claude Code

https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc

@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
openpay Ignored Ignored Preview Sep 24, 2026 9:55pm UTC

Request Review

@cipherwebllc
cipherwebllc force-pushed the fix/r6-a2c-checkout-binding branch from 776e6c8 to 2c45570 Compare September 24, 2026 14:40
Base automatically changed from fix/r6-a2c-checkout-binding to main September 24, 2026 15:10
…4・掟 15)

第 6 回レビュー Phase 6 の R14 (F14・F8)。3 フォームの canSubmit/paymentReady 系の式を
lib/paymentFlowGuards/{pay,checkout,tip}.ts のフォーム別 policy に移す (12/11/12 宣言・
byte 単位で同一・意図的な差 = Tip の route 限定ロックと完了後の許可と動的 standard engine 待ち、
Checkout の受付中は canSubmit だけ閉じて await 後に再確認、Pay の FX 期限)。手数料の内訳行は
components/PaymentBreakdownRows.tsx の行モデルと breakdownRow() で同じ Row/InfoTooltip を
同じ位置に返す (ラベル・金額・wrapper は各フォームに残す)。旧コードで採った pin: 真理値表
(harness だけ変更)・送信 43 行×3・競合 (double click / await 中の chain 切替・切断・同店 hold)・
ja/en の内訳 snapshot 144・呼び出しの省略記法と UI 出力の固定。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc
@cipherwebllc
cipherwebllc force-pushed the fix/r6-r14-payment-guards branch from 7b47d1c to 591a0d3 Compare September 24, 2026 21:55
@cipherwebllc
cipherwebllc merged commit b6be085 into main Sep 24, 2026
8 checks passed
@cipherwebllc
cipherwebllc deleted the fix/r6-r14-payment-guards branch September 24, 2026 22:22
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.

1 participant