Skip to content

Commit 667aa03

Browse files
author
Isaac
committed
[WIP] Edit message preview
1 parent 6ff4cd3 commit 667aa03

16 files changed

Lines changed: 481 additions & 1597 deletions

File tree

‎Telegram/Telegram-iOS/en.lproj/Localizable.strings‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12298,3 +12298,13 @@ Sorry for the inconvenience.";
1229812298
"Stars.Transfer.Balance" = "Balance";
1229912299

1230012300
"Settings.Stars" = "Your Stars";
12301+
12302+
"Chat.MessageEffectMenu.TitleAddEffect" = "Add an animated effect";
12303+
"Chat.MessageEffectMenu.SectionMessageEffects" = "Message Effects";
12304+
"Chat.SendMessageMenu.MoveCaptionUp" = "Move Caption Up";
12305+
"Chat.SendMessageMenu.MoveCaptionDown" = "Move Caption Down";
12306+
"Chat.SendMessageMenu.ToastPremiumRequired.Text" = "Subscribe to [Telegram Premium]() to add this animated effect.";
12307+
12308+
"BusinessLink.AlertTextLimitText" = "The message text limit is 4096 characters";
12309+
12310+
"Chat.SendMessageMenu.EditMessage" = "Edit Message";

‎submodules/AttachmentTextInputPanelNode/Sources/AttachmentTextInputActionButtonsNode.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ final class AttachmentTextInputActionButtonsNode: ASDisplayNode, ChatSendMessage
5757

5858
self.sendButton.highligthedChanged = { [weak self] highlighted in
5959
if let strongSelf = self {
60-
if strongSelf.sendButtonHasApplyIcon || !strongSelf.sendButtonLongPressEnabled {
60+
if !strongSelf.sendButtonLongPressEnabled {
6161
if highlighted {
6262
strongSelf.sendContainerNode.layer.removeAnimation(forKey: "opacity")
6363
strongSelf.sendContainerNode.alpha = 0.4

‎submodules/AttachmentUI/Sources/AttachmentPanel.swift‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,21 +1002,24 @@ final class AttachmentPanel: ASDisplayNode, ASScrollViewDelegate {
10021002
context: strongSelf.context,
10031003
updatedPresentationData: strongSelf.updatedPresentationData,
10041004
peerId: strongSelf.presentationInterfaceState.chatLocation.peerId,
1005-
forwardMessageIds: strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds,
1005+
params: .sendMessage(SendMessageActionSheetControllerParams.SendMessage(
1006+
isScheduledMessages: false,
1007+
mediaPreview: mediaPreview,
1008+
mediaCaptionIsAbove: (captionIsAboveMedia, { [weak strongSelf] value in
1009+
guard let strongSelf, let controller = strongSelf.controller, let mediaPickerContext = controller.mediaPickerContext else {
1010+
return
1011+
}
1012+
mediaPickerContext.setCaptionIsAboveMedia(value)
1013+
}),
1014+
attachment: true,
1015+
canSendWhenOnline: sendWhenOnlineAvailable,
1016+
forwardMessageIds: strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? []
1017+
)),
10061018
hasEntityKeyboard: hasEntityKeyboard,
10071019
gesture: gesture,
10081020
sourceSendButton: node,
10091021
textInputView: textInputNode.textView,
1010-
mediaPreview: mediaPreview,
1011-
mediaCaptionIsAbove: (captionIsAboveMedia, { [weak strongSelf] value in
1012-
guard let strongSelf, let controller = strongSelf.controller, let mediaPickerContext = controller.mediaPickerContext else {
1013-
return
1014-
}
1015-
mediaPickerContext.setCaptionIsAboveMedia(value)
1016-
}),
10171022
emojiViewProvider: textInputPanelNode.emojiViewProvider,
1018-
attachment: true,
1019-
canSendWhenOnline: sendWhenOnlineAvailable,
10201023
completion: {
10211024
},
10221025
sendMessage: { [weak textInputPanelNode] mode, messageEffect in

‎submodules/ChatSendMessageActionUI/Sources/ChatSendMessageActionSheetController.swift‎

Lines changed: 32 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -11,169 +11,57 @@ import TextFormat
1111
import ReactionSelectionNode
1212
import 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

16154
public 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

Comments
 (0)