mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-02 02:43:07 +00:00
Various fixes
This commit is contained in:
parent
9b8e4d2ca3
commit
d19b96d051
@ -10049,3 +10049,14 @@ Sorry for the inconvenience.";
|
|||||||
|
|
||||||
"Chat.ReplyStoryPrivateChannel" = "Private story";
|
"Chat.ReplyStoryPrivateChannel" = "Private story";
|
||||||
"Message.ForwardedUnavailableStoryShort" = "Private Story\nFrom: %@";
|
"Message.ForwardedUnavailableStoryShort" = "Private Story\nFrom: %@";
|
||||||
|
|
||||||
|
"ChannelBoost.ReplaceBoost" = "You currently boost **%1$@**. Do you want to boost **%2$@** instead?";
|
||||||
|
|
||||||
|
"ChannelBoost.Error.BoostTooOftenTitle" = "Can't Boost Too Often";
|
||||||
|
"ChannelBoost.Error.BoostTooOftenText" = "You can change the channel you boost only once a day. Next time you can boost is in **%@**.";
|
||||||
|
"ChannelBoost.Error.PremiumNeededTitle" = "Premium Needed";
|
||||||
|
"ChannelBoost.Error.PremiumNeededText" = "Only **Telegram Premium** subscribers can boost channels. Do you want to subscribe to **Telegram Premium**?";
|
||||||
|
"ChannelBoost.Error.GiftedPremiumNotAllowedTitle" = "Can't Boost with Gifted Premium";
|
||||||
|
"ChannelBoost.Error.GiftedPremiumNotAllowedText" = "Because your **Telegram Premium** subscription was gifted to you, you can't use it to boost channels.";
|
||||||
|
|
||||||
|
"Chat.ErrorFolderLinkExpired" = "The folder link has expired.";
|
||||||
|
@ -1525,6 +1525,8 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
|||||||
private var action: (() -> Bool)?
|
private var action: (() -> Bool)?
|
||||||
private let openPeer: (EnginePeer) -> Void
|
private let openPeer: (EnginePeer) -> Void
|
||||||
|
|
||||||
|
private let hapticFeedback = HapticFeedback()
|
||||||
|
|
||||||
public init(context: AccountContext, subject: PremiumLimitScreen.Subject, count: Int32, forceDark: Bool = false, cancel: @escaping () -> Void = {}, action: @escaping () -> Bool, openPeer: @escaping (EnginePeer) -> Void = { _ in }) {
|
public init(context: AccountContext, subject: PremiumLimitScreen.Subject, count: Int32, forceDark: Bool = false, cancel: @escaping () -> Void = {}, action: @escaping () -> Bool, openPeer: @escaping (EnginePeer) -> Void = { _ in }) {
|
||||||
self.context = context
|
self.context = context
|
||||||
self.openPeer = openPeer
|
self.openPeer = openPeer
|
||||||
@ -1532,7 +1534,7 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
|||||||
var actionImpl: (() -> Bool)?
|
var actionImpl: (() -> Bool)?
|
||||||
super.init(context: context, component: LimitSheetComponent(context: context, subject: subject, count: count, cancel: {}, action: {
|
super.init(context: context, component: LimitSheetComponent(context: context, subject: subject, count: count, cancel: {}, action: {
|
||||||
return actionImpl?() ?? true
|
return actionImpl?() ?? true
|
||||||
}, openPeer: openPeer), navigationBarAppearance: .none, theme: forceDark ? .dark : .default)
|
}, openPeer: openPeer), navigationBarAppearance: .none, statusBarStyle: .ignore, theme: forceDark ? .dark : .default)
|
||||||
|
|
||||||
self.navigationPresentation = .flatModal
|
self.navigationPresentation = .flatModal
|
||||||
|
|
||||||
@ -1564,6 +1566,8 @@ public class PremiumLimitScreen: ViewControllerComponentContainer {
|
|||||||
return true
|
return true
|
||||||
}, openPeer: self.openPeer)
|
}, openPeer: self.openPeer)
|
||||||
self.updateComponent(component: AnyComponent(component), transition: .easeInOut(duration: 0.2))
|
self.updateComponent(component: AnyComponent(component), transition: .easeInOut(duration: 0.2))
|
||||||
|
|
||||||
|
self.hapticFeedback.impact()
|
||||||
|
|
||||||
self.view.addSubview(ConfettiView(frame: self.view.bounds))
|
self.view.addSubview(ConfettiView(frame: self.view.bounds))
|
||||||
}
|
}
|
||||||
|
@ -3911,7 +3911,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
|||||||
let dropInteraction = UIDropInteraction(delegate: self)
|
let dropInteraction = UIDropInteraction(delegate: self)
|
||||||
self.displayNode.view.addInteraction(dropInteraction)
|
self.displayNode.view.addInteraction(dropInteraction)
|
||||||
|
|
||||||
Queue.mainQueue().after(1.0) {
|
Queue.mainQueue().after(0.4) {
|
||||||
self.adminedChannels.set(.single([]) |> then(self.context.engine.peers.channelsForStories()))
|
self.adminedChannels.set(.single([]) |> then(self.context.engine.peers.channelsForStories()))
|
||||||
self.closeFriends.set(self.context.engine.data.get(TelegramEngine.EngineData.Item.Contacts.CloseFriends()))
|
self.closeFriends.set(self.context.engine.data.get(TelegramEngine.EngineData.Item.Contacts.CloseFriends()))
|
||||||
}
|
}
|
||||||
@ -4507,57 +4507,11 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var didComplete = false
|
private var didComplete = false
|
||||||
func requestCompletion(animated: Bool, skipSendCheck: Bool = false) {
|
func requestCompletion(animated: Bool) {
|
||||||
guard let mediaEditor = self.node.mediaEditor, let subject = self.node.subject, !self.didComplete else {
|
guard let mediaEditor = self.node.mediaEditor, let subject = self.node.subject, !self.didComplete else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.isEditingStory, !skipSendCheck, let sendAsPeerId = self.state.privacy.sendAsPeerId, sendAsPeerId.namespace == Namespaces.Peer.CloudChannel {
|
|
||||||
let _ = (self.context.engine.messages.checkStoriesUploadAvailability(target: .peer(sendAsPeerId))
|
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] status in
|
|
||||||
guard let self else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
switch status {
|
|
||||||
case .available:
|
|
||||||
self.requestCompletion(animated: animated, skipSendCheck: true)
|
|
||||||
case .channelBoostRequired:
|
|
||||||
let _ = combineLatest(
|
|
||||||
queue: Queue.mainQueue(),
|
|
||||||
self.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: sendAsPeerId)),
|
|
||||||
self.context.engine.peers.getChannelBoostStatus(peerId: sendAsPeerId)
|
|
||||||
).start(next: { [weak self] peer, status in
|
|
||||||
guard let self, let peer, let status else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let link: String
|
|
||||||
if let addressName = peer.addressName, !addressName.isEmpty {
|
|
||||||
link = "t.me/\(peer.addressName ?? "")?boost"
|
|
||||||
} else {
|
|
||||||
link = "t.me/c/\(peer.id.id._internalGetInt64Value())?boost"
|
|
||||||
}
|
|
||||||
|
|
||||||
let controller = self.context.sharedContext.makePremiumLimitController(context: self.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), forceDark: true, cancel: {}, action: { [weak self] in
|
|
||||||
guard let self else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
|
||||||
self.present(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.Conversation_LinkCopied), elevatedLayout: false, position: .top, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
|
||||||
UIPasteboard.general.string = "https://\(link)"
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
self.push(controller)
|
|
||||||
|
|
||||||
self.hapticFeedback.impact(.light)
|
|
||||||
})
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
self.didComplete = true
|
self.didComplete = true
|
||||||
|
|
||||||
self.dismissAllTooltips()
|
self.dismissAllTooltips()
|
||||||
|
@ -39,6 +39,7 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/SwitchComponent",
|
"//submodules/TelegramUI/Components/SwitchComponent",
|
||||||
"//submodules/TooltipUI",
|
"//submodules/TooltipUI",
|
||||||
"//submodules/OverlayStatusController",
|
"//submodules/OverlayStatusController",
|
||||||
|
"//submodules/UndoUI",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -25,6 +25,7 @@ import TooltipUI
|
|||||||
import OverlayStatusController
|
import OverlayStatusController
|
||||||
import Markdown
|
import Markdown
|
||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
|
import UndoUI
|
||||||
|
|
||||||
final class ShareWithPeersScreenComponent: Component {
|
final class ShareWithPeersScreenComponent: Component {
|
||||||
typealias EnvironmentType = ViewControllerComponentContainer.Environment
|
typealias EnvironmentType = ViewControllerComponentContainer.Environment
|
||||||
@ -345,6 +346,8 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
private var searchStateContext: ShareWithPeersScreen.StateContext?
|
private var searchStateContext: ShareWithPeersScreen.StateContext?
|
||||||
private var searchStateDisposable: Disposable?
|
private var searchStateDisposable: Disposable?
|
||||||
|
|
||||||
|
private let postingAvailabilityDisposable = MetaDisposable()
|
||||||
|
|
||||||
private let hapticFeedback = HapticFeedback()
|
private let hapticFeedback = HapticFeedback()
|
||||||
|
|
||||||
private var effectiveStateValue: ShareWithPeersScreen.State? {
|
private var effectiveStateValue: ShareWithPeersScreen.State? {
|
||||||
@ -1063,15 +1066,73 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
selectionState: .none,
|
selectionState: .none,
|
||||||
hasNext: i < peers.count - 1,
|
hasNext: i < peers.count - 1,
|
||||||
action: { [weak self] peer in
|
action: { [weak self] peer in
|
||||||
guard let self else {
|
guard let self, let component = self.component else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if isStories {
|
if isStories {
|
||||||
let _ = self.presentSendAsPeer()
|
let _ = self.presentSendAsPeer()
|
||||||
} else {
|
} else {
|
||||||
self.hapticFeedback.impact(.light)
|
if peer.id.namespace == Namespaces.Peer.CloudUser {
|
||||||
self.environment?.controller()?.dismiss()
|
self.component?.peerCompletion(peer.id)
|
||||||
self.component?.peerCompletion(peer.id)
|
self.environment?.controller()?.dismiss()
|
||||||
|
|
||||||
|
self.hapticFeedback.impact(.light)
|
||||||
|
} else {
|
||||||
|
self.postingAvailabilityDisposable.set((component.context.engine.messages.checkStoriesUploadAvailability(target: .peer(peer.id))
|
||||||
|
|> deliverOnMainQueue).start(next: { [weak self] status in
|
||||||
|
guard let self, let component = self.component else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch status {
|
||||||
|
case .available:
|
||||||
|
component.peerCompletion(peer.id)
|
||||||
|
self.environment?.controller()?.dismiss()
|
||||||
|
case .channelBoostRequired:
|
||||||
|
let _ = combineLatest(
|
||||||
|
queue: Queue.mainQueue(),
|
||||||
|
component.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peer.id)),
|
||||||
|
component.context.engine.peers.getChannelBoostStatus(peerId: peer.id)
|
||||||
|
).start(next: { [weak self] peer, status in
|
||||||
|
guard let self, let component = self.component, let peer, let status else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let link: String
|
||||||
|
if let addressName = peer.addressName, !addressName.isEmpty {
|
||||||
|
link = "t.me/\(peer.addressName ?? "")?boost"
|
||||||
|
} else {
|
||||||
|
link = "t.me/c/\(peer.id.id._internalGetInt64Value())?boost"
|
||||||
|
}
|
||||||
|
|
||||||
|
if let navigationController = self.environment?.controller()?.navigationController as? NavigationController {
|
||||||
|
if let previousController = navigationController.viewControllers.last as? ShareWithPeersScreen {
|
||||||
|
previousController.dismiss()
|
||||||
|
}
|
||||||
|
let presentationData = component.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
let controller = component.context.sharedContext.makePremiumLimitController(context: component.context, subject: .storiesChannelBoost(peer: peer, isCurrent: true, level: Int32(status.level), currentLevelBoosts: Int32(status.currentLevelBoosts), nextLevelBoosts: status.nextLevelBoosts.flatMap(Int32.init), link: link, boosted: false), count: Int32(status.boosts), forceDark: true, cancel: {}, action: { [weak navigationController] in
|
||||||
|
UIPasteboard.general.string = "https://\(link)"
|
||||||
|
|
||||||
|
if let previousController = navigationController?.viewControllers.reversed().first(where: { $0 is ShareWithPeersScreen}) as? ShareWithPeersScreen {
|
||||||
|
previousController.dismiss(completion: { [weak navigationController] in
|
||||||
|
Queue.mainQueue().justDispatch {
|
||||||
|
if let controller = navigationController?.viewControllers.last as? ViewController {
|
||||||
|
controller.present(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.Conversation_LinkCopied), elevatedLayout: true, position: .top, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
navigationController.pushViewController(controller)
|
||||||
|
}
|
||||||
|
|
||||||
|
self.hapticFeedback.impact(.light)
|
||||||
|
})
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
@ -2826,9 +2887,10 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer {
|
|||||||
closeFriendsPeers: closeFriends,
|
closeFriendsPeers: closeFriends,
|
||||||
grayListPeers: grayListPeers
|
grayListPeers: grayListPeers
|
||||||
)
|
)
|
||||||
|
|
||||||
self.stateValue = state
|
self.stateValue = state
|
||||||
self.stateSubject.set(.single(state))
|
self.stateSubject.set(.single(state))
|
||||||
|
|
||||||
self.readySubject.set(true)
|
self.readySubject.set(true)
|
||||||
})
|
})
|
||||||
case let .chats(isGrayList):
|
case let .chats(isGrayList):
|
||||||
|
@ -791,7 +791,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
let errorText: String
|
let errorText: String
|
||||||
switch error {
|
switch error {
|
||||||
case .generic:
|
case .generic:
|
||||||
errorText = "The folder link has expired."
|
errorText = presentationData.strings.Chat_ErrorFolderLinkExpired
|
||||||
}
|
}
|
||||||
present(textAlertController(context: context, updatedPresentationData: updatedPresentationData, title: nil, text: errorText, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
|
present(textAlertController(context: context, updatedPresentationData: updatedPresentationData, title: nil, text: errorText, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
|
||||||
}))
|
}))
|
||||||
@ -877,7 +877,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
case .ok:
|
case .ok:
|
||||||
updateImpl?()
|
updateImpl?()
|
||||||
case let .replace(previousPeer):
|
case let .replace(previousPeer):
|
||||||
let text = "You currently boost **\(previousPeer.compactDisplayTitle)**. Do you want to boost **\(peer.compactDisplayTitle)** instead?"
|
let text = presentationData.strings.ChannelBoost_ReplaceBoost(previousPeer.compactDisplayTitle, peer.compactDisplayTitle).string
|
||||||
let controller = replaceBoostConfirmationController(context: context, fromPeer: previousPeer, toPeer: peer, text: text, commit: {
|
let controller = replaceBoostConfirmationController(context: context, fromPeer: previousPeer, toPeer: peer, text: text, commit: {
|
||||||
updateImpl?()
|
updateImpl?()
|
||||||
})
|
})
|
||||||
@ -895,16 +895,13 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
title = nil
|
title = nil
|
||||||
text = presentationData.strings.Login_UnknownError
|
text = presentationData.strings.Login_UnknownError
|
||||||
case let .floodWait(timeout):
|
case let .floodWait(timeout):
|
||||||
title = "Can't Boost Too Often"
|
title = presentationData.strings.ChannelBoost_Error_BoostTooOftenTitle
|
||||||
let valueText = timeIntervalString(strings: presentationData.strings, value: timeout, usage: .afterTime, preferLowerValue: false)
|
let valueText = timeIntervalString(strings: presentationData.strings, value: timeout, usage: .afterTime, preferLowerValue: false)
|
||||||
text = "You can change the channel you boost only once a day. Next time you can boost is in **\(valueText)**."
|
text = presentationData.strings.ChannelBoost_Error_BoostTooOftenText(valueText).string
|
||||||
dismiss = true
|
dismiss = true
|
||||||
case .peerBoostAlreadyActive:
|
|
||||||
title = "Already Boosted"
|
|
||||||
text = "You are already boosting this channel."
|
|
||||||
case .premiumRequired:
|
case .premiumRequired:
|
||||||
title = "Premium Needed"
|
title = presentationData.strings.ChannelBoost_Error_PremiumNeededTitle
|
||||||
text = "Only **Telegram Premium** subscribers can boost channels. Do you want to subscribe to **Telegram Premium**?"
|
text = presentationData.strings.ChannelBoost_Error_PremiumNeededText
|
||||||
actions = [
|
actions = [
|
||||||
TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}),
|
TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}),
|
||||||
TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Yes, action: {
|
TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Yes, action: {
|
||||||
@ -914,9 +911,11 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
})
|
})
|
||||||
]
|
]
|
||||||
case .giftedPremiumNotAllowed:
|
case .giftedPremiumNotAllowed:
|
||||||
title = "Can't Boost with Gifted Premium"
|
title = presentationData.strings.ChannelBoost_Error_GiftedPremiumNotAllowedTitle
|
||||||
text = "Because your **Telegram Premium** subscription was gifted to you, you can't use it to boost channels."
|
text = presentationData.strings.ChannelBoost_Error_GiftedPremiumNotAllowedText
|
||||||
dismiss = true
|
dismiss = true
|
||||||
|
case .peerBoostAlreadyActive:
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
let controller = textAlertController(sharedContext: context.sharedContext, title: title, text: text, actions: actions, parseMarkdown: true)
|
let controller = textAlertController(sharedContext: context.sharedContext, title: title, text: text, actions: actions, parseMarkdown: true)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user