Skip to content

Commit 2ba1f61

Browse files
committed
Various fixes
1 parent bbad574 commit 2ba1f61

10 files changed

Lines changed: 113 additions & 74 deletions

File tree

Telegram/Telegram-iOS/en.lproj/Localizable.strings

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15697,8 +15697,8 @@ Error: %8$@";
1569715697
"Gift.Craft.Info.Paragraph3.Title" = "Affect the Result";
1569815698
"Gift.Craft.Info.Paragraph3.Text" = "Use gifts with the same attribute to boost it's chance.";
1569915699
"Gift.Craft.Info.Understood" = "Understood";
15700-
"Gift.Craft.Unavailable.Title" = "Try Later";
15701-
"Gift.Craft.Unavailable.Text" = "You will be able to craft this gift on %@.";
15700+
"Gift.Craft.Unavailable.Title" = "Crafting Unavailable";
15701+
"Gift.Craft.Unavailable.Text" = "This gift will become available for crafting on **%@**.";
1570215702
"Gift.Craft.Error.NotAvailable" = "One of the gifts is not available for crafting.";
1570315703

1570415704
"Gift.Craft.Select.Title" = "Select Gifts";

submodules/Components/ResizableSheetComponent/Sources/ResizableSheetComponent.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ public final class ResizableSheetComponent<ChildEnvironmentType: Sendable & Equa
623623
environment: {},
624624
containerSize: CGSize(width: containerSize.width - 66.0 * 2.0, height: 66.0)
625625
)
626-
let titleItemFrame = CGRect(origin: CGPoint(x: rawSideInset + floorToScreenPixels((containerSize.width - titleItemSize.width)) / 2.0, y: floorToScreenPixels(36.0 - titleItemSize.height * 0.5)), size: titleItemSize)
626+
let titleItemFrame = CGRect(origin: CGPoint(x: rawSideInset + floorToScreenPixels((containerSize.width - titleItemSize.width)) / 2.0, y: floorToScreenPixels(38.0 - titleItemSize.height * 0.5)), size: titleItemSize)
627627
if let view = titleItemView.view {
628628
if view.superview == nil {
629629
self.navigationBarContainer.addSubview(view)

submodules/TelegramCallsUI/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ swift_library(
132132
"//submodules/TelegramUI/Components/Calls/VideoChatMicButtonComponent",
133133
"//submodules/TelegramUI/Components/AlertComponent",
134134
"//submodules/TelegramUI/Components/AlertComponent/AlertInputFieldComponent",
135+
"//submodules/TelegramUI/Components/GlassControls",
135136
],
136137
visibility = [
137138
"//visibility:public",

submodules/TelegramCallsUI/Sources/ScheduleVideoChatSheetScreen.swift

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import BalancedTextComponent
1313
import TelegramPresentationData
1414
import TelegramStringFormatting
1515
import Markdown
16+
import GlassControls
1617

1718
private final class ScheduleVideoChatSheetContentComponent: Component {
1819
typealias EnvironmentType = ViewControllerComponentContainer.Environment
@@ -33,8 +34,8 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
3334
}
3435

3536
final class View: UIView {
36-
private let button = ComponentView<Empty>()
37-
private let cancelButton = ComponentView<Empty>()
37+
private let buttons = ComponentView<Empty>()
38+
private let actionButton = ComponentView<Empty>()
3839

3940
private let title = ComponentView<Empty>()
4041
private let mainText = ComponentView<Empty>()
@@ -110,6 +111,43 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
110111
var contentHeight: CGFloat = 0.0
111112
contentHeight += 16.0
112113

114+
let buttonsSize = self.buttons.update(
115+
transition: transition,
116+
component: AnyComponent(
117+
GlassControlPanelComponent(
118+
theme: environment.theme,
119+
leftItem: GlassControlPanelComponent.Item(
120+
items: [
121+
GlassControlGroupComponent.Item(
122+
id: AnyHashable("close"),
123+
content: .icon("Navigation/Close"),
124+
action: { [weak self] in
125+
guard let component = self?.component else {
126+
return
127+
}
128+
component.dismiss()
129+
}
130+
)
131+
],
132+
background: .panel
133+
),
134+
centralItem: nil,
135+
rightItem: nil,
136+
centerAlignmentIfPossible: true,
137+
isDark: true
138+
)
139+
),
140+
environment: {},
141+
containerSize: CGSize(width: availableSize.width - 16.0 * 2.0, height: 44.0)
142+
)
143+
if let buttonsView = self.buttons.view {
144+
if buttonsView.superview == nil {
145+
self.addSubview(buttonsView)
146+
}
147+
transition.setFrame(view: buttonsView, frame: CGRect(origin: CGPoint(x: floor((availableSize.width - buttonsSize.width) * 0.5), y: contentHeight), size: buttonsSize))
148+
}
149+
contentHeight += buttonsSize.height
150+
113151
let titleString = NSMutableAttributedString()
114152
titleString.append(NSAttributedString(string: environment.strings.VideoChat_ScheduleButtonTitle, font: Font.semibold(17.0), textColor: environment.theme.list.itemPrimaryTextColor))
115153

@@ -126,9 +164,8 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
126164
if titleView.superview == nil {
127165
self.addSubview(titleView)
128166
}
129-
transition.setFrame(view: titleView, frame: CGRect(origin: CGPoint(x: floor((availableSize.width - titleSize.width) * 0.5), y: contentHeight), size: titleSize))
167+
transition.setFrame(view: titleView, frame: CGRect(origin: CGPoint(x: floor((availableSize.width - titleSize.width) * 0.5), y: contentHeight - buttonsSize.height * 0.5 - titleSize.height * 0.5), size: titleSize))
130168
}
131-
contentHeight += titleSize.height
132169
contentHeight += 16.0
133170

134171
let pickerView: UIDatePicker
@@ -221,17 +258,20 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
221258
transition.setFrame(view: mainTextView, frame: CGRect(origin: CGPoint(x: floor((availableSize.width - mainTextSize.width) * 0.5), y: contentHeight), size: mainTextSize))
222259
}
223260
contentHeight += mainTextSize.height
224-
contentHeight += 10.0
261+
contentHeight += 32.0
225262

226263
var buttonContents: [AnyComponentWithIdentity<Empty>] = []
227264
buttonContents.append(AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent(
228265
Text(text: buttonTitle, font: Font.semibold(17.0), color: environment.theme.list.itemCheckColors.foregroundColor)
229266
)))
230267
let buttonTransition = transition
231-
let buttonSize = self.button.update(
268+
269+
let buttonInsets = ContainerViewLayout.concentricInsets(bottomInset: environment.safeInsets.bottom, innerDiameter: 52.0, sideInset: 30.0)
270+
let buttonSize = self.actionButton.update(
232271
transition: buttonTransition,
233272
component: AnyComponent(ButtonComponent(
234273
background: ButtonComponent.Background(
274+
style: .glass,
235275
color: UIColor(rgb: 0x3252EF),
236276
foreground: .white,
237277
pressedColor: UIColor(rgb: 0x3252EF).withMultipliedAlpha(0.8)
@@ -250,56 +290,17 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
250290
}
251291
)),
252292
environment: {},
253-
containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 50.0)
293+
containerSize: CGSize(width: availableSize.width - buttonInsets.left - buttonInsets.right, height: 52.0)
254294
)
255-
let buttonFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight), size: buttonSize)
256-
if let buttonView = self.button.view {
295+
let buttonFrame = CGRect(origin: CGPoint(x: buttonInsets.left, y: contentHeight), size: buttonSize)
296+
if let buttonView = self.actionButton.view {
257297
if buttonView.superview == nil {
258298
self.addSubview(buttonView)
259299
}
260300
transition.setFrame(view: buttonView, frame: buttonFrame)
261301
}
262302
contentHeight += buttonSize.height
263-
contentHeight += 10.0
264-
265-
let cancelButtonSize = self.cancelButton.update(
266-
transition: buttonTransition,
267-
component: AnyComponent(ButtonComponent(
268-
background: ButtonComponent.Background(
269-
color: UIColor(rgb: 0x2B2B2F),
270-
foreground: .white,
271-
pressedColor: UIColor(rgb: 0x2B2B2F).withMultipliedAlpha(0.8)
272-
),
273-
content: AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent(
274-
Text(text: environment.strings.Common_Cancel, font: Font.semibold(17.0), color: environment.theme.list.itemPrimaryTextColor)
275-
)),
276-
isEnabled: true,
277-
tintWhenDisabled: false,
278-
displaysProgress: false,
279-
action: { [weak self] in
280-
guard let self, let component = self.component else {
281-
return
282-
}
283-
component.dismiss()
284-
}
285-
)),
286-
environment: {},
287-
containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 50.0)
288-
)
289-
let cancelButtonFrame = CGRect(origin: CGPoint(x: sideInset, y: contentHeight), size: cancelButtonSize)
290-
if let cancelButtonView = self.cancelButton.view {
291-
if cancelButtonView.superview == nil {
292-
self.addSubview(cancelButtonView)
293-
}
294-
transition.setFrame(view: cancelButtonView, frame: cancelButtonFrame)
295-
}
296-
contentHeight += cancelButtonSize.height
297-
298-
if environment.safeInsets.bottom.isZero {
299-
contentHeight += 16.0
300-
} else {
301-
contentHeight += environment.safeInsets.bottom + 14.0
302-
}
303+
contentHeight += buttonInsets.bottom
303304

304305
return CGSize(width: availableSize.width, height: contentHeight)
305306
}
@@ -407,7 +408,8 @@ private final class ScheduleVideoChatSheetScreenComponent: Component {
407408
})
408409
}
409410
)),
410-
backgroundColor: .color(UIColor(rgb: 0x1C1C1E)),
411+
style: .glass,
412+
backgroundColor: .color(UIColor(rgb: 0x1c1c1e)),
411413
animateOut: self.sheetAnimateOut
412414
)),
413415
environment: {

submodules/TelegramUI/Components/Gifts/GiftCraftScreen/Sources/GiftCraftScreen.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,6 +1517,7 @@ private final class SheetContainerComponent: CombinedComponent {
15171517
let state = context.state
15181518

15191519
let strings = environment.strings
1520+
let dateTimeFormat = environment.dateTimeFormat
15201521

15211522
if externalState.displayFailure {
15221523
state.displayFailure = true
@@ -1846,6 +1847,9 @@ private final class SheetContainerComponent: CombinedComponent {
18461847
if let navigationController = controller()?.navigationController {
18471848
var text: String = strings.Login_UnknownError
18481849
switch error {
1850+
case let .tooEarly(canCraftDate):
1851+
let dateString = stringForFullDate(timestamp: canCraftDate, strings: strings, dateTimeFormat: dateTimeFormat)
1852+
text = strings.Gift_Craft_Unavailable_Text(dateString).string
18491853
case .unavailable:
18501854
text = strings.Gift_Craft_Error_NotAvailable
18511855
default:

submodules/TelegramUI/Components/Gifts/GiftCraftScreen/Sources/SelectCraftGiftScreen.swift

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ final class SelectGiftPageContent: Component {
8787
private var craftStateDisposable: Disposable?
8888

8989
private var availableGifts: [GiftItem] = []
90-
private var giftMap: [Int64: GiftItem] = [:]
90+
private var giftMap: [Int64: ProfileGiftsContext.State.StarGift] = [:]
9191

9292
private var availableSize: CGSize?
9393
private var currentBounds: CGRect?
@@ -203,11 +203,27 @@ final class SelectGiftPageContent: Component {
203203
isEditing: false,
204204
mode: .grid,
205205
action: { [weak self] in
206-
guard let self, let component = self.component else {
206+
guard let self, let component = self.component, let environment = self.environment else {
207207
return
208208
}
209209
HapticFeedback().impact(.light)
210210

211+
let currentTime = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
212+
if let profileGift = self.giftMap[gift.gift.id], let canCraftDate = profileGift.canCraftAt, currentTime < canCraftDate {
213+
let dateString = stringForFullDate(timestamp: canCraftDate, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat)
214+
let alertController = textAlertController(
215+
context: component.context,
216+
title: environment.strings.Gift_Craft_Unavailable_Title,
217+
text: environment.strings.Gift_Craft_Unavailable_Text(dateString).string,
218+
actions: [
219+
TextAlertAction(type: .defaultAction, title: environment.strings.Common_OK, action: {})
220+
],
221+
parseMarkdown: true
222+
)
223+
environment.controller()?.present(alertController, in: .window(.root))
224+
return
225+
}
226+
211227
component.selectGift(gift)
212228
component.dismiss()
213229
},
@@ -322,7 +338,6 @@ final class SelectGiftPageContent: Component {
322338
self.availableGifts = [
323339
initialGiftItem
324340
]
325-
self.giftMap = [initialGiftItem.gift.id: initialGiftItem]
326341

327342
self.craftStateDisposable = (component.craftContext.state
328343
|> deliverOnMainQueue).start(next: { [weak self] state in
@@ -332,32 +347,28 @@ final class SelectGiftPageContent: Component {
332347
self.craftState = state
333348

334349
var items: [GiftItem] = []
335-
var map: [Int64: GiftItem] = [:]
336-
var foundInitial = false
350+
var giftMap: [Int64: ProfileGiftsContext.State.StarGift] = [:]
351+
var existingIds = Set<Int64>()
337352
for gift in state.gifts {
338-
guard let reference = gift.reference, case let .unique(uniqueGift) = gift.gift else {
353+
guard let reference = gift.reference, case let .unique(uniqueGift) = gift.gift, !existingIds.contains(uniqueGift.id) else {
339354
continue
340355
}
356+
existingIds.insert(uniqueGift.id)
357+
341358
let giftItem = GiftItem(
342359
gift: uniqueGift,
343360
reference: reference
344361
)
345-
map[uniqueGift.id] = giftItem
346-
if uniqueGift.id == component.gift.id {
347-
foundInitial = true
348-
} else {
349-
if component.selectedGiftIds.contains(uniqueGift.id) {
350-
continue
351-
}
352-
items.append(giftItem)
362+
giftMap[uniqueGift.id] = gift
363+
364+
if component.selectedGiftIds.contains(uniqueGift.id) {
365+
continue
353366
}
367+
items.append(giftItem)
354368
}
355369

356-
if !foundInitial {
357-
map[initialGiftItem.gift.id] = initialGiftItem
358-
}
359370
self.availableGifts = items
360-
self.giftMap = map
371+
self.giftMap = giftMap
361372

362373
self.state?.updated(transition: .spring(duration: 0.4))
363374
})

submodules/TelegramUI/Components/Gifts/GiftViewScreen/Sources/GiftViewScreen.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,9 +1536,18 @@ private final class GiftViewSheetContent: CombinedComponent {
15361536
controller?.present(UndoOverlayController(presentationData: presentationData, content: .linkCopied(title: nil, text: presentationData.strings.Conversation_LinkCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
15371537
})))
15381538

1539-
if let _ = arguments.canCraftDate {
1539+
var canCraft = false
1540+
if let data = self.context.currentAppConfiguration.with({ $0 }).data {
1541+
if let _ = data["ios_enable_crafting"] {
1542+
canCraft = true
1543+
} else if let isDev = data["dev"] as? Double, isDev == 1.0 {
1544+
canCraft = true
1545+
}
1546+
}
1547+
1548+
if let _ = arguments.canCraftDate, canCraft {
15401549
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Gift_View_Context_Craft, icon: { theme in
1541-
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Link"), color: theme.contextMenu.primaryColor)
1550+
return generateTintedImage(image: UIImage(bundleImageName: "Premium/Craft/Craft"), color: theme.contextMenu.primaryColor)
15421551
}, action: { [weak self] c, _ in
15431552
c?.dismiss(completion: nil)
15441553

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "craft.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Binary file not shown.

submodules/TranslateUI/Sources/TranslateScreen.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ private final class SheetContent: CombinedComponent {
251251
return { context in
252252
let environment = context.environment[ViewControllerComponentContainer.Environment.self].value
253253
let state = context.state
254-
let theme = environment.theme
254+
let theme = environment.theme.withModalBlocksBackground()
255255
let strings = environment.strings
256256

257257
let topInset: CGFloat = environment.navigationHeight - 35.0

0 commit comments

Comments
 (0)