Skip to content

Commit 60468e5

Browse files
committed
iOS: Fix draft save issue
1 parent 470258d commit 60468e5

File tree

2 files changed

+67
-12
lines changed

2 files changed

+67
-12
lines changed

apple/InlineIOS/Chat/ComposeView.swift

+61-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AVFoundation
2+
import Combine
23
import CoreServices
34
import ImageIO
45
import InlineKit
@@ -122,6 +123,7 @@ class ComposeView: UIView, NSTextLayoutManagerDelegate,
122123
private let buttonSize: CGSize = .init(width: 36, height: 36)
123124
private var overlayView: UIView?
124125
private var isOverlayVisible = false
126+
private var phaseObserver: AnyCancellable?
125127

126128
// MARK: UI Components
127129

@@ -160,8 +162,8 @@ class ComposeView: UIView, NSTextLayoutManagerDelegate,
160162

161163
override init(frame: CGRect) {
162164
super.init(frame: frame)
163-
164165
setupViews()
166+
setupScenePhaseObserver()
165167
}
166168

167169
@available(*, unavailable)
@@ -315,7 +317,7 @@ class ComposeView: UIView, NSTextLayoutManagerDelegate,
315317
)
316318

317319
UnreadManager.shared.readAll(peerId, chatId: chatId)
318-
320+
clearDraft()
319321
ChatState.shared.clearReplyingMessageId(peer: peerId)
320322
sendMessageHaptic()
321323
textViewContainer.textView.text = ""
@@ -427,16 +429,7 @@ class ComposeView: UIView, NSTextLayoutManagerDelegate,
427429
}
428430

429431
override func removeFromSuperview() {
430-
if let text = textViewContainer.textView.text {
431-
guard let peerId else { return }
432-
Task {
433-
do {
434-
try await DataManager.shared.updateDialog(peerId: peerId, draft: text.isEmpty ? nil : text)
435-
} catch {
436-
print("Failed to save draft", error)
437-
}
438-
}
439-
}
432+
saveDraft()
440433
super.removeFromSuperview()
441434
}
442435

@@ -666,6 +659,62 @@ class ComposeView: UIView, NSTextLayoutManagerDelegate,
666659
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
667660
picker.dismiss(animated: true)
668661
}
662+
663+
private func setupScenePhaseObserver() {
664+
// Save draft when app moves to background
665+
NotificationCenter.default.addObserver(
666+
self,
667+
selector: #selector(saveCurrentDraft),
668+
name: UIApplication.didEnterBackgroundNotification,
669+
object: nil
670+
)
671+
672+
// Save draft when force-quits the app from the app switcher
673+
NotificationCenter.default.addObserver(
674+
self,
675+
selector: #selector(saveCurrentDraft),
676+
name: UIApplication.willTerminateNotification,
677+
object: nil
678+
)
679+
680+
// Save draft when app becomes inactive
681+
NotificationCenter.default.addObserver(
682+
self,
683+
selector: #selector(saveCurrentDraft),
684+
name: UIApplication.willResignActiveNotification,
685+
object: nil
686+
)
687+
}
688+
689+
@objc private func saveCurrentDraft() {
690+
saveDraft()
691+
}
692+
693+
private func saveDraft() {
694+
guard let peerId else { return }
695+
696+
if let text = textViewContainer.textView.text, !text.isEmpty {
697+
Task {
698+
do {
699+
try await DataManager.shared.updateDialog(peerId: peerId, draft: text)
700+
} catch {
701+
print("Failed to save draft", error)
702+
}
703+
}
704+
}
705+
}
706+
707+
private func clearDraft() {
708+
guard let peerId else { return }
709+
710+
Task {
711+
do {
712+
try await DataManager.shared.updateDialog(peerId: peerId, draft: nil)
713+
} catch {
714+
print("Failed to clear draft", error)
715+
}
716+
}
717+
}
669718
}
670719

671720
// MARK: - User Interaction Handling

apple/InlineIOS/Localizable.xcstrings

+6
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@
209209
},
210210
"Integrations" : {
211211

212+
},
213+
"Invite Member" : {
214+
212215
},
213216
"It's an all new way to chat with your team." : {
214217
"localizations" : {
@@ -405,6 +408,9 @@
405408
},
406409
"Logout" : {
407410

411+
},
412+
"New Chat" : {
413+
408414
},
409415
"No archived chats" : {
410416

0 commit comments

Comments
 (0)