-
Notifications
You must be signed in to change notification settings - Fork 0
BookRecord Editor 화면 #22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
✅ PR의 Assign 자동 지정을 성공했어요! |
There was a problem hiding this 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
BookRepresentationstruct has been significantly refactored to align more closely with theBookEntityCore Data model. It now directly contains core book properties and includes new initializers and conversion methods (init(from bookEntity:)andtoBookEntity(in context:)) to facilitate seamless mapping between domain representation and Core Data entities. - Unified Book Record Editor: The
NewBookRecordViewControllerhas been renamed toBookRecordEditorViewControllerand 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
BookRecordEditorViewModelhas been introduced. This ViewModel manages the state of the editor, handles the logic for creating or updatingReadingLogEntityobjects 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 newReadingRangeCell. 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 newDateCellhas 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
UISheetPresentationControllerDelegatefor 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
-
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. ↩
There was a problem hiding this 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.
| self.originalBookID = bookEntity.originalBookID ?? "" | ||
| self.title = bookEntity.title ?? "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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 | |
| } |
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
💡 배경 및 개요
BookRecord Editor 화면
📃 작업내용
✅ PR 체크리스트
.env,노션,README)"API 개발 완료됐어요","환경값 추가되었어요")🎸 기타