Merge commit 'dd2227223d71da3da96f3f0901f66c135a7670f2'

This commit is contained in:
Isaac 2025-04-29 16:45:42 +02:00
commit e341c0f028
5 changed files with 87 additions and 10 deletions

View File

@ -97,6 +97,7 @@ public extension Stories {
case period case period
case randomId case randomId
case forwardInfo case forwardInfo
case uploadInfo
} }
public let target: PendingTarget public let target: PendingTarget
@ -113,6 +114,7 @@ public extension Stories {
public let period: Int32 public let period: Int32
public let randomId: Int64 public let randomId: Int64
public let forwardInfo: PendingForwardInfo? public let forwardInfo: PendingForwardInfo?
public let uploadInfo: StoryUploadInfo?
public init( public init(
target: PendingTarget, target: PendingTarget,
@ -128,7 +130,8 @@ public extension Stories {
isForwardingDisabled: Bool, isForwardingDisabled: Bool,
period: Int32, period: Int32,
randomId: Int64, randomId: Int64,
forwardInfo: PendingForwardInfo? forwardInfo: PendingForwardInfo?,
uploadInfo: StoryUploadInfo?
) { ) {
self.target = target self.target = target
self.stableId = stableId self.stableId = stableId
@ -144,6 +147,7 @@ public extension Stories {
self.period = period self.period = period
self.randomId = randomId self.randomId = randomId
self.forwardInfo = forwardInfo self.forwardInfo = forwardInfo
self.uploadInfo = uploadInfo
} }
public init(from decoder: Decoder) throws { public init(from decoder: Decoder) throws {
@ -171,6 +175,8 @@ public extension Stories {
self.randomId = try container.decode(Int64.self, forKey: .randomId) self.randomId = try container.decode(Int64.self, forKey: .randomId)
self.forwardInfo = try container.decodeIfPresent(PendingForwardInfo.self, forKey: .forwardInfo) self.forwardInfo = try container.decodeIfPresent(PendingForwardInfo.self, forKey: .forwardInfo)
self.uploadInfo = try container.decodeIfPresent(StoryUploadInfo.self, forKey: .uploadInfo)
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
@ -199,6 +205,7 @@ public extension Stories {
try container.encode(self.period, forKey: .period) try container.encode(self.period, forKey: .period)
try container.encode(self.randomId, forKey: .randomId) try container.encode(self.randomId, forKey: .randomId)
try container.encodeIfPresent(self.forwardInfo, forKey: .forwardInfo) try container.encodeIfPresent(self.forwardInfo, forKey: .forwardInfo)
try container.encodeIfPresent(self.uploadInfo, forKey: .uploadInfo)
} }
public static func ==(lhs: PendingItem, rhs: PendingItem) -> Bool { public static func ==(lhs: PendingItem, rhs: PendingItem) -> Bool {
@ -238,6 +245,9 @@ public extension Stories {
if lhs.forwardInfo != rhs.forwardInfo { if lhs.forwardInfo != rhs.forwardInfo {
return false return false
} }
if lhs.uploadInfo != rhs.uploadInfo {
return false
}
return true return true
} }
} }
@ -467,7 +477,12 @@ final class PendingStoryManager {
switch event { switch event {
case let .progress(progress): case let .progress(progress):
if let currentPendingItemContext = self.currentPendingItemContext, currentPendingItemContext.item.stableId == stableId { if let currentPendingItemContext = self.currentPendingItemContext, currentPendingItemContext.item.stableId == stableId {
currentPendingItemContext.progress = progress if let uploadInfo = currentPendingItemContext.item.uploadInfo {
let partTotalProgress = 1.0 / Float(uploadInfo.total)
currentPendingItemContext.progress = Float(uploadInfo.index) * partTotalProgress + progress * partTotalProgress
} else {
currentPendingItemContext.progress = progress
}
currentPendingItemContext.updated() currentPendingItemContext.updated()
} }
case let .completed(id): case let .completed(id):

View File

@ -976,7 +976,19 @@ private func apiInputPrivacyRules(privacy: EngineStoryPrivacy, transaction: Tran
return privacyRules return privacyRules
} }
func _internal_uploadStory(account: Account, target: Stories.PendingTarget, media: EngineStoryInputMedia, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], pin: Bool, privacy: EngineStoryPrivacy, isForwardingDisabled: Bool, period: Int, randomId: Int64, forwardInfo: Stories.PendingForwardInfo?) -> Signal<Int32, NoError> { public struct StoryUploadInfo: Codable, Equatable {
public var groupingId: Int32
public var index: Int32
public var total: Int32
public init(groupingId: Int32, index: Int32, total: Int32) {
self.groupingId = groupingId
self.index = index
self.total = total
}
}
func _internal_uploadStory(account: Account, target: Stories.PendingTarget, media: EngineStoryInputMedia, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], pin: Bool, privacy: EngineStoryPrivacy, isForwardingDisabled: Bool, period: Int, randomId: Int64, forwardInfo: Stories.PendingForwardInfo?, uploadInfo: StoryUploadInfo? = nil) -> Signal<Int32, NoError> {
let inputMedia = prepareUploadStoryContent(account: account, media: media) let inputMedia = prepareUploadStoryContent(account: account, media: media)
return (account.postbox.transaction { transaction in return (account.postbox.transaction { transaction in
@ -1004,7 +1016,8 @@ func _internal_uploadStory(account: Account, target: Stories.PendingTarget, medi
isForwardingDisabled: isForwardingDisabled, isForwardingDisabled: isForwardingDisabled,
period: Int32(period), period: Int32(period),
randomId: randomId, randomId: randomId,
forwardInfo: forwardInfo forwardInfo: forwardInfo,
uploadInfo: uploadInfo
)) ))
transaction.setLocalStoryState(state: CodableEntry(currentState)) transaction.setLocalStoryState(state: CodableEntry(currentState))
return stableId return stableId
@ -1020,7 +1033,50 @@ func _internal_cancelStoryUpload(account: Account, stableId: Int32) {
currentState = Stories.LocalState(items: []) currentState = Stories.LocalState(items: [])
} }
if let index = currentState.items.firstIndex(where: { $0.stableId == stableId }) { if let index = currentState.items.firstIndex(where: { $0.stableId == stableId }) {
currentState.items.remove(at: index) let cancelledItem = currentState.items[index]
if let uploadInfo = cancelledItem.uploadInfo {
let groupingId = uploadInfo.groupingId
let total = uploadInfo.total - 1
currentState.items.remove(at: index)
for i in 0..<currentState.items.count {
if let itemUploadInfo = currentState.items[i].uploadInfo, itemUploadInfo.groupingId == groupingId {
let newIndex: Int32
if itemUploadInfo.index > uploadInfo.index {
newIndex = itemUploadInfo.index - 1
} else {
newIndex = itemUploadInfo.index
}
let updatedItem = Stories.PendingItem(
target: currentState.items[i].target,
stableId: currentState.items[i].stableId,
timestamp: currentState.items[i].timestamp,
media: currentState.items[i].media,
mediaAreas: currentState.items[i].mediaAreas,
text: currentState.items[i].text,
entities: currentState.items[i].entities,
embeddedStickers: currentState.items[i].embeddedStickers,
pin: currentState.items[i].pin,
privacy: currentState.items[i].privacy,
isForwardingDisabled: currentState.items[i].isForwardingDisabled,
period: currentState.items[i].period,
randomId: currentState.items[i].randomId,
forwardInfo: currentState.items[i].forwardInfo,
uploadInfo: StoryUploadInfo(
groupingId: groupingId,
index: newIndex,
total: total
)
)
currentState.items[i] = updatedItem
}
}
} else {
currentState.items.remove(at: index)
}
transaction.setLocalStoryState(state: CodableEntry(currentState)) transaction.setLocalStoryState(state: CodableEntry(currentState))
} }
}).start() }).start()

View File

@ -1349,8 +1349,8 @@ public extension TelegramEngine {
} }
} }
public func uploadStory(target: Stories.PendingTarget, media: EngineStoryInputMedia, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], pin: Bool, privacy: EngineStoryPrivacy, isForwardingDisabled: Bool, period: Int, randomId: Int64, forwardInfo: Stories.PendingForwardInfo?) -> Signal<Int32, NoError> { public func uploadStory(target: Stories.PendingTarget, media: EngineStoryInputMedia, mediaAreas: [MediaArea], text: String, entities: [MessageTextEntity], pin: Bool, privacy: EngineStoryPrivacy, isForwardingDisabled: Bool, period: Int, randomId: Int64, forwardInfo: Stories.PendingForwardInfo?, uploadInfo: StoryUploadInfo? = nil) -> Signal<Int32, NoError> {
return _internal_uploadStory(account: self.account, target: target, media: media, mediaAreas: mediaAreas, text: text, entities: entities, pin: pin, privacy: privacy, isForwardingDisabled: isForwardingDisabled, period: period, randomId: randomId, forwardInfo: forwardInfo) return _internal_uploadStory(account: self.account, target: target, media: media, mediaAreas: mediaAreas, text: text, entities: entities, pin: pin, privacy: privacy, isForwardingDisabled: isForwardingDisabled, period: period, randomId: randomId, forwardInfo: forwardInfo, uploadInfo: uploadInfo)
} }
public func allStoriesUploadEvents() -> Signal<(Int32, Int32), NoError> { public func allStoriesUploadEvents() -> Signal<(Int32, Int32), NoError> {

View File

@ -44,8 +44,10 @@ extension MediaEditorScreenImpl {
let storyCount = min(storyMaxCombinedVideoCount, Int(ceil(duration / storyMaxVideoDuration))) let storyCount = min(storyMaxCombinedVideoCount, Int(ceil(duration / storyMaxVideoDuration)))
var start = values.videoTrimRange?.lowerBound ?? 0 var start = values.videoTrimRange?.lowerBound ?? 0
let end = values.videoTrimRange?.upperBound ?? (min(originalDuration, start + storyMaxCombinedVideoDuration))
for i in 0 ..< storyCount { for i in 0 ..< storyCount {
let trimmedValues = values.withUpdatedVideoTrimRange(start ..< min(start + storyMaxVideoDuration, originalDuration)) let trimmedValues = values.withUpdatedVideoTrimRange(start ..< min(end, start + storyMaxVideoDuration))
var editingItem = EditingItem(asset: asset) var editingItem = EditingItem(asset: asset)
if i == 0 { if i == 0 {
@ -526,7 +528,7 @@ extension MediaEditorScreenImpl {
} }
var items = items var items = items
if let mediaEditor = self.node.mediaEditor, case let .asset(asset) = self.node.subject, let currentItemIndex = items.firstIndex(where: { $0.asset.localIdentifier == asset.localIdentifier }) { if !isLongVideo, let mediaEditor = self.node.mediaEditor, case let .asset(asset) = self.node.subject, let currentItemIndex = items.firstIndex(where: { $0.asset.localIdentifier == asset.localIdentifier }) {
var updatedCurrentItem = items[currentItemIndex] var updatedCurrentItem = items[currentItemIndex]
updatedCurrentItem.caption = self.node.getCaption() updatedCurrentItem.caption = self.node.getCaption()
updatedCurrentItem.values = mediaEditor.values updatedCurrentItem.values = mediaEditor.values

View File

@ -659,6 +659,8 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
} }
if let _ = self.chatListController as? ChatListControllerImpl { if let _ = self.chatListController as? ChatListControllerImpl {
var index: Int32 = 0
let groupingId = Int32.random(in: 2000000 ..< Int32.max)
for result in results { for result in results {
var media: EngineStoryInputMedia? var media: EngineStoryInputMedia?
@ -732,12 +734,14 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
isForwardingDisabled: result.options.isForwardingDisabled, isForwardingDisabled: result.options.isForwardingDisabled,
period: result.options.timeout, period: result.options.timeout,
randomId: result.randomId, randomId: result.randomId,
forwardInfo: forwardInfo forwardInfo: forwardInfo,
uploadInfo: results.count > 1 ? StoryUploadInfo(groupingId: groupingId, index: index, total: Int32(results.count)) : nil
) )
|> deliverOnMainQueue).startStandalone(next: { stableId in |> deliverOnMainQueue).startStandalone(next: { stableId in
moveStorySource(engine: context.engine, peerId: context.account.peerId, from: result.randomId, to: Int64(stableId)) moveStorySource(engine: context.engine, peerId: context.account.peerId, from: result.randomId, to: Int64(stableId))
}) })
} }
index += 1
} }
completionImpl() completionImpl()
} }