mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Various improvements
This commit is contained in:
@@ -10,6 +10,8 @@ import TelegramCallsUI
|
||||
import TelegramPresentationData
|
||||
import StoryContainerScreen
|
||||
import ChatEntityKeyboardInputNode
|
||||
import AvatarNode
|
||||
import MultilineTextComponent
|
||||
|
||||
final class CameraLiveStreamComponent: Component {
|
||||
let context: AccountContext
|
||||
@@ -19,6 +21,7 @@ final class CameraLiveStreamComponent: Component {
|
||||
let story: EngineStoryItem?
|
||||
let statusBarHeight: CGFloat
|
||||
let inputHeight: CGFloat
|
||||
let safeInsets: UIEdgeInsets
|
||||
let metrics: LayoutMetrics
|
||||
let deviceMetrics: DeviceMetrics
|
||||
let didSetupMediaStream: (PresentationGroupCall) -> Void
|
||||
@@ -31,6 +34,7 @@ final class CameraLiveStreamComponent: Component {
|
||||
story: EngineStoryItem?,
|
||||
statusBarHeight: CGFloat,
|
||||
inputHeight: CGFloat,
|
||||
safeInsets: UIEdgeInsets,
|
||||
metrics: LayoutMetrics,
|
||||
deviceMetrics: DeviceMetrics,
|
||||
didSetupMediaStream: @escaping (PresentationGroupCall) -> Void
|
||||
@@ -42,6 +46,7 @@ final class CameraLiveStreamComponent: Component {
|
||||
self.story = story
|
||||
self.statusBarHeight = statusBarHeight
|
||||
self.inputHeight = inputHeight
|
||||
self.safeInsets = safeInsets
|
||||
self.metrics = metrics
|
||||
self.deviceMetrics = deviceMetrics
|
||||
self.didSetupMediaStream = didSetupMediaStream
|
||||
@@ -69,6 +74,9 @@ final class CameraLiveStreamComponent: Component {
|
||||
if lhs.inputHeight != rhs.inputHeight {
|
||||
return false
|
||||
}
|
||||
if lhs.safeInsets != rhs.safeInsets {
|
||||
return false
|
||||
}
|
||||
if lhs.metrics != rhs.metrics {
|
||||
return false
|
||||
}
|
||||
@@ -145,7 +153,7 @@ final class CameraLiveStreamComponent: Component {
|
||||
}
|
||||
|
||||
let itemSetContainerInsets = UIEdgeInsets(top: component.statusBarHeight + 5.0, left: 0.0, bottom: 0.0, right: 0.0)
|
||||
let itemSetContainerSafeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 20.0, right: 0.0)
|
||||
let itemSetContainerSafeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 34.0, right: 0.0)
|
||||
|
||||
let _ = liveChat.update(
|
||||
transition: mediaStreamTransition,
|
||||
@@ -188,10 +196,6 @@ final class CameraLiveStreamComponent: Component {
|
||||
// environment.controller()?.presentInGlobalOverlay(c, with: a)
|
||||
},
|
||||
close: {
|
||||
// guard let self, let environment = self.environment else {
|
||||
// return
|
||||
// }
|
||||
// environment.controller()?.dismiss()
|
||||
},
|
||||
navigate: { _ in
|
||||
},
|
||||
@@ -253,3 +257,128 @@ final class CameraLiveStreamComponent: Component {
|
||||
return view.update(component: self, availableSize: availableSize, state: state, environment: environment, transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
public final class StreamAsComponent: Component {
|
||||
let context: AccountContext
|
||||
let peerId: EnginePeer.Id
|
||||
|
||||
public init(
|
||||
context: AccountContext,
|
||||
peerId: EnginePeer.Id
|
||||
) {
|
||||
self.context = context
|
||||
self.peerId = peerId
|
||||
}
|
||||
|
||||
public static func ==(lhs: StreamAsComponent, rhs: StreamAsComponent) -> Bool {
|
||||
if lhs.context !== rhs.context {
|
||||
return false
|
||||
}
|
||||
if lhs.peerId != rhs.peerId {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
public final class View: UIView {
|
||||
private let avatarNode: AvatarNode
|
||||
private let title = ComponentView<Empty>()
|
||||
private let subtitle = ComponentView<Empty>()
|
||||
private var arrow = UIImageView()
|
||||
|
||||
private var component: StreamAsComponent?
|
||||
private weak var state: EmptyComponentState?
|
||||
|
||||
private var peer: EnginePeer?
|
||||
|
||||
public override init(frame: CGRect) {
|
||||
self.avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 18.0))
|
||||
self.arrow.image = generateTintedImage(image: UIImage(bundleImageName: "Item List/InlineTextRightArrow"), color: UIColor(white: 1.0, alpha: 0.8))
|
||||
|
||||
super.init(frame: frame)
|
||||
|
||||
self.addSubnode(self.avatarNode)
|
||||
self.addSubview(self.arrow)
|
||||
}
|
||||
|
||||
public required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
public func update(component: StreamAsComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<Empty>, transition: ComponentTransition) -> CGSize {
|
||||
self.component = component
|
||||
self.state = state
|
||||
|
||||
if self.peer?.id != component.peerId {
|
||||
let _ = (component.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: component.peerId))
|
||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||
guard let self, let peer else {
|
||||
return
|
||||
}
|
||||
self.peer = peer
|
||||
self.state?.updated()
|
||||
})
|
||||
}
|
||||
|
||||
self.avatarNode.frame = CGRect(origin: .zero, size: CGSize(width: 32.0, height: 32.0))
|
||||
if let peer = self.peer {
|
||||
self.avatarNode.setPeer(
|
||||
context: component.context,
|
||||
theme: component.context.sharedContext.currentPresentationData.with({ $0 }).theme,
|
||||
peer: peer,
|
||||
synchronousLoad: true
|
||||
)
|
||||
}
|
||||
|
||||
let titleSize = self.title.update(
|
||||
transition: .immediate,
|
||||
component: AnyComponent(
|
||||
MultilineTextComponent(
|
||||
text: .plain(NSAttributedString(string: self.peer?.compactDisplayTitle ?? "", font: Font.semibold(14.0), textColor: .white, paragraphAlignment: .left))
|
||||
)
|
||||
),
|
||||
environment: {},
|
||||
containerSize: CGSize(width: availableSize.width - 38.0, height: availableSize.height)
|
||||
)
|
||||
let titleFrame = CGRect(origin: CGPoint(x: 42.0, y: 1.0), size: titleSize)
|
||||
if let titleView = self.title.view {
|
||||
if titleView.superview == nil {
|
||||
self.addSubview(titleView)
|
||||
}
|
||||
titleView.frame = titleFrame
|
||||
}
|
||||
|
||||
let subtitleSize = self.subtitle.update(
|
||||
transition: .immediate,
|
||||
component: AnyComponent(
|
||||
MultilineTextComponent(
|
||||
text: .plain(NSAttributedString(string: "change", font: Font.regular(11.0), textColor: UIColor(white: 1.0, alpha: 0.8), paragraphAlignment: .left))
|
||||
)
|
||||
),
|
||||
environment: {},
|
||||
containerSize: CGSize(width: availableSize.width - 50.0, height: availableSize.height)
|
||||
)
|
||||
let subtitleFrame = CGRect(origin: CGPoint(x: 42.0, y: titleFrame.maxY + 2.0), size: subtitleSize)
|
||||
if let subtitleView = self.subtitle.view {
|
||||
if subtitleView.superview == nil {
|
||||
self.addSubview(subtitleView)
|
||||
}
|
||||
subtitleView.frame = subtitleFrame
|
||||
}
|
||||
|
||||
if let icon = self.arrow.image {
|
||||
self.arrow.frame = CGRect(origin: CGPoint(x: subtitleFrame.maxX + 1.0, y: floorToScreenPixels(subtitleFrame.midY - icon.size.height / 2.0) + 1.0), size: icon.size).insetBy(dx: 1.0, dy: 1.0)
|
||||
}
|
||||
|
||||
return CGSize(width: max(titleFrame.maxX, subtitleFrame.maxX + 16.0), height: 32.0)
|
||||
}
|
||||
}
|
||||
|
||||
public func makeView() -> View {
|
||||
return View(frame: CGRect())
|
||||
}
|
||||
|
||||
public func update(view: View, availableSize: CGSize, state: EmptyComponentState, environment: Environment<Empty>, transition: ComponentTransition) -> CGSize {
|
||||
return view.update(component: self, availableSize: availableSize, state: state, environment: environment, transition: transition)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user