From ace2b1cbdfd51bfa573cb81060c5b9deecfe853c Mon Sep 17 00:00:00 2001 From: CMK Date: Tue, 29 Jun 2021 17:46:43 +0800 Subject: [PATCH] fix: reply to label missing emoji issue in compose scene --- .../Scene/Compose/ComposeViewController.swift | 20 ++++++++++++------- .../Compose/ComposeViewModel+Diffable.swift | 13 +++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Mastodon/Scene/Compose/ComposeViewController.swift b/Mastodon/Scene/Compose/ComposeViewController.swift index 0e3efede2..c13cedb8c 100644 --- a/Mastodon/Scene/Compose/ComposeViewController.swift +++ b/Mastodon/Scene/Compose/ComposeViewController.swift @@ -215,6 +215,7 @@ extension ComposeViewController { ) // update layout when keyboard show/dismiss + view.layoutIfNeeded() let keyboardEventPublishers = Publishers.CombineLatest3( KeyboardResponderService.shared.isShow, KeyboardResponderService.shared.state, @@ -428,8 +429,8 @@ extension ComposeViewController { // setup snap behavior Publishers.CombineLatest( - viewModel.repliedToCellFrame.removeDuplicates().eraseToAnyPublisher(), - viewModel.collectionViewState.eraseToAnyPublisher() + viewModel.repliedToCellFrame, + viewModel.collectionViewState ) .receive(on: DispatchQueue.main) .sink { [weak self] repliedToCellFrame, collectionViewState in @@ -438,6 +439,8 @@ extension ComposeViewController { switch collectionViewState { case .fold: self.tableView.contentInset.top = -repliedToCellFrame.height + os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: set contentInset.top: -%s", ((#file as NSString).lastPathComponent), #line, #function, repliedToCellFrame.height.description) + case .expand: self.tableView.contentInset.top = 0 } @@ -447,12 +450,15 @@ extension ComposeViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - - // Fix AutoLayout conflict issue - DispatchQueue.main.async { [weak self] in - guard let self = self else { return } - self.markTextEditorViewBecomeFirstResponser() + + // using index to make table view layout + // otherwise, the content offset will be wrong + guard let indexPath = tableView.indexPath(for: viewModel.composeStatusContentTableViewCell), + let cell = tableView.cellForRow(at: indexPath) as? ComposeStatusContentTableViewCell else { + assertionFailure() + return } + cell.metaText.textView.becomeFirstResponder() } override func viewDidAppear(_ animated: Bool) { diff --git a/Mastodon/Scene/Compose/ComposeViewModel+Diffable.swift b/Mastodon/Scene/Compose/ComposeViewModel+Diffable.swift index 7f60a5b3f..a7b3ee028 100644 --- a/Mastodon/Scene/Compose/ComposeViewModel+Diffable.swift +++ b/Mastodon/Scene/Compose/ComposeViewModel+Diffable.swift @@ -221,7 +221,18 @@ extension ComposeViewModel: UITableViewDataSource { } cell.statusView.headerContainerView.isHidden = false cell.statusView.headerIconLabel.attributedText = StatusView.iconAttributedString(image: StatusView.replyIconImage) - cell.statusView.headerInfoLabel.text = L10n.Scene.Compose.replyingToUser(replyTo.author.displayNameWithFallback) + let headerText: String = { + let author = replyTo.author + let name = author.displayName.isEmpty ? author.username : author.displayName + return L10n.Scene.Compose.replyingToUser(name) + }() + MastodonStatusContent.parseResult(content: headerText, emojiDict: replyTo.author.emojiDict) + .receive(on: DispatchQueue.main) + .sink { [weak cell] parseResult in + guard let cell = cell else { return } + cell.statusView.headerInfoLabel.configure(contentParseResult: parseResult) + } + .store(in: &cell.disposeBag) } // configure author ComposeStatusSection.configureStatusContent(cell: cell, attribute: composeStatusAttribute)