[ios][promo] promo after booking is added

This commit is contained in:
Arsentiy Milchakov 2019-07-11 19:49:58 +03:00 committed by Aleksey Belousov
parent 8213956cb3
commit 823c1e2b3e
18 changed files with 309 additions and 6 deletions

View file

@ -70,6 +70,6 @@ class Info;
- (id<MWMBookingInfoHolder>)bookingInfoHolder;
- (void)showTutorialIfNeeded;
- (void)showAdditionalViewsIfNeeded;
@end

View file

@ -16,6 +16,7 @@
#include "platform/local_country_file_utils.hpp"
#include "platform/platform.hpp"
#include "platform/preferred_languages.hpp"
#include "storage/storage_helpers.hpp"
@ -418,8 +419,7 @@ extern NSString * const kAlohalyticsTapEventKey;
return tutorial;
}
- (void)showTutorialIfNeeded
{
- (void)showAdditionalViewsIfNeeded {
auto ownerController = self.ownerController;
if ([MWMRouter isRoutingActive] || [MWMRouter hasSavedRoute])
@ -437,13 +437,50 @@ extern NSString * const kAlohalyticsTapEventKey;
if (DeepLinkHandler.shared.isLaunchedByDeeplink)
return;
if (self.tutorialViewContoller != nil)
if ([self showPromoBookingIfNeeded])
return;
[self showTutorialIfNeeded];
}
- (BOOL)showPromoBookingIfNeeded {
auto policy = platform::GetCurrentNetworkPolicy();
auto promoApi = GetFramework().GetPromoApi(policy);
if (promoApi == nullptr)
return NO;
auto const promoAfterBooking = promoApi->GetAfterBooking(languages::GetCurrentNorm());
if (promoAfterBooking.IsEmpty())
return NO;
auto const ok = ^{
auto urlString = @(promoAfterBooking.m_promoUrl.c_str());
auto url = [NSURL URLWithString:urlString];
[MapViewController.sharedController openCatalogDeeplink:url animated:YES utm:MWMUTMNone];
[self.ownerController dismissViewControllerAnimated:YES completion:nil];
};
auto cancel = ^{
[self.ownerController dismissViewControllerAnimated:YES completion:nil];
};
auto cityImageUrl = @(promoAfterBooking.m_pictureUrl.c_str());
auto alert = [[PromoAfterBookingViewController alloc] initWithCityImageUrl:cityImageUrl ok:ok cancel:cancel];
[self.ownerController presentViewController:alert animated:YES completion:nil];
[MWMEye promoAfterBookingShownWithCityId:@(promoAfterBooking.m_id.c_str())];
return YES;
}
- (BOOL)showTutorialIfNeeded {
if (self.tutorialViewContoller != nil)
return YES;
self.tutorialType = [MWMEye getTipType];
self.tutorialViewContoller = [self tutorialWithType:self.tutorialType];
if (!self.tutorialViewContoller)
return;
return NO;
auto ownerController = self.ownerController;
[self logTutorialEvent:kStatTipsTricksShow additionalOptions:nil];
self.hidden = NO;
@ -452,6 +489,8 @@ extern NSString * const kAlohalyticsTapEventKey;
self.tutorialViewContoller.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[ownerController.controlsView addSubview:self.tutorialViewContoller.view];
[self.tutorialViewContoller didMoveToParentViewController:ownerController];
return YES;
}
- (void)didPressCancel:(MWMTutorialViewController *)viewController {

View file

@ -289,7 +289,7 @@ BOOL gIsFirstMyPositionMode = YES;
- (void)didBecomeActive
{
if (!self.welcomePageController)
[self.controlsManager showTutorialIfNeeded];
[self.controlsManager showAdditionalViewsIfNeeded];
}
- (void)viewDidLayoutSubviews

View file

@ -33,5 +33,7 @@ typedef NS_ENUM(NSUInteger, MWMEyeDiscoveryEvent)
+ (void)boomarksCatalogShown;
+ (void)discoveryShown;
+ (void)discoveryItemClickedWithEvent:(MWMEyeDiscoveryEvent)event;
+ (void)transitionToBookingWithPos:(CGPoint)pos;
+ (void)promoAfterBookingShownWithCityId:(NSString *)cityId;
@end

View file

@ -36,4 +36,13 @@
eye::Eye::Event::DiscoveryItemClicked((eye::Discovery::Event)event);
}
+ (void)transitionToBookingWithPos:(CGPoint)pos
{
eye::Eye::Event::TransitionToBooking({pos.x, pos.y});
}
+ (void)promoAfterBookingShownWithCityId:(NSString *)cityId
{
eye::Eye::Event::PromoAfterBookingShown(cityId.UTF8String);
}
@end

View file

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_dark.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_dark@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_dark@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_light.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_light@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "img_booking_popup_pholder_light@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View file

@ -339,6 +339,8 @@
34FE5A6F1F18F30F00BCA729 /* TrafficButtonArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34FE5A6D1F18F30F00BCA729 /* TrafficButtonArea.swift */; };
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3D15ACED2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm */; };
3D1958EB213804B6009A83EC /* libmetrics.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D1958EA213804B6009A83EC /* libmetrics.a */; };
3DB1C57122D5DDA60097EC4C /* PromoAfterBookingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */; };
3DE1762422D614B8000214FF /* PromoAfterBookingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */; };
3DEE1AEB21F72CD300054A91 /* MWMPowerManagmentViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DEE1AEA21F72CD300054A91 /* MWMPowerManagmentViewController.mm */; };
3DF9C22B207CC14A00DA0793 /* taxi_places in Resources */ = {isa = PBXBuildFile; fileRef = 3DF9C22A207CC14A00DA0793 /* taxi_places */; };
408645FC21495EB1000A4A1D /* categories_cuisines.txt in Resources */ = {isa = PBXBuildFile; fileRef = 408645FB21495EB1000A4A1D /* categories_cuisines.txt */; };
@ -1388,7 +1390,9 @@
3D15ACED2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMObjectsCategorySelectorDataSource.mm; sourceTree = "<group>"; };
3D15ACEF2155118800F725D5 /* MWMObjectsCategorySelectorDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMObjectsCategorySelectorDataSource.h; sourceTree = "<group>"; };
3D1958EA213804B6009A83EC /* libmetrics.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libmetrics.a; sourceTree = BUILT_PRODUCTS_DIR; };
3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PromoAfterBookingViewController.xib; sourceTree = "<group>"; };
3DDB4BC31DAB98F000F4D021 /* libpartners_api.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpartners_api.a; path = "../../../omim-xcode-build/Debug-iphonesimulator/libpartners_api.a"; sourceTree = "<group>"; };
3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoAfterBookingViewController.swift; sourceTree = "<group>"; };
3DEE1AE921F72CD300054A91 /* MWMPowerManagmentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPowerManagmentViewController.h; sourceTree = "<group>"; };
3DEE1AEA21F72CD300054A91 /* MWMPowerManagmentViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPowerManagmentViewController.mm; sourceTree = "<group>"; };
3DF9C22A207CC14A00DA0793 /* taxi_places */ = {isa = PBXFileReference; lastKnownFileType = folder; name = taxi_places; path = ../../data/taxi_places; sourceTree = "<group>"; };
@ -3404,6 +3408,15 @@
path = Widgets;
sourceTree = "<group>";
};
3DB1C56F22D5DCF20097EC4C /* Promo */ = {
isa = PBXGroup;
children = (
3DB1C57022D5DDA60097EC4C /* PromoAfterBookingViewController.xib */,
3DE1762322D614B8000214FF /* PromoAfterBookingViewController.swift */,
);
path = Promo;
sourceTree = "<group>";
};
470F5A7B2189BA7200754295 /* InappPurchase */ = {
isa = PBXGroup;
children = (
@ -3992,6 +4005,7 @@
F6E2FC321E097B9F0083EBEC /* Editor */,
F6E2FC8A1E097B9F0083EBEC /* Migration */,
F6E2FC8F1E097B9F0083EBEC /* PlacePage */,
3DB1C56F22D5DCF20097EC4C /* Promo */,
343029191F87BBF300D0A07C /* Reviews */,
F6E2FCE11E097B9F0083EBEC /* Search */,
F6E2FD361E097BA00083EBEC /* Settings */,
@ -4847,6 +4861,7 @@
34D3B02D1E389D05004100F9 /* MWMEditorAdditionalNameTableViewCell.xib in Resources */,
34D3B0331E389D05004100F9 /* MWMEditorCategoryCell.xib in Resources */,
F6E2FDCB1E097BA00083EBEC /* MWMEditorNotesFooter.xib in Resources */,
3DB1C57122D5DDA60097EC4C /* PromoAfterBookingViewController.xib in Resources */,
474AC76D2139E4F2002F9BF9 /* RemoveAdsViewController.xib in Resources */,
34D3B0391E389D05004100F9 /* MWMEditorSelectTableViewCell.xib in Resources */,
34AB663B1FC5AA330078E451 /* RouteManagerViewController.xib in Resources */,
@ -5496,6 +5511,7 @@
34D4FA631E26572D003F53EF /* FirstLaunchController.swift in Sources */,
3404756E1E081A4600C92850 /* MWMSearch.mm in Sources */,
6741AA191BF340DE002C974C /* MWMDownloaderDialogCell.mm in Sources */,
3DE1762422D614B8000214FF /* PromoAfterBookingViewController.swift in Sources */,
34AB66441FC5AA330078E451 /* RouteManagerViewModelProtocol.swift in Sources */,
3486B5081E27A4B50069C126 /* LocalNotificationManager.mm in Sources */,
3454D7BF1E07F045004AF2AD /* DateComponentsFormatter+ETA.swift in Sources */,

View file

@ -518,6 +518,9 @@ void RegisterEventIfPossible(eye::MapObject::Event::Type const type, place_page:
NSAssert(url, @"Sponsored url can't be nil!");
[UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil];
if (data.isBooking)
[MWMEye transitionToBookingWithPos:CGPointMake(data.mercator.x, data.mercator.y)];
}
- (void)book

View file

@ -0,0 +1,51 @@
@objc
class PromoAfterBookingViewController: UIViewController {
private let transitioning = FadeTransitioning<AlertPresentationController>()
private var cityImageUrl: String
private var ok: MWMVoidBlock
private var cancel: MWMVoidBlock
@IBOutlet weak var cityImageView: UIImageView!
@objc init(cityImageUrl: String, ok: @escaping MWMVoidBlock, cancel: @escaping MWMVoidBlock) {
self.cityImageUrl = cityImageUrl
self.ok = ok
self.cancel = cancel
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
setCityImage(cityImageUrl)
}
private func setCityImage(_ imageUrl: String) {
cityImageView.image = UIColor.isNightMode()
? UIImage(named: "img_booking_popup_pholder_night")
: UIImage(named: "img_booking_popup_pholder")
if !imageUrl.isEmpty, let url = URL(string: imageUrl) {
cityImageView.wi_setImage(with: url, transitionDuration: kDefaultAnimationDuration)
}
}
@IBAction func onOk() {
ok()
}
@IBAction func onCancel() {
cancel()
}
override var transitioningDelegate: UIViewControllerTransitioningDelegate? {
get { return transitioning }
set { }
}
override var modalPresentationStyle: UIModalPresentationStyle {
get { return .custom }
set { }
}
}

View file

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="landscape">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="PromoAfterBookingViewController" customModule="maps_me" customModuleProvider="target">
<connections>
<outlet property="cityImageView" destination="sDQ-mR-Qzk" id="zGI-LE-s8P"/>
<outlet property="view" destination="BIK-1L-Jgv" id="j5K-AU-y0g"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="BIK-1L-Jgv">
<rect key="frame" x="0.0" y="0.0" width="307" height="339"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="img_booking_popup_pholder_light" translatesAutoresizingMaskIntoConstraints="NO" id="sDQ-mR-Qzk" userLabel="City Image">
<rect key="frame" x="0.0" y="0.0" width="307" height="128"/>
<constraints>
<constraint firstAttribute="height" constant="128" id="NJk-9b-9g9"/>
<constraint firstAttribute="width" constant="307" id="Rye-Y6-lJx"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Booked a hotel?" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rST-i3-ilM">
<rect key="frame" x="18" y="144" width="271" height="21.5"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
<color key="textColor" white="0.0" alpha="0.86124785958904104" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="popup_booking_download_guides_title"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold18"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Take a look at ready-made trips around the place!" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9tQ-SL-jQU">
<rect key="frame" x="18" y="173.5" width="271" height="33.5"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" white="0.0" alpha="0.54000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="popup_booking_download_guides_message"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
</userDefinedRuntimeAttributes>
</label>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="s7h-bI-mHW">
<rect key="frame" x="16" y="227" width="275" height="48"/>
<color key="backgroundColor" red="0.11767578125" green="0.58980089430000004" blue="0.94108072916666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="275" id="0m8-86-yE0"/>
<constraint firstAttribute="height" constant="48" id="2Aa-Ig-c33"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
<state key="normal" title="Discover Guides"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="popup_mwm_download_guides_cta"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold16"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onOk" destination="-1" eventType="touchUpInside" id="fNr-s9-Hg3"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3oa-Vj-n0Q">
<rect key="frame" x="16" y="283" width="275" height="48"/>
<constraints>
<constraint firstAttribute="width" constant="275" id="cwU-Xt-F7y"/>
<constraint firstAttribute="height" constant="48" id="f8G-sC-CzS"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
<state key="normal" title="Cancel">
<color key="titleColor" white="0.0" alpha="0.37976241438356162" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="cancel"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onCancel" destination="-1" eventType="touchUpInside" id="cRZ-PQ-NWh"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="sDQ-mR-Qzk" firstAttribute="leading" secondItem="KOL-sB-eMa" secondAttribute="leading" id="1gC-m1-Vt8"/>
<constraint firstItem="sDQ-mR-Qzk" firstAttribute="top" secondItem="KOL-sB-eMa" secondAttribute="top" id="2ew-IR-iMY"/>
<constraint firstItem="3oa-Vj-n0Q" firstAttribute="top" secondItem="s7h-bI-mHW" secondAttribute="bottom" constant="8" id="3vS-Sf-cy1"/>
<constraint firstItem="rST-i3-ilM" firstAttribute="top" secondItem="sDQ-mR-Qzk" secondAttribute="bottom" constant="16" id="6tG-Pi-hDQ"/>
<constraint firstItem="rST-i3-ilM" firstAttribute="leading" secondItem="KOL-sB-eMa" secondAttribute="leading" constant="18" id="75L-G4-PJ4"/>
<constraint firstItem="KOL-sB-eMa" firstAttribute="trailing" secondItem="rST-i3-ilM" secondAttribute="trailing" constant="18" id="9g8-5m-yul"/>
<constraint firstItem="3oa-Vj-n0Q" firstAttribute="leading" secondItem="KOL-sB-eMa" secondAttribute="leading" constant="16" id="FoX-wo-jMZ"/>
<constraint firstItem="s7h-bI-mHW" firstAttribute="top" secondItem="9tQ-SL-jQU" secondAttribute="bottom" constant="20" id="PbO-1K-3bN"/>
<constraint firstItem="9tQ-SL-jQU" firstAttribute="top" secondItem="rST-i3-ilM" secondAttribute="bottom" constant="8" id="Sm7-8W-ZWh"/>
<constraint firstItem="KOL-sB-eMa" firstAttribute="trailing" secondItem="9tQ-SL-jQU" secondAttribute="trailing" constant="18" id="WLR-t2-3Qp"/>
<constraint firstItem="KOL-sB-eMa" firstAttribute="trailing" secondItem="s7h-bI-mHW" secondAttribute="trailing" constant="16" id="hU8-gZ-kny"/>
<constraint firstItem="s7h-bI-mHW" firstAttribute="leading" secondItem="KOL-sB-eMa" secondAttribute="leading" constant="16" id="kGK-rF-oHQ"/>
<constraint firstItem="9tQ-SL-jQU" firstAttribute="leading" secondItem="KOL-sB-eMa" secondAttribute="leading" constant="18" id="kxH-7p-4pU"/>
<constraint firstItem="KOL-sB-eMa" firstAttribute="trailing" secondItem="3oa-Vj-n0Q" secondAttribute="trailing" constant="16" id="qx8-UG-zXp"/>
<constraint firstItem="sDQ-mR-Qzk" firstAttribute="trailing" secondItem="KOL-sB-eMa" secondAttribute="trailing" id="s8H-x9-uGL"/>
<constraint firstItem="KOL-sB-eMa" firstAttribute="bottom" secondItem="3oa-Vj-n0Q" secondAttribute="bottom" constant="8" id="ykg-KU-alf"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="KOL-sB-eMa"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<point key="canvasLocation" x="-779" y="-103"/>
</view>
</objects>
<resources>
<image name="img_booking_popup_pholder_light" width="307" height="128"/>
</resources>
</document>