Skip to content

[#287] TodoEditorView에서 Todo의 카테고리를 수정할 수 있는 UI를 구현한다#294

Merged
opficdev merged 7 commits intodevelopfrom
feat/#287-category
Mar 17, 2026
Merged

[#287] TodoEditorView에서 Todo의 카테고리를 수정할 수 있는 UI를 구현한다#294
opficdev merged 7 commits intodevelopfrom
feat/#287-category

Conversation

@opficdev
Copy link
Owner

@opficdev opficdev self-assigned this Mar 17, 2026
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, 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은 TodoEditorView의 사용자 경험을 개선하기 위해 Todo의 카테고리를 수정할 수 있는 기능을 추가하고, 기존에 분산되어 있던 Todo의 세부 정보(중요 표시, 태그, 마감일) 편집 기능을 새로운 '세부 정보' 시트로 통합합니다. 이를 통해 사용자는 Todo 생성 및 편집 시 더욱 체계적이고 편리하게 정보를 관리할 수 있게 됩니다.

Highlights

  • Todo 카테고리 관리: Todo의 카테고리(TodoKind)를 편집할 수 있는 UI가 추가되었으며, TodoEditorViewModelkind 속성이 도입되어 카테고리 상태를 관리합니다.
  • 세부 정보 시트 도입: TodoEditorView에서 기존의 accessoryBar를 제거하고, Todo의 중요 표시, 태그, 마감일, 카테고리 등 세부 정보를 편집할 수 있는 TodoEditorInfoSheetView가 시트로 제공됩니다.
  • ViewModel 상태 및 액션 확장: TodoEditorViewModel.StateshowInfo 불리언과 kind 속성이 추가되었고, Action 열거형에 setKindsetShowInfo 액션이 새로 정의되었습니다.
  • 내비게이션 타이틀 동적 변경: TodoEditorViewModelnavigationTitle이 이제 state.kind에 따라 동적으로
  • 로컬라이징 문자열 업데이트: 새로운 UI 요소에 필요한 '세부 정보', '없음', '옵션', '카테고리' 등의 로컬라이징 문자열이 Localizable.xcstrings에 추가 및 수정되었습니다.
Changelog
  • DevLog/Presentation/ViewModel/TodoEditorViewModel.swift
    • Draft 구조체에 kind 속성이 추가되었습니다.
    • State 구조체에 showInfokind 속성이 추가되고 기본값이 설정되었습니다.
    • Action 열거형에 setKindsetShowInfo 케이스가 추가되었습니다.
    • navigationTitle이 저장 속성에서 state.kind에 따라 동적으로 결정되는 계산 속성으로 변경되었습니다.
    • 새로운 Todo 생성 및 기존 Todo 편집용 init 메서드에서 kind 속성 초기화 로직이 state.kind를 사용하도록 변경되었습니다.
    • reduce 메서드에 setKindsetShowInfo 액션 처리 로직이 추가되었습니다.
    • makeTodo 메서드에서 kind 속성이 state.kind를 참조하도록 수정되었습니다.
  • DevLog/Resource/Localizable.xcstrings
    • '세부 정보', '없음', '옵션', '카테고리' 문자열이 새로 추가되었습니다.
    • '태그 입력' 문자열이 '태그 없음'으로 변경되었습니다.
    • '중요' 문자열이 제거되었습니다.
  • DevLog/UI/Common/Component/Tag+.swift
    • 버튼에 .buttonStyle(.plain)이 적용되었습니다.
  • DevLog/UI/Home/TodoEditorView.swift
    • safeAreaInsets 환경 변수와 showDueDatePicker 상태 변수가 제거되었습니다.
    • 기존 ZStack 기반 레이아웃이 ScrollView 기반으로 변경되었습니다.
    • 콘텐츠 필드의 focused 상태가 .description에서 .content로 변경되었습니다.
    • 새로운 TodoEditorInfoSheetView가 시트로 추가되어 viewModel.state.showInfo에 따라 표시됩니다.
    • 툴바에 '정보' 버튼(info.circle)이 추가되어 TodoEditorInfoSheetView를 토글합니다.
    • 기존 accessoryBar가 제거되고, 그 기능(중요 표시, 태그 편집, 마감일)이 TodoEditorInfoSheetView로 이동되었습니다.
    • TodoEditorInfoSheetView 구조체가 새로 정의되어 Todo의 카테고리, 중요 표시, 마감일, 태그를 편집하는 UI를 제공합니다.
    • TodoEditorInfoSheetView 내에서 태그 추가 및 삭제 로직이 구현되었습니다.
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.

Copy link
Contributor

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

Choose a reason for hiding this comment

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

Code Review

이 PR은 TodoEditorView의 UI를 개선하여 Todo의 상세 정보를 편집하는 방식을 리팩토링했습니다. 기존의 액세서리 바를 제거하고, 중요 표시, 태그, 마감일 설정 기능과 함께 새로운 카테고리 편집 기능을 TodoEditorInfoSheetView라는 새로운 시트 뷰로 옮겼습니다. 이를 통해 메인 편집 화면이 더 깔끔해졌습니다. TodoEditorViewModelkind 프로퍼티를 State 내부로 이동하는 등 이러한 변경사항을 지원하도록 업데이트되었습니다. 전반적으로 사용자 경험과 코드 구조를 개선하는 좋은 변경이라고 생각합니다.

Comment on lines +199 to +203
set: { isPinned in
if viewModel.state.isPinned != isPinned {
viewModel.send(.togglePinned)
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

ToggleBinding을 위한 set 클로저 내의 if viewModel.state.isPinned != isPinned 조건은 불필요합니다. Toggleset 클로저는 값이 변경될 때만 호출되므로, 이 조건은 항상 true가 됩니다. if 문을 제거하여 코드를 더 간결하게 만들 수 있습니다. 또한 set 클로저의 isPinned 파라미터가 사용되지 않으므로 _로 바꿀 수 있습니다.

                            set: { _ in
                                viewModel.send(.togglePinned)
                            }

@opficdev opficdev merged commit 389efce into develop Mar 17, 2026
2 checks passed
@opficdev opficdev deleted the feat/#287-category branch March 17, 2026 11:56
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.

TodoEditorView에서 Todo의 카테고리를 수정할 수 있는 UI를 구현한다

1 participant