Skip to content

[UI] 활성 타이머가 있는 투두의 재생 버튼을 색으로 구분한다#209

Merged
kimminna merged 2 commits into
developfrom
feat/web/208-pause-icon-color
Jul 15, 2026
Merged

[UI] 활성 타이머가 있는 투두의 재생 버튼을 색으로 구분한다#209
kimminna merged 2 commits into
developfrom
feat/web/208-pause-icon-color

Conversation

@jjangminii

@jjangminii jjangminii commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

ISSUE 🔗

close #208



What is this PR? 🔍

홈/오늘 탭 목록과 투두 수정 모달의 재생 버튼이 재생 중이든 일시정지든 상관없이 항상 같은 파란색으로 보여서, 여러 투두 중 지금 활성 타이머를 가진 게 어떤 건지 구분이 안 되던 문제를 수정했습니다.

배경

  • 기존 구조: PlayButtontimerStatus === "RUNNING"일 때만 아이콘 모양(재생 → 정지)을 바꿨고, 색상은 완료 여부(disabled)로만 결정됐습니다. variant("play"/"stop") 두 값 모두 동일한 파란 배경 클래스를 썼습니다.
  • 발생 문제: 일시정지(PAUSED)된 투두와 아예 시작하지 않은(STOPPED) 투두가 똑같은 파란 재생 버튼으로 보여서, 재생 중이던 타이머를 일시정지하면 그 투두가 다른 투두들과 구분되지 않았습니다.
  • 해결 방향: 처음엔 PAUSED 상태만 아이콘 색으로 구분하는 방향을 검토했지만, 실제로 필요한 신호는 "재생 중이냐"가 아니라 "지금 활성 타이머를 가진 투두가 이 투두냐"라는 걸 확인했습니다. PlayButton에 색상 전용 active prop을 추가하고, "활성 타이머(재생/일시정지 모두 포함)가 아예 없으면 전부 파랑, 있으면 그 투두만 파랑·나머지는 회색"이라는 규칙을 홈/오늘 탭 목록과 투두 수정 모달 세 곳에 동일하게 적용했습니다.

재생 버튼 활성 상태 구분

  • 변경 요약: PlayButtondisabled와 별개인 active prop을 추가하고, 홈/오늘 탭 목록·투두 수정 모달에서 "이 투두가 지금 활성 타이머를 가지고 있는가"를 계산해 전달하도록 했습니다.
  • 이유: 활성 타이머는 RUNNING/PAUSED를 모두 포함하는 개념이라, 일시정지해도 그 투두는 여전히 "활성" 상태로 남아있어야 나머지 투두와 시각적으로 구분됩니다. 기존에는 이 구분이 아예 없었습니다.
  • 구현 방식: 각 목록/모달 컨테이너에서 isPlayHighlighted = !activeTimer || activeTimer.todoId === todo.todoId 한 줄로 계산합니다. PlayButtondisabled(완료돼서 클릭 자체가 막히는 경우, 회색 + 클릭 불가)와 active(다른 투두가 활성이라 시각적으로만 낮추는 경우, 회색이지만 클릭은 계속 가능)를 서로 다른 조건으로 분리해 처리합니다. 아이콘도 isPlayHighlighted가 false면 기존에 있던 회색 PlayDisabledIcon을 그대로 재사용해 배경색과 맞췄습니다. 투두 수정 모달은 홈/오늘 목록과 달리 자기 자신의 todo.timerStatus만 알고 있어서, DetailTodoModalContainer에서 useActiveTimer()를 직접 호출해 전역 활성 타이머와 비교하도록 했습니다.
  • 경계 · 제약: 포커스 페이지의 재생 버튼은 이번 범위에 포함하지 않았습니다(이번 요청 범위가 홈/오늘 탭 목록과 투두 수정 모달로 한정됐습니다).



To Reviewers

PlayButtonactive prop 기본값을 true로 둬서 기존 호출부(포커스 페이지 등, 이번에 안 건드린 곳)는 동작 변화가 없도록 했는데, 이 부분 확인 부탁드립니다.
"활성 타이머 유무"만으로 나머지 투두를 전부 회색 처리하는 방식이 목록이 길어졌을 때도 UX상 괜찮을지도 봐주시면 좋겠습니다.



Screenshot 📷

컴포넌트 Before After
HomeTodoCard / TodayTodoCard / DetailTodoTaskFields (스크린샷) (스크린샷)



Test Checklist ✔

  • pnpm check-types 통과
  • pnpm lint 통과
  • 활성 타이머 없음 → 전부 파란 재생 버튼, 활성 타이머 있음(재생/일시정지 모두) → 해당 투두만 파랑·나머지 회색 확인 (작성자 확인)
  • 완료된 투두는 기존처럼 회색 + 클릭 불가 상태 유지 확인 (작성자 확인)

Summary by CodeRabbit

  • 새로운 기능
    • 현재 실행 중인 타이머와 연결된 할 일의 재생 버튼을 강조 표시합니다.
    • 실행할 수 없는 할 일은 비활성 재생 아이콘으로 구분됩니다.
    • 홈, 오늘, 할 일 상세 모달에서 동일한 재생 상태를 확인할 수 있습니다.
    • 재생 버튼이 활성·비활성 상태에 따라 배경, 커서, 접근성 레이블을 일관되게 표시합니다.

홈/오늘 탭 목록과 투두 수정 모달의 재생 버튼이 재생 중이든 일시정지든 상관없이
전부 같은 파란색이라, 어떤 투두가 지금 활성 타이머를 갖고 있는지 목록에서 구분이
안 됐습니다. 활성 타이머가 아예 없으면 전부 파란색, 활성 타이머가 있으면 그
투두만 파란색·나머지는 회색으로 낮추도록 PlayButton에 active prop을 추가하고
홈/오늘/투두 수정 모달 세 곳에 동일하게 적용했습니다.
@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
timo Ready Ready Preview, Comment Jul 14, 2026 7:00pm

Request Review

@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown

Storybook Preview

항목 링크
Storybook 열기
Chromatic 빌드 확인

마지막 업데이트: 2026-07-14 18:59 UTC

prop 이름만으로 드러나는 설명이라 정리했습니다.
@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown

Timo Performance Report

Bundle Size — timo-web
라우트 크기 First Load JS
/[locale]/home 209.85 kB 🔴 415.71 kB
/[locale]/today 193.88 kB 🔴 399.74 kB
/[locale]/focus 160.05 kB 🔴 365.91 kB
/[locale]/settings 166.37 kB 🔴 372.22 kB
/[locale]/statistics 232.92 kB 🔴 438.78 kB
/[locale]/[...rest] 0 B 🟡 205.86 kB
/[locale]/login 212.94 kB 🔴 418.79 kB
/[locale]/oauth/callback 119.65 kB 🟡 325.50 kB
/[locale]/onboarding 232.90 kB 🔴 438.75 kB
/[locale] 118.96 kB 🟡 324.82 kB
/[locale]/policy 125.09 kB 🟡 330.94 kB

공유 번들: 205.86 kB
🟢 < 200kB  |  🟡 < 350kB  |  🔴 ≥ 350kB (First Load JS · gzip)

Lighthouse — timo-web
URL Perf A11y LCP CLS TBT
/en/home 🔴 64 🟢 95 🔴 15.5s 🟢 0.000 🟡 458ms
/en/today 🔴 65 🟢 95 🔴 15.3s 🟢 0.000 🟡 411ms
/en/focus 🔴 60 🟢 95 🔴 15.2s 🟢 0.000 🟡 574ms
/en/statistics 🔴 60 🟢 95 🔴 15.0s 🟢 0.000 🟡 564ms

Perf ≥ 70 / A11y ≥ 85 목표
LCP 🟢 < 2.5s 🟡 < 4s 🔴 ≥ 4s  |  CLS 🟢 < 0.1 🟡 < 0.25 🔴 ≥ 0.25  |  TBT 🟢 < 200ms 🟡 < 600ms 🔴 ≥ 600ms

Image Optimization — timo-web
파일 크기 포맷 상태
images/google-calendar.png 36.20 kB PNG ⚠️ 🟢
images/google-logo.png 26.79 kB PNG ⚠️ 🟢

총 2개 · 63.00 kB  |  🟢 < 200KB  |  🟡 < 500KB  |  🔴 ≥ 500KB
⚠️ 2개 파일 WebP/AVIF 변환 권장

측정 커밋: 74217b9

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

활성 타이머와 Todo ID를 비교해 재생 버튼 하이라이트 상태를 계산하고, Home·Today·상세 모달의 카드와 공통 PlayButton에 전달합니다. 하이라이트 여부에 따라 재생 아이콘과 버튼 스타일이 달라집니다.

Changes

타이머 재생 하이라이트

Layer / File(s) Summary
PlayButton 상태 및 스타일 변경
packages/timo-design-system/src/components/button/play-button/PlayButton.tsx
active prop을 추가하고 disabled·active 상태에 따른 aria-label과 스타일을 적용합니다.
활성 타이머 하이라이트 상태 연결
apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx, apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/*, apps/timo-web/containers/todo-modal/detail/DetailTodoModalContainer.tsx, apps/timo-web/components/todo-modal/detail/DetailTodoModalContent.tsx
활성 타이머의 todoId와 현재 Todo를 비교해 isPlayHighlighted를 계산하고 카드 및 상세 필드로 전달합니다.
Todo 카드 아이콘 렌더링
apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_components/todo-card/HomeTodoCard.tsx, apps/timo-web/app/[locale]/(main)/today/_components/TodayTodoCard.tsx, apps/timo-web/components/todo-modal/detail/DetailTodoTaskFields.tsx
실행 중에는 정지 아이콘을 표시하고, 그 외에는 isPlayHighlighted에 따라 재생 또는 비활성 재생 아이콘을 표시합니다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested labels: ✨ Feature

Suggested reviewers: yumin-kim2, ehye1, kimminna

Poem

깡충 토끼 버튼을 눌러요
활성이면 반짝, 아니면 살짝
멈춘 시간도 색으로 보여
Todo 길마다 빛이 나요
당근처럼 선명한 변화 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed [#208] 홈 투두 카드의 활성 타이머 아이콘/색상 분기 요구를 충족하며, 관련 화면에도 동일한 규칙을 적용했습니다.
Out of Scope Changes check ✅ Passed 홈/오늘 목록과 투두 수정 모달 적용은 목표 범위에 맞고, 명확한 범위 외 변경은 보이지 않습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed 활성 타이머 기준으로 재생 버튼 색을 구분하는 변경을 잘 요약해 제목과 내용이 일치합니다.
Description check ✅ Passed 홈/오늘 목록과 수정 모달의 재생 버튼을 활성 타이머 기준으로 구분하는 변경을 정확히 설명합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/web/208-pause-icon-color

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx (1)

141-142: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

불필요한 Boolean() 캐스팅 생략

isActiveTodoactiveTimer가 존재할 때 이미 명확한 boolean 값(=== 비교 결과)을 가집니다. 반대로 activeTimer가 없을 때는 앞의 !activeTimertrue가 되어 단락 평가(short-circuit)가 발생하므로 Boolean(isActiveTodo)가 실행조차 되지 않습니다.

DetailTodoModalContainer의 구현과 동일하게 Boolean()을 생략하여 코드를 간결하게 유지할 수 있습니다.

  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx#L141-L142: !activeTimer || isActiveTodo로 변경합니다.
  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx#L95-L95: 동일하게 !activeTimer || isActiveTodo로 변경합니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/timo-web/app/`[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx
around lines 141 - 142, Remove the unnecessary Boolean() cast from
isPlayHighlighted, using !activeTimer || isActiveTodo in HomeTodoContainer.tsx
(lines 141-142) and TodayTodoListContainer.tsx (line 95). Preserve the existing
short-circuit behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@apps/timo-web/app/`[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx:
- Around line 141-142: Remove the unnecessary Boolean() cast from
isPlayHighlighted, using !activeTimer || isActiveTodo in HomeTodoContainer.tsx
(lines 141-142) and TodayTodoListContainer.tsx (line 95). Preserve the existing
short-circuit behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 226476c9-39a0-4b30-b9d9-e8792c0ec25d

📥 Commits

Reviewing files that changed from the base of the PR and between e46922b and 72428d7.

📒 Files selected for processing (9)
  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_components/todo-card/HomeTodoCard.tsx
  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/home/_containers/HomeTodoContainer.tsx
  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoCardContainer.tsx
  • apps/timo-web/app/[locale]/(main)/(with-time-sidebar)/today/_containers/TodayTodoListContainer.tsx
  • apps/timo-web/app/[locale]/(main)/today/_components/TodayTodoCard.tsx
  • apps/timo-web/components/todo-modal/detail/DetailTodoModalContent.tsx
  • apps/timo-web/components/todo-modal/detail/DetailTodoTaskFields.tsx
  • apps/timo-web/containers/todo-modal/detail/DetailTodoModalContainer.tsx
  • packages/timo-design-system/src/components/button/play-button/PlayButton.tsx

@kimminna kimminna merged commit 6c5deb8 into develop Jul 15, 2026
17 of 18 checks passed
@kimminna kimminna deleted the feat/web/208-pause-icon-color branch July 15, 2026 03:10
@kimminna kimminna mentioned this pull request Jul 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⌚ Timo-Design-system Timo 디자인 시스템 ⏰ Timo-web Timo 웹 서비스 ♠️ 정민 정민양

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[UI] 홈 투두 카드에서 일시정지된 타이머를 아이콘 색상으로 구분한다

2 participants