Skip to content

フロントエンドからロールごとの分配係数(multiplier)を入力できるようにする(splits / scheduled) #528

@yu23ki14

Description

@yu23ki14

概要

分配ルール作成(splits)と予約分配作成(scheduled)のフローで、ロールごとの分配係数(multiplier / 倍率)をフロントエンドから入力できない。現状はどちらも multiplier: 1 でハードコードされており、UI から変更する手段が無い。main ブランチの旧 splits 作成画面には「分配係数」の入力欄が存在していたため、v3 への移行時にこの機能が欠落した形になっている。

対象ファイル

  • pkgs/frontend/app/routes/$treeId_.splits.new.tsx
  • pkgs/frontend/app/routes/$treeId_.scheduled.new.tsx

現状

両画面とも RoleInputmultiplier: number フィールドを持つが、シード時に multiplier: 1 で固定され、それを編集する UI が無い。

  • splits.new.tsx: setRolesmultiplier: 1 を初期化(calcSplitsParams で top/bottom に分解して送信済み)。
  • scheduled.new.tsx: 同様に multiplier: 1 固定。submitCreate 内で multiplier を top/bottom に分解して multiplierTops / multiplierBottoms として送信済み。

つまり送信パイプラインは既に係数に対応しているため、必要なのは入力 UI と roles ステートを更新するハンドラの追加が中心。

main の参考実装

main$treeId_.splits.new.tsx には以下のような係数入力 UI がある(Chakra ベースなので v3 のデザインシステムへ移植が必要):

const handleUpdateMultiplier = (e) => {
  update(fieldIndex, { ...field, multiplier: Number(e.target.value) });
};
// ...
<Text fontSize="sm">分配係数</Text>
<CommonInput type="number" value={field.multiplier}
  onChange={handleUpdateMultiplier} placeholder="例: 1, 1.5 10" />
<Text as="span"></Text>

コントラクト側の調査結果

Note

Issue 起票時の不安点だった「scheduled はコントラクト側が係数を受け付けるか不明」について調査済み。コントラクト変更は不要

ScheduledDistributorInitParamspkgs/contract/contracts/scheduleddistributor/IScheduledDistributor.sol)は既に係数を受け取る:

struct InitParams {
    ...
    uint256[] hatIds;
    uint256[] multiplierTops;
    uint256[] multiplierBottoms;
    address[][] confirmedWearers;
    ...
}

フロントの createScheduledDistributor も既に multiplierTops / multiplierBottoms を渡している(現状は常に 1/1)。よって splits・scheduled いずれもフロントエンドのみの変更で対応可能

対応方針(案)

  1. 対象ロール(当番)の行、もしくは「詳細」ダイアログ内に係数入力欄を追加する。v3 のデザインシステム(~/components/ui/inputInput + Typography / FieldLabel)で実装し、text-*/font-* 直書きは避ける。
  2. roles[key].multiplier を更新する updateMultiplier(hatId, value) ハンドラを両画面に追加。
  3. 既存の top/bottom 分解ロジック(calcSplitsParams / submitCreate)はそのまま流用できる。小数(例 1.5)も対応すること。
  4. バリデーション: 0 や負数・非数を弾く(最低でも正の数)。
  5. splits 側はプレビュー(previewSplits)に係数が反映されることを確認。

受け入れ条件

  • splits 作成画面でロールごとに係数を入力でき、プレビュー・作成結果に反映される
  • scheduled 作成画面でロールごとに係数を入力でき、multiplierTops/multiplierBottoms に反映されて送信される
  • 小数係数(例: 1.5)が正しく top/bottom に分解される
  • pnpm frontend typecheck が通る

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions