mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Update localization
This commit is contained in:
parent
a340133bd9
commit
3a73b76f35
@ -1158,32 +1158,14 @@ private final class NotificationServiceHandler {
|
||||
}
|
||||
|
||||
let _ = messageId
|
||||
|
||||
/*if (peerId != 0 && messageId != 0 && parsedAttachment != nil && attachmentData != nil) {
|
||||
userInfo[@"peerId"] = @(peerId);
|
||||
userInfo[@"messageId.namespace"] = @(0);
|
||||
userInfo[@"messageId.id"] = @(messageId);
|
||||
|
||||
userInfo[@"media"] = [attachmentData base64EncodedStringWithOptions:0];
|
||||
|
||||
if (isExpandableMedia) {
|
||||
if ([categoryString isEqualToString:@"r"]) {
|
||||
_bestAttemptContent.categoryIdentifier = @"withReplyMedia";
|
||||
} else if ([categoryString isEqualToString:@"m"]) {
|
||||
_bestAttemptContent.categoryIdentifier = @"withMuteMedia";
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
/*if (accountInfos.accounts.count > 1) {
|
||||
if (_bestAttemptContent.title.length != 0 && account.peerName.length != 0) {
|
||||
_bestAttemptContent.title = [NSString stringWithFormat:@"%@ → %@", _bestAttemptContent.title, account.peerName];
|
||||
}
|
||||
}*/
|
||||
|
||||
if let storyId {
|
||||
content.category = "st"
|
||||
if content.category == "t" {
|
||||
content.category = "str"
|
||||
} else {
|
||||
content.category = "st"
|
||||
}
|
||||
action = .pollStories(peerId: peerId, content: content, storyId: storyId)
|
||||
} else {
|
||||
action = .poll(peerId: peerId, content: content, messageId: messageIdValue)
|
||||
|
@ -267,11 +267,11 @@
|
||||
"PUSH_MESSAGE_STORY" = "%1$@|shared a story with you";
|
||||
"PUSH_MESSAGE_STORY_MENTION" = "%1$@|mentioned you in a story";
|
||||
"PUSH_CHANNEL_MESSAGE_STORY" = "%1$@|shared a story";
|
||||
"PUSH_CHAT_MESSAGE_STORY" = "%2$@|%1$@ shared a story to the group";
|
||||
|
||||
"PUSH_REACT_HIDDEN" = "New reaction to your message";
|
||||
"PUSH_REACT_STORY" = "%1$@|%2$@ to your story";
|
||||
"PUSH_REACT_STORY_HIDDEN" = "New reaction to your story";
|
||||
"PUSH_CHAT_REACT_STORY" = "%2$@|%1$@ %3$@ to your story";
|
||||
|
||||
"LOCAL_MESSAGE_FWDS" = "%1$@ forwarded you %2$d messages";
|
||||
"LOCAL_CHANNEL_MESSAGE_FWDS" = "%1$@ posted %2$d forwarded messages";
|
||||
@ -11910,3 +11910,94 @@ Sorry for the inconvenience.";
|
||||
"Conversation.ViewEmojis" = "VIEW EMOJIS";
|
||||
|
||||
"MediaEditor.StickersTooMuch" = "Sorry, you've reached the maximum number of stickers in this set. Try a different one.";
|
||||
|
||||
"ChatList.ChannelsSection" = "Channels";
|
||||
"ChatList.Search.FilterChannels" = "Channels";
|
||||
"ChatList.Search.SectionRecommendedChannels" = "RECOMMENDED CHANNELS";
|
||||
"ChatList.Search.SectionLocalChannels" = "CHANNELS YOU JOINED";
|
||||
"ChatList.Search.SectionActionShowLess" = "Show Less";
|
||||
"ChatList.Search.SectionActionShowMore" = "Show More";
|
||||
"ChatList.Search.RecommendedChannelsEmpty.Title" = "No Channels Yet...";
|
||||
"ChatList.Search.RecommendedChannelsEmpty.Text" = "You are not currently subscribed to any channel.";
|
||||
|
||||
"Notifications.Reactions" = "Reactions";
|
||||
"Notifications.Reactions.SubtitleStories" = "Stories";
|
||||
"Notifications.Reactions.SubtitleMessages" = "Messages";
|
||||
|
||||
"Notifications.Stories.SettingsHeader" = "NOTIFY ME ABOUT...";
|
||||
"Notifications.Stories.GlobalSetting" = "New Stories";
|
||||
"Notifications.Stories.Important" = "Important Stories";
|
||||
"Notifications.Stories.DisplayName" = "Show Sender's Name";
|
||||
|
||||
"Notifications.Reactions.Title" = "Reactions";
|
||||
"Notifications.Reactions.SettingsHeader" = "NOTIFY ME ABOUT...";
|
||||
"Notifications.Reactions.SubtitleContacts" = "From My Contacts";
|
||||
"Notifications.Reactions.SubtitleEveryone" = "From Everyone";
|
||||
"Notifications.Reactions.ItemMessages" = "Reactions to my Messages";
|
||||
"Notifications.Reactions.ItemStories" = "Reactions to my Stories";
|
||||
"Notifications.Reactions.SheetTitleMessages" = "Notify about reactions to my messages from";
|
||||
"Notifications.Reactions.SheetTitleStories" = "Notify about reactions to my stories from";
|
||||
"Notifications.Reactions.SheetValueEveryone" = "Everyone";
|
||||
"Notifications.Reactions.SheetValueContacts" = "My Contacts";
|
||||
|
||||
"PeerInfo.AllowedReactions.MaxCountSectionTitle" = "MAXIMUM REACTIONS PER POST";
|
||||
"PeerInfo.AllowedReactions.MaxCountSectionFooter" = "Limit the number of different reactions that can be added to a post, including already published posts.";
|
||||
"PeerInfo.AllowedReactions.MaxCountValue_1" = "1 reaction";
|
||||
"PeerInfo.AllowedReactions.MaxCountValue_any" = "%d reactions";
|
||||
|
||||
"PeerInfo.PaneArchivedStories" = "Archived Posts";
|
||||
|
||||
"StoryList.ItemAction.Archive" = "Archive";
|
||||
"StoryList.ItemAction.Unarchive" = "Unarchive";
|
||||
"StoryList.ItemAction.Pin" = "Pin";
|
||||
"StoryList.ItemAction.Unpin" = "Unpin";
|
||||
"StoryList.ItemAction.Forward" = "Forward";
|
||||
"StoryList.ItemAction.Edit" = "Edit";
|
||||
"StoryList.ItemAction.Delete" = "Delete";
|
||||
"StoryList.ToastUnarchived.Text_1" = "Story unarchived.";
|
||||
"StoryList.ToastUnarchived.Text_any" = "%d stories unarchived.";
|
||||
"StoryList.ToastArchived.Text_1" = "Story archived.";
|
||||
"StoryList.ToastArchived.Text_any" = "%d stories archived.";
|
||||
"StoryList.ToastPinLimit.Text_1" = "You can't pin more than 1 post.";
|
||||
"StoryList.ToastPinLimit.Text_any" = "You can't pin more than %d posts.";
|
||||
"StoryList.ToastUnpinned.Text_1" = "Story unpinned.";
|
||||
"StoryList.ToastUnpinned.Text_any" = "%d stories unpinned.";
|
||||
"StoryList.ToastPinned.Title_1" = "Story pinned";
|
||||
"StoryList.ToastPinned.Title_any" = "%d stories pinned";
|
||||
"StoryList.ToastPinned.Text_1" = "Now it will always be shown on the top.";
|
||||
"StoryList.ToastPinned.Text_any" = "Now they will always be shown on the top.";
|
||||
"StoryList.DeleteConfirmation.Title_1" = "Delete 1 story?";
|
||||
"StoryList.DeleteConfirmation.Title_any" = "Delete %d stories?";
|
||||
"StoryList.DeleteConfirmation.Action" = "Delete";
|
||||
"StoryList.ActionPanel.Pin" = "Pin";
|
||||
"StoryList.ActionPanel.Unpin" = "Unpin";
|
||||
"StoryList.ActionPanel.Archive" = "Archive";
|
||||
"StoryList.ActionPanel.Unarchive" = "Unarchive";
|
||||
"StoryList.ActionPanel.Delete" = "Delete";
|
||||
|
||||
"Settings.MyProfile" = "My Profile";
|
||||
|
||||
"MyProfile.UsernameActionEdit" = "Edit Username";
|
||||
"MyProfile.UsernameActionCopy" = "Copy Username";
|
||||
"MyProfile.BioActionEdit" = "Edit Bio";
|
||||
"MyProfile.BioActionCopy" = "Copy Bio";
|
||||
"MyProfile.ToastBioCopied" = "Bio copied to clipboard.";
|
||||
"MyProfile.HoursActionEdit" = "Edit Hours";
|
||||
"MyProfile.HoursActionCopy" = "Copy Hours";
|
||||
"MyProfile.HoursActionRemove" = "Remove";
|
||||
"MyProfile.HoursRemoveConfirmation.Title" = "Are you sure you want to remove business hours?";
|
||||
"MyProfile.HoursRemoveConfirmation.Action" = "Remove";
|
||||
"MyProfile.ToastHoursCopied" = "Hours copied to clipboard.";
|
||||
"MyProfile.LocationActionOpen" = "Open in Maps";
|
||||
"MyProfile.LocationActionEdit" = "Edit Location";
|
||||
"MyProfile.LocationActionCopy" = "Copy Address";
|
||||
"MyProfile.LocationActionRemove" = "Remove";
|
||||
"MyProfile.LocationRemoveConfirmation.Title" = "Are you sure you want to remove location?";
|
||||
"MyProfile.LocationRemoveConfirmation.Action" = "Remove";
|
||||
"MyProfile.ToastLocationCopied" = "Location copied to clipboard.";
|
||||
"MyProfile.BirthdayActionEdit" = "Edit Birthday";
|
||||
"MyProfile.BirthdayActionCopy" = "Copy";
|
||||
"MyProfile.ToastBirthdayCopied" = "Birthday copied to clipboard.";
|
||||
"MyProfile.PhoneActionEdit" = "Change Number";
|
||||
"MyProfile.PhoneActionCopy" = "Copy Number";
|
||||
"MyProfile.ToastPhoneCopied" = "Birthday copied to clipboard.";
|
||||
|
@ -64,8 +64,7 @@ public enum ChatListSearchItemHeaderType {
|
||||
case .chats:
|
||||
return strings.Cache_ByPeerHeader
|
||||
case .channels:
|
||||
//TODO:localize
|
||||
return "Channels"
|
||||
return strings.ChatList_ChannelsSection
|
||||
case .chatTypes:
|
||||
return strings.ChatList_ChatTypesSection
|
||||
case .faq:
|
||||
|
@ -85,8 +85,7 @@ private final class ItemNode: ASDisplayNode {
|
||||
title = presentationData.strings.ChatList_Search_FilterChats
|
||||
icon = nil
|
||||
case .channels:
|
||||
//TODO:localize
|
||||
title = "Channels"
|
||||
title = presentationData.strings.ChatList_Search_FilterChannels
|
||||
icon = nil
|
||||
case .media:
|
||||
title = presentationData.strings.ChatList_Search_FilterMedia
|
||||
|
@ -238,11 +238,9 @@ private enum ChatListRecentEntry: Comparable, Identifiable {
|
||||
let header: ChatListSearchItemHeader?
|
||||
if case .channels = key {
|
||||
if case .recommendedChannels = section {
|
||||
//TODO:localize
|
||||
header = ChatListSearchItemHeader(type: .text("RECOMMENDED CHANNELS", 1), theme: theme, strings: strings)
|
||||
header = ChatListSearchItemHeader(type: .text(presentationData.strings.ChatList_Search_SectionRecommendedChannels, 1), theme: theme, strings: strings)
|
||||
} else {
|
||||
//TODO:localize
|
||||
header = ChatListSearchItemHeader(type: .text("CHANNELS YOU JOINED", 0), theme: theme, strings: strings, actionTitle: isChannelsTabExpanded ? "Show less" : "Show more", action: {
|
||||
header = ChatListSearchItemHeader(type: .text(presentationData.strings.ChatList_Search_SectionLocalChannels, 0), theme: theme, strings: strings, actionTitle: isChannelsTabExpanded ? presentationData.strings.ChatList_Search_SectionActionShowLess : presentationData.strings.ChatList_Search_SectionActionShowMore, action: {
|
||||
toggleChannelsTabExpanded()
|
||||
})
|
||||
}
|
||||
@ -1273,10 +1271,9 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
|
||||
self.emptyResultsAnimationNode.isHidden = true
|
||||
|
||||
if key == .channels {
|
||||
//TODO:localize
|
||||
let emptyRecentTitleNode = ImmediateTextNode()
|
||||
emptyRecentTitleNode.displaysAsynchronously = false
|
||||
emptyRecentTitleNode.attributedText = NSAttributedString(string: "No Channels Yet...", font: Font.semibold(17.0), textColor: self.presentationData.theme.list.freeTextColor)
|
||||
emptyRecentTitleNode.attributedText = NSAttributedString(string: presentationData.strings.ChatList_Search_RecommendedChannelsEmpty_Title, font: Font.semibold(17.0), textColor: self.presentationData.theme.list.freeTextColor)
|
||||
emptyRecentTitleNode.textAlignment = .center
|
||||
emptyRecentTitleNode.isHidden = true
|
||||
self.emptyRecentTitleNode = emptyRecentTitleNode
|
||||
@ -1286,7 +1283,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
|
||||
emptyRecentTextNode.maximumNumberOfLines = 0
|
||||
emptyRecentTextNode.textAlignment = .center
|
||||
emptyRecentTextNode.isHidden = true
|
||||
emptyRecentTextNode.attributedText = NSAttributedString(string: "You are not currently subscribed to any channel.", font: Font.regular(15.0), textColor: presentationData.theme.list.freeTextColor)
|
||||
emptyRecentTextNode.attributedText = NSAttributedString(string: presentationData.strings.ChatList_Search_RecommendedChannelsEmpty_Text, font: Font.regular(15.0), textColor: presentationData.theme.list.freeTextColor)
|
||||
self.emptyRecentTextNode = emptyRecentTextNode
|
||||
|
||||
let emptyRecentAnimationNode = DefaultAnimatedStickerNodeImpl()
|
||||
|
@ -579,7 +579,6 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn
|
||||
|
||||
entries.append(.stories(presentationData.theme, presentationData.strings.Notifications_Stories, !exceptions.stories.isEmpty ? presentationData.strings.Notifications_CategoryExceptions(Int32(exceptions.stories.peerIds.count)) : "", storiesValue))
|
||||
|
||||
//TODO:localize
|
||||
var reactionsValue: String = ""
|
||||
var hasReactionNotifications = false
|
||||
switch globalSettings.reactionSettings.messages {
|
||||
@ -590,7 +589,7 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn
|
||||
reactionsValue.append(", ")
|
||||
}
|
||||
hasReactionNotifications = true
|
||||
reactionsValue.append("Messages")
|
||||
reactionsValue.append(presentationData.strings.Notifications_Reactions_SubtitleMessages)
|
||||
}
|
||||
switch globalSettings.reactionSettings.stories {
|
||||
case .nobody:
|
||||
@ -600,9 +599,9 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn
|
||||
reactionsValue.append(", ")
|
||||
}
|
||||
hasReactionNotifications = true
|
||||
reactionsValue.append("Stories")
|
||||
reactionsValue.append(presentationData.strings.Notifications_Reactions_SubtitleStories)
|
||||
}
|
||||
entries.append(.reactions(presentationData.theme, "Reactions", reactionsValue, hasReactionNotifications ? "On" : "Off"))
|
||||
entries.append(.reactions(presentationData.theme, presentationData.strings.Notifications_Reactions, reactionsValue, hasReactionNotifications ? presentationData.strings.Notifications_On : presentationData.strings.Notifications_Off))
|
||||
|
||||
entries.append(.inAppHeader(presentationData.theme, presentationData.strings.Notifications_InAppNotifications.uppercased()))
|
||||
entries.append(.inAppSounds(presentationData.theme, presentationData.strings.Notifications_InAppNotificationsSounds, inAppSettings.playSounds))
|
||||
|
@ -344,8 +344,7 @@ private func notificationsPeerCategoryEntries(category: NotificationsPeerCategor
|
||||
}
|
||||
|
||||
if case .stories = category {
|
||||
//TODO:localize
|
||||
entries.append(.enableHeader("NOTIFY ME ABOUT..."))
|
||||
entries.append(.enableHeader(presentationData.strings.Notifications_Stories_SettingsHeader))
|
||||
|
||||
var allEnabled = false
|
||||
var importantEnabled = false
|
||||
@ -362,16 +361,16 @@ private func notificationsPeerCategoryEntries(category: NotificationsPeerCategor
|
||||
importantEnabled = true
|
||||
}
|
||||
|
||||
entries.append(.enable(presentationData.theme, "New Stories", allEnabled))
|
||||
entries.append(.enable(presentationData.theme, presentationData.strings.Notifications_Stories_GlobalSetting, allEnabled))
|
||||
if !allEnabled {
|
||||
entries.append(.enableImportant(presentationData.theme, "Important Stories", importantEnabled))
|
||||
entries.append(.enableImportant(presentationData.theme, presentationData.strings.Notifications_Stories_Important, importantEnabled))
|
||||
entries.append(.importantInfo(presentationData.theme, presentationData.strings.NotificationSettings_Stories_ShowImportantFooter))
|
||||
}
|
||||
|
||||
if notificationSettings.enabled || !notificationExceptions.isEmpty {
|
||||
entries.append(.optionsHeader(presentationData.theme, presentationData.strings.Notifications_Options.uppercased()))
|
||||
|
||||
entries.append(.previews(presentationData.theme, "Show Sender's Name", notificationSettings.storySettings.hideSender != .hide))
|
||||
entries.append(.previews(presentationData.theme, presentationData.strings.Notifications_Stories_DisplayName, notificationSettings.storySettings.hideSender != .hide))
|
||||
entries.append(.sound(presentationData.theme, presentationData.strings.Notifications_MessageNotificationsSound, localizedPeerNotificationSoundString(strings: presentationData.strings, notificationSoundList: notificationSoundList, sound: filteredGlobalSound(notificationSettings.storySettings.sound)), filteredGlobalSound(notificationSettings.storySettings.sound)))
|
||||
}
|
||||
} else {
|
||||
|
@ -206,8 +206,7 @@ private func reactionNotificationSettingsEntries(
|
||||
) -> [ReactionNotificationSettingsEntry] {
|
||||
var entries: [ReactionNotificationSettingsEntry] = []
|
||||
|
||||
//TODO:localize
|
||||
entries.append(.categoriesHeader("NOTIFY ME ABOUT..."))
|
||||
entries.append(.categoriesHeader(presentationData.strings.Notifications_Reactions_SettingsHeader))
|
||||
|
||||
let messagesText: String?
|
||||
let messagesValue: Bool
|
||||
@ -216,10 +215,10 @@ private func reactionNotificationSettingsEntries(
|
||||
messagesText = nil
|
||||
messagesValue = false
|
||||
case .contacts:
|
||||
messagesText = "From My Contacts"
|
||||
messagesText = presentationData.strings.Notifications_Reactions_SubtitleContacts
|
||||
messagesValue = true
|
||||
case .everyone:
|
||||
messagesText = "From Everyone"
|
||||
messagesText = presentationData.strings.Notifications_Reactions_SubtitleEveryone
|
||||
messagesValue = true
|
||||
}
|
||||
|
||||
@ -230,21 +229,20 @@ private func reactionNotificationSettingsEntries(
|
||||
storiesText = nil
|
||||
storiesValue = false
|
||||
case .contacts:
|
||||
storiesText = "From My Contacts"
|
||||
storiesText = presentationData.strings.Notifications_Reactions_SubtitleContacts
|
||||
storiesValue = true
|
||||
case .everyone:
|
||||
storiesText = "From Everyone"
|
||||
storiesText = presentationData.strings.Notifications_Reactions_SubtitleEveryone
|
||||
storiesValue = true
|
||||
}
|
||||
|
||||
entries.append(.messages(title: "Reactions to my Messages", text: messagesText, value: messagesValue))
|
||||
entries.append(.stories(title: "Reactions to my Stories", text: storiesText, value: storiesValue))
|
||||
entries.append(.messages(title: presentationData.strings.Notifications_Reactions_ItemMessages, text: messagesText, value: messagesValue))
|
||||
entries.append(.stories(title: presentationData.strings.Notifications_Reactions_ItemStories, text: storiesText, value: storiesValue))
|
||||
|
||||
if messagesValue || storiesValue {
|
||||
entries.append(.optionsHeader(presentationData.strings.Notifications_Options.uppercased()))
|
||||
|
||||
//TODO:localize
|
||||
entries.append(.previews("Show Sender's Name", globalSettings.reactionSettings.hideSender != .hide))
|
||||
entries.append(.previews(presentationData.strings.Notifications_Stories_DisplayName, globalSettings.reactionSettings.hideSender != .hide))
|
||||
entries.append(.sound(presentationData.strings.Notifications_MessageNotificationsSound, localizedPeerNotificationSoundString(strings: presentationData.strings, notificationSoundList: notificationSoundList, sound: filteredGlobalSound(globalSettings.reactionSettings.sound)), filteredGlobalSound(globalSettings.reactionSettings.sound)))
|
||||
}
|
||||
|
||||
@ -274,19 +272,19 @@ public func reactionNotificationSettingsController(
|
||||
let _ = updateState
|
||||
|
||||
let openCategory: (Bool) -> Void = { isMessages in
|
||||
//TODO:localize
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
||||
let text: String
|
||||
if isMessages {
|
||||
text = "Notify about reactions to my messages from"
|
||||
text = presentationData.strings.Notifications_Reactions_SheetTitleMessages
|
||||
} else {
|
||||
text = "Notify about reactions to my stories from"
|
||||
text = presentationData.strings.Notifications_Reactions_SheetTitleStories
|
||||
}
|
||||
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||
actionSheet.setItemGroups([ActionSheetItemGroup(items: [
|
||||
ActionSheetTextItem(title: text),
|
||||
ActionSheetButtonItem(title: "Everyone", color: .accent, action: { [weak actionSheet] in
|
||||
ActionSheetButtonItem(title: presentationData.strings.Notifications_Reactions_SheetValueEveryone, color: .accent, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
|
||||
let _ = updateGlobalNotificationSettingsInteractively(postbox: context.account.postbox, { settings in
|
||||
@ -299,7 +297,7 @@ public func reactionNotificationSettingsController(
|
||||
return settings
|
||||
}).start()
|
||||
}),
|
||||
ActionSheetButtonItem(title: "My Contacts", color: .accent, action: { [weak actionSheet] in
|
||||
ActionSheetButtonItem(title: presentationData.strings.Notifications_Reactions_SheetValueContacts, color: .accent, action: { [weak actionSheet] in
|
||||
actionSheet?.dismissAnimated()
|
||||
|
||||
let _ = updateGlobalNotificationSettingsInteractively(postbox: context.account.postbox, { settings in
|
||||
@ -398,8 +396,7 @@ public func reactionNotificationSettingsController(
|
||||
leftNavigationButton = nil
|
||||
rightNavigationButton = nil
|
||||
|
||||
//TODO:localize
|
||||
let title: String = "Reactions"
|
||||
let title: String = presentationData.strings.Notifications_Reactions_Title
|
||||
|
||||
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
|
||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: entries, style: .blocks)
|
||||
|
@ -797,20 +797,14 @@ final class PeerAllowedReactionsScreenComponent: Component {
|
||||
let reactionCountValueList = (1 ... 11).map { i -> String in
|
||||
return "\(i)"
|
||||
}
|
||||
//TODO:localize
|
||||
let sliderTitle: String
|
||||
if self.allowedReactionCount == 1 {
|
||||
sliderTitle = "1 reaction"
|
||||
} else {
|
||||
sliderTitle = "\(self.allowedReactionCount) reactions"
|
||||
}
|
||||
let sliderTitle: String = environment.strings.PeerInfo_AllowedReactions_MaxCountValue(Int32(self.allowedReactionCount))
|
||||
let reactionCountSectionSize = reactionCountSection.update(
|
||||
transition: transition,
|
||||
component: AnyComponent(ListSectionComponent(
|
||||
theme: environment.theme,
|
||||
header: AnyComponent(MultilineTextComponent(
|
||||
text: .plain(NSAttributedString(
|
||||
string: "MAXIMUM REACTIONS PER POST",
|
||||
string: environment.strings.PeerInfo_AllowedReactions_MaxCountSectionTitle,
|
||||
font: Font.regular(13.0),
|
||||
textColor: environment.theme.list.freeTextColor
|
||||
)),
|
||||
@ -818,7 +812,7 @@ final class PeerAllowedReactionsScreenComponent: Component {
|
||||
)),
|
||||
footer: AnyComponent(MultilineTextComponent(
|
||||
text: .plain(NSAttributedString(
|
||||
string: "Limit the number of different reactions that can be added to a post, including already published posts.",
|
||||
string: environment.strings.PeerInfo_AllowedReactions_MaxCountSectionFooter,
|
||||
font: Font.regular(13.0),
|
||||
textColor: environment.theme.list.freeTextColor
|
||||
)),
|
||||
|
@ -58,17 +58,6 @@ final class PeerInfoPaneTabsContainerPaneNode: ASDisplayNode {
|
||||
self.addSubnode(self.buttonNode)
|
||||
|
||||
self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
|
||||
/*self.buttonNode.highligthedChanged = { [weak self] highlighted in
|
||||
if let strongSelf = self {
|
||||
if highlighted && !strongSelf.isSelected {
|
||||
strongSelf.titleNode.layer.removeAnimation(forKey: "opacity")
|
||||
strongSelf.titleNode.alpha = 0.4
|
||||
} else {
|
||||
strongSelf.titleNode.alpha = 1.0
|
||||
strongSelf.titleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@objc private func buttonPressed() {
|
||||
@ -1033,7 +1022,6 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, ASGestureRecognizerDelegat
|
||||
if let availablePanes = data?.availablePanes, let currentPaneKey = strongSelf.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey), let paneIndex = availablePanes.firstIndex(of: key), abs(paneIndex - currentIndex) <= 1 {
|
||||
} else {
|
||||
if let pane = strongSelf.currentPanes.removeValue(forKey: key) {
|
||||
//print("remove \(key)")
|
||||
pane.node.removeFromSupernode()
|
||||
}
|
||||
}
|
||||
@ -1097,8 +1085,7 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, ASGestureRecognizerDelegat
|
||||
case .stories:
|
||||
title = presentationData.strings.PeerInfo_PaneStories
|
||||
case .storyArchive:
|
||||
//TODO:localize
|
||||
title = "Archived Posts"
|
||||
title = presentationData.strings.PeerInfo_PaneArchivedStories
|
||||
case .media:
|
||||
title = presentationData.strings.PeerInfo_PaneMedia
|
||||
case .files:
|
||||
|
@ -874,8 +874,7 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p
|
||||
}))
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 0, text: "My Profile", icon: PresentationResourcesSettings.myProfile, action: {
|
||||
items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 0, text: presentationData.strings.Settings_MyProfile, icon: PresentationResourcesSettings.myProfile, action: {
|
||||
interaction.openSettings(.profile)
|
||||
}))
|
||||
|
||||
@ -6940,14 +6939,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
UIPasteboard.general.string = "@\(username)"
|
||||
|
||||
//TODO:localize
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Username copied"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.Conversation_UsernameCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if self.isMyProfile {
|
||||
items.append(.action(ContextMenuActionItem(text: "Edit Username", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_UsernameActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -6957,8 +6955,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
})))
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy Username", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_UsernameActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
@ -6997,15 +6994,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
UIPasteboard.general.string = bioText
|
||||
|
||||
//TODO:localize
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Bio copied"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastBioCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if self.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Edit Bio", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BioActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7026,8 +7021,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
})))
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy Bio", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BioActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
@ -7062,15 +7056,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
UIPasteboard.general.string = businessHoursTextToCopy(businessHours: businessHours, presentationData: self.presentationData, displayLocalTimezone: false)
|
||||
|
||||
//TODO:localize
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Working hours copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastHoursCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if self.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Edit Hours", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7081,26 +7073,29 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
})))
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy Hours", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
})))
|
||||
|
||||
if self.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionRemove, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _
|
||||
in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
|
||||
var subItems: [ContextMenuItem] = []
|
||||
let noAction: ((ContextMenuActionItem.Action) -> Void)? = nil
|
||||
subItems.append(.action(ContextMenuActionItem(
|
||||
text: "Are you sure you want to remove business hours?",
|
||||
text: self.presentationData.strings.MyProfile_HoursRemoveConfirmation_Title,
|
||||
textLayout: .multiline,
|
||||
textFont: .small,
|
||||
icon: { _ in nil },
|
||||
action: noAction
|
||||
)))
|
||||
subItems.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in
|
||||
subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursRemoveConfirmation_Action, textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7141,15 +7136,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
UIPasteboard.general.string = businessLocation.address
|
||||
|
||||
//TODO:localize
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Working hours copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastLocationCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if businessLocation.coordinates != nil {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Open in Maps", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Editor/LocationSmall"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionOpen, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Editor/LocationSmall"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss(completion: {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7160,8 +7153,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
|
||||
if !businessLocation.address.isEmpty {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy Address", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
@ -7169,8 +7161,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
|
||||
if self.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Edit Location", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7180,18 +7171,21 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
}
|
||||
})))
|
||||
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionRemove, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
|
||||
var subItems: [ContextMenuItem] = []
|
||||
let noAction: ((ContextMenuActionItem.Action) -> Void)? = nil
|
||||
subItems.append(.action(ContextMenuActionItem(
|
||||
text: "Are you sure you want to remove location?",
|
||||
text: self.presentationData.strings.MyProfile_LocationRemoveConfirmation_Title,
|
||||
textLayout: .multiline,
|
||||
textFont: .small,
|
||||
icon: { _ in nil },
|
||||
action: noAction
|
||||
)))
|
||||
subItems.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in
|
||||
subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationRemoveConfirmation_Action, textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7235,15 +7229,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
|
||||
UIPasteboard.general.string = text
|
||||
|
||||
//TODO:localize
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Birthday copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastBirthdayCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if self.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Edit Birthday", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BirthdayActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7255,8 +7247,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
})))
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BirthdayActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
@ -7343,8 +7334,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
if strongSelf.isMyProfile {
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Change Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss {
|
||||
guard let self else {
|
||||
return
|
||||
@ -7378,8 +7368,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
} else {
|
||||
isAnonymousNumber = true
|
||||
}
|
||||
//TODO:localize
|
||||
items.append(.action(ContextMenuActionItem(text: "Copy Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
@ -7398,9 +7387,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
||||
} else {
|
||||
isAnonymousNumber = true
|
||||
}
|
||||
//TODO:localize
|
||||
items.append(
|
||||
.action(ContextMenuActionItem(text: "Copy Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
|
||||
c.dismiss {
|
||||
copyAction()
|
||||
}
|
||||
|
@ -1798,10 +1798,8 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
|
||||
var items: [ContextMenuItem] = []
|
||||
|
||||
//TODO:localize
|
||||
|
||||
if canManage {
|
||||
items.append(.action(ContextMenuActionItem(text: !self.isArchive ? "Archive" : "Unarchive", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: self.isArchive ? "Chat/Context Menu/Archive" : "Chat/Context Menu/Unarchive"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in
|
||||
items.append(.action(ContextMenuActionItem(text: !self.isArchive ? self.presentationData.strings.StoryList_ItemAction_Archive : self.presentationData.strings.StoryList_ItemAction_Unarchive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: self.isArchive ? "Chat/Context Menu/Archive" : "Chat/Context Menu/Unarchive"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in
|
||||
guard let self else {
|
||||
f(.default)
|
||||
return
|
||||
@ -1814,12 +1812,12 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
}
|
||||
|
||||
let _ = self.context.engine.messages.updateStoriesArePinned(peerId: self.peerId, ids: [item.id: item], isPinned: self.isArchive ? true : false).startStandalone()
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .actionSucceeded(title: nil, text: self.isArchive ? "Story unarchived." : "Story archived.", cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.parentController?.present(UndoOverlayController(presentationData: self.presentationData, content: .actionSucceeded(title: nil, text: self.isArchive ? self.presentationData.strings.StoryList_ToastUnarchived_Text(1) : self.presentationData.strings.StoryList_ToastArchived_Text(1), cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
})))
|
||||
|
||||
if !self.isArchive {
|
||||
let isPinned = self.pinnedIds.contains(item.id)
|
||||
items.append(.action(ContextMenuActionItem(text: isPinned ? "Unpin" : "Pin", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin" : "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { [weak self, weak itemLayer] _, f in
|
||||
items.append(.action(ContextMenuActionItem(text: isPinned ? self.presentationData.strings.StoryList_ItemAction_Unpin : self.presentationData.strings.StoryList_ItemAction_Pin, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin" : "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { [weak self, weak itemLayer] _, f in
|
||||
itemLayer?.isHidden = false
|
||||
guard let self else {
|
||||
f(.default)
|
||||
@ -1830,7 +1828,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
f(.default)
|
||||
|
||||
let presentationData = self.presentationData
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "You can't pin more than 3 posts.", timeout: nil, customUndoText: nil), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: presentationData.strings.StoryList_ToastPinLimit_Text(Int32(3)), timeout: nil, customUndoText: nil), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
|
||||
return
|
||||
}
|
||||
@ -1845,23 +1843,22 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
}
|
||||
let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone()
|
||||
|
||||
//TODO:localize
|
||||
let presentationData = self.presentationData
|
||||
|
||||
let toastTitle: String?
|
||||
let toastText: String
|
||||
if isPinned {
|
||||
toastTitle = nil
|
||||
toastText = "Story unpinned."
|
||||
toastText = presentationData.strings.StoryList_ToastUnpinned_Text(1)
|
||||
} else {
|
||||
toastTitle = "Story pinned"
|
||||
toastText = "Now it will always be shown on the top."
|
||||
toastTitle = presentationData.strings.StoryList_ToastPinned_Title(1)
|
||||
toastText = presentationData.strings.StoryList_ToastPinned_Text(1)
|
||||
}
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: isPinned ? "anim_toastunpin" : "anim_toastpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
})))
|
||||
}
|
||||
|
||||
/*items.append(.action(ContextMenuActionItem(text: "Edit", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
/*items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Edit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss(completion: {
|
||||
guard let self else {
|
||||
return
|
||||
@ -1874,7 +1871,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
}
|
||||
|
||||
if !item.isForwardingDisabled, case .everyone = item.privacy?.base {
|
||||
items.append(.action(ContextMenuActionItem(text: "Forward", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Forward, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss(completion: {
|
||||
guard let self else {
|
||||
return
|
||||
@ -1916,7 +1913,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
}
|
||||
|
||||
if canManage {
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in
|
||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Delete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in
|
||||
c.dismiss(completion: {
|
||||
guard let self else {
|
||||
return
|
||||
@ -2414,18 +2411,12 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
controller?.dismissAnimated()
|
||||
}
|
||||
|
||||
//TODO:localize
|
||||
let title: String
|
||||
if ids.count == 1 {
|
||||
title = "Delete 1 story?"
|
||||
} else {
|
||||
title = "Delete \(ids.count) stories?"
|
||||
}
|
||||
let title: String = presentationData.strings.StoryList_DeleteConfirmation_Title(Int32(ids.count))
|
||||
|
||||
controller.setItemGroups([
|
||||
ActionSheetItemGroup(items: [
|
||||
ActionSheetTextItem(title: title),
|
||||
ActionSheetButtonItem(title: "Delete", color: .destructive, action: { [weak self] in
|
||||
ActionSheetButtonItem(title: presentationData.strings.StoryList_DeleteConfirmation_Action, color: .destructive, action: { [weak self] in
|
||||
dismissAction()
|
||||
|
||||
guard let self else {
|
||||
@ -2465,7 +2456,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
selectionItems.append(BottomActionsPanelComponent.Item(
|
||||
id: "pin-unpin",
|
||||
color: .accent,
|
||||
title: actionIsPin ? "Pin" : "Unpin",
|
||||
title: actionIsPin ? presentationData.strings.StoryList_ActionPanel_Pin : presentationData.strings.StoryList_ActionPanel_Unpin,
|
||||
isEnabled: !selectedIds.isEmpty,
|
||||
action: { [weak self] in
|
||||
guard let self, let selectedIds = self.itemInteraction.selectedIds else {
|
||||
@ -2479,23 +2470,16 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
if updatedPinnedIds.count > 3 {
|
||||
let presentationData = self.presentationData
|
||||
let animationBackgroundColor = presentationData.theme.rootController.tabBar.backgroundColor
|
||||
let toastText = "You can't pin more than 3 posts."
|
||||
let toastText = presentationData.strings.StoryList_ToastPinLimit_Text(3)
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_infotip", scale: 1.0, colors: ["info1.info1.stroke": animationBackgroundColor, "info2.info2.Fill": animationBackgroundColor], title: nil, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
} else {
|
||||
let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone()
|
||||
|
||||
//TODO:localize
|
||||
let presentationData = self.presentationData
|
||||
|
||||
let toastTitle: String
|
||||
let toastText: String
|
||||
if selectedIds.count == 1 {
|
||||
toastTitle = "Story Pinned"
|
||||
toastText = "Now it will always be shown on the top."
|
||||
} else {
|
||||
toastTitle = "Stories Pinned"
|
||||
toastText = "Now they will always be shown on the top."
|
||||
}
|
||||
let toastTitle = presentationData.strings.StoryList_ToastPinned_Title(Int32(selectedIds.count))
|
||||
let toastText = presentationData.strings.StoryList_ToastPinned_Text(Int32(selectedIds.count))
|
||||
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_toastpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
|
||||
if let parentController = self.parentController as? PeerInfoScreen {
|
||||
@ -2509,18 +2493,11 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
}
|
||||
let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone()
|
||||
|
||||
//TODO:localize
|
||||
let presentationData = self.presentationData
|
||||
|
||||
let toastTitle: String?
|
||||
let toastText: String
|
||||
if selectedIds.count == 1 {
|
||||
toastTitle = nil
|
||||
toastText = "Story unpinned."
|
||||
} else {
|
||||
toastTitle = nil
|
||||
toastText = "Stories unpinned."
|
||||
}
|
||||
let toastTitle: String? = nil
|
||||
let toastText: String = presentationData.strings.StoryList_ToastUnpinned_Text(Int32(selectedIds.count))
|
||||
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_toastunpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
|
||||
if let parentController = self.parentController as? PeerInfoScreen {
|
||||
@ -2532,7 +2509,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
selectionItems.append(BottomActionsPanelComponent.Item(
|
||||
id: "archive",
|
||||
color: .accent,
|
||||
title: self.isArchive ? "Unarchive" : "Archive",
|
||||
title: self.isArchive ? presentationData.strings.StoryList_ActionPanel_Unarchive : presentationData.strings.StoryList_ActionPanel_Archive,
|
||||
isEnabled: !selectedIds.isEmpty,
|
||||
action: { [weak self] in
|
||||
guard let self, let _ = self.itemInteraction.selectedIds else {
|
||||
@ -2549,17 +2526,9 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
|
||||
let text: String
|
||||
if self.isArchive {
|
||||
if items.count == 1 {
|
||||
text = "Story unarchived."
|
||||
} else {
|
||||
text = "Stories unarchived."
|
||||
}
|
||||
text = presentationData.strings.StoryList_ToastUnarchived_Text(Int32(items.count))
|
||||
} else {
|
||||
if items.count == 1 {
|
||||
text = "Story archived."
|
||||
} else {
|
||||
text = "Stories archived."
|
||||
}
|
||||
text = presentationData.strings.StoryList_ToastArchived_Text(Int32(items.count))
|
||||
}
|
||||
self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .actionSucceeded(title: nil, text: text, cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
|
||||
}
|
||||
@ -2567,7 +2536,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr
|
||||
selectionItems.append(BottomActionsPanelComponent.Item(
|
||||
id: "delete",
|
||||
color: .destructive,
|
||||
title: "Delete",
|
||||
title: presentationData.strings.StoryList_ActionPanel_Delete,
|
||||
isEnabled: !selectedIds.isEmpty,
|
||||
action: { [weak self] in
|
||||
guard let self, let selectedIds = self.itemInteraction.selectedIds else {
|
||||
|
@ -2565,11 +2565,11 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
|
||||
return settings.displayNameOnLockscreen
|
||||
}
|
||||
|> deliverOnMainQueue).start(next: { displayNames in
|
||||
self.registerForNotifications(replyString: presentationData.strings.Notification_Reply, messagePlaceholderString: presentationData.strings.Conversation_InputTextPlaceholder, hiddenContentString: presentationData.strings.Watch_MessageView_Title, hiddenReactionContentString: presentationData.strings.Notification_LockScreenReactionPlaceholder, hiddenStoryContentString: presentationData.strings.Notification_LockScreenStoryPlaceholder, includeNames: displayNames, authorize: authorize, completion: completion)
|
||||
self.registerForNotifications(replyString: presentationData.strings.Notification_Reply, messagePlaceholderString: presentationData.strings.Conversation_InputTextPlaceholder, hiddenContentString: presentationData.strings.Watch_MessageView_Title, hiddenReactionContentString: presentationData.strings.Notification_LockScreenReactionPlaceholder, hiddenStoryContentString: presentationData.strings.Notification_LockScreenStoryPlaceholder, hiddenStoryReactionContentString: presentationData.strings.PUSH_REACT_STORY_HIDDEN, includeNames: displayNames, authorize: authorize, completion: completion)
|
||||
})
|
||||
}
|
||||
|
||||
private func registerForNotifications(replyString: String, messagePlaceholderString: String, hiddenContentString: String, hiddenReactionContentString: String, hiddenStoryContentString: String, includeNames: Bool, authorize: Bool = true, completion: @escaping (Bool) -> Void = { _ in }) {
|
||||
private func registerForNotifications(replyString: String, messagePlaceholderString: String, hiddenContentString: String, hiddenReactionContentString: String, hiddenStoryContentString: String, hiddenStoryReactionContentString: String, includeNames: Bool, authorize: Bool = true, completion: @escaping (Bool) -> Void = { _ in }) {
|
||||
let notificationCenter = UNUserNotificationCenter.current()
|
||||
Logger.shared.log("App \(self.episodeId)", "register for notifications: get settings (authorize: \(authorize))")
|
||||
notificationCenter.getNotificationSettings(completionHandler: { settings in
|
||||
@ -2600,6 +2600,7 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
|
||||
let channelMessageCategory: UNNotificationCategory
|
||||
let reactionMessageCategory: UNNotificationCategory
|
||||
let storyCategory: UNNotificationCategory
|
||||
let storyReactionCategory: UNNotificationCategory
|
||||
|
||||
var options: UNNotificationCategoryOptions = []
|
||||
if includeNames {
|
||||
@ -2620,6 +2621,7 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
|
||||
channelMessageCategory = UNNotificationCategory(identifier: "c", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenContentString, options: options)
|
||||
reactionMessageCategory = UNNotificationCategory(identifier: "t", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenReactionContentString, options: options)
|
||||
storyCategory = UNNotificationCategory(identifier: "st", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenStoryContentString, options: options)
|
||||
storyReactionCategory = UNNotificationCategory(identifier: "str", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: hiddenStoryReactionContentString, options: options)
|
||||
|
||||
UNUserNotificationCenter.current().setNotificationCategories([
|
||||
unknownMessageCategory,
|
||||
@ -2629,7 +2631,8 @@ private func extractAccountManagerState(records: AccountRecordsView<TelegramAcco
|
||||
reactionMessageCategory,
|
||||
groupRepliableMessageCategory,
|
||||
groupRepliableMediaMessageCategory,
|
||||
storyCategory
|
||||
storyCategory,
|
||||
storyReactionCategory
|
||||
])
|
||||
|
||||
Logger.shared.log("App \(self.episodeId)", "register for notifications: invoke registerForRemoteNotifications")
|
||||
|
Loading…
x
Reference in New Issue
Block a user