Skip to content

Conversation

@baekteun
Copy link
Member

@baekteun baekteun commented Aug 2, 2025

💡 배경 및 개요

BookRecord Editor 화면

image

📃 작업내용

  • BookRecord Editor 화면, 디자인 다소 바뀌었어요.
  • DB 연결도함
  • ReadingProgress를 Optional로 할지도 고민되네요.

✅ PR 체크리스트

템플릿 체크리스트 말고도 추가적으로 필요한 체크리스트는 추가해주세요!

  • 이 작업으로 인해 변경이 필요한 문서가 변경되었나요? (e.g. .env, 노션, README)
  • 이 작업을 하고나서 공유해야할 팀원들에게 공유되었나요? (e.g. "API 개발 완료됐어요", "환경값 추가되었어요")
  • 작업한 코드가 정상적으로 동작하나요?
  • Merge 대상 브랜치가 올바른가요?
  • PR과 관련 없는 작업이 있지는 않나요?

🎸 기타

@github-actions
Copy link

github-actions bot commented Aug 2, 2025

✅ PR의 Assign 자동 지정을 성공했어요!

@baekteun

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.

Summary of Changes

Hello @baekteun, 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!

This pull request introduces a comprehensive overhaul of the book record logging functionality, transforming the previous 'new record' screen into a versatile 'editor' that supports both creation and modification of reading logs. Key changes include a streamlined data model for books, a dedicated ViewModel to manage editor state and Core Data persistence, and new UI components for more precise input of reading dates and page ranges.

Highlights

  • Data Model Refactoring: The BookRepresentation struct has been significantly refactored to align more closely with the BookEntity Core Data model. It now directly contains core book properties and includes new initializers and conversion methods (init(from bookEntity:) and toBookEntity(in context:)) to facilitate seamless mapping between domain representation and Core Data entities.
  • Unified Book Record Editor: The NewBookRecordViewController has been renamed to BookRecordEditorViewController and refactored to serve as a unified interface for both creating new reading logs and editing existing ones. This includes dynamic navigation bar titles based on the edit mode.
  • New ViewModel for Editor Logic: A new BookRecordEditorViewModel has been introduced. This ViewModel manages the state of the editor, handles the logic for creating or updating ReadingLogEntity objects in Core Data, and tracks unsaved changes to prompt the user before dismissal.
  • Enhanced Reading Progress Input: The previous ReadingProgressCell (which only tracked a single current page) has been replaced by a new ReadingRangeCell. This new component allows users to input both a start page and an end page for a reading session, providing a more granular way to log reading progress. A new DateCell has also been added for date selection.
  • Improved User Experience for Dismissal: The editor now includes logic to detect unsaved changes. If changes are present, the user is prompted with an alert before the editor can be dismissed, preventing accidental data loss. This also integrates with UISheetPresentationControllerDelegate for sheet dismissal behavior.
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 in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

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 issue 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 or fill out our survey to provide feedback.

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

This pull request introduces the BookRecordEditor screen, refactoring the previous NewBookRecord screen and adding an edit mode. The changes are extensive and well-executed, especially the UI/UX improvements like the "discard changes" alert and the updated cell components. The new BookRecordEditorViewModel is well-structured with the Observation framework.

My review focuses on a critical Core Data issue regarding cross-context object usage that could lead to crashes, some opportunities for refactoring to improve maintainability, and best practices for error handling and localization. Overall, this is a great enhancement to the feature.

Comment on lines +49 to +50
self.originalBookID = bookEntity.originalBookID ?? ""
self.title = bookEntity.title ?? ""
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

Using nil-coalescing to provide an empty string for originalBookID and title can hide data integrity issues if these properties are considered essential. An empty string might be treated as valid data downstream, which could lead to unexpected behavior.

Consider making this initializer failable (init?) and returning nil if these essential properties are missing from the BookEntity. This would make your data flow more robust.

Suggested change
self.originalBookID = bookEntity.originalBookID ?? ""
self.title = bookEntity.title ?? ""
public init?(from bookEntity: BookEntity) {
guard let originalBookID = bookEntity.originalBookID, !originalBookID.isEmpty,
let title = bookEntity.title, !title.isEmpty else {
return nil
}
self.originalBookID = originalBookID
self.title = title
self.author = bookEntity.author
self.isbn = bookEntity.isbn
self.isbn13 = bookEntity.isbn13
self.pageCount = bookEntity.pageCount
self.publishedDate = bookEntity.publishedDate
self.publisher = bookEntity.publisher
self.rating = bookEntity.rating
self.source = bookEntity.source?.sourceType ?? .googleBooks
self.status = bookEntity.status?.status
self.coverImageURL = bookEntity.coverImageURL
}

baekteun and others added 2 commits August 3, 2025 00:09
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Base automatically changed from feature/newbook-to-searchbook to master August 9, 2025 02:54
@baekteun baekteun merged commit dd4e85c into master Aug 10, 2025
@baekteun baekteun deleted the feature/book-record-editor branch August 10, 2025 07:30
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.

4 participants