From 0564463540d7ea046e9eafd82a3086c061534e6d Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 21 Jul 2023 21:14:10 +0400 Subject: [PATCH] Stories --- .../Messages/StoryListContext.swift | 74 +++++++++++++++++++ .../Sources/PeerInfoStoryPaneNode.swift | 7 +- .../Sources/StoryPeerListComponent.swift | 9 ++- .../Sources/StoryPeerListItemComponent.swift | 2 +- 4 files changed, 87 insertions(+), 5 deletions(-) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index c311fa994c..cb5ae41885 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -790,6 +790,44 @@ public final class PeerStoryListContext { finalUpdatedState = updatedState } } + } else { + if case let .item(item) = item { + if let media = item.media { + var updatedState = finalUpdatedState ?? self.stateValue + updatedState.items[index] = EngineStoryItem( + id: item.id, + timestamp: item.timestamp, + expirationTimestamp: item.expirationTimestamp, + media: EngineMedia(media), + text: item.text, + entities: item.entities, + views: item.views.flatMap { views in + return EngineStoryItem.Views( + seenCount: views.seenCount, + seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in + return peers[id].flatMap(EnginePeer.init) + } + ) + }, + privacy: item.privacy.flatMap(EngineStoryPrivacy.init), + isPinned: item.isPinned, + isExpired: item.isExpired, + isPublic: item.isPublic, + isPending: false, + isCloseFriends: item.isCloseFriends, + isContacts: item.isContacts, + isSelectedContacts: item.isSelectedContacts, + isForwardingDisabled: item.isForwardingDisabled, + isEdited: item.isEdited + ) + finalUpdatedState = updatedState + } else { + var updatedState = finalUpdatedState ?? self.stateValue + updatedState.items.remove(at: index) + updatedState.totalCount = max(0, updatedState.totalCount - 1) + finalUpdatedState = updatedState + } + } } } else { if !self.isArchived { @@ -830,6 +868,42 @@ public final class PeerStoryListContext { } } } + } else { + if case let .item(item) = item { + if let media = item.media { + var updatedState = finalUpdatedState ?? self.stateValue + updatedState.items.append(EngineStoryItem( + id: item.id, + timestamp: item.timestamp, + expirationTimestamp: item.expirationTimestamp, + media: EngineMedia(media), + text: item.text, + entities: item.entities, + views: item.views.flatMap { views in + return EngineStoryItem.Views( + seenCount: views.seenCount, + seenPeers: views.seenPeerIds.compactMap { id -> EnginePeer? in + return peers[id].flatMap(EnginePeer.init) + } + ) + }, + privacy: item.privacy.flatMap(EngineStoryPrivacy.init), + isPinned: item.isPinned, + isExpired: item.isExpired, + isPublic: item.isPublic, + isPending: false, + isCloseFriends: item.isCloseFriends, + isContacts: item.isContacts, + isSelectedContacts: item.isSelectedContacts, + isForwardingDisabled: item.isForwardingDisabled, + isEdited: item.isEdited + )) + updatedState.items.sort(by: { lhs, rhs in + return lhs.timestamp > rhs.timestamp + }) + finalUpdatedState = updatedState + } + } } } } diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift index 0a7ba25b6e..b681623fab 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift @@ -1850,7 +1850,12 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScr let isSelecting = self._itemInteraction?.selectedIds != nil self.itemGrid.pinchEnabled = !isSelecting - self.view.disablesInteractiveTransitionGestureRecognizer = isSelecting + var enableDismissGesture = true + if let items = self.items, items.items.isEmpty { + } else if isSelecting { + enableDismissGesture = false + } + self.view.disablesInteractiveTransitionGestureRecognizer = enableDismissGesture if isSelecting { if self.gridSelectionGesture == nil { diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift index ecbfb1c92f..f9fe30d554 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift @@ -677,12 +677,13 @@ public final class StoryPeerListComponent: Component { let calculateOverscrollEffectFraction: (CGFloat, CGFloat) -> CGFloat = { maxFraction, bounceFraction in var expandEffectFraction: CGFloat = max(0.0, min(1.0, maxFraction)) - expandEffectFraction = 1.0 - pow(1.0 - expandEffectFraction, 2.0) + expandEffectFraction = pow(expandEffectFraction, 1.0) let overscrollEffectFraction = max(0.0, maxFraction - 1.0) - expandEffectFraction += overscrollEffectFraction * 0.1 + expandEffectFraction += overscrollEffectFraction * 0.12 - expandEffectFraction += pow(bounceFraction, 1.4) * 0.2 * maxFraction + let reverseBounceFraction = 1.0 - pow(1.0 - bounceFraction, 2.4) + expandEffectFraction += reverseBounceFraction * 0.09 * maxFraction return expandEffectFraction } @@ -1269,6 +1270,8 @@ public final class StoryPeerListComponent: Component { titleContentOffset = titleMinContentOffset.interpolate(to: ((itemLayout.containerSize.width - collapsedState.titleWidth) * 0.5) as CGFloat, amount: min(1.0, collapsedState.maxFraction) * (1.0 - collapsedState.activityFraction)) } + titleContentOffset += -expandBoundsFraction * 4.0 + var titleIndicatorSize: CGSize? if collapsedState.activityFraction != 0.0 { let collapsedItemMinX = collapsedContentOrigin - collapsedItemWidth * 0.5 diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListItemComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListItemComponent.swift index 1d0ed60dff..c3e38c3e5d 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListItemComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListItemComponent.swift @@ -113,7 +113,7 @@ private func calculateMergingCircleShape(center: CGPoint, leftCenter: CGPoint?, } var startAngle = segmentSpacingAngle * 0.5 - CGFloat.pi * 0.5 + CGFloat(i) * (segmentSpacingAngle + segmentAngle) - startAngle += -1.0 * (1.0 - rotationFraction) * CGFloat.pi * 2.0 * 0.5 + startAngle += -1.0 * (1.0 - rotationFraction) * CGFloat.pi * 2.0 * 0.25 let endAngle = startAngle + segmentAngle path.move(to: CGPoint(x: center.x + cos(startAngle) * radius, y: center.y + sin(startAngle) * radius))