ASEditAddressViewController.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. //
  2. // ASEditAddressViewController.m
  3. // Asteria
  4. //
  5. // Created by iOS on 2024/5/8.
  6. //
  7. #import "ASEditAddressViewController.h"
  8. #import "ASAddressViewModel.h"
  9. #import "InTableScrollView.h"
  10. #import "KWTextField.h"
  11. #import <BRPickerView/BRPickerView.h>
  12. @interface ASEditAddressViewController () <UITextFieldDelegate>
  13. @property (nonatomic, strong) ASAddressViewModel *vm;
  14. @property (nonatomic, strong) InTableScrollView *scrollV;
  15. @property (nonatomic, strong) UIStackView *totalStackV;
  16. @property (nonatomic, strong) NSMutableArray<KWTextField *> *tfArr;
  17. @property (nonatomic, strong) NSMutableArray<UILabel *> *errLbArr;
  18. @property (nonatomic, strong) NSArray<NSString *> *placeHoldArr;
  19. @property (nonatomic, strong) NSArray<NSString *> *errDesArr;
  20. @property (nonatomic, strong) UIButton *billTypeBt;
  21. @property (nonatomic, strong) UIButton *shipTypeBt;
  22. @property (nonatomic, strong) UIButton *saveBt;
  23. @property (nonatomic, strong) UIButton *deletBt;
  24. @end
  25. @implementation ASEditAddressViewController
  26. -(ASAddressViewModel *)vm {
  27. if (!_vm) {
  28. _vm = [ASAddressViewModel new];
  29. }
  30. return _vm;
  31. }
  32. - (instancetype)init {
  33. self = [super init];
  34. if (self) {
  35. __weak typeof(self) weakSelf = self;
  36. [self.vm getCountryList:^{
  37. [weakSelf.vm getProvinceList:weakSelf.m.country_id success:^{}];
  38. }];
  39. }
  40. return self;
  41. }
  42. - (void)viewDidLoad {
  43. [super viewDidLoad];
  44. [self setUI];
  45. if (self.isEdit) {
  46. [self setTitle:@"EDIT ADDRESS"];
  47. [self.vm getProvinceList:self.m.country_id success:^{}];
  48. [self setEditDefualtData];
  49. } else {
  50. if (!self.m) {
  51. self.m = [ASAddressModel defualtData];
  52. } else {
  53. [self.vm getProvinceList:self.m.country_id success:^{}];
  54. [self setEditDefualtData];
  55. }
  56. [self setTitle: @"NEW ADDRESS"];
  57. _deletBt.hidden = true;
  58. }
  59. if(self.isCartEdit){
  60. // [self.saveBt setTitle:@"SAVE AND APPLY" forState:UIControlStateNormal];
  61. [self.saveBt setTitle:@"Save" forState:UIControlStateNormal];
  62. }
  63. }
  64. #pragma mark - **************** EditAddressTypeShippingNewAddress ****************
  65. - (void)xxx_tengteng_confignavBarBar{
  66. self.navigationController.navigationBar.hidden = YES;
  67. UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  68. [closeBtn setImage:[UIImage imageNamed:@"login_close_black"] forState:UIControlStateNormal];
  69. [closeBtn addTarget:self action:@selector(xxx_closeVC) forControlEvents:UIControlEventTouchUpInside];
  70. [self.view addSubview:closeBtn];
  71. NSInteger top = IPHONEX ? 44 : 20;
  72. closeBtn.frame = CGRectMake((KScreenWidth -44)/2, top, 44, 44);
  73. IPhoneXHeigh
  74. [self.scrollV mas_remakeConstraints:^(MASConstraintMaker *make) {
  75. make.left.right.equalTo(self.view);
  76. make.top.mas_equalTo(securitytop_Y +10);
  77. make.height.mas_equalTo(security_H -10);
  78. }];
  79. }
  80. #pragma mark - **************** handle 触发事件****************
  81. -(void)xxx_closeVC{
  82. [self dismissViewControllerAnimated:YES completion:nil];
  83. }
  84. - (void)setEditDefualtData {
  85. NSArray<NSString *> *arr = @[STR(self.m.firstname),
  86. STR(self.m.lastname),
  87. STR(self.m.street.firstObject),
  88. STR(self.m.postcode),
  89. STR(self.m.city),
  90. STR(self.m.country),
  91. STR(self.m.region.region),
  92. STR(self.m.telephone)
  93. ];
  94. for (int i= 0 ; i<arr.count; i++) {
  95. if (self.tfArr.count > i) {
  96. self.tfArr[i].text = arr[i];
  97. }
  98. }
  99. _billTypeBt.selected = false;
  100. _shipTypeBt.selected = false;
  101. switch (self.m.addressType) {
  102. case 1:
  103. [_billTypeBt setSelected:true];
  104. break;
  105. case 2:
  106. [_shipTypeBt setSelected:true];
  107. break;
  108. case 3:
  109. [_shipTypeBt setSelected:true];
  110. [_billTypeBt setSelected:true];
  111. default:
  112. break;
  113. }
  114. }
  115. - (void)setData {
  116. self.placeHoldArr = @[@"* FIRST NAME",
  117. @"* LAST NAME",
  118. @"* ADDRESS (NO ACCEPTING P0.BOX)",
  119. @"* ZIP/POSTAL CODE",
  120. @"* CITY",
  121. @"* COUNTY",
  122. @"* STATE/PROVINCE",
  123. @"* TELEPHONE"];
  124. self.errDesArr = @[@"*This Is Mandatory",
  125. @"*This Is Mandatory",
  126. @"*This Is Mandatory",
  127. @"*This Is Mandatory",
  128. @"*This Is Mandatory",
  129. @"*This Is Mandatory",
  130. @"*This Is Mandatory",
  131. @"*This Is Mandatory"];
  132. }
  133. - (void)setUI {
  134. self.tfArr = [NSMutableArray array];
  135. self.errLbArr = [NSMutableArray array];
  136. [self setData];
  137. [self.view addSubview:self.scrollV];
  138. IPhoneXHeigh
  139. [self.scrollV mas_makeConstraints:^(MASConstraintMaker *make) {
  140. make.left.right.equalTo(self.view);
  141. make.top.mas_equalTo(securitytop_Y);
  142. // make.top.equalTo(self.customNavBar.mas_bottom);
  143. make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
  144. }];
  145. UIStackView *tStackV = [[UIStackView alloc] init];
  146. tStackV.axis = UILayoutConstraintAxisVertical;
  147. tStackV.alignment = UIStackViewAlignmentFill;
  148. tStackV.distribution = UIStackViewDistributionFill;
  149. tStackV.spacing = 16;
  150. self.totalStackV = tStackV;
  151. UIStackView *topStackV = [[UIStackView alloc] init];
  152. topStackV.axis = UILayoutConstraintAxisHorizontal;
  153. topStackV.alignment = UIStackViewAlignmentFill;
  154. topStackV.distribution = UIStackViewDistributionFillEqually;
  155. topStackV.spacing = 20;
  156. [self.totalStackV addArrangedSubview:topStackV];
  157. [self.tfArr removeAllObjects];
  158. [self.errLbArr removeAllObjects];
  159. for (int i = 0; i<self.placeHoldArr.count; i++) {
  160. UIView *v = [UIView new];
  161. v.backgroundColor = [UIColor clearColor];
  162. UILabel *lb = [[UILabel alloc] init];
  163. lb.font = [UIFont fontWithName:Rob_Regular size:12];
  164. lb.textColor = [UIColor colorWithHexString:@"#E60013"];
  165. lb.textAlignment = NSTextAlignmentCenter;
  166. lb.tag = 70000 + i;
  167. KWTextField *tf = [[KWTextField alloc] init];
  168. tf.tag = 90000 + i;
  169. if (i == 5 || i == 6) {
  170. tf.delegate = self;
  171. }
  172. [v addSubview:tf];
  173. [v addSubview:lb];
  174. UIStackView *stackV = [[UIStackView alloc] init];
  175. stackV.axis = UILayoutConstraintAxisVertical;
  176. stackV.alignment = UIStackViewAlignmentFill;
  177. stackV.distribution = UIStackViewDistributionFill;
  178. stackV.spacing = 0;
  179. [stackV addArrangedSubview:v];
  180. lb.text = self.errDesArr[i];
  181. lb.hidden = true;
  182. tf.placeholder = self.placeHoldArr[i];
  183. [v mas_makeConstraints:^(MASConstraintMaker *make) {
  184. make.height.equalTo(@59);
  185. }];
  186. [tf mas_makeConstraints:^(MASConstraintMaker *make) {
  187. make.left.top.right.equalTo(v);
  188. make.height.equalTo(@45);
  189. }];
  190. [lb mas_makeConstraints:^(MASConstraintMaker *make) {
  191. make.left.bottom.right.equalTo(v);
  192. make.height.equalTo(@14);
  193. }];
  194. if (i == 0 || i == 1) {
  195. [topStackV addArrangedSubview:stackV];
  196. } else {
  197. [self.totalStackV addArrangedSubview:stackV];
  198. }
  199. [self.tfArr addObject:tf];
  200. [self.errLbArr addObject:lb];
  201. }
  202. [self.scrollV addSubview:self.totalStackV];
  203. [self.totalStackV mas_makeConstraints:^(MASConstraintMaker *make) {
  204. make.top.equalTo(self.scrollV).offset(20);
  205. make.left.equalTo(self.scrollV).offset(20);
  206. make.right.equalTo(self.view).offset(-20);
  207. make.bottom.equalTo(self.scrollV).offset(-20);
  208. make.width.equalTo([NSNumber numberWithFloat:KScreenWidth-40]);
  209. }];
  210. NSMutableArray *btArr = [[NSMutableArray alloc]init];
  211. if(self.isCartEdit){
  212. // [btArr addObjectsFromArray:@[self.saveBt]];
  213. [btArr addObjectsFromArray:@[self.billTypeBt, self.shipTypeBt, self.saveBt]];
  214. }else{
  215. [btArr addObjectsFromArray:@[self.billTypeBt, self.shipTypeBt, self.saveBt, self.deletBt]];
  216. }
  217. for (UIButton *bt in btArr) {
  218. UIView * v = [UIView new];
  219. v.backgroundColor = [UIColor clearColor];
  220. [v addSubview:bt];
  221. [self.totalStackV addArrangedSubview:v];
  222. [v mas_makeConstraints:^(MASConstraintMaker *make) {
  223. make.height.equalTo(bt == self.saveBt ? @45 : @30);
  224. }];
  225. [bt mas_makeConstraints:^(MASConstraintMaker *make) {
  226. make.top.left.bottom.equalTo(v);
  227. if (bt == self.saveBt || bt == self.deletBt) {
  228. make.right.equalTo(v);
  229. } else {
  230. }
  231. }];
  232. }
  233. }
  234. - (InTableScrollView *)scrollV {
  235. if (!_scrollV) {
  236. InTableScrollView *v = [[InTableScrollView alloc] init];
  237. v.showsVerticalScrollIndicator = false;
  238. v.showsHorizontalScrollIndicator = false;
  239. v.alwaysBounceVertical = true;
  240. v.backgroundColor = [UIColor whiteColor];
  241. _scrollV = v;
  242. }
  243. return _scrollV;
  244. }
  245. - (UIButton *)billTypeBt {
  246. if (!_billTypeBt) {
  247. UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
  248. [bt setImage:[UIImage imageNamed:@"login_selectRido"] forState:UIControlStateNormal];
  249. [bt setImage:[UIImage imageNamed:@"login_selectRido_select"] forState:UIControlStateSelected];
  250. [bt setTitle:@" SET TO THE DEFAULT BILLING ADDRESS" forState:UIControlStateNormal];
  251. bt.titleLabel.font = [UIFont fontWithName:Rob_Regular size:12];
  252. bt.selected = false;
  253. [bt setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  254. [bt addTarget:self action:@selector(typeButtonAction:) forControlEvents:UIControlEventTouchUpInside];
  255. _billTypeBt = bt;
  256. }
  257. return _billTypeBt;
  258. }
  259. - (UIButton *)shipTypeBt {
  260. if (!_shipTypeBt) {
  261. UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
  262. [bt setImage:[UIImage imageNamed:@"login_selectRido"] forState:UIControlStateNormal];
  263. [bt setImage:[UIImage imageNamed:@"login_selectRido_select"] forState:UIControlStateSelected];
  264. [bt setTitle:@" SET TO THE DEFAULT SHIPPING ADDRESS" forState:UIControlStateNormal];
  265. bt.titleLabel.font = [UIFont fontWithName:Rob_Regular size:12];
  266. bt.selected = false;
  267. [bt setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  268. [bt addTarget:self action:@selector(typeButtonAction:) forControlEvents:UIControlEventTouchUpInside];
  269. _shipTypeBt = bt;
  270. }
  271. return _shipTypeBt;
  272. }
  273. - (void)typeButtonAction:(UIButton *)bt {
  274. if ([bt isEqual:self.billTypeBt]) {
  275. self.billTypeBt.selected = !self.billTypeBt.isSelected;
  276. }
  277. if ([bt isEqual:self.shipTypeBt]) {
  278. self.shipTypeBt.selected = !self.shipTypeBt.selected;
  279. }
  280. }
  281. - (UIButton *)saveBt {
  282. if (!_saveBt) {
  283. UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
  284. [bt setTitle:@"Save" forState:UIControlStateNormal];
  285. bt.titleLabel.font = [UIFont fontWithName:Rob_Regular size:16];
  286. [bt setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  287. [bt setBackgroundColor:[UIColor colorWithHexString:@"#000000"]];
  288. bt.layer.cornerRadius = 4;
  289. bt.layer.masksToBounds = true;
  290. // bt.enabled = true;
  291. [bt addTarget:self action:@selector(bottomBtAction) forControlEvents:UIControlEventTouchUpInside];
  292. _saveBt = bt;
  293. }
  294. return _saveBt;
  295. }
  296. - (void)bottomBtAction {
  297. [self uploadData];
  298. }
  299. - (UIButton *)deletBt {
  300. if (!_deletBt) {
  301. UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
  302. NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:@"Delete"];
  303. [attStr addAttributes:@{
  304. NSFontAttributeName:[UIFont fontWithName:Rob_Regular size:14],
  305. NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
  306. NSUnderlineColorAttributeName:[UIColor colorWithHexString:@"#0B0B0B"]
  307. } range:[attStr.string rangeOfString:attStr.string]];
  308. [attStr setColor:[UIColor colorWithHexString:@"#0B0B0B"]];
  309. [bt setAttributedTitle:attStr forState:UIControlStateNormal];
  310. [bt addTarget:self action:@selector(deleteBtAction) forControlEvents:UIControlEventTouchUpInside];
  311. _deletBt = bt;
  312. }
  313. return _deletBt;
  314. }
  315. -(void)deleteBtAction {
  316. [MBProgressHUD showHUDAddedTo:self.view animated:true];
  317. @weakify(self);
  318. [self.vm deleteAnAddress:self.m complate:^(BOOL flag, NSString *msg) {
  319. [MBProgressHUD hideHUDForView:weak_self.view animated:true];
  320. NSString *str = flag ? @"Successed" : [NSString stringWithFormat:@"Faild, %@", msg];
  321. [weak_self.view makeToast:[NSString stringWithFormat:@"Delete %@", str]];
  322. if (flag) {
  323. [weak_self.navigationController popViewControllerAnimated:true];
  324. }
  325. }];
  326. }
  327. - (void)uploadData {
  328. BOOL hadError = false;
  329. for (int i = 0; i<self.tfArr.count; i++) {
  330. NSString *text = self.tfArr[i].text;
  331. if (text && ![text isEqualToString:@""]) {
  332. self.errLbArr[i].hidden = true;
  333. switch (i) {
  334. case 0:
  335. self.m.firstname = text;
  336. break;
  337. case 1:
  338. self.m.lastname = text;
  339. break;
  340. case 2:
  341. self.m.street = [NSArray arrayWithObject: text];
  342. break;
  343. case 3:
  344. self.m.postcode = text;
  345. break;
  346. case 4:
  347. self.m.city = text;
  348. break;
  349. case 5:
  350. self.m.country = text;
  351. break;
  352. case 6:
  353. self.m.region.region = text;
  354. break;
  355. case 7:
  356. self.m.telephone = text;
  357. break;
  358. default:
  359. break;
  360. }
  361. } else {
  362. hadError = true;
  363. self.errLbArr[i].hidden = false;
  364. }
  365. }
  366. if (self.billTypeBt.isSelected) {
  367. self.m.addressType = 1;
  368. }
  369. if (self.shipTypeBt.isSelected) {
  370. self.m.addressType = 2;
  371. }
  372. if ((self.shipTypeBt.isSelected && self.billTypeBt.isSelected) || self.isCartEdit){
  373. self.m.addressType = 3;
  374. }
  375. if (hadError) {
  376. return;
  377. }
  378. [MBProgressHUD showHUDAddedTo:self.view animated:true];
  379. __weak typeof(self) weak_self = self;
  380. [self.vm upAddress:self.m complate:^(BOOL success, NSString * _Nonnull addressid) {
  381. [MBProgressHUD hideHUDForView:weak_self.view animated:true];
  382. if (success) {
  383. [weak_self.view makeToast:@"Edit Successed"];
  384. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5), dispatch_get_main_queue(), ^{
  385. if (weak_self.isCartEdit && weak_self.saveSuccess) {
  386. weak_self.saveSuccess(self.m);
  387. }
  388. [weak_self.navigationController popViewControllerAnimated:true];
  389. });
  390. } else {
  391. [weak_self.view makeToast:addressid];
  392. }
  393. }];
  394. }
  395. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
  396. [self.view endEditing:true];
  397. NSInteger tag = textField.tag-90000;
  398. if (tag == 5) {//country
  399. NSInteger index = 0;
  400. for (int i=0;i<self.vm.countryArr.count; i++) {
  401. KWCountryAddressModel *item = self.vm.countryArr[i];
  402. if (item.country_id == self.m.country_id) {
  403. index = i;
  404. }
  405. }
  406. @weakify(self);
  407. [BRStringPickerView showPickerWithTitle:@"Select Country" dataSourceArr:self.vm.countryNameList selectIndex:index resultBlock:^(BRResultModel * _Nullable resultModel) {
  408. KWCountryAddressModel *item = weak_self.vm.countryArr[resultModel.index];
  409. weak_self.tfArr[6].text = @"";
  410. textField.text = item.full_name_english;
  411. weak_self.m.country = item.full_name_english;
  412. weak_self.m.country_id = item.country_id;
  413. weak_self.m.region = [ASAddressReginModel new];
  414. weak_self.m.region.region = @"";
  415. weak_self.m.region.region_id = @"";
  416. weak_self.m.region.region_code = @"";
  417. weak_self.m.region_id = @"";
  418. [weak_self.vm getProvinceList:item.country_id success:^{}];
  419. }];
  420. }
  421. if (tag == 6) {// province
  422. if (self.m.country_id && ![self.m.country_id isEqualToString:@""]) {
  423. if (self.vm.hadGetProvince && self.vm.provinceArr.count > 0) {
  424. [self showProvincePick];
  425. } else {
  426. return true;
  427. }
  428. } else {
  429. [self.view makeToast:@"Please Select Country First"];
  430. }
  431. }
  432. return false;
  433. }
  434. - (void)showProvincePick {
  435. NSInteger index = 0;
  436. for (int i=0;i<self.vm.provinceArr.count; i++) {
  437. KWProvinceAddressModel *item = self.vm.provinceArr[i];
  438. if (item.Id == self.m.region_id) {
  439. index = i;
  440. }
  441. }
  442. @weakify(self);
  443. [BRStringPickerView showPickerWithTitle:@"Select Province" dataSourceArr:self.vm.provinceNameList selectIndex:index resultBlock:^(BRResultModel * _Nullable resultModel) {
  444. KWProvinceAddressModel *item = weak_self.vm.provinceArr[resultModel.index];
  445. weak_self.m.region.region = item.name;
  446. weak_self.m.region_id = item.Id;
  447. weak_self.tfArr[6].text = item.name;
  448. }];
  449. }
  450. @end