Skip to content

Commit ed08dcd

Browse files
authored
[iPadOS 26][Woo POS] Flexible width and height for card present modals (#16104)
2 parents 636c35f + a019f60 commit ed08dcd

9 files changed

+56
-39
lines changed

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentBluetoothRequiredAlertView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ struct PointOfSaleCardPresentPaymentBluetoothRequiredAlertView: View {
2929
.fixedSize(horizontal: false, vertical: true)
3030
}
3131
.frame(maxWidth: .infinity)
32-
.scrollVerticallyIfNeeded()
3332

3433
Button(viewModel.openSettingsButtonViewModel.title,
3534
action: viewModel.openSettingsButtonViewModel.actionHandler)
3635
.buttonStyle(POSFilledButtonStyle(size: .normal))
3736
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3837
}
38+
.scrollVerticallyIfNeeded()
3939
.posModalCloseButton(action: viewModel.dismissButtonViewModel.actionHandler,
4040
accessibilityLabel: viewModel.dismissButtonViewModel.title)
4141
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentConnectingFailedChargeReaderView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ struct PointOfSaleCardPresentPaymentConnectingFailedChargeReaderView: View {
2424
}
2525
}
2626
.frame(maxWidth: .infinity)
27-
.scrollVerticallyIfNeeded()
2827

2928
Button(viewModel.retryButtonViewModel.title,
3029
action: viewModel.retryButtonViewModel.actionHandler)
3130
.buttonStyle(POSFilledButtonStyle(size: .normal))
3231
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3332
}
33+
.scrollVerticallyIfNeeded()
3434
.posModalCloseButton(action: viewModel.cancelButtonViewModel.actionHandler,
3535
accessibilityLabel: viewModel.cancelButtonViewModel.title)
3636
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentConnectingFailedLocationRequiredAlertView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ struct PointOfSaleCardPresentPaymentConnectingFailedLocationRequiredAlertView: V
2424
}
2525
}
2626
.frame(maxWidth: .infinity)
27-
.scrollVerticallyIfNeeded()
2827

2928
Button(viewModel.primaryButtonViewModel.title,
3029
action: viewModel.primaryButtonViewModel.actionHandler)
3130
.buttonStyle(POSFilledButtonStyle(size: .normal))
3231
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3332
}
33+
.scrollVerticallyIfNeeded()
3434
.posModalCloseButton(action: viewModel.cancelButtonViewModel.actionHandler,
3535
accessibilityLabel: viewModel.cancelButtonViewModel.title)
3636
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentConnectingFailedUpdatePostalCodeView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ struct PointOfSaleCardPresentPaymentConnectingFailedUpdatePostalCodeView: View {
2424
}
2525
}
2626
.frame(maxWidth: .infinity)
27-
.scrollVerticallyIfNeeded()
2827

2928
Button(viewModel.retryButtonViewModel.title,
3029
action: viewModel.retryButtonViewModel.actionHandler)
3130
.buttonStyle(POSFilledButtonStyle(size: .normal))
3231
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3332
}
33+
.scrollVerticallyIfNeeded()
3434
.posModalCloseButton(action: viewModel.cancelButtonViewModel.actionHandler,
3535
accessibilityLabel: viewModel.cancelButtonViewModel.title)
3636
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentConnectingFailedView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ struct PointOfSaleCardPresentPaymentConnectingFailedView: View {
3131
.fixedSize(horizontal: false, vertical: true)
3232
}
3333
.frame(maxWidth: .infinity)
34-
.scrollVerticallyIfNeeded()
3534

3635
Button(viewModel.retryButtonViewModel.title,
3736
action: viewModel.retryButtonViewModel.actionHandler)
3837
.buttonStyle(POSFilledButtonStyle(size: .normal))
3938
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
4039
}
40+
.scrollVerticallyIfNeeded()
4141
.posModalCloseButton(action: viewModel.cancelButtonViewModel.actionHandler,
4242
accessibilityLabel: viewModel.cancelButtonViewModel.title)
4343
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentFoundReaderView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ struct PointOfSaleCardPresentPaymentFoundReaderView: View {
2424
}
2525
}
2626
.frame(maxWidth: .infinity)
27-
.scrollVerticallyIfNeeded()
2827

2928
VStack(spacing: PointOfSaleReaderConnectionModalLayout.buttonSpacing) {
3029
Button(viewModel.connectButton.title,
@@ -37,6 +36,7 @@ struct PointOfSaleCardPresentPaymentFoundReaderView: View {
3736
}
3837
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3938
}
39+
.scrollVerticallyIfNeeded()
4040
.posModalCloseButton(action: viewModel.cancelSearchButton.actionHandler,
4141
accessibilityLabel: viewModel.cancelSearchButton.title)
4242
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/Connection Alerts/PointOfSaleCardPresentPaymentReaderUpdateFailedView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ struct PointOfSaleCardPresentPaymentReaderUpdateFailedView: View {
2323
.matchedGeometryEffect(id: animation.titleTransitionId, in: animation.namespace, properties: .position)
2424
}
2525
.frame(maxWidth: .infinity)
26-
.scrollVerticallyIfNeeded()
2726

2827
Button(viewModel.retryButtonViewModel.title,
2928
action: viewModel.retryButtonViewModel.actionHandler)
3029
.buttonStyle(POSFilledButtonStyle(size: .normal))
3130
.matchedGeometryEffect(id: animation.buttonsTransitionId, in: animation.namespace, properties: .position)
3231
}
32+
.scrollVerticallyIfNeeded()
3333
.posModalCloseButton(action: viewModel.cancelButtonViewModel.actionHandler,
3434
accessibilityLabel: viewModel.cancelButtonViewModel.title)
3535
.multilineTextAlignment(.center)

WooCommerce/Classes/POS/Presentation/Reusable Views/POSModalSizing.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extension View {
99

1010
struct POSModalSizing: ViewModifier {
1111
@Environment(\.sizeCategory) private var sizeCategory
12+
@Environment(\.posModalParentSize) private var parentSize
1213

1314
func body(content: Content) -> some View {
1415
content
@@ -19,6 +20,10 @@ struct POSModalSizing: ViewModifier {
1920

2021
private extension POSModalSizing {
2122
var frameWidth: CGFloat {
23+
return min(preferredFrameWidth, maxAvailableFrameWidth)
24+
}
25+
26+
var preferredFrameWidth: CGFloat {
2227
switch sizeCategory {
2328
case .extraSmall, .small:
2429
return 560
@@ -37,7 +42,15 @@ private extension POSModalSizing {
3742
}
3843
}
3944

45+
var maxAvailableFrameWidth: CGFloat {
46+
return parentSize.width
47+
}
48+
4049
var frameHeight: CGFloat {
50+
return min(preferredFrameHeight, maxAvailableFrameHeight)
51+
}
52+
53+
var preferredFrameHeight: CGFloat {
4154
switch sizeCategory {
4255
case .extraSmall, .small:
4356
return 640
@@ -56,6 +69,10 @@ private extension POSModalSizing {
5669
}
5770
}
5871

72+
var maxAvailableFrameHeight: CGFloat {
73+
parentSize.height
74+
}
75+
5976
var windowBounds: CGRect {
6077
window?.bounds ?? UIScreen.main.bounds
6178
}

WooCommerce/Classes/POS/Presentation/Reusable Views/POSModalViewModifier.swift

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,42 @@ struct POSRootModalViewModifier: ViewModifier {
88
private let scaleTransitionAmount = Constants.scaleTransitionAmount
99

1010
func body(content: Content) -> some View {
11-
ZStack {
12-
content
13-
.blur(radius: modalManager.isPresented ? 8 : 0)
14-
.disabled(modalManager.isPresented)
15-
.accessibilityElement(children: modalManager.isPresented ? .ignore : .contain)
16-
17-
if modalManager.isPresented {
18-
Color.posSurfaceDim.opacity(0.8)
19-
.edgesIgnoringSafeArea(.all)
20-
.onTapGesture {
21-
if modalManager.allowsInteractiveDismissal {
22-
modalManager.dismiss()
11+
content
12+
.blur(radius: modalManager.isPresented ? 8 : 0)
13+
.disabled(modalManager.isPresented)
14+
.accessibilityElement(children: modalManager.isPresented ? .ignore : .contain)
15+
.measureFrame { frame in
16+
updateModalParentSize(with: frame.size)
17+
}
18+
.overlay {
19+
if modalManager.isPresented {
20+
Color.posSurfaceDim.opacity(0.8)
21+
.edgesIgnoringSafeArea(.all)
22+
.onTapGesture {
23+
if modalManager.allowsInteractiveDismissal {
24+
modalManager.dismiss()
25+
}
2326
}
27+
// Don't scale/fade in the backdrop
28+
.animation(nil, value: modalManager.isPresented)
29+
ZStack {
30+
modalManager.getContent()
31+
.environment(\.posModalParentSize, modalParentSize)
32+
.background(Color.posSurfaceBright)
33+
.cornerRadius(POSCornerRadiusStyle.extraLarge.value)
34+
.posShadow(.large, cornerRadius: POSCornerRadiusStyle.extraLarge.value)
35+
.padding()
2436
}
25-
// Don't scale/fade in the backdrop
26-
.animation(nil, value: modalManager.isPresented)
27-
ZStack {
28-
modalManager.getContent()
29-
.environment(\.posModalParentSize, modalParentSize)
30-
.background(Color.posSurfaceBright)
31-
.cornerRadius(POSCornerRadiusStyle.extraLarge.value)
32-
.posShadow(.large, cornerRadius: POSCornerRadiusStyle.extraLarge.value)
33-
.padding()
37+
.zIndex(1)
38+
// Scale the modal container in and out, fading appropriately.
39+
// Unfortunately combined doesn't work on removal.
40+
// The extra ZStack prevents changing modalContent from scaling and fading, but the ZIndex needs to be
41+
// consistent even when animating out, which it wouldn't be if unspecified.
42+
.transition(.scale(scale: scaleTransitionAmount).combined(with: .opacity))
3443
}
35-
.zIndex(1)
36-
// Scale the modal container in and out, fading appropriately.
37-
// Unfortunately combined doesn't work on removal.
38-
// The extra ZStack prevents changing modalContent from scaling and fading, but the ZIndex needs to be
39-
// consistent even when animating out, which it wouldn't be if unspecified.
40-
.transition(.scale(scale: scaleTransitionAmount).combined(with: .opacity))
4144
}
42-
}
43-
.measureFrame { frame in
44-
updateModalParentSize(with: frame.size)
45-
}
46-
.animation(.easeInOut(duration: animationDuration), value: modalManager.isPresented)
45+
.animation(.easeInOut(duration: animationDuration), value: modalManager.isPresented)
46+
.ignoresSafeArea()
4747
}
4848

4949
private func updateModalParentSize(with size: CGSize) {

0 commit comments

Comments
 (0)