@ -162,6 +162,8 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
result . register ( view : InfoMessageCell . self )
result . register ( view : TypingIndicatorCell . self )
result . register ( view : CallMessageCell . self )
result . estimatedSectionHeaderHeight = ConversationVC . loadingHeaderHeight
result . sectionFooterHeight = 0
result . dataSource = self
result . delegate = self
@ -209,7 +211,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
private lazy var emptyStateLabel : UILabel = {
let text : String = String (
format : " GROUP_ CONVERSATION_EMPTY_STATE" . localized ( ) ,
format : " CONVERSATION_EMPTY_STATE" . localized ( ) ,
self . viewModel . threadData . displayName
)
@ -228,10 +230,6 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
result . textAlignment = . center
result . lineBreakMode = . byWordWrapping
result . numberOfLines = 0
result . isHidden = (
self . viewModel . threadData . threadVariant != . legacyGroup &&
self . viewModel . threadData . threadVariant != . group
)
return result
} ( )
@ -401,8 +399,8 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
view . addSubview ( messageRequestStackView )
emptyStateLabel . pin ( . top , to : . top , of : view , withInset : Values . largeSpacing )
emptyStateLabel . pin ( . leading , to : . leading , of : view , withInset : Values . l argeSpacing)
emptyStateLabel . pin ( . trailing , to : . trailing , of : view , withInset : - Values . l argeSpacing)
emptyStateLabel . pin ( . leading , to : . leading , of : view , withInset : Values . veryL argeSpacing)
emptyStateLabel . pin ( . trailing , to : . trailing , of : view , withInset : - Values . veryL argeSpacing)
messageRequestStackView . addArrangedSubview ( messageRequestBlockButton )
messageRequestStackView . addArrangedSubview ( messageRequestDescriptionContainerView )
@ -620,7 +618,9 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
// P a g e d D a t a b a s e O b s e r v e r w o n ' t h a v e t h e m s o w e n e e d t o f o r c e a r e - f e t c h o f t h e c u r r e n t
// d a t a t o e n s u r e e v e r y t h i n g i s u p t o d a t e
if didReturnFromBackground {
self ? . viewModel . pagedDataObserver ? . reload ( )
DispatchQueue . global ( qos : . background ) . async {
self ? . viewModel . pagedDataObserver ? . reload ( )
}
}
}
}
@ -674,7 +674,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
// U p d a t e t h e e m p t y s t a t e
let text : String = String (
format : " GROUP_ CONVERSATION_EMPTY_STATE" . localized ( ) ,
format : " CONVERSATION_EMPTY_STATE" . localized ( ) ,
updatedThreadData . displayName
)
emptyStateLabel . attributedText = NSAttributedString ( string : text )
@ -775,6 +775,13 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
changeset : StagedChangeset < [ ConversationViewModel . SectionModel ] > ,
initialLoad : Bool = false
) {
// D e t e r m i n e i f w e h a v e a n y m e s s a g e s f o r t h e e m p t y s t a t e
let hasMessages : Bool = ( updatedData
. filter { $0 . model = = . messages }
. first ?
. elements
. isEmpty = = false )
// E n s u r e t h e f i r s t l o a d o r a l o a d w h e n r e t u r n i n g f r o m a c h i l d s c r e e n r u n s w i t h o u t
// a n i m a t i o n s ( i f w e d o n ' t d o t h i s t h e c e l l s w i l l a n i m a t e i n f r o m a f r a m e o f
// C G R e c t . z e r o o r h a v e a b u g g y t r a n s i t i o n )
@ -785,17 +792,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
self . viewModel . updateInteractionData ( updatedData )
// U p d a t e t h e e m p t y s t a t e
let hasMessages : Bool = ( updatedData
. filter { $0 . model = = . messages }
. first ?
. elements
. isEmpty = = false )
self . emptyStateLabel . isHidden = (
hasMessages || (
self . viewModel . threadData . threadVariant != . legacyGroup &&
self . viewModel . threadData . threadVariant != . group
)
)
self . emptyStateLabel . isHidden = hasMessages
UIView . performWithoutAnimation {
self . tableView . reloadData ( )
@ -806,12 +803,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
}
// U p d a t e t h e e m p t y s t a t e
self . emptyStateLabel . isHidden = (
! updatedData . isEmpty || (
self . viewModel . threadData . threadVariant != . legacyGroup &&
self . viewModel . threadData . threadVariant != . group
)
)
self . emptyStateLabel . isHidden = hasMessages
// U p d a t e t h e R e a c t i o n L i s t S h e e t ( i f o n e e x i s t s )
if let messageUpdates : [ MessageViewModel ] = updatedData . first ( where : { $0 . model = = . messages } ) ? . elements {
@ -1428,14 +1420,6 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
}
// MARK: - U I T a b l e V i e w D e l e g a t e
func tableView ( _ tableView : UITableView , estimatedHeightForRowAt indexPath : IndexPath ) -> CGFloat {
return UITableView . automaticDimension
}
func tableView ( _ tableView : UITableView , heightForRowAt indexPath : IndexPath ) -> CGFloat {
return UITableView . automaticDimension
}
func tableView ( _ tableView : UITableView , heightForHeaderInSection section : Int ) -> CGFloat {
let section : ConversationViewModel . SectionModel = viewModel . interactionData [ section ]
@ -1507,15 +1491,6 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
return
}
// N o t e : I n t h i s c a s e w e n e e d t o f o r c e a t a b l e V i e w l a y o u t t o e n s u r e u p d a t i n g t h e
// s c r o l l p o s i t i o n h a s t h e c o r r e c t o f f s e t ( o t h e r w i s e t h e r e a r e s o m e c a s e s w h e r e
// t h e s c r e e n w i l l j u m p u p - e g . w h e n s e n d i n g a r e p l y w h i l e t h e s o f t k e y b o a r d
// i s v i s i b l e )
UIView . performWithoutAnimation {
self . tableView . setNeedsLayout ( )
self . tableView . layoutIfNeeded ( )
}
let targetIndexPath : IndexPath = IndexPath (
row : ( self . viewModel . interactionData [ messagesSectionIndex ] . elements . count - 1 ) ,
section : messagesSectionIndex
@ -1762,12 +1737,6 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
return
}
// N o t e : I f t h e t a b l e V i e w n e e d s t o l a y o u t t h e n w e s h o u l d d o i t f i r s t w i t h o u t a n a n i m a t i o n
// t o p r e v e n t a n a n n o y i n g i s s u e w h e r e t h e s c r e e n j u m p s s l i g h t l y a f t e r t h e s c r o l l c o m p l e t e s
UIView . performWithoutAnimation {
self . tableView . layoutIfNeeded ( )
}
let targetIndexPath : IndexPath = IndexPath (
row : targetMessageIndex ,
section : messageSectionIndex