@@ -11,169 +11,57 @@ import TextFormat
1111import ReactionSelectionNode
1212import WallpaperBackgroundNode
1313
14- private final class ChatSendMessageActionSheetControllerImpl : ViewController , ChatSendMessageActionSheetController {
15- private var controllerNode : ChatSendMessageActionSheetControllerNode {
16- return self . displayNode as! ChatSendMessageActionSheetControllerNode
17- }
18-
19- private let context : AccountContext
20-
21- private let peerId : EnginePeer . Id ?
22- private let isScheduledMessages : Bool
23- private let forwardMessageIds : [ EngineMessage . Id ] ?
24- private let hasEntityKeyboard : Bool
25-
26- private let gesture : ContextGesture
27- private let sourceSendButton : ASDisplayNode
28- private let textInputView : UITextView
29- private let attachment : Bool
30- private let canSendWhenOnline : Bool
31- private let completion : ( ) -> Void
32- private let sendMessage : ( SendMode , SendParameters ? ) -> Void
33- private let schedule : ( SendParameters ? ) -> Void
34- private let reactionItems : [ ReactionItem ] ?
35-
36- private var presentationData : PresentationData
37- private var presentationDataDisposable : Disposable ?
38-
39- private var didPlayPresentationAnimation = false
40-
41- private var validLayout : ContainerViewLayout ?
42-
43- private let hapticFeedback = HapticFeedback ( )
44-
45- private let emojiViewProvider : ( ( ChatTextInputTextCustomEmojiAttribute ) -> UIView ) ?
46-
47- public init ( context: AccountContext , updatedPresentationData: ( initial: PresentationData , signal: Signal < PresentationData , NoError > ) ? = nil , peerId: EnginePeer . Id ? , isScheduledMessages: Bool = false , forwardMessageIds: [ EngineMessage . Id ] ? , hasEntityKeyboard: Bool , gesture: ContextGesture , sourceSendButton: ASDisplayNode , textInputView: UITextView , emojiViewProvider: ( ( ChatTextInputTextCustomEmojiAttribute ) -> UIView ) ? , attachment: Bool = false , canSendWhenOnline: Bool , completion: @escaping ( ) -> Void , sendMessage: @escaping ( SendMode , SendParameters ? ) -> Void , schedule: @escaping ( SendParameters ? ) -> Void , reactionItems: [ ReactionItem ] ? = nil ) {
48- self . context = context
49- self . peerId = peerId
50- self . isScheduledMessages = isScheduledMessages
51- self . forwardMessageIds = forwardMessageIds
52- self . hasEntityKeyboard = hasEntityKeyboard
53- self . gesture = gesture
54- self . sourceSendButton = sourceSendButton
55- self . textInputView = textInputView
56- self . emojiViewProvider = emojiViewProvider
57- self . attachment = attachment
58- self . canSendWhenOnline = canSendWhenOnline
59- self . completion = completion
60- self . sendMessage = sendMessage
61- self . schedule = schedule
62- self . reactionItems = reactionItems
63-
64- self . presentationData = updatedPresentationData? . initial ?? context. sharedContext. currentPresentationData. with { $0 }
65-
66- super. init ( navigationBarPresentationData: nil )
67-
68- self . blocksBackgroundWhenInOverlay = true
14+ public enum SendMessageActionSheetControllerParams {
15+ public final class SendMessage {
16+ public let isScheduledMessages : Bool
17+ public let mediaPreview : ChatSendMessageContextScreenMediaPreview ?
18+ public let mediaCaptionIsAbove : ( Bool , ( Bool ) -> Void ) ?
19+ public let attachment : Bool
20+ public let canSendWhenOnline : Bool
21+ public let forwardMessageIds : [ EngineMessage . Id ]
6922
70- self . presentationDataDisposable = ( ( updatedPresentationData? . signal ?? context. sharedContext. presentationData)
71- |> deliverOnMainQueue) . startStrict ( next: { [ weak self] presentationData in
72- if let strongSelf = self {
73- strongSelf. presentationData = presentationData
74- if strongSelf. isNodeLoaded {
75- strongSelf. controllerNode. updatePresentationData ( presentationData)
76- }
77- }
78- } ) . strict ( )
79-
80- self . statusBar. statusBarStyle = . Hide
81- self . statusBar. ignoreInCall = true
82- }
83-
84- required init ( coder aDecoder: NSCoder ) {
85- fatalError ( " init(coder:) has not been implemented " )
86- }
87-
88- deinit {
89- self . presentationDataDisposable? . dispose ( )
90- }
91-
92- override public func loadDisplayNode( ) {
93- var forwardedCount : Int ?
94- if let forwardMessageIds = self . forwardMessageIds, forwardMessageIds. count > 0 {
95- forwardedCount = forwardMessageIds. count
96- }
97-
98- var reminders = false
99- var isSecret = false
100- var canSchedule = false
101- if let peerId = self . peerId {
102- reminders = peerId == context. account. peerId
103- isSecret = peerId. namespace == Namespaces . Peer. SecretChat
104- canSchedule = !isSecret
105- }
106- if self . isScheduledMessages {
107- canSchedule = false
23+ public init (
24+ isScheduledMessages: Bool ,
25+ mediaPreview: ChatSendMessageContextScreenMediaPreview ? ,
26+ mediaCaptionIsAbove: ( Bool , ( Bool ) -> Void ) ? ,
27+ attachment: Bool ,
28+ canSendWhenOnline: Bool ,
29+ forwardMessageIds: [ EngineMessage . Id ]
30+ ) {
31+ self . isScheduledMessages = isScheduledMessages
32+ self . mediaPreview = mediaPreview
33+ self . mediaCaptionIsAbove = mediaCaptionIsAbove
34+ self . attachment = attachment
35+ self . canSendWhenOnline = canSendWhenOnline
36+ self . forwardMessageIds = forwardMessageIds
10837 }
109-
110- self . displayNode = ChatSendMessageActionSheetControllerNode ( context: self . context, presentationData: self . presentationData, reminders: reminders, gesture: gesture, sourceSendButton: self . sourceSendButton, textInputView: self . textInputView, attachment: self . attachment, canSendWhenOnline: self . canSendWhenOnline, forwardedCount: forwardedCount, hasEntityKeyboard: self . hasEntityKeyboard, emojiViewProvider: self . emojiViewProvider, send: { [ weak self] in
111- self ? . sendMessage ( . generic, nil )
112- self ? . dismiss ( cancel: false )
113- } , sendSilently: { [ weak self] in
114- self ? . sendMessage ( . silently, nil )
115- self ? . dismiss ( cancel: false )
116- } , sendWhenOnline: { [ weak self] in
117- self ? . sendMessage ( . whenOnline, nil )
118- self ? . dismiss ( cancel: false )
119- } , schedule: !canSchedule ? nil : { [ weak self] in
120- self ? . schedule ( nil )
121- self ? . dismiss ( cancel: false )
122- } , cancel: { [ weak self] in
123- self ? . dismiss ( cancel: true )
124- } , reactionItems: self . reactionItems)
125- self . displayNodeDidLoad ( )
12638 }
12739
128- override public func viewDidAppear( _ animated: Bool ) {
129- super. viewDidAppear ( animated)
40+ public final class EditMessage {
41+ public let messages : [ EngineMessage ]
42+ public let mediaPreview : ChatSendMessageContextScreenMediaPreview ?
13043
131- if !self . didPlayPresentationAnimation {
132- self . didPlayPresentationAnimation = true
133-
134- self . hapticFeedback. impact ( )
135- self . controllerNode. animateIn ( )
44+ public init ( messages: [ EngineMessage ] , mediaPreview: ChatSendMessageContextScreenMediaPreview ? ) {
45+ self . messages = messages
46+ self . mediaPreview = mediaPreview
13647 }
13748 }
13849
139- override public func containerLayoutUpdated( _ layout: ContainerViewLayout , transition: ContainedViewLayoutTransition ) {
140- self . validLayout = layout
141-
142- super. containerLayoutUpdated ( layout, transition: transition)
143-
144- self . controllerNode. containerLayoutUpdated ( layout, transition: transition)
145- }
146-
147- override public func dismiss( completion: ( ( ) -> Void ) ? = nil ) {
148- self . dismiss ( cancel: true )
149- }
150-
151- private func dismiss( cancel: Bool ) {
152- self . statusBar. statusBarStyle = . Ignore
153- self . controllerNode. animateOut ( cancel: cancel, completion: { [ weak self] in
154- self ? . completion ( )
155- self ? . didPlayPresentationAnimation = false
156- self ? . presentingViewController? . dismiss ( animated: false , completion: nil )
157- } )
158- }
50+ case sendMessage( SendMessage )
51+ case editMessage( EditMessage )
15952}
16053
16154public func makeChatSendMessageActionSheetController(
16255 context: AccountContext ,
16356 updatedPresentationData: ( initial: PresentationData , signal: Signal < PresentationData , NoError > ) ? = nil ,
16457 peerId: EnginePeer . Id ? ,
165- isScheduledMessages: Bool = false ,
166- forwardMessageIds: [ EngineMessage . Id ] ? ,
58+ params: SendMessageActionSheetControllerParams ,
16759 hasEntityKeyboard: Bool ,
16860 gesture: ContextGesture ,
16961 sourceSendButton: ASDisplayNode ,
17062 textInputView: UITextView ,
171- mediaPreview: ChatSendMessageContextScreenMediaPreview ? = nil ,
172- mediaCaptionIsAbove: ( Bool , ( Bool ) -> Void ) ? = nil ,
17363 emojiViewProvider: ( ( ChatTextInputTextCustomEmojiAttribute ) -> UIView ) ? ,
17464 wallpaperBackgroundNode: WallpaperBackgroundNode ? = nil ,
175- attachment: Bool = false ,
176- canSendWhenOnline: Bool ,
17765 completion: @escaping ( ) -> Void ,
17866 sendMessage: @escaping ( ChatSendMessageActionSheetController . SendMode , ChatSendMessageActionSheetController . SendParameters ? ) -> Void ,
17967 schedule: @escaping ( ChatSendMessageActionSheetController . SendParameters ? ) -> Void ,
@@ -182,43 +70,17 @@ public func makeChatSendMessageActionSheetController(
18270 availableMessageEffects: AvailableMessageEffects ? = nil ,
18371 isPremium: Bool = false
18472) -> ChatSendMessageActionSheetController {
185- if textInputView. text. isEmpty && !" " . isEmpty {
186- return ChatSendMessageActionSheetControllerImpl (
187- context: context,
188- updatedPresentationData: updatedPresentationData,
189- peerId: peerId,
190- isScheduledMessages: isScheduledMessages,
191- forwardMessageIds: forwardMessageIds,
192- hasEntityKeyboard: hasEntityKeyboard,
193- gesture: gesture,
194- sourceSendButton: sourceSendButton,
195- textInputView: textInputView,
196- emojiViewProvider: emojiViewProvider,
197- attachment: attachment,
198- canSendWhenOnline: canSendWhenOnline,
199- completion: completion,
200- sendMessage: sendMessage,
201- schedule: schedule,
202- reactionItems: nil
203- )
204- }
205-
20673 return ChatSendMessageContextScreen (
20774 context: context,
20875 updatedPresentationData: updatedPresentationData,
20976 peerId: peerId,
210- isScheduledMessages: isScheduledMessages,
211- forwardMessageIds: forwardMessageIds,
77+ params: params,
21278 hasEntityKeyboard: hasEntityKeyboard,
21379 gesture: gesture,
21480 sourceSendButton: sourceSendButton,
21581 textInputView: textInputView,
216- mediaPreview: mediaPreview,
217- mediaCaptionIsAbove: mediaCaptionIsAbove,
21882 emojiViewProvider: emojiViewProvider,
21983 wallpaperBackgroundNode: wallpaperBackgroundNode,
220- attachment: attachment,
221- canSendWhenOnline: canSendWhenOnline,
22284 completion: completion,
22385 sendMessage: sendMessage,
22486 schedule: schedule,
0 commit comments