ASEditAddressViewController.m 18 KB

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