From 1adee04eae5e474af482d0c756f467fd32db0316 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 18 Jul 2023 13:02:32 +0400 Subject: [PATCH 1/6] Stories --- submodules/Display/Source/TextNode.swift | 2 +- submodules/MediaPlayer/Sources/MediaPlayer.swift | 1 - .../Sources/StoryItemContentComponent.swift | 14 ++++++++++++++ .../Sources/StoryItemSetContainerComponent.swift | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/submodules/Display/Source/TextNode.swift b/submodules/Display/Source/TextNode.swift index 0d4f74c74e..d9e047b7dc 100644 --- a/submodules/Display/Source/TextNode.swift +++ b/submodules/Display/Source/TextNode.swift @@ -1274,7 +1274,7 @@ open class TextNode: ASDisplayNode { coreTextLine = originalLine } } else { - coreTextLine = CTLineCreateTruncatedLine(originalLine, Double(lineConstrainedSize.width), truncationType, truncationToken) ?? truncationToken + coreTextLine = CTLineCreateTruncatedLine(originalLine, max(1.0, Double(lineConstrainedSize.width) - truncationTokenWidth), truncationType, truncationToken) ?? truncationToken let runs = (CTLineGetGlyphRuns(coreTextLine) as [AnyObject]) as! [CTRun] for run in runs { let runAttributes: NSDictionary = CTRunGetAttributes(run) diff --git a/submodules/MediaPlayer/Sources/MediaPlayer.swift b/submodules/MediaPlayer/Sources/MediaPlayer.swift index acaf62405f..67e142d587 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayer.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayer.swift @@ -1022,7 +1022,6 @@ private final class MediaPlayerContext { if isPaused && self.fadeTimer != nil { playbackStatus = .paused } else if reportRate.isZero { - //playbackStatus = .buffering(initial: false, whilePlaying: true) playbackStatus = .playing statusTimestamp = 0.0 } else { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 57427331e6..714d4dfc4c 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -82,6 +82,8 @@ final class StoryItemContentComponent: Component { private var currentProgressTimerValue: Double = 0.0 private var videoProgressDisposable: Disposable? + private var ignoreBufferingTimestamp: Double = 0.0 + private var markedAsSeen: Bool = false private var contentLoaded: Bool = false @@ -252,6 +254,7 @@ final class StoryItemContentComponent: Component { override func leaveAmbientMode() { if let videoNode = self.videoNode { + self.ignoreBufferingTimestamp = CFAbsoluteTimeGetCurrent() videoNode.setSoundEnabled(true) videoNode.continueWithOverridingAmbientMode(isAmbient: false) } @@ -259,6 +262,7 @@ final class StoryItemContentComponent: Component { override func enterAmbientMode(ambient: Bool) { if let videoNode = self.videoNode { + self.ignoreBufferingTimestamp = CFAbsoluteTimeGetCurrent() if ambient { videoNode.continueWithOverridingAmbientMode(isAmbient: true) } else { @@ -369,6 +373,16 @@ final class StoryItemContentComponent: Component { isBuffering = true } + if isBuffering { + if CFAbsoluteTimeGetCurrent() - self.ignoreBufferingTimestamp < 0.3 { + isBuffering = false + } else { + self.ignoreBufferingTimestamp = 0.0 + } + } else { + self.ignoreBufferingTimestamp = 0.0 + } + if case .buffering(true, _, _, _) = videoPlaybackStatus.status { timestampAndDuration = (nil, effectiveDuration) } else if effectiveDuration > 0.0 { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index e9e9718a4a..6de5f65225 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -3886,7 +3886,7 @@ public final class StoryItemSetContainerComponent: Component { self.requestSave() }))) - if component.slice.item.storyItem.isPublic && (component.slice.peer.addressName != nil || !component.slice.peer._asPeer().usernames.isEmpty) && component.slice.item.storyItem.expirationTimestamp > Int32(Date().timeIntervalSince1970) { + if component.slice.item.storyItem.isPublic && (component.slice.peer.addressName != nil || !component.slice.peer._asPeer().usernames.isEmpty) && (component.slice.item.storyItem.expirationTimestamp > Int32(Date().timeIntervalSince1970) || component.slice.item.storyItem.isPinned) { items.append(.action(ContextMenuActionItem(text: component.strings.Story_Context_CopyLink, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Link"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, a in From 63edb12edf74b4f9aa17a745d0b98eaf99be9eeb Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 18 Jul 2023 17:46:39 +0400 Subject: [PATCH 2/6] Fix more --- submodules/Display/Source/TextNode.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/submodules/Display/Source/TextNode.swift b/submodules/Display/Source/TextNode.swift index d9e047b7dc..3a3abedbce 100644 --- a/submodules/Display/Source/TextNode.swift +++ b/submodules/Display/Source/TextNode.swift @@ -1260,7 +1260,12 @@ open class TextNode: ASDisplayNode { var effectiveLineRange = brokenLineRange var additionalTrailingLine: (CTLine, Double)? - if lineRange.length == 0 || (CTLineGetTypographicBounds(originalLine, nil, nil, nil) - CTLineGetTrailingWhitespaceWidth(originalLine) + truncationTokenWidth) < Double(lineConstrainedSize.width) { + var measureFitWidth = CTLineGetTypographicBounds(originalLine, nil, nil, nil) - CTLineGetTrailingWhitespaceWidth(originalLine) + if customTruncationToken != nil { + measureFitWidth += truncationTokenWidth + } + + if lineRange.length == 0 || measureFitWidth < Double(lineConstrainedSize.width) { if didClipLinebreak { if lineRange.length == 0 { coreTextLine = CTLineCreateWithAttributedString(NSAttributedString()) From 4dad31f6eb60a411e1922611956a4189aaf1c7a0 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 18 Jul 2023 16:47:15 +0200 Subject: [PATCH 3/6] Fix colors --- .../ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift index 2b5efec6ca..a94bb8f429 100644 --- a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift +++ b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift @@ -2023,7 +2023,7 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer { id: .contacts, title: presentationData.strings.Story_Privacy_CategoryContacts, icon: "Chat List/Tabs/IconContacts", - iconColor: .yellow, + iconColor: .violet, actionTitle: contactsSubtitle )) @@ -2063,7 +2063,7 @@ public class ShareWithPeersScreen: ViewControllerComponentContainer { id: .selectedContacts, title: presentationData.strings.Story_Privacy_CategorySelectedContacts, icon: "Chat List/Filters/Group", - iconColor: .violet, + iconColor: .yellow, actionTitle: selectedContactsSubtitle )) From 4375a373c0d5ab674842aeafd5223d95bb9a3edc Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 18 Jul 2023 18:29:29 +0200 Subject: [PATCH 4/6] Various fixes --- submodules/ChatListUI/Sources/ChatListController.swift | 6 ++++++ .../Sources/StoryItemSetContainerComponent.swift | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index cd196c2e37..53b9c56dc3 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -2540,6 +2540,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController return nil } + private weak var storyCameraTooltip: TooltipScreen? fileprivate func openStoryCamera(fromList: Bool) { var reachedCountLimit = false var premiumNeeded = false @@ -2575,6 +2576,10 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController } if reachedCountLimit || premiumNeeded || hasActiveCall || hasActiveGroupCall { + if let storyCameraTooltip = self.storyCameraTooltip { + self.storyCameraTooltip = nil + storyCameraTooltip.dismiss() + } if let componentView = self.chatListHeaderView() { var sourceFrame: CGRect? if fromList { @@ -2626,6 +2631,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController } } ) + self.storyCameraTooltip = tooltipController self.present(tooltipController, in: .window(.root)) } } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 6de5f65225..914f23e282 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -2468,7 +2468,7 @@ public final class StoryItemSetContainerComponent: Component { privacyIcon = ComponentView() self.privacyIcon = privacyIcon } - let closeFriendIconSize = privacyIcon.update( + let privacyIconSize = privacyIcon.update( transition: privacyIconTransition, component: AnyComponent(PlainButtonComponent( content: AnyComponent( @@ -2504,7 +2504,7 @@ public final class StoryItemSetContainerComponent: Component { let tooltipScreen = TooltipScreen( account: component.context.account, sharedContext: component.context.sharedContext, - text: .plain(text: tooltipText), style: .default, location: TooltipScreen.Location.point(closeFriendIconView.convert(closeFriendIconView.bounds, to: self).offsetBy(dx: 1.0, dy: 6.0), .top), displayDuration: .infinite, shouldDismissOnTouch: { _, _ in + text: .plain(text: tooltipText), style: .default, location: TooltipScreen.Location.point(closeFriendIconView.convert(closeFriendIconView.bounds, to: nil).offsetBy(dx: 1.0, dy: 6.0), .top), displayDuration: .infinite, shouldDismissOnTouch: { _, _ in return .dismiss(consume: true) } ) @@ -2524,7 +2524,7 @@ public final class StoryItemSetContainerComponent: Component { environment: {}, containerSize: CGSize(width: 44.0, height: 44.0) ) - let closeFriendIconFrame = CGRect(origin: CGPoint(x: headerRightOffset - closeFriendIconSize.width - 8.0, y: 23.0), size: closeFriendIconSize) + let closeFriendIconFrame = CGRect(origin: CGPoint(x: headerRightOffset - privacyIconSize.width - 8.0, y: 22.0), size: privacyIconSize) if let closeFriendIconView = privacyIcon.view { if closeFriendIconView.superview == nil { self.controlsContainerView.addSubview(closeFriendIconView) From 295a29332d63258a200f68a72d2b77c51f04e62e Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 18 Jul 2023 22:13:01 +0400 Subject: [PATCH 5/6] Stories --- submodules/Display/Source/TextNode.swift | 35 ++------ .../Sources/PeerInfoStoryGridScreen.swift | 87 ++++--------------- .../Sources/OpenStories.swift | 7 ++ .../Sources/StoryPeerListComponent.swift | 1 + submodules/TgVoipWebrtc/tgcalls | 2 +- 5 files changed, 32 insertions(+), 100 deletions(-) diff --git a/submodules/Display/Source/TextNode.swift b/submodules/Display/Source/TextNode.swift index a4a58949d4..d8fe7feed8 100644 --- a/submodules/Display/Source/TextNode.swift +++ b/submodules/Display/Source/TextNode.swift @@ -1264,36 +1264,18 @@ open class TextNode: ASDisplayNode { if didClipLinebreak { coreTextLine = originalLine additionalTrailingLine = (truncationToken, truncationTokenWidth) - - /*let mergedLine = NSMutableAttributedString() - mergedLine.append(attributedString.attributedSubstring(from: NSRange(location: lineRange.location, length: lineRange.length))) - mergedLine.append(truncatedTokenString) - - coreTextLine = CTLineCreateWithAttributedString(mergedLine) - - let runs = (CTLineGetGlyphRuns(coreTextLine) as [AnyObject]) as! [CTRun] - for run in runs { - let runAttributes: NSDictionary = CTRunGetAttributes(run) - if let _ = runAttributes["CTForegroundColorFromContext"] { - brokenLineRange.length = CTRunGetStringRange(run).location - brokenLineRange.location - break - } - } - if brokenLineRange.location + brokenLineRange.length > lineRange.location + lineRange.length { - brokenLineRange.location = lineRange.location - brokenLineRange.length = lineRange.length - } - if brokenLineRange.location + brokenLineRange.length > attributedString.length { - brokenLineRange.length = attributedString.length - brokenLineRange.location - } - effectiveLineRange = brokenLineRange*/ - truncated = true } else { coreTextLine = originalLine } } else { - coreTextLine = CTLineCreateTruncatedLine(originalLine, Double(lineConstrainedSize.width), truncationType, truncationToken) ?? truncationToken + var availableLineConstrainedWidth = lineConstrainedSize.width + if customTruncationToken != nil { + availableLineConstrainedWidth -= truncationTokenWidth + } + + coreTextLine = CTLineCreateTruncatedLine(originalLine, Double(availableLineConstrainedWidth), truncationType, truncationToken) ?? truncationToken + let runs = (CTLineGetGlyphRuns(coreTextLine) as [AnyObject]) as! [CTRun] for run in runs { let runAttributes: NSDictionary = CTRunGetAttributes(run) @@ -1302,9 +1284,6 @@ open class TextNode: ASDisplayNode { break } } - if customTruncationToken != nil { - assert(true) - } effectiveLineRange = CFRange(location: effectiveLineRange.location, length: 0) for run in runs { let runRange = CTRunGetStringRange(run) diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoStoryGridScreen/Sources/PeerInfoStoryGridScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoStoryGridScreen/Sources/PeerInfoStoryGridScreen.swift index b2ba55ea2f..5aae15186d 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoStoryGridScreen/Sources/PeerInfoStoryGridScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoStoryGridScreen/Sources/PeerInfoStoryGridScreen.swift @@ -53,7 +53,7 @@ final class PeerInfoStoryGridScreenComponent: Component { private weak var state: EmptyComponentState? private var environment: EnvironmentType? - private var paneNode: PeerInfoStoryPaneNode? + private(set) var paneNode: PeerInfoStoryPaneNode? private var paneStatusDisposable: Disposable? private(set) var paneStatusText: String? @@ -171,74 +171,6 @@ final class PeerInfoStoryGridScreenComponent: Component { self.environment?.controller()?.push(PeerInfoStoryGridScreen(context: component.context, peerId: component.peerId, scope: .archive)) }))) } - - /*if photoCount != 0 && videoCount != 0 { - items.append(.separator) - - let showPhotos: Bool - switch pane.contentType { - case .photo, .photoOrVideo: - showPhotos = true - default: - showPhotos = false - } - let showVideos: Bool - switch pane.contentType { - case .video, .photoOrVideo: - showVideos = true - default: - showVideos = false - } - - items.append(.action(ContextMenuActionItem(text: strings.SharedMedia_ShowPhotos, icon: { theme in - if !showPhotos { - return nil - } - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) - }, action: { [weak pane] _, a in - a(.default) - - guard let pane = pane else { - return - } - let updatedContentType: PeerInfoVisualMediaPaneNode.ContentType - switch pane.contentType { - case .photoOrVideo: - updatedContentType = .video - case .photo: - updatedContentType = .photo - case .video: - updatedContentType = .photoOrVideo - default: - updatedContentType = pane.contentType - } - pane.updateContentType(contentType: updatedContentType) - }))) - items.append(.action(ContextMenuActionItem(text: strings.SharedMedia_ShowVideos, icon: { theme in - if !showVideos { - return nil - } - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) - }, action: { [weak pane] _, a in - a(.default) - - guard let pane = pane else { - return - } - let updatedContentType: PeerInfoVisualMediaPaneNode.ContentType - switch pane.contentType { - case .photoOrVideo: - updatedContentType = .photo - case .photo: - updatedContentType = .photoOrVideo - case .video: - updatedContentType = .video - default: - updatedContentType = pane.contentType - } - pane.updateContentType(contentType: updatedContentType) - }))) - }*/ } let contextController = ContextController(account: component.context.account, presentationData: presentationData, source: .reference(PeerInfoContextReferenceContentSource(controller: controller, sourceNode: source)), items: .single(ContextController.Items(content: .list(items))), gesture: nil) @@ -554,8 +486,6 @@ public class PeerInfoStoryGridScreen: ViewControllerComponentContainer { } moreBarButton.addTarget(self, action: #selector(self.morePressed), forControlEvents: .touchUpInside) - self.navigationItem.setRightBarButton(moreBarButtonItem, animated: false) - self.titleView = ChatTitleView( context: context, theme: presentationData.theme, @@ -594,6 +524,8 @@ public class PeerInfoStoryGridScreen: ViewControllerComponentContainer { title = nil } self.titleView?.titleContent = .custom(presentationData.strings.StoryList_TitleSaved, title, false) + + self.navigationItem.setRightBarButton(self.moreBarButtonItem, animated: false) case .archive: guard let componentView = self.node.hostView.componentView as? PeerInfoStoryGridScreenComponent.View else { return @@ -605,6 +537,19 @@ public class PeerInfoStoryGridScreen: ViewControllerComponentContainer { title = presentationData.strings.StoryList_TitleArchive } self.titleView?.titleContent = .custom(title, nil, false) + + var hasMenu = false + if componentView.selectedCount != 0 { + hasMenu = true + } else if let paneNode = componentView.paneNode, !paneNode.isEmpty { + hasMenu = true + } + + if hasMenu { + self.navigationItem.setRightBarButton(self.moreBarButtonItem, animated: false) + } else { + self.navigationItem.setRightBarButton(nil, animated: false) + } } } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/OpenStories.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/OpenStories.swift index 3394fe9f18..60e966250b 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/OpenStories.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/OpenStories.swift @@ -171,6 +171,13 @@ public extension StoryContainerScreen { |> take(1) |> mapToSignal { state -> Signal in if let slice = state.slice { + #if DEBUG && true + if "".isEmpty { + return .single(state) + |> delay(4.0, queue: .mainQueue()) + } + #endif + return waitUntilStoryMediaPreloaded(context: context, peerId: slice.peer.id, storyItem: slice.item.storyItem) |> timeout(4.0, queue: .mainQueue(), alternate: .complete()) |> map { _ -> StoryContentContextState in diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift index 59b6366829..73be5d761f 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift @@ -374,6 +374,7 @@ public final class StoryPeerListComponent: Component { self.scrollContainerView = UIView() self.scrollContainerView.clipsToBounds = true + self.scrollContainerView.isExclusiveTouch = true self.titleView = UIImageView() self.titleView.layer.anchorPoint = CGPoint(x: 0.0, y: 0.5) diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index ef358c48b0..ebc8452d3a 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit ef358c48b05ccd59319a7ceded340b75baffa751 +Subproject commit ebc8452d3a0d0bc18822b4eb6ca61ec8fa7a70a5 From 1c817881b5c3e0c26f953641a813148e46356c2e Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 18 Jul 2023 23:22:37 +0200 Subject: [PATCH 6/6] Fix localization --- Telegram/Telegram-iOS/en.lproj/Localizable.strings | 2 +- .../ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 8481a453da..ac2ad35005 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -9698,7 +9698,7 @@ Sorry for the inconvenience."; "Story.Privacy.CategoryContacts" = "Contacts"; "Story.Privacy.CategoryCloseFriends" = "Close Friends"; "Story.Privacy.CategorySelectedContacts" = "Selected Contacts"; -"Story.Privacy.ExcludedPeople" = "ExcludedPeople"; +"Story.Privacy.ExcludedPeople" = "Excluded People"; "Story.Privacy.ExcludePeople" = "exclude people"; "Story.Privacy.ExcludePeopleExceptNames" = "except %@"; diff --git a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift index a94bb8f429..534fd87bf8 100644 --- a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift +++ b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift @@ -1446,7 +1446,7 @@ final class ShareWithPeersScreenComponent: Component { case .closeFriends: title = environment.strings.Story_Privacy_CategoryCloseFriends case .contacts: - title = environment.strings.Story_Privacy_ExcludePeople + title = environment.strings.Story_Privacy_ExcludedPeople case .nobody: title = environment.strings.Story_Privacy_CategorySelectedContacts case .everyone: