Skip to content

feat: add useToggle hook and refactor useDisclosure on it#2822

Merged
devmgn merged 1 commit into
mainfrom
feat/use-toggle
May 24, 2026
Merged

feat: add useToggle hook and refactor useDisclosure on it#2822
devmgn merged 1 commit into
mainfrom
feat/use-toggle

Conversation

@devmgn
Copy link
Copy Markdown
Owner

@devmgn devmgn commented May 24, 2026

Summary

  • boolean / 任意値の循環をトグルするカスタムフック useToggle を追加
  • useDisclosureuseToggle ベースの薄いラッパーへリファクタ
  • 単体テスト・型テスト (*.test-d.ts) ・Storybook stories を整備

useToggle の API

```ts
// boolean モード
const [on, toggle] = useToggle(); // 初期 false
const [on, toggle] = useToggle(true); // 初期 true
toggle(); // 反転
toggle(true); // 特定値セット

// 配列モード (任意値の循環)
const [theme, toggle] = useToggle(['light', 'dark', 'system']);
const [theme, toggle] = useToggle(['light', 'dark', 'system'], 'dark'); // 初期値
toggle(); // 次へ循環 (末尾→先頭)
toggle('dark'); // 特定値セット
```

  • `const` ジェネリクスで配列要素型を維持 (`as const` 不要)
  • impl signature の戻り型を `ToggleFn` にすることで型アサーション (`as unknown as ...`) なしで overload 互換性を満たす
  • 空配列・範囲外 `initialValue` は invariant で throw

useDisclosure の変更

  • `useReducer` ベースから `useToggle` の薄いラッパーへ置き換え
  • 公開 API `{ isOpen, open, close, toggle }` は維持
  • テストを公開 API ベースで全面的に書き直し
  • v8 カバレッジが React Compiler メモ化と相互作用して `toggle` 関数の閉じブロックを未到達と誤判定するため、当該ブロックを `/* v8 ignore */` で除外(理由コメント付き)

Test plan

  • `pnpm test` 全パス (35 tests)
  • `pnpm vitest run --typecheck` 型テストパス
  • `pnpm check` (lint + fmt + knip) パス
  • `pnpm vitest run --coverage --coverage.include='src/hooks/useToggle/**'` で useToggle 全項目 100%
  • Storybook `BooleanMode` / `ArrayMode` で play 動作確認

🤖 Generated with Claude Code

boolean / 任意値の循環をトグルするカスタムフック useToggle を追加し、
useDisclosure を useToggle ベースの薄いラッパーに置き換えた。

- useToggle: 引数なし or boolean / readonly 配列を受け取り、`[value, toggle]` を返す。
  - 配列モードでは const ジェネリクスで要素型を維持し、toggle() で循環・toggle(value) で特定値セット
  - 空配列・範囲外 initialValue は invariant で throw
- 単体テスト・型テスト (test-d.ts)・Storybook stories を追加
- useDisclosure を useToggle ベースに変更し、テストを公開 API ベースで書き直し

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@devmgn devmgn enabled auto-merge (squash) May 24, 2026 09:18
@devmgn devmgn merged commit 0d28344 into main May 24, 2026
3 checks passed
@devmgn devmgn deleted the feat/use-toggle branch May 24, 2026 09:18
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