Skip to content

FE refacter#272

Merged
yusuke0610 merged 1 commit into
devfrom
refactor/backend/deadcode
May 26, 2026
Merged

FE refacter#272
yusuke0610 merged 1 commit into
devfrom
refactor/backend/deadcode

Conversation

@yusuke0610

Copy link
Copy Markdown
Owner

Summary

  • dirty 判定の isDeepEqualutils/deepEqual.ts に集約し、useCareerDirty / useProjectFormDirty の byte 一致コピペを解消(等価判定の乖離リスクを除去)。
  • useAsyncTaskPage の未参照デッドコード getNextInterval を削除(バックオフは useTaskPolling が実装済み)。
  • useCareerExperienceMutators に単体テストを新規追加し、フォーム state を書き換える仕様分岐(is_current↔end_date / has_client↔name / 最後の1件削除ガード / onProjectSave 追加・置換)を固定。
  • useTaskPolling.test のフレーキーな実時間待ち(setTimeout)を fake timers ベースへ置換し、unmount でポーリングが止まる仕様を決定論的に検証。

Applied Changes

High

  • なし(レポート通り構造的破綻なし)

Medium

  • [frontend/src/utils/deepEqual.ts:8] 新規。isDeepEqual を移設(Findings Medium / Duplication High「isDeepEqual の byte 一致コピペ」)。
  • [frontend/src/hooks/career/useCareerDirty.ts:10,117] ローカル定義を削除し ../../utils/deepEqual から import。挙動不変。
  • [frontend/src/hooks/career/useProjectFormDirty.ts:5,55-57] 同上。diffProject / team・technology_stacks・phases 比較はそのまま共通関数を利用。

Low

  • [frontend/src/hooks/useAsyncTaskPage.ts:21-25] getNextInterval の定義・export・「将来の拡張用」コメントを削除(Findings Low「デッドコード export」)。rg getNextInterval src/ で参照ゼロを確認済み。
  • [.claude/rules/frontend/architecture.md] hooks ディレクトリ記載 drift(Findings Low)を修正。実態調査で analyze 機能削除(commit ee481a0 "all anarize remove" 系)による drift が hooks 以外にも波及していたため、同種の乖離をまとめて是正:
    • hooks ブロックを実構成(top-level 8 件 + blog/ + career/)へ更新。存在しない useBlogSummaryPolling / useCareerAnalysisPage / useAsyncAnalysisPage / analysis/ 記載を削除し、未記載だった useAsyncTaskPage / useAuthSession を追記。
    • pages/ から削除済み CareerAnalysisPage.tsxcomponents/career-analysis/ ディレクトリ記載を削除。
    • api/ モジュール一覧から削除済み career-analysis / intelligence を除き、実在の githubLink を追記。
    • utils/ に新規 deepEqual.ts と既存未記載の pdfjs.ts / taskStatus.ts を追記。
    • 本文の非同期タスク進捗の記述を useAsyncAnalysisPageuseAsyncTaskPage に修正。

Test Changes

Removed

  • なし(レポートの削除推奨は無し)。

Added

  • [frontend/src/hooks/career/useCareerExperienceMutators.test.ts] 新規。守るユーザー挙動:
    • is_current=true で end_date がクリアされる / is_current=false では保持される
    • 通常フィールド更新は end_date を巻き込まない
    • has_client=false で取引先名がクリアされる / true では保持される
    • removeExperience / removeClient / removeProject の「最後の1件は削除せず blank で置換」ガード(各 1 件時)と複数時の index 削除
    • onProjectSave の projIndex=null(末尾追加)/ 非 null(置換)分岐
    • 実 React state(useState)越しに act で駆動し、操作後の form state を assert。

Changed

  • [frontend/src/hooks/useTaskPolling.test.ts:110-135] 「アンマウント時にポーリングが停止する」を置換。await new Promise((r)=>setTimeout(r, FAST_INTERVAL*3)) の実時間待ちを vi.useFakeTimers() + vi.advanceTimersByTimeAsync に変更。マウント中は反復(呼び出し ≥2)→ unmount → 仮想時間を進めても呼び出しが増えないことを決定論的に検証。守る仕様(unmount でポーリング停止)は維持。

Duplication Resolved

  • [frontend/src/utils/deepEqual.ts] Duplication Findings High「useCareerDirty.ts:72-96useProjectFormDirty.ts:30-54isDeepEqual(27L clone)」を統合。抽出先は duplication.md「Frontend → 純粋関数は src/utils/」に準拠。両 hook は import 1 行に置換し、再帰等価判定の正本を 1 か所に集約。
  • Allowed Duplication(useCareerExperienceMutators の nested setForm パターン、テストの arrange-act-assert 群)は偶発的重複として抽出せず維持(Skipped 参照)。

Structure Changes

  • utils/deepEqual.ts を新設したのみ。ディレクトリ移動・hook 切り出しなし(レポートの Oversized 3 件は全て「現状維持推奨」)。
frontend/src/
  utils/
    appError.ts
    errorId.ts
    pdfjs.ts
    taskStatus.ts
    deepEqual.ts   # ← 新規: isDeepEqual を useCareerDirty / useProjectFormDirty から集約

Skipped

  • Allowed Duplication 群(useCareerExperienceMutators の experience/client/project 別 nested updater、jscpd 検出のテスト arrange-act-assert 13 件)は duplication.md「許容される類似」に該当するため抽出しない。
  • Oversized Components(ProjectModal 321L / CareerExperienceEditor 296L / CareerResumeForm 272L)はレポート通り責務分離済み・分割は過剰抽象化になるため未対応。

Validation

  • make lint-frontend: pass(eslint src/ エラーなし)
  • make lint-frontend-messages: pass(grep ベース検知ゼロ)
  • make test-frontend: pass(node:test 4 / vitest 22 ファイル 160 tests 全 green。新規 useCareerExperienceMutators.test.ts 含む)
  • make build-frontend: pass(tsc -b + vite build、220 modules、型エラーなし)
  • E2E (npm run test:e2e): 未実行。理由: 新規ページ/ルート追加・認証/ナビゲーション/レイアウト/サイドバー変更・UI フローに影響する API 変更のいずれにも該当しない(util 抽出は挙動不変、デッドコード削除、テストのみの変更)。

Follow-ups

  • なし(architecture.md の drift 是正を本 PR に取り込み済み)。仕様判断が必要で保留にした項目もなし。

@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f7730381-698b-4916-848a-b683c218cd60

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/backend/deadcode

Comment @coderabbitai help to get the list of available commands and usage tips.

@yusuke0610
yusuke0610 merged commit ec66f91 into dev May 26, 2026
16 of 17 checks passed
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