Commit ee616b19 authored by Wei Han's avatar Wei Han

code update

parent e25e0600
...@@ -7,24 +7,24 @@ ...@@ -7,24 +7,24 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
04AD2AFD03B4D56C1CE62F6A /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C73ABF42EDEF67482B70912 /* libPods-example.a */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
44006126336D83DB220E7214 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; 44006126336D83DB220E7214 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
950A967506366138996B34BA /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 08C95BC9A5B6BC17979676EC /* libPods-example.a */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
08C95BC9A5B6BC17979676EC /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; };
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = example/PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = example/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
1C73ABF42EDEF67482B70912 /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = example/AppDelegate.swift; sourceTree = "<group>"; }; 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = example/AppDelegate.swift; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = example/LaunchScreen.storyboard; sourceTree = "<group>"; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = example/LaunchScreen.storyboard; sourceTree = "<group>"; };
E9E0F976F970803123876068 /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
F97D380E3689279E81FCCF0D /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = "<group>"; }; FA5C9464D4270BCB5E2B5606 /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = "<group>"; };
FD2BE23365AFCE8816A3B912 /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
04AD2AFD03B4D56C1CE62F6A /* libPods-example.a in Frameworks */, 950A967506366138996B34BA /* libPods-example.a in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
1C73ABF42EDEF67482B70912 /* libPods-example.a */, 08C95BC9A5B6BC17979676EC /* libPods-example.a */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -92,8 +92,8 @@ ...@@ -92,8 +92,8 @@
BBD78D7AC51CEA395F1C20DB /* Pods */ = { BBD78D7AC51CEA395F1C20DB /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F97D380E3689279E81FCCF0D /* Pods-example.debug.xcconfig */, FA5C9464D4270BCB5E2B5606 /* Pods-example.debug.xcconfig */,
FD2BE23365AFCE8816A3B912 /* Pods-example.release.xcconfig */, E9E0F976F970803123876068 /* Pods-example.release.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -105,13 +105,13 @@ ...@@ -105,13 +105,13 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */;
buildPhases = ( buildPhases = (
09928E3D5127D716871C58DB /* [CP] Check Pods Manifest.lock */, 82370A9BDD9AA0D77C19EFC8 /* [CP] Check Pods Manifest.lock */,
13B07F871A680F5B00A75B9A /* Sources */, 13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */, 13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
49A09A0160A62946A28722B3 /* [CP] Embed Pods Frameworks */, E574563129899784DB9E58BA /* [CP] Embed Pods Frameworks */,
66729857758E088B57840AEF /* [CP] Copy Pods Resources */, D34FB6FAC9791DDA2B8870A6 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
...@@ -183,7 +183,7 @@ ...@@ -183,7 +183,7 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
}; };
09928E3D5127D716871C58DB /* [CP] Check Pods Manifest.lock */ = { 82370A9BDD9AA0D77C19EFC8 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
...@@ -205,38 +205,38 @@ ...@@ -205,38 +205,38 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
49A09A0160A62946A28722B3 /* [CP] Embed Pods Frameworks */ = { D34FB6FAC9791DDA2B8870A6 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Embed Pods Frameworks"; name = "[CP] Copy Pods Resources";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
66729857758E088B57840AEF /* [CP] Copy Pods Resources */ = { E574563129899784DB9E58BA /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Copy Pods Resources"; name = "[CP] Embed Pods Frameworks";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
...@@ -255,7 +255,7 @@ ...@@ -255,7 +255,7 @@
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = { 13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = F97D380E3689279E81FCCF0D /* Pods-example.debug.xcconfig */; baseConfigurationReference = FA5C9464D4270BCB5E2B5606 /* Pods-example.debug.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
...@@ -283,7 +283,7 @@ ...@@ -283,7 +283,7 @@
}; };
13B07F951A680F5B00A75B9A /* Release */ = { 13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = FD2BE23365AFCE8816A3B912 /* Pods-example.release.xcconfig */; baseConfigurationReference = E9E0F976F970803123876068 /* Pods-example.release.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
......
// AppointmentDetailsViewController.mm // AppointmentDetailsViewController.mm
#import "AppointmentDetailsViewController.h" #import "AppointmentDetailsViewController.h"
#import <WebKit/WebKit.h>
#import "AppointmentAPIClient.h" #import "AppointmentAPIClient.h"
#import <WebKit/WebKit.h>
@interface AppointmentDetailsViewController () @interface AppointmentDetailsViewController ()
// UI // Fixed UI
@property (nonatomic, strong) UIView *navBar; @property (nonatomic, strong) UIView *navBar;
@property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) UIButton *backButton;
@property (nonatomic, strong) UIView *unitInfoHeader; @property (nonatomic, strong) UIView *unitInfoHeader;
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIView *contentView;
@property (nonatomic, strong) UIView *statusBanner;
@property (nonatomic, strong) UILabel *statusLabel;
@property (nonatomic, strong) UILabel *reasonLabel;
@property (nonatomic, strong) UIView *summaryCard;
@property (nonatomic, strong) UIView *repCard;
@property (nonatomic, strong) UIView *buttonSection;
@property (nonatomic, strong) UIView *tabsBar; @property (nonatomic, strong) UIView *tabsBar;
@property (nonatomic, strong) UIView *summaryContainer; @property (nonatomic, strong) UIButton *summaryBtn;
@property (nonatomic, strong) UIView *ownerInfoContainer; @property (nonatomic, strong) UIButton *ownerBtn;
@property (nonatomic, strong) UIView *loadingOverlay;
// Scrollable content for each tab
@property (nonatomic, strong) UIScrollView *summaryScrollView;
@property (nonatomic, strong) UIView *summaryContentView;
@property (nonatomic, strong) UIView *summaryCard;
@property (nonatomic, strong) UIButton *summaryCancelBtn;
@property (nonatomic, strong) UILabel *typeField; @property (nonatomic, strong) UILabel *typeField;
@property (nonatomic, strong) UILabel *dateField; @property (nonatomic, strong) UILabel *dateField;
@property (nonatomic, strong) UILabel *slotField; @property (nonatomic, strong) UILabel *slotField;
@property (nonatomic, strong) UILabel *locField; @property (nonatomic, strong) UILabel *locField;
@property (nonatomic, strong) UILabel *termsField; @property (nonatomic, strong) UILabel *termsField;
@property (nonatomic, strong) UIButton *summaryBtn; @property (nonatomic, strong) UIScrollView *ownerScrollView;
@property (nonatomic, strong) UIButton *ownerBtn; @property (nonatomic, strong) UIView *ownerContentView;
@property (nonatomic, strong) NSMutableArray<UIView *> *ownerCards;
@property (nonatomic, strong) UIButton *ownerCancelBtn;
@end
@end
@implementation AppointmentDetailsViewController @implementation AppointmentDetailsViewController
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
self.view.backgroundColor = UIColor.whiteColor; self.view.backgroundColor = UIColor.whiteColor;
[self setupNavBar]; [self setupNavBar];
[self setupScrollView];
[self setupStatusBanner];
[self setupUnitInfoHeader]; [self setupUnitInfoHeader];
[self setupTabs]; [self setupTabsBar];
[self setupContainers]; [self setupSummaryScrollView];
[self setupSummaryCard]; [self setupOwnerScrollView];
[self setupButtonSection];
[self setupLoadingOverlay]; [self showSummary]; // default tab
[self applyAppointmentDataToUI];
} }
#pragma mark - Navigation Bar #pragma mark - NavBar
- (void)setupNavBar { - (void)setupNavBar {
self.navBar = [[UIView alloc] init]; self.navBar = [[UIView alloc] init];
self.navBar.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1]; self.navBar.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
self.navBar.translatesAutoresizingMaskIntoConstraints = NO; self.navBar.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.navBar]; [self.view addSubview:self.navBar];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"Appointment Details";
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.font = [UIFont boldSystemFontOfSize:17];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.navBar addSubview:self.titleLabel];
self.backButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.backButton setImage:[UIImage imageNamed:@"icon_white_back"] forState:UIControlStateNormal]; [self.backButton setImage:[UIImage imageNamed:@"icon_white_back"] forState:UIControlStateNormal];
[self.backButton addTarget:self action:@selector(backTapped) forControlEvents:UIControlEventTouchUpInside]; [self.backButton addTarget:self action:@selector(backTapped) forControlEvents:UIControlEventTouchUpInside];
self.backButton.translatesAutoresizingMaskIntoConstraints = NO; self.backButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.navBar addSubview:self.backButton]; [self.navBar addSubview:self.backButton];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"Appointment Details";
self.titleLabel.font = [UIFont boldSystemFontOfSize:17];
self.titleLabel.textColor = UIColor.whiteColor;
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.navBar addSubview:self.titleLabel];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.navBar.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], [self.navBar.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],
[self.navBar.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], [self.navBar.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.navBar.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], [self.navBar.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.navBar.heightAnchor constraintEqualToConstant:50], [self.navBar.heightAnchor constraintEqualToConstant:50],
[self.backButton.leadingAnchor constraintEqualToAnchor:self.navBar.leadingAnchor constant:10], [self.backButton.leadingAnchor constraintEqualToAnchor:self.navBar.leadingAnchor constant:10],
[self.backButton.centerYAnchor constraintEqualToAnchor:self.navBar.centerYAnchor], [self.backButton.centerYAnchor constraintEqualToAnchor:self.navBar.centerYAnchor],
[self.backButton.widthAnchor constraintEqualToConstant:30], [self.backButton.widthAnchor constraintEqualToConstant:30],
[self.backButton.heightAnchor constraintEqualToConstant:30], [self.backButton.heightAnchor constraintEqualToConstant:30],
[self.titleLabel.centerXAnchor constraintEqualToAnchor:self.navBar.centerXAnchor], [self.titleLabel.centerXAnchor constraintEqualToAnchor:self.navBar.centerXAnchor],
[self.titleLabel.centerYAnchor constraintEqualToAnchor:self.navBar.centerYAnchor], [self.titleLabel.centerYAnchor constraintEqualToAnchor:self.navBar.centerYAnchor],
]]; ]];
} }
#pragma mark - Unit Info Header #pragma mark - Unit Info Header
- (void)setupUnitInfoHeader { - (void)setupUnitInfoHeader {
UIView *header = [[UIView alloc] init]; UIView *header = [[UIView alloc] init];
header.translatesAutoresizingMaskIntoConstraints = NO; header.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:header]; [self.view addSubview:header];
// Line 1: "For Unit No.:"
UILabel *unitText = [[UILabel alloc] init]; UILabel *unitText = [[UILabel alloc] init];
unitText.text = @"For Unit No.:"; unitText.text = @"For Unit No.:";
unitText.textColor = UIColor.darkGrayColor; unitText.textColor = UIColor.darkGrayColor;
...@@ -110,6 +99,7 @@ ...@@ -110,6 +99,7 @@
unitText.translatesAutoresizingMaskIntoConstraints = NO; unitText.translatesAutoresizingMaskIntoConstraints = NO;
[header addSubview:unitText]; [header addSubview:unitText];
// Line 2: the actual unit number
UILabel *unitNumber = [[UILabel alloc] init]; UILabel *unitNumber = [[UILabel alloc] init];
unitNumber.text = self.appointmentData[@"unit_no"]; unitNumber.text = self.appointmentData[@"unit_no"];
unitNumber.font = [UIFont boldSystemFontOfSize:22]; unitNumber.font = [UIFont boldSystemFontOfSize:22];
...@@ -132,14 +122,15 @@ ...@@ -132,14 +122,15 @@
[header addSubview:floorPlan]; [header addSubview:floorPlan];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[header.topAnchor constraintEqualToAnchor:self.statusBanner.topAnchor constant:20], [header.topAnchor constraintEqualToAnchor:self.navBar.bottomAnchor constant:16],
[header.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor constant:16], [header.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:16],
[header.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-16], [header.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-16],
// Stack unit labels vertically
[unitText.topAnchor constraintEqualToAnchor:header.topAnchor], [unitText.topAnchor constraintEqualToAnchor:header.topAnchor],
[unitText.leadingAnchor constraintEqualToAnchor:header.leadingAnchor], [unitText.leadingAnchor constraintEqualToAnchor:header.leadingAnchor],
[unitNumber.topAnchor constraintEqualToAnchor:unitText.bottomAnchor constant:4], [unitNumber.topAnchor constraintEqualToAnchor:unitText.bottomAnchor constant:2],
[unitNumber.leadingAnchor constraintEqualToAnchor:header.leadingAnchor], [unitNumber.leadingAnchor constraintEqualToAnchor:header.leadingAnchor],
[unitType.topAnchor constraintEqualToAnchor:unitNumber.bottomAnchor constant:2], [unitType.topAnchor constraintEqualToAnchor:unitNumber.bottomAnchor constant:2],
...@@ -157,368 +148,269 @@ ...@@ -157,368 +148,269 @@
} }
#pragma mark - ScrollView #pragma mark - Tabs
- (void)setupTabsBar {
- (void)setupScrollView { self.tabsBar = [[UIView alloc] init];
self.scrollView = [[UIScrollView alloc] init]; self.tabsBar.translatesAutoresizingMaskIntoConstraints = NO;
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:self.tabsBar];
self.contentView = [[UIView alloc] init]; self.summaryBtn = [UIButton buttonWithType:UIButtonTypeCustom];
self.contentView.translatesAutoresizingMaskIntoConstraints = NO; [self.summaryBtn setTitle:@"Summary" forState:UIControlStateNormal];
self.summaryBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
[self.view addSubview:self.scrollView]; self.summaryBtn.layer.cornerRadius = 20;
[self.scrollView addSubview:self.contentView]; [self.summaryBtn addTarget:self action:@selector(showSummary) forControlEvents:UIControlEventTouchUpInside];
self.summaryBtn.translatesAutoresizingMaskIntoConstraints = NO;
[self.tabsBar addSubview:self.summaryBtn];
self.ownerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.ownerBtn setTitle:@"Owner Info" forState:UIControlStateNormal];
self.ownerBtn.backgroundColor = [UIColor lightGrayColor];
self.ownerBtn.layer.cornerRadius = 20;
[self.ownerBtn addTarget:self action:@selector(showOwnerInfo) forControlEvents:UIControlEventTouchUpInside];
self.ownerBtn.translatesAutoresizingMaskIntoConstraints = NO;
[self.tabsBar addSubview:self.ownerBtn];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.scrollView.topAnchor constraintEqualToAnchor:self.navBar.bottomAnchor], [self.tabsBar.topAnchor constraintEqualToAnchor:self.unitInfoHeader.bottomAnchor constant:10],
[self.scrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], [self.tabsBar.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:16],
[self.scrollView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], [self.tabsBar.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-16],
[self.scrollView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], [self.tabsBar.heightAnchor constraintEqualToConstant:40],
[self.contentView.topAnchor constraintEqualToAnchor:self.scrollView.topAnchor], [self.summaryBtn.leadingAnchor constraintEqualToAnchor:self.tabsBar.leadingAnchor],
[self.contentView.leadingAnchor constraintEqualToAnchor:self.scrollView.leadingAnchor], [self.summaryBtn.topAnchor constraintEqualToAnchor:self.tabsBar.topAnchor],
[self.contentView.trailingAnchor constraintEqualToAnchor:self.scrollView.trailingAnchor], [self.summaryBtn.bottomAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor],
[self.contentView.bottomAnchor constraintEqualToAnchor:self.scrollView.bottomAnchor], [self.summaryBtn.widthAnchor constraintEqualToAnchor:self.tabsBar.widthAnchor multiplier:0.5],
[self.contentView.widthAnchor constraintEqualToAnchor:self.scrollView.widthAnchor],
[self.ownerBtn.trailingAnchor constraintEqualToAnchor:self.tabsBar.trailingAnchor],
[self.ownerBtn.topAnchor constraintEqualToAnchor:self.tabsBar.topAnchor],
[self.ownerBtn.bottomAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor],
[self.ownerBtn.widthAnchor constraintEqualToAnchor:self.tabsBar.widthAnchor multiplier:0.5],
]]; ]];
} }
#pragma mark - Status Banner #pragma mark - Summary ScrollView
- (void)setupSummaryScrollView {
- (void)setupStatusBanner { self.summaryScrollView = [[UIScrollView alloc] init];
self.statusBanner = [[UIView alloc] init]; self.summaryScrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.statusBanner.layer.cornerRadius = 12; [self.view addSubview:self.summaryScrollView];
self.statusBanner.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:self.statusBanner]; self.summaryContentView = [[UIView alloc] init];
self.summaryContentView.translatesAutoresizingMaskIntoConstraints = NO;
self.statusLabel = [[UILabel alloc] init]; [self.summaryScrollView addSubview:self.summaryContentView];
self.statusLabel.font = [UIFont boldSystemFontOfSize:18];
self.statusLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.statusBanner addSubview:self.statusLabel];
self.reasonLabel = [[UILabel alloc] init];
self.reasonLabel.font = [UIFont systemFontOfSize:14];
self.reasonLabel.numberOfLines = 0;
self.reasonLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.statusBanner addSubview:self.reasonLabel];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.statusBanner.topAnchor constraintEqualToAnchor:self.contentView.topAnchor constant:20], [self.summaryScrollView.topAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor constant:10],
[self.statusBanner.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor constant:16], [self.summaryScrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.statusBanner.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-16], [self.summaryScrollView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.summaryScrollView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
[self.statusLabel.topAnchor constraintEqualToAnchor:self.statusBanner.topAnchor constant:16],
[self.statusLabel.leadingAnchor constraintEqualToAnchor:self.statusBanner.leadingAnchor constant:16], [self.summaryContentView.topAnchor constraintEqualToAnchor:self.summaryScrollView.topAnchor],
[self.summaryContentView.leadingAnchor constraintEqualToAnchor:self.summaryScrollView.leadingAnchor],
[self.reasonLabel.topAnchor constraintEqualToAnchor:self.statusLabel.bottomAnchor constant:8], [self.summaryContentView.trailingAnchor constraintEqualToAnchor:self.summaryScrollView.trailingAnchor],
[self.reasonLabel.leadingAnchor constraintEqualToAnchor:self.statusBanner.leadingAnchor constant:16], [self.summaryContentView.bottomAnchor constraintEqualToAnchor:self.summaryScrollView.bottomAnchor],
[self.reasonLabel.trailingAnchor constraintEqualToAnchor:self.statusBanner.trailingAnchor constant:-16], [self.summaryContentView.widthAnchor constraintEqualToAnchor:self.summaryScrollView.widthAnchor],
[self.reasonLabel.bottomAnchor constraintEqualToAnchor:self.statusBanner.bottomAnchor constant:-16],
]]; ]];
}
// Summary card
#pragma mark - Appointment Summary Card
- (void)setupSummaryCard {
self.summaryCard = [[UIView alloc] init]; self.summaryCard = [[UIView alloc] init];
self.summaryCard.backgroundColor = UIColor.whiteColor; self.summaryCard.backgroundColor = UIColor.whiteColor;
self.summaryCard.layer.cornerRadius = 12; self.summaryCard.layer.cornerRadius = 12;
self.summaryCard.layer.borderWidth = 1; self.summaryCard.layer.borderWidth = 1;
self.summaryCard.layer.borderColor = [UIColor colorWithWhite:0.9 alpha:1].CGColor; self.summaryCard.layer.borderColor = [UIColor colorWithWhite:0.9 alpha:1].CGColor;
self.summaryCard.translatesAutoresizingMaskIntoConstraints = NO; self.summaryCard.translatesAutoresizingMaskIntoConstraints = NO;
[self.summaryContainer addSubview:self.summaryCard]; [self.summaryContentView addSubview:self.summaryCard];
UILabel *title = [[UILabel alloc] init]; UILabel *titleLabel = [[UILabel alloc] init];
title.text = @"Appointment Summary"; titleLabel.text = @"Appointment Info";
title.font = [UIFont boldSystemFontOfSize:16]; titleLabel.font = [UIFont boldSystemFontOfSize:16];
title.translatesAutoresizingMaskIntoConstraints = NO; titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self.summaryContainer addSubview:title]; [self.summaryCard addSubview:titleLabel];
[NSLayoutConstraint activateConstraints:@[
[self.summaryCard.topAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor constant:20],
[self.summaryCard.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor constant:16],
[self.summaryCard.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-16],
[title.topAnchor constraintEqualToAnchor:self.summaryCard.topAnchor constant:16],
[title.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
]];
UILabel *(^makeField)(NSString*, NSString*) = ^UILabel*(NSString *label, NSString *value) { UILabel *(^makeField)(NSString*, NSString*) = ^UILabel*(NSString *label, NSString *value) {
UILabel *field = [[UILabel alloc] init]; UILabel *field = [[UILabel alloc] init];
field.numberOfLines = 0; field.numberOfLines = 0;
field.font = [UIFont systemFontOfSize:15]; field.font = [UIFont systemFontOfSize:15];
field.text = [NSString stringWithFormat:@"%@ %@", label, value]; field.text = [NSString stringWithFormat:@"%@ %@", label, value];
field.translatesAutoresizingMaskIntoConstraints = NO; field.translatesAutoresizingMaskIntoConstraints = NO;
[self.summaryCard addSubview:field]; [self.summaryCard addSubview:field];
return field; return field;
}; };
self.typeField = makeField(@"Type :", self.appointmentData[@"type"]); self.typeField = makeField(@"Type:", self.appointmentData[@"appointment_type"]);
self.dateField = makeField(@"Date :", self.appointmentData[@"date"]); self.dateField = makeField(@"Date:", self.appointmentData[@"appointment_date"]);
self.slotField = makeField(@"Time Slot :", self.appointmentData[@"time"]); self.slotField = makeField(@"Time Slot:", self.appointmentData[@"appointment_time"]);
self.locField = makeField(@"Location :", self.appointmentData[@"location"]); self.locField = makeField(@"Location:", self.appointmentData[@"location"]);
self.termsField = makeField(@"Terms &\n Conditions :", @"View Here"); self.termsField = makeField(@"Terms & Conditions:", @"View Here");
UIButton *calendarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
calendarBtn.layer.cornerRadius = 12;
calendarBtn.layer.borderWidth = 1;
calendarBtn.layer.borderColor = [UIColor colorWithWhite:0.8 alpha:1].CGColor;
calendarBtn.titleLabel.font = [UIFont systemFontOfSize:15];
[calendarBtn setImage:[UIImage systemImageNamed:@"calendar"] forState:UIControlStateNormal];
[calendarBtn setTitle:@" Add To Calendar" forState:UIControlStateNormal];
[calendarBtn setTitleColor:UIColor.blackColor forState:UIControlStateNormal];
calendarBtn.translatesAutoresizingMaskIntoConstraints = NO;
[self.summaryContainer addSubview:calendarBtn];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.typeField.topAnchor constraintEqualToAnchor:title.bottomAnchor constant:10], [self.summaryCard.topAnchor constraintEqualToAnchor:self.summaryContentView.topAnchor constant:20],
[self.summaryCard.leadingAnchor constraintEqualToAnchor:self.summaryContentView.leadingAnchor constant:16],
[self.summaryCard.trailingAnchor constraintEqualToAnchor:self.summaryContentView.trailingAnchor constant:-16],
[titleLabel.topAnchor constraintEqualToAnchor:self.summaryCard.topAnchor constant:16],
[titleLabel.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[titleLabel.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
[titleLabel.bottomAnchor constraintEqualToAnchor:self.summaryCard.bottomAnchor constant:-16],
[self.typeField.topAnchor constraintEqualToAnchor:titleLabel.bottomAnchor constant:12],
[self.typeField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16], [self.typeField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[self.typeField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16], [self.typeField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
[self.dateField.topAnchor constraintEqualToAnchor:self.typeField.bottomAnchor constant:10],
[self.dateField.leadingAnchor constraintEqualToAnchor:self.typeField.leadingAnchor],
[self.dateField.trailingAnchor constraintEqualToAnchor:self.typeField.trailingAnchor],
[self.slotField.topAnchor constraintEqualToAnchor:self.dateField.bottomAnchor constant:10],
[self.slotField.leadingAnchor constraintEqualToAnchor:self.typeField.leadingAnchor],
[self.slotField.trailingAnchor constraintEqualToAnchor:self.typeField.trailingAnchor],
[self.locField.topAnchor constraintEqualToAnchor:self.slotField.bottomAnchor constant:10],
[self.locField.leadingAnchor constraintEqualToAnchor:self.typeField.leadingAnchor],
[self.locField.trailingAnchor constraintEqualToAnchor:self.typeField.trailingAnchor],
[self.termsField.topAnchor constraintEqualToAnchor:self.locField.bottomAnchor constant:10], [self.dateField.topAnchor constraintEqualToAnchor:self.typeField.bottomAnchor constant:12],
[self.termsField.leadingAnchor constraintEqualToAnchor:self.typeField.leadingAnchor], [self.dateField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[self.termsField.trailingAnchor constraintEqualToAnchor:self.typeField.trailingAnchor], [self.dateField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
[calendarBtn.topAnchor constraintEqualToAnchor:self.termsField.bottomAnchor constant:10], [self.slotField.topAnchor constraintEqualToAnchor:self.dateField.bottomAnchor constant:12],
[calendarBtn.leadingAnchor constraintEqualToAnchor:self.typeField.leadingAnchor], [self.slotField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[calendarBtn.trailingAnchor constraintEqualToAnchor:self.typeField.trailingAnchor], [self.slotField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
[calendarBtn.heightAnchor constraintEqualToConstant:44],
[self.locField.topAnchor constraintEqualToAnchor:self.slotField.bottomAnchor constant:12],
[self.summaryCard.bottomAnchor constraintEqualToAnchor:calendarBtn.bottomAnchor constant:16] [self.locField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[self.locField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
[self.termsField.topAnchor constraintEqualToAnchor:self.locField.bottomAnchor constant:12],
[self.termsField.leadingAnchor constraintEqualToAnchor:self.summaryCard.leadingAnchor constant:16],
[self.termsField.trailingAnchor constraintEqualToAnchor:self.summaryCard.trailingAnchor constant:-16],
]]; ]];
}
// Cancel button
#pragma mark - Summary Tabs self.summaryCancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- (void)setupTabs { [self.summaryCancelBtn setTitle:@"Cancel Appointment" forState:UIControlStateNormal];
UIView *tabs = [[UIView alloc] init]; self.summaryCancelBtn.backgroundColor = [UIColor systemRedColor];
tabs.translatesAutoresizingMaskIntoConstraints = NO; self.summaryCancelBtn.layer.cornerRadius = 12;
[self.contentView addSubview:tabs]; [self.summaryCancelBtn addTarget:self action:@selector(cancelPressed) forControlEvents:UIControlEventTouchUpInside];
self.summaryCancelBtn.translatesAutoresizingMaskIntoConstraints = NO;
self.summaryBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [self.summaryContentView addSubview:self.summaryCancelBtn];
self.summaryBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
[self.summaryBtn setTitle:@"Summary" forState:UIControlStateNormal];
self.summaryBtn.layer.cornerRadius = 20;
self.summaryBtn.translatesAutoresizingMaskIntoConstraints = NO;
self.ownerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
self.ownerBtn.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
self.ownerBtn.layer.cornerRadius = 20;
[self.ownerBtn setTitle:@"Owner Info" forState:UIControlStateNormal];
self.ownerBtn.translatesAutoresizingMaskIntoConstraints = NO;
[tabs addSubview:self.summaryBtn];
[tabs addSubview:self.ownerBtn];
[self.summaryBtn addTarget:self action:@selector(showSummary) forControlEvents:UIControlEventTouchUpInside];
[self.ownerBtn addTarget:self action:@selector(showOwnerInfo) forControlEvents:UIControlEventTouchUpInside];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[tabs.topAnchor constraintEqualToAnchor:self.unitInfoHeader.bottomAnchor constant:20], [self.summaryCancelBtn.topAnchor constraintEqualToAnchor:self.termsField.bottomAnchor constant:20],
[tabs.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor constant:16], [self.summaryCancelBtn.leadingAnchor constraintEqualToAnchor:self.summaryContentView.leadingAnchor constant:16],
[tabs.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-16], [self.summaryCancelBtn.trailingAnchor constraintEqualToAnchor:self.summaryContentView.trailingAnchor constant:-16],
[self.summaryCancelBtn.heightAnchor constraintEqualToConstant:55],
[self.summaryBtn.topAnchor constraintEqualToAnchor:tabs.topAnchor], [self.summaryCancelBtn.bottomAnchor constraintEqualToAnchor:self.summaryContentView.bottomAnchor constant:-20] // important for scrolling
[self.summaryBtn.leadingAnchor constraintEqualToAnchor:tabs.leadingAnchor],
[self.summaryBtn.widthAnchor constraintEqualToAnchor:tabs.widthAnchor multiplier:0.5],
[self.summaryBtn.heightAnchor constraintEqualToConstant:40],
[self.ownerBtn.topAnchor constraintEqualToAnchor:tabs.topAnchor],
[self.ownerBtn.trailingAnchor constraintEqualToAnchor:tabs.trailingAnchor],
[self.ownerBtn.widthAnchor constraintEqualToAnchor:tabs.widthAnchor multiplier:0.5],
[self.ownerBtn.heightAnchor constraintEqualToConstant:40],
[tabs.bottomAnchor constraintEqualToAnchor:self.summaryBtn.bottomAnchor]
]]; ]];
self.tabsBar = tabs;
}
- (void)showSummary {
self.summaryContainer.hidden = NO;
self.ownerInfoContainer.hidden = YES;
// Update tab colors
self.summaryBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
self.ownerBtn.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
} }
- (void)showOwnerInfo { #pragma mark - Owner ScrollView
self.summaryContainer.hidden = YES; #pragma mark - Owner ScrollView (Dynamic Cards)
self.ownerInfoContainer.hidden = NO; - (void)setupOwnerScrollView {
self.ownerScrollView = [[UIScrollView alloc] init];
// Update tab colors self.ownerScrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.summaryBtn.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1]; self.ownerScrollView.hidden = YES;
self.ownerBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1]; [self.view addSubview:self.ownerScrollView];
}
self.ownerContentView = [[UIView alloc] init];
#pragma mark - Containers self.ownerContentView.translatesAutoresizingMaskIntoConstraints = NO;
- (void)setupContainers { [self.ownerScrollView addSubview:self.ownerContentView];
self.summaryContainer = [[UIView alloc] init];
self.summaryContainer.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:self.summaryContainer];
self.ownerInfoContainer = [[UIView alloc] init];
self.ownerInfoContainer.translatesAutoresizingMaskIntoConstraints = NO;
self.ownerInfoContainer.hidden = YES; // Start hidden
[self.contentView addSubview:self.ownerInfoContainer];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.summaryContainer.topAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor constant:20], [self.ownerScrollView.topAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor constant:10],
[self.summaryContainer.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], [self.ownerScrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[self.summaryContainer.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], [self.ownerScrollView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
[self.ownerScrollView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
[self.ownerInfoContainer.topAnchor constraintEqualToAnchor:self.tabsBar.bottomAnchor constant:20],
[self.ownerInfoContainer.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], [self.ownerContentView.topAnchor constraintEqualToAnchor:self.ownerScrollView.topAnchor],
[self.ownerInfoContainer.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], [self.ownerContentView.leadingAnchor constraintEqualToAnchor:self.ownerScrollView.leadingAnchor],
]]; [self.ownerContentView.trailingAnchor constraintEqualToAnchor:self.ownerScrollView.trailingAnchor],
} [self.ownerContentView.bottomAnchor constraintEqualToAnchor:self.ownerScrollView.bottomAnchor],
[self.ownerContentView.widthAnchor constraintEqualToAnchor:self.ownerScrollView.widthAnchor],
#pragma mark - Representative Card
- (void)setupRepresentativeCard {
self.repCard = [[UIView alloc] init];
self.repCard.backgroundColor = UIColor.whiteColor;
self.repCard.layer.cornerRadius = 12;
self.repCard.layer.borderColor = [UIColor colorWithWhite:0.9 alpha:1].CGColor;
self.repCard.layer.borderWidth = 1;
self.repCard.translatesAutoresizingMaskIntoConstraints = NO;
[self.ownerInfoContainer addSubview:self.repCard];
UILabel *title = [[UILabel alloc] init];
title.text = @"Representative";
title.font = [UIFont boldSystemFontOfSize:16];
title.translatesAutoresizingMaskIntoConstraints = NO;
[self.ownerInfoContainer addSubview:title];
[NSLayoutConstraint activateConstraints:@[
[self.repCard.topAnchor constraintEqualToAnchor:self.ownerInfoContainer.topAnchor constant:0],
[self.repCard.leadingAnchor constraintEqualToAnchor:self.ownerInfoContainer.leadingAnchor constant:16],
[self.repCard.trailingAnchor constraintEqualToAnchor:self.ownerInfoContainer.trailingAnchor constant:-16],
[self.repCard.bottomAnchor constraintEqualToAnchor:self.ownerInfoContainer.bottomAnchor constant:-20],
[title.topAnchor constraintEqualToAnchor:self.repCard.topAnchor constant:16],
[title.leadingAnchor constraintEqualToAnchor:self.repCard.leadingAnchor constant:16],
]]; ]];
}
NSArray *owners = self.appointmentData[@"owners"]; // Array of dictionaries
#pragma mark - Buttons Section UIView *previousCard = nil;
- (UIButton *)buildCancelButton {
UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom]; for (NSDictionary *ownerData in owners) {
cancelBtn.backgroundColor = [UIColor colorWithRed:1.0 green:0.45 blue:0.45 alpha:1]; UIView *card = [self createOwnerCardWithData:ownerData];
cancelBtn.layer.cornerRadius = 12; [self.ownerContentView addSubview:card];
[cancelBtn setTitle:@"Cancel Appointment" forState:UIControlStateNormal];
cancelBtn.titleLabel.font = [UIFont boldSystemFontOfSize:17]; [NSLayoutConstraint activateConstraints:@[
[cancelBtn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; [card.leadingAnchor constraintEqualToAnchor:self.ownerContentView.leadingAnchor constant:16],
cancelBtn.translatesAutoresizingMaskIntoConstraints = NO; [card.trailingAnchor constraintEqualToAnchor:self.ownerContentView.trailingAnchor constant:-16],
[cancelBtn addTarget:self [card.heightAnchor constraintEqualToConstant:120],
action:@selector(cancelPressed) ]];
forControlEvents:UIControlEventTouchUpInside];
return cancelBtn; if (previousCard) {
} [card.topAnchor constraintEqualToAnchor:previousCard.bottomAnchor constant:16].active = YES;
} else {
- (void)setupButtonSection { [card.topAnchor constraintEqualToAnchor:self.ownerContentView.topAnchor constant:20].active = YES;
self.buttonSection = [[UIView alloc] init]; }
self.buttonSection.translatesAutoresizingMaskIntoConstraints = NO; previousCard = card;
[self.summaryContainer addSubview:self.buttonSection]; }
UIButton *cancelBtn = [self buildCancelButton]; // Cancel button at the bottom
[self.buttonSection addSubview:cancelBtn]; self.ownerCancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.ownerCancelBtn setTitle:@"Cancel Appointment" forState:UIControlStateNormal];
self.ownerCancelBtn.backgroundColor = [UIColor systemRedColor];
self.ownerCancelBtn.layer.cornerRadius = 12;
[self.ownerCancelBtn addTarget:self action:@selector(cancelPressed) forControlEvents:UIControlEventTouchUpInside];
self.ownerCancelBtn.translatesAutoresizingMaskIntoConstraints = NO;
[self.ownerContentView addSubview:self.ownerCancelBtn];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.buttonSection.topAnchor constraintEqualToAnchor:self.summaryCard.bottomAnchor constant:30], [self.ownerCancelBtn.topAnchor constraintEqualToAnchor:previousCard ? previousCard.bottomAnchor : self.ownerContentView.topAnchor constant:20],
[self.buttonSection.leadingAnchor constraintEqualToAnchor:self.summaryContainer.leadingAnchor], [self.ownerCancelBtn.leadingAnchor constraintEqualToAnchor:self.ownerContentView.leadingAnchor constant:16],
[self.buttonSection.trailingAnchor constraintEqualToAnchor:self.summaryContainer.trailingAnchor], [self.ownerCancelBtn.trailingAnchor constraintEqualToAnchor:self.ownerContentView.trailingAnchor constant:-16],
[self.buttonSection.bottomAnchor constraintEqualToAnchor:self.summaryContainer.bottomAnchor constant:-50], [self.ownerCancelBtn.heightAnchor constraintEqualToConstant:55],
[self.ownerCancelBtn.bottomAnchor constraintEqualToAnchor:self.ownerContentView.bottomAnchor constant:-20]
[cancelBtn.topAnchor constraintEqualToAnchor:self.buttonSection.topAnchor],
[cancelBtn.leadingAnchor constraintEqualToAnchor:self.summaryContainer.leadingAnchor constant:16],
[cancelBtn.trailingAnchor constraintEqualToAnchor:self.summaryContainer.trailingAnchor constant:-16],
[cancelBtn.heightAnchor constraintEqualToConstant:55],
]]; ]];
} }
- (void)setupOwnerInfoButtons { #pragma mark - Helper: Create Owner Card
UIView *ownerButtonSection = [[UIView alloc] init]; - (UIView *)createOwnerCardWithData:(NSDictionary *)ownerData {
ownerButtonSection.translatesAutoresizingMaskIntoConstraints = NO; UIView *card = [[UIView alloc] init];
[self.ownerInfoContainer addSubview:ownerButtonSection]; card.backgroundColor = UIColor.whiteColor;
card.layer.cornerRadius = 12;
UIButton *cancelBtn2 = [self buildCancelButton]; card.layer.borderColor = [UIColor colorWithWhite:0.9 alpha:1].CGColor;
[ownerButtonSection addSubview:cancelBtn2]; card.layer.borderWidth = 1;
card.translatesAutoresizingMaskIntoConstraints = NO;
UILabel *nameLabel = [[UILabel alloc] init];
nameLabel.text = [NSString stringWithFormat:@"Name: %@", ownerData[@"name"]];
nameLabel.font = [UIFont boldSystemFontOfSize:16];
nameLabel.translatesAutoresizingMaskIntoConstraints = NO;
UILabel *typeLabel = [[UILabel alloc] init];
typeLabel.text = [NSString stringWithFormat:@"Type: %@", ownerData[@"type"]]; // Primary/Joint
typeLabel.font = [UIFont systemFontOfSize:14];
typeLabel.textColor = UIColor.darkGrayColor;
typeLabel.translatesAutoresizingMaskIntoConstraints = NO;
[card addSubview:nameLabel];
[card addSubview:typeLabel];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[ownerButtonSection.topAnchor constraintEqualToAnchor:self.repCard.bottomAnchor constant:30], [nameLabel.topAnchor constraintEqualToAnchor:card.topAnchor constant:16],
[ownerButtonSection.leadingAnchor constraintEqualToAnchor:self.ownerInfoContainer.leadingAnchor], [nameLabel.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:16],
[ownerButtonSection.trailingAnchor constraintEqualToAnchor:self.ownerInfoContainer.trailingAnchor], [nameLabel.trailingAnchor constraintEqualToAnchor:card.trailingAnchor constant:-16],
[ownerButtonSection.bottomAnchor constraintEqualToAnchor:self.ownerInfoContainer.bottomAnchor constant:-50],
[typeLabel.topAnchor constraintEqualToAnchor:nameLabel.bottomAnchor constant:8],
[cancelBtn2.topAnchor constraintEqualToAnchor:ownerButtonSection.topAnchor], [typeLabel.leadingAnchor constraintEqualToAnchor:card.leadingAnchor constant:16],
[cancelBtn2.leadingAnchor constraintEqualToAnchor:self.ownerInfoContainer.leadingAnchor constant:16], [typeLabel.trailingAnchor constraintEqualToAnchor:card.trailingAnchor constant:-16],
[cancelBtn2.trailingAnchor constraintEqualToAnchor:self.ownerInfoContainer.trailingAnchor constant:-16],
[cancelBtn2.heightAnchor constraintEqualToConstant:55]
]]; ]];
return card;
} }
#pragma mark - Loading Overlay #pragma mark - Tab Actions
- (void)showSummary {
- (void)setupLoadingOverlay { self.summaryScrollView.hidden = NO;
self.loadingOverlay = [[UIView alloc] initWithFrame:self.view.bounds]; self.ownerScrollView.hidden = YES;
self.loadingOverlay.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.4]; self.summaryBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
self.loadingOverlay.hidden = YES; self.ownerBtn.backgroundColor = UIColor.lightGrayColor;
UIActivityIndicatorView *spin = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
spin.color = UIColor.whiteColor;
spin.center = self.loadingOverlay.center;
[self.loadingOverlay addSubview:spin];
[self.view addSubview:self.loadingOverlay];
[spin startAnimating];
} }
#pragma mark - Apply Data - (void)showOwnerInfo {
self.summaryScrollView.hidden = YES;
- (void)applyAppointmentDataToUI { self.ownerScrollView.hidden = NO;
self.loadingOverlay.hidden = YES; self.summaryBtn.backgroundColor = UIColor.lightGrayColor;
self.ownerBtn.backgroundColor = [UIColor colorWithRed:0 green:0.45 blue:0.55 alpha:1];
NSString *status = self.appointmentData[@"appointment_status"];
if ([status isEqualToString:@"Pending"]) {
self.statusBanner.backgroundColor = [UIColor colorWithRed:0.95 green:0.8 blue:0.2 alpha:1];
} else if ([status isEqualToString:@"Approved"]) {
self.statusBanner.backgroundColor = [UIColor colorWithRed:0 green:0.7 blue:0.3 alpha:1];
} else if ([status isEqualToString:@"Rejected"]) {
self.statusBanner.backgroundColor = [UIColor colorWithRed:0.9 green:0.2 blue:0.2 alpha:1];
} else {
self.statusBanner.backgroundColor = [UIColor lightGrayColor];
}
self.statusLabel.text = status;
self.reasonLabel.text = self.appointmentData[@"rejected_reason"];
self.typeField.text = [NSString stringWithFormat:@"Type : %@", self.appointmentData[@"appointment_type"]];
self.dateField.text = [NSString stringWithFormat:@"Date : %@", self.appointmentData[@"appointment_date"]];
self.slotField.text = [NSString stringWithFormat:@"Time Slot : %@", self.appointmentData[@"appointment_time"]];
self.locField.text = [NSString stringWithFormat:@"Location : %@", self.appointmentData[@"location"]];
} }
#pragma mark - Actions #pragma mark - Actions
- (void)backTapped { - (void)backTapped {
[self.navigationController popViewControllerAnimated:YES]; [self.navigationController popViewControllerAnimated:YES];
} }
#pragma mark - cancel button
- (void)cancelPressed { - (void)cancelPressed {
// STEP 1 — Confirmation alert // STEP 1 — Confirmation alert
...@@ -597,6 +489,4 @@ ...@@ -597,6 +489,4 @@
}]; }];
} }
@end @end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment