Advertisement
rifki_cs29

EditProfilePage

Feb 12th, 2024
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.49 KB | None | 0 0
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:flutter_smmf_one/core/common/app_theme.dart';
  5. import 'package:flutter_smmf_one/core/common/state_enum.dart';
  6. import 'package:flutter_smmf_one/core/widgets/custom_app_bar.dart';
  7. import 'package:flutter_smmf_one/core/widgets/custom_textfield.dart';
  8. import 'package:flutter_smmf_one/core/widgets/gap/widgets/gap.dart';
  9. import 'package:flutter_smmf_one/core/widgets/loading_shimmer.dart';
  10. import 'package:flutter_smmf_one/data/datasources/db/database_helper.dart';
  11. import 'package:flutter_smmf_one/data/models/region_request_payload.dart';
  12. import 'package:flutter_smmf_one/presentation/controllers/home_controller.dart';
  13. import 'package:flutter_smmf_one/presentation/controllers/profile_region_controller.dart';
  14. import 'package:flutter_smmf_one/presentation/controllers/region_controller.dart';
  15. import 'package:flutter_smmf_one/presentation/controllers/update_location_controller.dart';
  16. import 'package:flutter_smmf_one/presentation/widgets/cities_options.dart';
  17. import 'package:flutter_smmf_one/presentation/widgets/district_options.dart';
  18. import 'package:flutter_smmf_one/presentation/widgets/provinces_options.dart';
  19. import 'package:flutter_smmf_one/presentation/widgets/sub_district_options.dart';
  20. import 'package:get/get.dart';
  21. import 'package:google_fonts/google_fonts.dart';
  22.  
  23. final _regionController = Get.put(RegionController());
  24. final _profileRegionController = Get.put(ProfileRegionController());
  25. // final _homeController = Get.put(HomeController());
  26. final _updateLocationController = Get.put(UpdateLocationController());
  27.  
  28. class EditProfilePage extends StatefulWidget {
  29. final Map<String, dynamic> args = Get.arguments;
  30.  
  31. EditProfilePage({super.key});
  32.  
  33. @override
  34. State<EditProfilePage> createState() => _EditProfilePageState();
  35. }
  36.  
  37. class _EditProfilePageState extends State<EditProfilePage> {
  38. final _formKey = GlobalKey<FormState>();
  39. HomeController homeController = Get.find();
  40. final TextEditingController _provinceController = TextEditingController();
  41. final TextEditingController _cityController = TextEditingController();
  42. final TextEditingController _subDistrictController = TextEditingController();
  43. final TextEditingController _districtController = TextEditingController();
  44. final TextEditingController _postalCodeController = TextEditingController();
  45.  
  46. @override
  47. void initState() {
  48. if (widget.args['isEdit'] == true) {
  49. final loggedInUser = homeController.loggedInUser;
  50.  
  51. _profileRegionController.setRegion(
  52. provinceId: loggedInUser[DatabaseHelper.columnProvinceId],
  53. provinceName: loggedInUser[DatabaseHelper.columnProvinceName],
  54. cityId: loggedInUser[DatabaseHelper.columnCityId],
  55. cityName: loggedInUser[DatabaseHelper.columnCityName],
  56. subDistrictId: loggedInUser[DatabaseHelper.columnSubDistrictId],
  57. subDistrictName: loggedInUser[DatabaseHelper.columnSubDistrictName],
  58. districtName: loggedInUser[DatabaseHelper.columnDistrictName],
  59. zipCode: loggedInUser[DatabaseHelper.columnZipCode],
  60. );
  61.  
  62. _regionController.fetchCities(
  63. RegionRequestPayload(
  64. username: "1007072",
  65. version: 152,
  66. postalId: loggedInUser[DatabaseHelper.columnProvinceId],
  67. postalType: "PROVINCE",
  68. ),
  69. );
  70.  
  71. _regionController.fetchSubDistricts(
  72. RegionRequestPayload(
  73. username: "1007072",
  74. version: 152,
  75. postalId: loggedInUser[DatabaseHelper.columnCityId],
  76. postalType: "CITY",
  77. ),
  78. );
  79.  
  80. _regionController.fetchDistricts(
  81. RegionRequestPayload(
  82. username: "1007072",
  83. version: 152,
  84. postalId: loggedInUser[DatabaseHelper.columnSubDistrictId],
  85. postalType: "SUBDISTRICT",
  86. ),
  87. );
  88.  
  89. _provinceController.text =
  90. loggedInUser[DatabaseHelper.columnProvinceName] ?? '';
  91. _cityController.text = loggedInUser[DatabaseHelper.columnCityName] ?? '';
  92. _subDistrictController.text =
  93. loggedInUser[DatabaseHelper.columnSubDistrictName] ?? '';
  94. _districtController.text =
  95. loggedInUser[DatabaseHelper.columnDistrictName] ?? '';
  96. _postalCodeController.text =
  97. loggedInUser[DatabaseHelper.columnZipCode] ?? '';
  98. }
  99. super.initState();
  100. }
  101.  
  102. @override
  103. void dispose() {
  104. _provinceController.dispose();
  105. _cityController.dispose();
  106. _subDistrictController.dispose();
  107. _districtController.dispose();
  108. _postalCodeController.dispose();
  109. super.dispose();
  110. }
  111.  
  112. @override
  113. Widget build(BuildContext context) {
  114. return Scaffold(
  115. appBar: CustomAppBar(
  116. titleText: 'Edit Profile',
  117. leading: InkWell(
  118. hoverColor: colorWhite,
  119. onTap: () => Navigator.pop(context),
  120. child: Icon(
  121. CupertinoIcons.back,
  122. color: colorBlack,
  123. size: 24,
  124. ),
  125. ),
  126. ),
  127. body: SingleChildScrollView(
  128. padding: EdgeInsets.symmetric(
  129. horizontal: defaultMargin,
  130. ),
  131. child: Form(
  132. key: _formKey,
  133. child: Column(
  134. crossAxisAlignment: CrossAxisAlignment.start,
  135. children: [
  136. Gap(12.h),
  137. Obx(
  138. () {
  139. final state = _regionController.stateProvince.value;
  140. final provincesData = _regionController.regionProvince;
  141.  
  142. if (state == RequestState.loading) {
  143. return Column(
  144. crossAxisAlignment: CrossAxisAlignment.start,
  145. children: [
  146. Padding(
  147. padding: const EdgeInsets.only(
  148. bottom: 8,
  149. ),
  150. child: Text(
  151. 'Province',
  152. style: GoogleFonts.plusJakartaSans(
  153. fontSize: 12.sp,
  154. fontWeight: FontWeight.w400,
  155. color: const Color(0xFF000000),
  156. ),
  157. ),
  158. ),
  159. SizedBox(
  160. height: 44.h,
  161. width: double.infinity,
  162. child: const LoadingShimmer(
  163. radius: 8,
  164. ),
  165. ),
  166. ],
  167. );
  168. }
  169. return CustomTextField(
  170. controller: _provinceController,
  171. textName: 'Province',
  172. hintText: 'Province',
  173. suffixIcon: Icon(
  174. Icons.arrow_drop_down,
  175. size: 24,
  176. color: colorBlack,
  177. ),
  178. readOnly: true,
  179. onTap: () {
  180. showModalBottomSheet(
  181. context: context,
  182. isScrollControlled: true,
  183. useRootNavigator: true,
  184. shape: const RoundedRectangleBorder(
  185. borderRadius: BorderRadius.vertical(
  186. top: Radius.circular(24.0),
  187. ),
  188. ),
  189. builder: (_) {
  190. return LayoutBuilder(
  191. builder: (context, _) {
  192. return AnimatedPadding(
  193. padding: MediaQuery.of(
  194. context,
  195. ).viewInsets,
  196. duration: const Duration(
  197. milliseconds: 100,
  198. ),
  199. child: SearchProvinceOptions(
  200. data: provincesData,
  201. provinceController: _provinceController,
  202. cityController: _cityController,
  203. subDistrictController: _subDistrictController,
  204. districtController: _districtController,
  205. postalCodeController: _postalCodeController,
  206. ),
  207. );
  208. },
  209. );
  210. },
  211. );
  212. },
  213. validator: (value) {
  214. if (value != null) {
  215. if (value.isEmpty) {
  216. return 'Province tidak boleh kosong';
  217. }
  218. }
  219. return null;
  220. },
  221. );
  222. },
  223. ),
  224. Gap(12.h),
  225. Obx(
  226. () {
  227. final state = _regionController.stateCity.value;
  228. final citiesData = _regionController.regionCity;
  229.  
  230. if (state == RequestState.loading) {
  231. return Column(
  232. crossAxisAlignment: CrossAxisAlignment.start,
  233. children: [
  234. Padding(
  235. padding: const EdgeInsets.only(
  236. bottom: 8,
  237. ),
  238. child: Text(
  239. 'City',
  240. style: GoogleFonts.plusJakartaSans(
  241. fontSize: 12.sp,
  242. fontWeight: FontWeight.w400,
  243. color: const Color(0xFF000000),
  244. ),
  245. ),
  246. ),
  247. SizedBox(
  248. height: 44.h,
  249. width: double.infinity,
  250. child: const LoadingShimmer(
  251. radius: 8,
  252. ),
  253. ),
  254. ],
  255. );
  256. }
  257. return CustomTextField(
  258. controller: _cityController,
  259. textName: 'City',
  260. hintText: 'City',
  261. suffixIcon: Icon(
  262. Icons.arrow_drop_down,
  263. size: 24,
  264. color: colorBlack,
  265. ),
  266. readOnly: true,
  267. fillColor: _profileRegionController.provinceName.value != ''
  268. ? null
  269. : Colors.grey[200],
  270. onTap: _profileRegionController.provinceName.value != ''
  271. ? () {
  272. showModalBottomSheet(
  273. context: context,
  274. isScrollControlled: true,
  275. useRootNavigator: true,
  276. shape: const RoundedRectangleBorder(
  277. borderRadius: BorderRadius.vertical(
  278. top: Radius.circular(24.0),
  279. ),
  280. ),
  281. builder: (_) {
  282. return LayoutBuilder(
  283. builder: (context, _) {
  284. return AnimatedPadding(
  285. padding: MediaQuery.of(
  286. context,
  287. ).viewInsets,
  288. duration: const Duration(
  289. milliseconds: 100,
  290. ),
  291. child: SearchCityOptions(
  292. data: citiesData,
  293. cityController: _cityController,
  294. subDistrictController:
  295. _subDistrictController,
  296. districtController: _districtController,
  297. postalCodeController:
  298. _postalCodeController,
  299. ),
  300. );
  301. },
  302. );
  303. },
  304. );
  305. }
  306. : null,
  307. validator: (value) {
  308. if (value != null) {
  309. if (value.isEmpty) {
  310. return 'City tidak boleh kosong';
  311. }
  312. }
  313. return null;
  314. },
  315. );
  316. },
  317. ),
  318. Gap(12.h),
  319. Obx(
  320. () {
  321. final state = _regionController.stateSubDistrict.value;
  322. final subDistrictData = _regionController.regionSubDistrict;
  323.  
  324. if (state == RequestState.loading) {
  325. return Column(
  326. crossAxisAlignment: CrossAxisAlignment.start,
  327. children: [
  328. Padding(
  329. padding: const EdgeInsets.only(
  330. bottom: 8,
  331. ),
  332. child: Text(
  333. 'Sub District',
  334. style: GoogleFonts.plusJakartaSans(
  335. fontSize: 12.sp,
  336. fontWeight: FontWeight.w400,
  337. color: const Color(0xFF000000),
  338. ),
  339. ),
  340. ),
  341. SizedBox(
  342. height: 44.h,
  343. width: double.infinity,
  344. child: const LoadingShimmer(
  345. radius: 8,
  346. ),
  347. ),
  348. ],
  349. );
  350. }
  351. return CustomTextField(
  352. controller: _subDistrictController,
  353. textName: 'Sub District',
  354. hintText: 'Sub District',
  355. suffixIcon: Icon(
  356. Icons.arrow_drop_down,
  357. size: 24,
  358. color: colorBlack,
  359. ),
  360. readOnly: true,
  361. fillColor: _profileRegionController.cityName.value != ''
  362. ? null
  363. : Colors.grey[200],
  364. onTap: _profileRegionController.cityName.value != ''
  365. ? () {
  366. showModalBottomSheet(
  367. context: context,
  368. isScrollControlled: true,
  369. useRootNavigator: true,
  370. shape: const RoundedRectangleBorder(
  371. borderRadius: BorderRadius.vertical(
  372. top: Radius.circular(24.0),
  373. ),
  374. ),
  375. builder: (_) {
  376. return LayoutBuilder(
  377. builder: (context, _) {
  378. return AnimatedPadding(
  379. padding: MediaQuery.of(
  380. context,
  381. ).viewInsets,
  382. duration: const Duration(
  383. milliseconds: 100,
  384. ),
  385. child: SearchSubDistrictOptions(
  386. data: subDistrictData,
  387. subDistrictController:
  388. _subDistrictController,
  389. districtController: _districtController,
  390. postalCodeController:
  391. _postalCodeController,
  392. ),
  393. );
  394. },
  395. );
  396. },
  397. );
  398. }
  399. : null,
  400. validator: (value) {
  401. if (value != null) {
  402. if (value.isEmpty) {
  403. return 'Sub District tidak boleh kosong';
  404. }
  405. }
  406. return null;
  407. },
  408. );
  409. },
  410. ),
  411. Gap(12.h),
  412. Obx(
  413. () {
  414. final state = _regionController.stateDistrict.value;
  415. final districtData = _regionController.regionDistrict;
  416.  
  417. if (state == RequestState.loading) {
  418. return Column(
  419. crossAxisAlignment: CrossAxisAlignment.start,
  420. children: [
  421. Padding(
  422. padding: const EdgeInsets.only(
  423. bottom: 8,
  424. ),
  425. child: Text(
  426. 'District',
  427. style: GoogleFonts.plusJakartaSans(
  428. fontSize: 12.sp,
  429. fontWeight: FontWeight.w400,
  430. color: const Color(0xFF000000),
  431. ),
  432. ),
  433. ),
  434. SizedBox(
  435. height: 44.h,
  436. width: double.infinity,
  437. child: const LoadingShimmer(
  438. radius: 8,
  439. ),
  440. ),
  441. ],
  442. );
  443. }
  444. return CustomTextField(
  445. controller: _districtController,
  446. textName: 'District',
  447. hintText: 'District',
  448. suffixIcon: Icon(
  449. Icons.arrow_drop_down,
  450. size: 24,
  451. color: colorBlack,
  452. ),
  453. readOnly: true,
  454. fillColor:
  455. _profileRegionController.subDistrictName.value != ''
  456. ? null
  457. : Colors.grey[200],
  458. onTap: _profileRegionController.subDistrictName.value != ''
  459. ? () {
  460. showModalBottomSheet(
  461. context: context,
  462. isScrollControlled: true,
  463. useRootNavigator: true,
  464. shape: const RoundedRectangleBorder(
  465. borderRadius: BorderRadius.vertical(
  466. top: Radius.circular(24.0),
  467. ),
  468. ),
  469. builder: (_) {
  470. return LayoutBuilder(
  471. builder: (context, _) {
  472. return AnimatedPadding(
  473. padding: MediaQuery.of(
  474. context,
  475. ).viewInsets,
  476. duration: const Duration(
  477. milliseconds: 100,
  478. ),
  479. child: SearchDistrictOptions(
  480. data: districtData,
  481. districtController: _districtController,
  482. postalCodeController:
  483. _postalCodeController,
  484. ),
  485. );
  486. },
  487. );
  488. },
  489. );
  490. }
  491. : null,
  492. validator: (value) {
  493. if (value != null) {
  494. if (value.isEmpty) {
  495. return 'District tidak boleh kosong';
  496. }
  497. }
  498. return null;
  499. },
  500. );
  501. },
  502. ),
  503. Gap(12.h),
  504. CustomTextField(
  505. controller: _postalCodeController,
  506. textName: 'Postal Code',
  507. hintText: 'Postal Code',
  508. readOnly: true,
  509. fillColor: Colors.grey[200],
  510. validator: (value) {
  511. if (value != null) {
  512. if (value.isEmpty) {
  513. return 'Postal Code tidak boleh kosong';
  514. }
  515. }
  516. return null;
  517. },
  518. ),
  519. ],
  520. ),
  521. ),
  522. ),
  523. bottomNavigationBar: Padding(
  524. padding: EdgeInsets.symmetric(
  525. horizontal: defaultMargin,
  526. vertical: 12.h,
  527. ),
  528. child: TextButton(
  529. onPressed: () {
  530. if (_formKey.currentState?.validate() == true) {
  531. if (FocusScope.of(context).hasFocus) {
  532. FocusManager.instance.primaryFocus?.unfocus();
  533. }
  534. _updateLocationController.updateLocation(
  535. widget.args['phone'],
  536. _profileRegionController.provinceId.value,
  537. _profileRegionController.provinceName.value,
  538. _profileRegionController.cityId.value,
  539. _profileRegionController.cityName.value,
  540. _profileRegionController.subDistrictId.value,
  541. _profileRegionController.subDistrictName.value,
  542. _profileRegionController.districtName.value,
  543. _profileRegionController.zipCode.value,
  544. );
  545. }
  546. },
  547. style: OutlinedButton.styleFrom(
  548. backgroundColor: colorPrimary,
  549. padding: const EdgeInsets.symmetric(
  550. vertical: 12,
  551. horizontal: 8,
  552. ),
  553. shape: RoundedRectangleBorder(
  554. borderRadius: BorderRadius.circular(
  555. defaultRadius,
  556. ),
  557. ),
  558. ),
  559. child: Text(
  560. 'Simpan',
  561. style: GoogleFonts.plusJakartaSans(
  562. fontSize: 14.sp,
  563. fontWeight: FontWeight.w600,
  564. color: Colors.white,
  565. letterSpacing: 1,
  566. ),
  567. ),
  568. ),
  569. ),
  570. );
  571. }
  572. }
  573.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement