Skip to content

히스토리 페이지 개발#68

Merged
Jieunsse merged 1 commit into
mainfrom
feature/history
Feb 23, 2026
Merged

히스토리 페이지 개발#68
Jieunsse merged 1 commit into
mainfrom
feature/history

Conversation

@HWAN0218

Copy link
Copy Markdown
Contributor

Summary

  • 히스토리 페이지

Issue

Scope

  • 포함

    • 변경한 내용
  • 특이사항

@HWAN0218 HWAN0218 added this to the 페이지 milestone Feb 23, 2026
@HWAN0218 HWAN0218 requested review from a team, Jieunsse, jungwon123 and yooolleee February 23, 2026 01:10
@HWAN0218 HWAN0218 self-assigned this Feb 23, 2026
@HWAN0218 HWAN0218 added the 기능추가 기능개발 및 추가할 때 사용해주세요. label Feb 23, 2026
@HWAN0218 HWAN0218 added this to workers Feb 23, 2026
@github-project-automation github-project-automation Bot moved this to 개발 대기중 in workers Feb 23, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @HWAN0218, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 사용자가 완료한 작업을 월별 및 카테고리별로 쉽게 확인하고 관리할 수 있는 히스토리 페이지를 도입합니다. 사용자는 자신의 팀과 관련된 완료된 작업을 조회하고, 특정 작업의 상세 내용을 확인하며, 댓글을 작성하거나 작업을 수정/삭제할 수 있습니다. 이 페이지는 다양한 화면 크기에 맞춰 최적의 사용자 경험을 제공하도록 반응형으로 설계되었습니다.

Highlights

  • 새로운 히스토리 페이지 UI/UX: 사용자가 완료한 작업을 월별 및 카테고리별로 확인하고 관리할 수 있는 새로운 히스토리 페이지가 추가되었습니다.
  • API 연동 로직 구현: 완료된 작업, 댓글 조회 및 생성, 작업 완료 상태 변경 및 삭제를 위한 API 연동 로직이 React Query 훅을 사용하여 구현되었습니다.
  • 반응형 디자인 적용: 데스크톱 및 모바일 환경에 최적화된 반응형 디자인이 적용되어 다양한 화면 크기에서 일관된 사용자 경험을 제공합니다.
  • 작업 상세 오버레이 및 댓글 기능: 특정 작업의 상세 내용을 확인하고 댓글을 작성할 수 있는 오버레이 기능이 추가되었으며, 작업 수정 및 삭제 기능도 포함됩니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • src/app/(root)/history/history.module.css
    • 히스토리 페이지의 전반적인 레이아웃, 반응형 동작, 그리고 다양한 UI 컴포넌트(사이드바, 헤더, 작업 목록, 상세 오버레이 등)에 대한 스타일이 추가되었습니다.
  • src/app/(root)/history/hooks/queries.ts
    • 사용자 정보, 그룹 상세, 완료된 작업, 댓글 조회 및 생성, 작업 완료 상태 변경 및 삭제를 위한 React Query 훅(queries 및 mutations)이 정의되었습니다.
    • BFF 프록시 기반의 API 호출 유틸리티가 포함되었습니다.
  • src/app/(root)/history/page.tsx
    • 히스토리 페이지의 메인 컴포넌트가 구현되었습니다.
    • 사용자 및 그룹 데이터 로딩, 월별/카테고리별 작업 필터링, UI 상태 관리(모바일 드로어, 캘린더, 작업 메뉴, 상세 오버레이) 로직이 포함되었습니다.
    • TaskCard, Chip, TaskListItem, TaskDetailCard와 같은 여러 UI 컴포넌트의 렌더링 로직이 추가되었습니다.
Activity
  • 이 PR에 대한 특정 활동(예: 댓글, 검토 피드백)은 제공된 정보에서 확인되지 않았습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a new history page, complete with a responsive layout for desktop and mobile, including a sidebar and mobile navigation. It integrates new API hooks for fetching user data, group details, and done tasks, as well as mutations for task comments, completion, and deletion. The page displays completed tasks grouped by date, allows filtering by task list categories, and provides a detailed view for each task. Review comments highlight concerns regarding the extensive use of !important in the new CSS module, suggesting refactoring for better maintainability and specificity. Additionally, several comments point out potential type safety issues with as number assertions and string-based checks in the JavaScript logic, recommending more robust type handling and element identification methods.

Comment on lines +26 to +32
/* ✅ list 페이지와 동일: aside는 visible, 내용 영역만 hidden */
:global([class*='Sidebar-module__'][class*='sidebar']) {
overflow: visible !important;
}
:global([class*='Sidebar-module__'][class*='content']) {
overflow: hidden !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Using !important extensively can lead to specificity issues and make CSS harder to maintain and debug. Consider refactoring these styles to avoid !important by adjusting the component's structure or using more specific selectors.

Comment on lines +34 to +43
/* ✅ 텍스트 줄바꿈/넘침 방지 (list 동일) */
:global([class*='Sidebar-module__'] button),
:global([class*='Sidebar-module__'] a),
:global([class*='Sidebar-module__'] span),
:global([class*='Sidebar-module__'] p) {
max-width: 100% !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Similar to the previous comment, the use of !important here for text overflow properties can create maintenance challenges. It's generally better to control these styles through proper component hierarchy and CSS specificity.

Comment on lines +51 to +60
@media (min-width: 1024px) and (max-width: 1199px) {
.desktopSidebar {
display: flex !important;
}
.mobileGnb {
display: none !important;
}
:global([class*='Sidebar-module__'][class*='sidebar']) {
display: flex !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The use of !important in media queries can be particularly problematic. If these styles are intended to override existing ones, try to achieve the desired effect with more specific selectors or by ensuring the order of CSS rules is correct.

Comment on lines +122 to +127
:global(.TeamHeader-module__H3kcRq__container) {
width: 100%;
max-width: 1200px;
margin-left: auto !important;
margin-right: auto !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Using !important for margin-left and margin-right can make it difficult to override these properties later. Consider if there's a way to achieve the centering without !important, perhaps by using display: flex on the parent and justify-content: center.

Comment on lines +408 to +410
:global(.Chip-module__j4Ti-q__chip.Chip-module__j4Ti-q__small) {
border: 1px solid var(--color-background-tertiary, #e2e8f0) !important;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The !important declaration here for border on the Chip component might be unnecessary if the base styles are managed correctly. Review if this override is strictly required or if it can be achieved through better CSS organization.

Comment on lines +205 to +206
const iso = t.doneAt ?? t.date ?? '';
const dayKey = iso ? iso.slice(0, 10) : '1970-01-01';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The default dayKey of '1970-01-01' for tasks without doneAt or date might lead to unexpected grouping or display if such tasks exist. It's good to have a fallback, but consider if these tasks should be explicitly excluded or if a more descriptive dayKey (e.g., 'Undated Tasks') would be better for debugging/display.

Comment on lines +227 to +230
if (filteredTasks.length === 0) return 0;
if (filteredTasks.some((t) => t.id === selectedTaskId)) return selectedTaskId;
return filteredTasks[0].id;
}, [filteredTasks, selectedTaskId]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The logic for effectiveSelectedTaskId ensures a task is always selected if filteredTasks is not empty. This is a good fallback, but if filteredTasks becomes empty while selectedTaskId still holds a value, effectiveSelectedTaskId will become 0. Ensure that 0 is correctly interpreted as 'no task selected' or handle this case explicitly where effectiveSelectedTaskId is used.

Comment on lines +256 to +257
taskId: c.taskId ?? effectiveSelectedTaskId,
userId: c.userId ?? c.user?.id ?? 0,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The taskId and userId properties are asserted with ?? effectiveSelectedTaskId and ?? c.user?.id ?? 0. While effectiveSelectedTaskId is a number, c.user?.id could be undefined. The ?? 0 fallback is good, but ensure that 0 is a valid default for userId in all contexts where UiComment is used.

Comment on lines +276 to +277
window.setTimeout(() => setDetailMounted(false), 260);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The window.setTimeout with a hardcoded delay of 260ms is tied to the CSS transition duration. If the CSS transition duration changes, this JavaScript delay will need to be updated manually. Consider using onTransitionEnd event if precise synchronization is critical, or define the duration as a constant in a shared place.

Comment on lines +579 to +583
<div style={{ position: 'relative' }}>
<TaskListItem
title={task.name}
date={formatKoreanDateFromIso(`${group.dayKey}T00:00:00.000Z`)}
checked={!!task.doneAt}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The date prop for TaskDetailCard is cast as string after a series of nullish coalescing operators. While new Date().toISOString() will always return a string, if selectedTask.doneAt or selectedTask.date were somehow not strings, this cast would hide a potential type mismatch. Ensure that the upstream data types are consistently strings or handle potential non-string values more explicitly.

@HWAN0218 HWAN0218 closed this Feb 23, 2026
@github-project-automation github-project-automation Bot moved this from 개발 대기중 to 개발 완료 in workers Feb 23, 2026
@HWAN0218 HWAN0218 reopened this Feb 23, 2026
@Jieunsse Jieunsse merged commit 06584ca into main Feb 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

기능추가 기능개발 및 추가할 때 사용해주세요.

Projects

Status: 개발 완료

Development

Successfully merging this pull request may close these issues.

2 participants