@@ -14,6 +14,12 @@ final class NoteEditViewModel: BaseViewModel {
1414 var shouldPresentEmotionEdit : ( emotion: Emotion ? , timestamp: Date ) ?
1515 var saveCompleted : Bool = false
1616 var deleteCompleted : Bool = false
17+
18+ var currentFormData : ( page: String , sentence: String , appreciation: String ) = ( " " , " " , " " )
19+
20+ var initialRecordInfo : RecordInfo ?
21+ var initialSelectedEmotion : Emotion ?
22+ var isDiff : Bool = false // 변경 내용이 있는지 추적
1723 }
1824
1925 enum Action {
@@ -23,10 +29,15 @@ final class NoteEditViewModel: BaseViewModel {
2329 case errorHandled
2430 case presentEmotionEdit
2531 case emotionSelected( Emotion )
26- case saveButtonTapped( formData: ( page: Int ? , sentence: String , appreciation: String ? ) )
32+
33+ case saveButtonTapped
2734 case patchRecordSuccessed( RecordInfo )
2835 case deleteButtonTapped
2936 case deleteRecordSuccessed
37+
38+ case pageDidChange( String )
39+ case sentenceDidChange( String )
40+ case appreciationDidChange( String )
3041 }
3142
3243 enum SideEffect {
@@ -69,15 +80,27 @@ final class NoteEditViewModel: BaseViewModel {
6980 switch action {
7081 case . onAppear:
7182 newState. isLoading = true
83+ newState. isDiff = false
7284 effects. append ( . fetchRecordDetail( recordId) )
7385
7486 case . fetchRecordDetailSuccessed( let recordInfo) :
7587 newState. recordInfo = recordInfo
88+ newState. initialRecordInfo = recordInfo
89+
90+ newState. currentFormData = (
91+ page: " \( recordInfo. pageNumber) " ,
92+ sentence: recordInfo. quote,
93+ appreciation: recordInfo. review ?? " "
94+ )
95+
7696 // 사용자가 이미 감정을 선택했다면 덮어쓰지 않음
7797 if newState. selectedEmotion == nil {
78- newState. selectedEmotion = recordInfo. emotionTags. first
98+ let initialEmotion = recordInfo. emotionTags. first
99+ newState. selectedEmotion = initialEmotion
100+ newState. initialSelectedEmotion = initialEmotion
79101 }
80102 newState. isLoading = false
103+ newState. isDiff = false
81104
82105 case . errorOccured( let error) :
83106 newState. error = error
@@ -91,28 +114,41 @@ final class NoteEditViewModel: BaseViewModel {
91114
92115 case . emotionSelected( let emotion) :
93116 newState. selectedEmotion = emotion
117+ newState. isDiff = checkForDiff ( state: newState)
94118
95- case . saveButtonTapped( let formData ) :
119+ case . saveButtonTapped:
96120 guard let selectedEmotion = state. selectedEmotion,
97- let page = formData . page,
98- !formData . sentence. isEmpty else {
121+ let page = Int ( state . currentFormData . page) ,
122+ !state . currentFormData . sentence. isEmpty else {
99123 break
100124 }
101125
126+ // 감상평이 비어있으면 nil, 아니면 텍스트 전달
127+ let appreciation = state. currentFormData. appreciation. isEmpty
128+ ? nil
129+ : state. currentFormData. appreciation
130+
102131 let noteForm = NoteForm (
103132 page: page,
104- sentence: formData . sentence,
133+ sentence: state . currentFormData . sentence,
105134 emotion: selectedEmotion,
106- appreciation: formData . appreciation
135+ appreciation: appreciation
107136 )
108137
109138 newState. isLoading = true
110139 effects. append ( . patchRecord( recordId, noteForm) )
111140
112141 case . patchRecordSuccessed( let recordInfo) :
113142 newState. recordInfo = recordInfo
143+ newState. initialRecordInfo = recordInfo
144+ newState. currentFormData = (
145+ page: " \( recordInfo. pageNumber) " ,
146+ sentence: recordInfo. quote,
147+ appreciation: recordInfo. review ?? " "
148+ )
114149 newState. isLoading = false
115150 newState. saveCompleted = true
151+ newState. isDiff = false
116152
117153 case . deleteButtonTapped:
118154 newState. isLoading = true
@@ -121,6 +157,18 @@ final class NoteEditViewModel: BaseViewModel {
121157 case . deleteRecordSuccessed:
122158 newState. isLoading = false
123159 newState. deleteCompleted = true
160+
161+ case . pageDidChange( let text) :
162+ newState. currentFormData. page = text
163+ newState. isDiff = checkForDiff ( state: newState)
164+
165+ case . sentenceDidChange( let text) :
166+ newState. currentFormData. sentence = text
167+ newState. isDiff = checkForDiff ( state: newState)
168+
169+ case . appreciationDidChange( let text) :
170+ newState. currentFormData. appreciation = text
171+ newState. isDiff = checkForDiff ( state: newState)
124172 }
125173
126174 return ( newState, effects)
@@ -159,5 +207,19 @@ final class NoteEditViewModel: BaseViewModel {
159207 . sink ( receiveValue: send ( _: ) )
160208 . store ( in: & cancellables)
161209 }
210+
211+ private func checkForDiff( state: State ) -> Bool {
212+ guard let initialInfo = state. initialRecordInfo else {
213+ return false
214+ }
215+
216+ let pageDiff = state. currentFormData. page != " \( initialInfo. pageNumber) "
217+ let sentenceDiff = state. currentFormData. sentence != initialInfo. quote
218+ let appreciationDiff = state. currentFormData. appreciation != ( initialInfo. review ?? " " )
219+
220+ let emotionDiff = state. selectedEmotion != state. initialSelectedEmotion
221+
222+ return pageDiff || sentenceDiff || appreciationDiff || emotionDiff
223+ }
162224}
163225
0 commit comments