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