Various fixes

This commit is contained in:
Ilya Laktyushin 2023-12-16 17:39:47 +04:00
parent 37dc9a3b6f
commit d476aa27e8
6 changed files with 73 additions and 9 deletions

View File

@ -178,9 +178,9 @@ public final class EngineStoryViewListContext {
} }
public struct ItemHash: Hashable { public struct ItemHash: Hashable {
var peerId: EnginePeer.Id public var peerId: EnginePeer.Id
var storyId: Int32? public var storyId: Int32?
var messageId: EngineMessage.Id? public var messageId: EngineMessage.Id?
} }
public var uniqueId: ItemHash { public var uniqueId: ItemHash {

View File

@ -2669,6 +2669,9 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
return false return false
} }
} }
if self.stickerScreen != nil {
return false
}
return true return true
} else { } else {
return true return true

View File

@ -253,7 +253,7 @@ public final class PeerListItemComponent: Component {
private var fileDisposable: Disposable? private var fileDisposable: Disposable?
private var imageButtonView: HighlightTrackingButton? private var imageButtonView: HighlightTrackingButton?
private var imageNode: TransformImageNode? public private(set) var imageNode: TransformImageNode?
private var component: PeerListItemComponent? private var component: PeerListItemComponent?
private weak var state: EmptyComponentState? private weak var state: EmptyComponentState?
@ -410,6 +410,10 @@ public final class PeerListItemComponent: Component {
} }
} }
public func updateIsPreviewing(isPreviewing: Bool) {
self.imageNode?.isHidden = isPreviewing
}
func update(component: PeerListItemComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<Empty>, transition: Transition) -> CGSize { func update(component: PeerListItemComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<Empty>, transition: Transition) -> CGSize {
let previousComponent = self.component let previousComponent = self.component
@ -910,6 +914,7 @@ public final class PeerListItemComponent: Component {
imageButtonView = HighlightTrackingButton() imageButtonView = HighlightTrackingButton()
imageButtonView.addTarget(self, action: #selector(self.imageButtonPressed), for: .touchUpInside) imageButtonView.addTarget(self, action: #selector(self.imageButtonPressed), for: .touchUpInside)
imageButtonView.isEnabled = component.message == nil
self.imageButtonView = imageButtonView self.imageButtonView = imageButtonView
self.containerButton.addSubview(imageNode.view) self.containerButton.addSubview(imageNode.view)

View File

@ -2454,6 +2454,7 @@ public final class RepostStoriesContentContextImpl: StoryContentContext {
readGlobally: Bool readGlobally: Bool
) { ) {
self.context = context self.context = context
self.focusedItem = (focusedStoryId.peerId, focusedStoryId.id)
self.viewListContext = viewListContext self.viewListContext = viewListContext
self.readGlobally = readGlobally self.readGlobally = readGlobally

View File

@ -5199,7 +5199,7 @@ public final class StoryItemSetContainerComponent: Component {
let storyContent = RepostStoriesContentContextImpl(context: context, focusedStoryId: StoryId(peerId: peer.id, id: id), viewListContext: viewListContext, readGlobally: false) let storyContent = RepostStoriesContentContextImpl(context: context, focusedStoryId: StoryId(peerId: peer.id, id: id), viewListContext: viewListContext, readGlobally: false)
let _ = (storyContent.state let _ = (storyContent.state
|> take(1) |> take(1)
|> deliverOnMainQueue).startStandalone(next: { [weak controller, weak sourceView] _ in |> deliverOnMainQueue).startStandalone(next: { [weak controller, weak viewListView, weak sourceView] _ in
guard let controller, let sourceView else { guard let controller, let sourceView else {
return return
} }
@ -5214,9 +5214,14 @@ public final class StoryItemSetContainerComponent: Component {
context: context, context: context,
content: storyContent, content: storyContent,
transitionIn: transitionIn, transitionIn: transitionIn,
transitionOut: { [weak sourceView] peerId, storyIdValue in transitionOut: { [weak sourceView, weak viewListView] peerId, storyIdValue in
if let sourceView { var destinationView: UIView?
let destinationView = sourceView if let view = viewListView?.sourceView(storyId: StoryId(peerId: peerId, id: storyIdValue as? Int32 ?? 0)) {
destinationView = view
} else {
destinationView = sourceView
}
if let destinationView {
return StoryContainerScreen.TransitionOut( return StoryContainerScreen.TransitionOut(
destinationView: destinationView, destinationView: destinationView,
transitionView: StoryContainerScreen.TransitionView( transitionView: StoryContainerScreen.TransitionView(
@ -5252,6 +5257,7 @@ public final class StoryItemSetContainerComponent: Component {
} }
} }
) )
viewListView?.setPreviewedItem(signal: storyContainerScreen.focusedItem)
controller.push(storyContainerScreen) controller.push(storyContainerScreen)
}) })
} }

View File

@ -293,6 +293,9 @@ final class StoryItemSetViewListComponent: Component {
var viewListState: EngineStoryViewListContext.State? var viewListState: EngineStoryViewListContext.State?
var requestedLoadMoreToken: EngineStoryViewListContext.LoadMoreToken? var requestedLoadMoreToken: EngineStoryViewListContext.LoadMoreToken?
private var previewedItemDisposable: Disposable?
private var previewedItemId: StoryId?
var eventCycleState: EventCycleState? var eventCycleState: EventCycleState?
var totalCount: Int? { var totalCount: Int? {
@ -339,6 +342,42 @@ final class StoryItemSetViewListComponent: Component {
deinit { deinit {
self.viewListDisposable?.dispose() self.viewListDisposable?.dispose()
self.previewedItemDisposable?.dispose()
}
func setPreviewedItem(signal: Signal<StoryId?, NoError>) {
self.previewedItemDisposable?.dispose()
self.previewedItemDisposable = (signal |> distinctUntilChanged |> deliverOnMainQueue).start(next: { [weak self] previewedItemId in
guard let self else {
return
}
self.previewedItemId = previewedItemId
for (itemId, visibleItem) in self.visibleItems {
if let itemView = visibleItem.view as? PeerListItemComponent.View {
let isPreviewing = itemId.peerId == previewedItemId?.peerId && itemId.storyId == previewedItemId?.id
itemView.updateIsPreviewing(isPreviewing: isPreviewing)
if isPreviewing {
let itemFrame = itemView.frame.offsetBy(dx: 0.0, dy: self.scrollView.bounds.minY)
if !self.scrollView.bounds.intersects(itemFrame.insetBy(dx: 0.0, dy: 20.0)) {
self.scrollView.scrollRectToVisible(itemFrame.insetBy(dx: 0.0, dy: -40.0), animated: false)
}
}
}
}
})
}
func sourceView(storyId: StoryId) -> UIView? {
for (itemId, visibleItem) in self.visibleItems {
if let itemView = visibleItem.view as? PeerListItemComponent.View {
if itemId.peerId == storyId.peerId && itemId.storyId == storyId.id {
return itemView.imageNode?.view
}
}
}
return nil
} }
func scrollViewDidScroll(_ scrollView: UIScrollView) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
@ -577,7 +616,7 @@ final class StoryItemSetViewListComponent: Component {
environment: {}, environment: {},
containerSize: itemFrame.size containerSize: itemFrame.size
) )
if let itemView = visibleItem.view { if let itemView = visibleItem.view as? PeerListItemComponent.View {
var animateIn = false var animateIn = false
if itemView.superview == nil { if itemView.superview == nil {
animateIn = true animateIn = true
@ -585,6 +624,8 @@ final class StoryItemSetViewListComponent: Component {
} }
itemTransition.setFrame(view: itemView, frame: itemFrame) itemTransition.setFrame(view: itemView, frame: itemFrame)
itemView.updateIsPreviewing(isPreviewing: self.previewedItemId?.peerId == item.peer.id && self.previewedItemId?.id == item.story?.id)
if animateIn, synchronousLoad { if animateIn, synchronousLoad {
itemView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) itemView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
} }
@ -1310,6 +1351,14 @@ final class StoryItemSetViewListComponent: Component {
return super.hitTest(point, with: event) return super.hitTest(point, with: event)
} }
public func setPreviewedItem(signal: Signal<StoryId?, NoError>) {
self.currentContentView?.setPreviewedItem(signal: signal)
}
public func sourceView(storyId: StoryId) -> UIView? {
self.currentContentView?.sourceView(storyId: storyId)
}
func animateIn(transition: Transition) { func animateIn(transition: Transition) {
let offset = self.bounds.height - self.navigationBarBackground.frame.minY let offset = self.bounds.height - self.navigationBarBackground.frame.minY
Transition.immediate.setBoundsOrigin(view: self, origin: CGPoint(x: 0.0, y: -offset)) Transition.immediate.setBoundsOrigin(view: self, origin: CGPoint(x: 0.0, y: -offset))