From a496699796bec6bb87a31679a1c13b7e56d41e7e Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 27 Apr 2021 15:19:56 +0700 Subject: [PATCH 01/27] [CHORES] Fix bug saving the wrong token --- lib/page/login/login.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/page/login/login.dart b/lib/page/login/login.dart index 79e9600..92666cb 100644 --- a/lib/page/login/login.dart +++ b/lib/page/login/login.dart @@ -371,11 +371,6 @@ class LoginState extends State { await login( _currentUser.email, '', 'true', token, _currentUser.displayName); sharedPreferences = await SharedPreferences.getInstance(); - setState(() { - sharedPreferences - ..setString('token', googleSignInAuthentication.accessToken) - ..setString('email', _currentUser.email); - }); successDialog(context); Timer(const Duration(seconds: 2), () { Navigator.pushNamed(context, '/'); -- GitLab From ddee6faffe4da51eb5798522a39fea6a3cb1c7da Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 3 May 2021 14:42:38 +0700 Subject: [PATCH 02/27] added firebase dynamic links dependencies --- pubspec.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pubspec.yaml b/pubspec.yaml index 4925c3d..973e90d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,11 @@ dependencies: google_sign_in: ^4.5.1 material_design_icons_flutter: ^4.0.5755 get_it: ^5.0.1 + plugin_platform_interface: ^1.1.0-nullsafety.1 + path_provider_platform_interface: ^1.0.1 + firebase_core: ^0.7.0 + firebase_core_platform_interface: ^3.0.1 + firebase_dynamic_links: ^0.7.0+1 dev_dependencies: flutter_test: -- GitLab From 71517c3de2764a67beac9beda1659b9eaa3a86e5 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 3 May 2021 14:44:14 +0700 Subject: [PATCH 03/27] [GREEN] implemented retrieve data from dynamic links + null guards --- lib/page/dashboard/dashboard.dart | 79 +++++++++++++++++++ lib/page/filter_fasilitas/fasilitas.dart | 6 +- .../postingan/detail_post.dart | 7 +- lib/repository/komentar_repository.dart | 9 +++ 4 files changed, 95 insertions(+), 6 deletions(-) diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index e81abda..3ccd081 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -1,15 +1,24 @@ import 'package:bisaGo/bloc/lokasi_response_bloc.dart'; +import 'package:bisaGo/config/strings.dart'; +import 'package:bisaGo/model/komentar.dart'; import 'package:bisaGo/model/lokasi.dart'; import 'package:bisaGo/network/data/network_model.dart'; +import 'package:bisaGo/page/filter_fasilitas/postingan/detail_post.dart'; +import 'package:bisaGo/repository/komentar_repository.dart'; import 'package:bisaGo/utils/custom_dashboard_location_button.dart'; import 'package:bisaGo/utils/location_turn_on_dialog.dart'; +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:bisaGo/component/bisago_appbar.dart'; import 'package:bisaGo/component/bisago_drawer.dart'; import 'package:bisaGo/config/styles.dart'; import 'package:bisaGo/page/pencarian/pencarian.dart'; +import 'package:bisaGo/page/filter_fasilitas/fasilitas.dart'; +import 'package:bisaGo/model/lokasi.dart'; +import 'package:google_maps_webservice/places.dart'; class Dashboard extends StatefulWidget { const Dashboard({Key key}) : super(key: key); @@ -31,6 +40,7 @@ class DashboardState extends State { super.initState(); _showTurnOnLocationDialog(context); geolocator = Geolocator()..forceAndroidLocationManager; + initDynamicLinks(); setInitialLocation(); } @@ -243,4 +253,73 @@ class DashboardState extends State { currentLocation = LatLng(position.latitude, position.longitude); }); } + + Future getLokasiName(String placeId) async { + final _places = GoogleMapsPlaces(apiKey: DotEnv().env['API_KEY']); + var details = await _places.getDetailsByPlaceId( + placeId, + fields: [ + 'name', + ], + ); + return details.result.name; + } + + void _navigateToDetailFasilitasPage(BuildContext context, String placeId, String fasilitasId) async { + final fetches = await Future.wait([ + KomentarRepository().fetchDetailFasilitas(placeId, fasilitasId), + getLokasiName(placeId), + ]); + final KomentarModel fasilitas = fetches[0]; + final String namaLokasi = fetches[1] ?? 'INVALID'; + final lokasi = Lokasi() + ..placeId = placeId + ..name = namaLokasi; + final fasilitasRoute = + MaterialPageRoute( + builder: (BuildContext context) => DetailPostPage( + lokasi: lokasi, + komentar: KomentarModel( + creator: fasilitas.creator, + dateTime: fasilitas.dateTime, + deskripsi: fasilitas.deskripsi, + id: fasilitas.id, + image: fasilitas.image, + isVerified: fasilitas.isVerified, + namaLokasi: lokasi.name, + tag: fasilitas.tag, + disabilitas: fasilitas.disabilitas, + jumlah: fasilitas.jumlah, + ), + ) + ); + await Navigator.of(context).push(fasilitasRoute); +} + +void initDynamicLinks() async { + final data = await FirebaseDynamicLinks.instance.getInitialLink(); + + _handleDeepLink(data); + FirebaseDynamicLinks.instance.onLink( + onSuccess: (PendingDynamicLinkData dynamicLink) async { + _handleDeepLink(dynamicLink); + }, onError: (OnLinkErrorException e) async { + print('Link Failed: ${e.message}'); + }); +} + + void _handleDeepLink(PendingDynamicLinkData data) async { + final deepLink = data?.link; + if (deepLink != null) { + final params = deepLink.queryParameters; + final path = deepLink.pathSegments; + final placeId = params['place_id']; + final id = params['id']; + if (path[0] == 'fasilitas') { + _navigateToDetailFasilitasPage(context, placeId, id); + } else if (path[0] == 'kegiatan') { + // TODO navigate kegiatan + } + } + } } diff --git a/lib/page/filter_fasilitas/fasilitas.dart b/lib/page/filter_fasilitas/fasilitas.dart index be88d64..06baea9 100644 --- a/lib/page/filter_fasilitas/fasilitas.dart +++ b/lib/page/filter_fasilitas/fasilitas.dart @@ -73,7 +73,7 @@ class _FasilitasState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - widget.lokasi.name, + widget.lokasi.name ?? 'INVALID', style: const TextStyle( fontSize: 25, fontWeight: FontWeight.w800, @@ -93,7 +93,7 @@ class _FasilitasState extends State { Flexible( key: const Key('Alamat'), child: Text( - widget.lokasi.alamat, + widget.lokasi.alamat ?? 'LOCATION INVALID', softWrap: true, textAlign: TextAlign.left, style: const TextStyle( @@ -116,7 +116,7 @@ class _FasilitasState extends State { ), Flexible( child: Text( - widget.lokasi.noTelp, + widget.lokasi.noTelp ?? '-', softWrap: true, textAlign: TextAlign.left, style: const TextStyle( diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index 7528396..fbcdd98 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post.dart @@ -51,16 +51,17 @@ class _DetailPostPageState extends State { @override Widget build(BuildContext context) { + var namaLokasi = widget.komentar.namaLokasi ?? 'Invalid Lokasi Name'; return WillPopScope( child: Scaffold( appBar: BisaGoAppBar( - title: widget.komentar.namaLokasi, - key: Key('appbar-text-${widget.komentar.namaLokasi}'), + title: namaLokasi, + key: Key('appbar-text-${namaLokasi}'), actions: [ InkWell( child: const Icon(Icons.share), onTap: () => Share.share( - 'Review fasilitas disabilitas di ${widget.lokasi.name}, ' + 'Review fasilitas disabilitas di ${namaLokasi}, ' 'oleh: ${widget.komentar.creator}\n\"${widget.komentar.deskripsi}\"\n\nDapatkan info fasilitas ramah ' 'disabilitas dari aplikasi bisaGo!\nDownload bisaGo ' 'sekarang di: https://bit.ly/DownloadbisaGo')) diff --git a/lib/repository/komentar_repository.dart b/lib/repository/komentar_repository.dart index a2976ff..b2adf34 100644 --- a/lib/repository/komentar_repository.dart +++ b/lib/repository/komentar_repository.dart @@ -8,6 +8,8 @@ abstract class BaseKomentarRepository { Future fetchKomentar(String namaLokasi); Future createKomentar( Map newKomentarData, String namaLokasi); + Future fetchDetailFasilitas( + String placeId, String fasilitasId); } class KomentarRepository implements BaseKomentarRepository { @@ -41,4 +43,11 @@ class KomentarRepository implements BaseKomentarRepository { body: json.encode(newKomentarData)); return response; } + + @override + Future fetchDetailFasilitas(String placeId, String fasilitasId) async { + final url = '/informasi-fasilitas/lokasi/detail-fasilitas/$placeId/$fasilitasId/'; + final response = await _network.get(url: url, isLogin: false); + return KomentarModel.fromJson(response); + } } -- GitLab From 8938301aa721296f0f309328c8f8672da0f3dcc9 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 3 May 2021 15:00:42 +0700 Subject: [PATCH 04/27] [CHORES] fixing incorrect dependencies plugin_platform_interface from 1.1.0-nullsafety.1 to 1.1.0-nullsafety --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 973e90d..d063af2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,7 +44,7 @@ dependencies: google_sign_in: ^4.5.1 material_design_icons_flutter: ^4.0.5755 get_it: ^5.0.1 - plugin_platform_interface: ^1.1.0-nullsafety.1 + plugin_platform_interface: ^1.1.0-nullsafety path_provider_platform_interface: ^1.0.1 firebase_core: ^0.7.0 firebase_core_platform_interface: ^3.0.1 -- GitLab From 70a8ffc1c5d76ed758f9e7bd621260a28b8106bd Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 3 May 2021 15:22:57 +0700 Subject: [PATCH 05/27] [GREEN] fix linter, remove unused and duplicate import --- lib/page/dashboard/dashboard.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index 3ccd081..eac8b3a 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -1,5 +1,4 @@ import 'package:bisaGo/bloc/lokasi_response_bloc.dart'; -import 'package:bisaGo/config/strings.dart'; import 'package:bisaGo/model/komentar.dart'; import 'package:bisaGo/model/lokasi.dart'; import 'package:bisaGo/network/data/network_model.dart'; @@ -16,8 +15,6 @@ import 'package:bisaGo/component/bisago_appbar.dart'; import 'package:bisaGo/component/bisago_drawer.dart'; import 'package:bisaGo/config/styles.dart'; import 'package:bisaGo/page/pencarian/pencarian.dart'; -import 'package:bisaGo/page/filter_fasilitas/fasilitas.dart'; -import 'package:bisaGo/model/lokasi.dart'; import 'package:google_maps_webservice/places.dart'; class Dashboard extends StatefulWidget { -- GitLab From 7cb89e14142236bbf28bef6f99482dd01a43ab4f Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Mon, 3 May 2021 16:44:01 +0700 Subject: [PATCH 06/27] [RED] Implement generate deep link for fasilitas --- .../dynamic_links_service_repository.dart | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 lib/repository/dynamic_links_service_repository.dart diff --git a/lib/repository/dynamic_links_service_repository.dart b/lib/repository/dynamic_links_service_repository.dart new file mode 100644 index 0000000..4d07a51 --- /dev/null +++ b/lib/repository/dynamic_links_service_repository.dart @@ -0,0 +1,26 @@ +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; + +abstract class BaseDynamicLinksServiceRepository { + Future createDynamicLinkForFasilitas( + String fasilitasId, String placeId); +} + +class DynamicLinksServiceRepository + implements BaseDynamicLinksServiceRepository { + @override + Future createDynamicLinkForFasilitas( + String fasilitasId, String placeId) async { + var uriPrefix = 'https://bisago.page.link'; + + final parameters = DynamicLinkParameters( + uriPrefix: uriPrefix, + link: Uri.parse( + 'https://bisago.page.link/fasilitas?id=$fasilitasId&place_id=$placeId', + ), + ); + + final shortDynamicLink = await parameters.buildShortLink(); + final shortUrl = shortDynamicLink.shortUrl; + return shortUrl.toString(); + } +} -- GitLab From 73417be1205094ae72ef2cb905d99bd85ae32f9e Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Mon, 3 May 2021 16:44:16 +0700 Subject: [PATCH 07/27] [GREEN] Implement test for generate deep link for fasilitas --- lib/get_it.dart | 9 +++++---- test/dynamic_link_service_test.dart | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 test/dynamic_link_service_test.dart diff --git a/lib/get_it.dart b/lib/get_it.dart index 3271d88..ae85098 100644 --- a/lib/get_it.dart +++ b/lib/get_it.dart @@ -1,5 +1,4 @@ - - +import 'package:bisaGo/repository/dynamic_links_service_repository.dart'; import 'package:bisaGo/repository/komentar_posting_repository.dart'; import 'package:bisaGo/repository/komentar_repository.dart'; import 'package:bisaGo/repository/komunitas_repository.dart'; @@ -24,7 +23,9 @@ class AppGetIt { () => KomentarPostingRepository()); _getIt .registerLazySingleton(() => LokasiRepository()); - _getIt - .registerLazySingleton(() => LayananRepository()); + _getIt.registerLazySingleton( + () => LayananRepository()); + _getIt.registerLazySingleton( + () => DynamicLinksServiceRepository()); } } diff --git a/test/dynamic_link_service_test.dart b/test/dynamic_link_service_test.dart new file mode 100644 index 0000000..a273c1e --- /dev/null +++ b/test/dynamic_link_service_test.dart @@ -0,0 +1,28 @@ +import 'package:bisaGo/repository/dynamic_links_service_repository.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/mockito.dart'; + +class MockDynamicLinksServiceRepository extends Fake + implements DynamicLinksServiceRepository { + @override + Future createDynamicLinkForFasilitas( + String fasilitasId, String placeId) { + return Future.value('https://bisago.page.link/bQ61qYhY1KajctUHA'); + } +} + +void main() { + setUpAll(() { + final _getIt = GetIt.instance; + _getIt.registerLazySingleton( + () => MockDynamicLinksServiceRepository()); + }); + testWidgets('Generate deep link for Fasilitas Test -- Positive', + (WidgetTester tester) async { + final generatedUrl = await MockDynamicLinksServiceRepository() + .createDynamicLinkForFasilitas('11', '22'); + + expect(generatedUrl, 'https://bisago.page.link/bQ61qYhY1KajctUHA'); + }); +} -- GitLab From 4dd535172f4af3b82c5cfd73b1b52461ffd6a0e9 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 13:26:36 +0700 Subject: [PATCH 08/27] debug flutter version --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6535cd..ad62482 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,7 @@ stages: export PATH=$PATH:/sdk/android-sdk-linux/platform-tools/ mv $FLUTTER_ENV .env flutter pub get + flutter doctor -v image: poipole/bisago-be:latest -- GitLab From d28cdf62b3968c3f036d9be5dfd0edffde6b2bcf Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 13:45:02 +0700 Subject: [PATCH 09/27] flutter clean --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad62482..3b8c7da 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,6 +10,7 @@ stages: mv $FLUTTER_ENV .env flutter pub get flutter doctor -v + fluter clean image: poipole/bisago-be:latest -- GitLab From 604ebb77c2d207bedd68da791552da0ccb3300cf Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 13:46:25 +0700 Subject: [PATCH 10/27] flutter clean and update-packages --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b8c7da..3123fbf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,9 +8,10 @@ stages: .flutter_before_script: &flutter_before_script |- export PATH=$PATH:/sdk/android-sdk-linux/platform-tools/ mv $FLUTTER_ENV .env + flutter clean + flutter update-packages flutter pub get flutter doctor -v - fluter clean image: poipole/bisago-be:latest -- GitLab From 06eca7f3926b32dbf11ab35ae4eed1649a5d810b Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 15:45:29 +0700 Subject: [PATCH 11/27] [CHORES] Add android parameter --- lib/repository/dynamic_links_service_repository.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/repository/dynamic_links_service_repository.dart b/lib/repository/dynamic_links_service_repository.dart index 4d07a51..9531fa4 100644 --- a/lib/repository/dynamic_links_service_repository.dart +++ b/lib/repository/dynamic_links_service_repository.dart @@ -10,12 +10,15 @@ class DynamicLinksServiceRepository @override Future createDynamicLinkForFasilitas( String fasilitasId, String placeId) async { - var uriPrefix = 'https://bisago.page.link'; + var uriPrefix = 'https://bisago.page.link/'; final parameters = DynamicLinkParameters( uriPrefix: uriPrefix, link: Uri.parse( - 'https://bisago.page.link/fasilitas?id=$fasilitasId&place_id=$placeId', + 'https://bisago.page.link/link?id=$fasilitasId&place_id=$placeId&type=fasilitas', + ), + androidParameters: AndroidParameters( + packageName: 'com.ppl.bisaGo', ), ); -- GitLab From 57d84a35d9dfe1c53400ed50b8f3e22740d5365f Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 15:46:17 +0700 Subject: [PATCH 12/27] [CHORES] Remove static string --- test/dynamic_link_service_test.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/dynamic_link_service_test.dart b/test/dynamic_link_service_test.dart index a273c1e..305f563 100644 --- a/test/dynamic_link_service_test.dart +++ b/test/dynamic_link_service_test.dart @@ -3,12 +3,19 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:mockito/mockito.dart'; +final String _mockLink = 'https://bisago.page.link/bQ61qYhY1KajctUHA'; + class MockDynamicLinksServiceRepository extends Fake implements DynamicLinksServiceRepository { @override Future createDynamicLinkForFasilitas( String fasilitasId, String placeId) { - return Future.value('https://bisago.page.link/bQ61qYhY1KajctUHA'); + return Future.value(_mockLink); + } + + @override + Future createDynamicLinkForKegiatan(String id, String placeId) { + return Future.value(_mockLink); } } @@ -23,6 +30,6 @@ void main() { final generatedUrl = await MockDynamicLinksServiceRepository() .createDynamicLinkForFasilitas('11', '22'); - expect(generatedUrl, 'https://bisago.page.link/bQ61qYhY1KajctUHA'); + expect(generatedUrl, _mockLink); }); } -- GitLab From e94ffbd62b748ec8121ce87f5ede6aeea2c078bc Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 15:56:45 +0700 Subject: [PATCH 13/27] [CHORES] Implement dynamic link to share button in detail post --- .../postingan/detail_post.dart | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index fbcdd98..5102854 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post.dart @@ -4,6 +4,7 @@ import 'package:bisaGo/config/strings.dart'; import 'package:bisaGo/model/lokasi.dart'; import 'package:bisaGo/page/filter_fasilitas/fasilitas.dart'; import 'package:bisaGo/page/updateInformasi/update_informasi.dart'; +import 'package:bisaGo/repository/dynamic_links_service_repository.dart'; import 'package:bisaGo/utils/validator.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -60,11 +61,18 @@ class _DetailPostPageState extends State { actions: [ InkWell( child: const Icon(Icons.share), - onTap: () => Share.share( - 'Review fasilitas disabilitas di ${namaLokasi}, ' - 'oleh: ${widget.komentar.creator}\n\"${widget.komentar.deskripsi}\"\n\nDapatkan info fasilitas ramah ' - 'disabilitas dari aplikasi bisaGo!\nDownload bisaGo ' - 'sekarang di: https://bit.ly/DownloadbisaGo')) + onTap: () async { + final link = await DynamicLinksServiceRepository() + .createDynamicLinkForFasilitas( + widget.komentar.id.toString(), + widget.lokasi.placeId, + ); + await Share.share( + 'Tersedia ${fasilitas[widget.komentar.tag]} di ${widget.lokasi.name}, Oleh: ${widget.komentar.creator}\n\n' + 'Dapatkan info fasilitas ramah disabilitas selengkapnya dari aplikasi BisaGo!\n' + '$link\n', + ); + }), ], ), body: SingleChildScrollView( -- GitLab From 28456c5d4a3c280873f12b6d19c10034590388cb Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 16:00:15 +0700 Subject: [PATCH 14/27] change format share from /fasilitas to /link?type=[fasilitas|kegiatan] --- lib/page/dashboard/dashboard.dart | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index eac8b3a..1d64061 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -312,10 +312,13 @@ void initDynamicLinks() async { final path = deepLink.pathSegments; final placeId = params['place_id']; final id = params['id']; - if (path[0] == 'fasilitas') { - _navigateToDetailFasilitasPage(context, placeId, id); - } else if (path[0] == 'kegiatan') { - // TODO navigate kegiatan + final type = params['type']; + if (path[0] == 'link') { + if (type == 'fasilitas') { + _navigateToDetailFasilitasPage(context, placeId, id); + } else if (type == 'kegiatan') { + // TODO(:ariqbasyar) navigate kegiatan + } } } } -- GitLab From 8e9f1afa040cc37a409181f2a326c16f209212a5 Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 16:00:39 +0700 Subject: [PATCH 15/27] [GREEN] Implement generate dynamic link for kegiatan --- .../dynamic_links_service_repository.dart | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/repository/dynamic_links_service_repository.dart b/lib/repository/dynamic_links_service_repository.dart index 9531fa4..7a94e7f 100644 --- a/lib/repository/dynamic_links_service_repository.dart +++ b/lib/repository/dynamic_links_service_repository.dart @@ -3,6 +3,8 @@ import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; abstract class BaseDynamicLinksServiceRepository { Future createDynamicLinkForFasilitas( String fasilitasId, String placeId); + + Future createDynamicLinkForKegiatan(String id, String placeId); } class DynamicLinksServiceRepository @@ -26,4 +28,24 @@ class DynamicLinksServiceRepository final shortUrl = shortDynamicLink.shortUrl; return shortUrl.toString(); } + + @override + Future createDynamicLinkForKegiatan( + String fasilitasId, String placeId) async { + var uriPrefix = 'https://bisago.page.link/'; + + final parameters = DynamicLinkParameters( + uriPrefix: uriPrefix, + link: Uri.parse( + 'https://bisago.page.link/link?id=$fasilitasId&place_id=$placeId&type=kegiatan', + ), + androidParameters: AndroidParameters( + packageName: 'com.ppl.bisaGo', + ), + ); + + final shortDynamicLink = await parameters.buildShortLink(); + final shortUrl = shortDynamicLink.shortUrl; + return shortUrl.toString(); + } } -- GitLab From e9415bdb425c5c503760553b0dbdc1b806bd161f Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 16:19:34 +0700 Subject: [PATCH 16/27] [REFACTOR] Update to the newest linter --- lib/component/bisago_drawer.dart | 26 +- lib/component/image_preview_holder.dart | 3 +- lib/page/addLokasi/add_lokasi.dart | 141 ++-- lib/page/add_informasi/add_informasi.dart | 54 +- lib/page/dashboard/dashboard.dart | 53 +- .../postingan/detail_post.dart | 635 +++++++++--------- lib/page/informasi/layanan_disabilitas.dart | 2 +- lib/page/login/login.dart | 26 +- lib/page/login/pilih_disabilitas.dart | 5 +- lib/page/profile/edit_profile.dart | 9 +- lib/page/profile/profile.dart | 19 +- lib/page/registrasi/registrasi.dart | 8 +- ...istrasi_informasi_layanan_disabilitas.dart | 12 +- .../riwayat_pencarian/riwayat_pencarian.dart | 4 +- .../tentang_disabilitas_fisik.dart | 5 +- .../tentang_disabilitas_intelektual.dart | 5 +- .../tentang_disabilitas_mental.dart | 5 +- .../tentang_disabilitas_sensorik.dart | 5 +- .../updateInformasi/update_informasi.dart | 47 +- lib/repository/lokasi_repository.dart | 2 +- lib/utils/custom_alert_dialog.dart | 8 +- lib/utils/custom_button.dart | 4 +- lib/utils/custom_dropdown.dart | 2 +- lib/utils/location_turn_on_dialog.dart | 70 +- 24 files changed, 577 insertions(+), 573 deletions(-) diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index af87b28..7e45592 100644 --- a/lib/component/bisago_drawer.dart +++ b/lib/component/bisago_drawer.dart @@ -90,6 +90,12 @@ class BisaGoDrawer extends StatelessWidget { if (snapshot.hasData && snapshot.data != 'Selamat datang ke BisaGo!') { return Container( + decoration: BoxDecoration( + color: greenPrimary, + border: Border( + bottom: BorderSide(color: Colors.white), + ), + ), child: ListTile( key: Key(title), leading: Icon( @@ -107,18 +113,12 @@ class BisaGoDrawer extends StatelessWidget { ), onTap: () async { if (title == 'Login') { - await checkLoginStatus(context); + checkLoginStatus(context); } else if (title == 'Profile') { _navigateToProfilePage(context, snapshot.data); } }, ), - decoration: BoxDecoration( - color: greenPrimary, - border: Border( - bottom: BorderSide(color: Colors.white), - ), - ), ); } return Container(); @@ -126,6 +126,12 @@ class BisaGoDrawer extends StatelessWidget { ); } return Container( + decoration: BoxDecoration( + color: greenPrimary, + border: Border( + bottom: BorderSide(color: Colors.white), + ), + ), child: ListTile( key: Key(title), leading: Icon( @@ -145,12 +151,6 @@ class BisaGoDrawer extends StatelessWidget { _navigateToPage(context, title); }, ), - decoration: BoxDecoration( - color: greenPrimary, - border: Border( - bottom: BorderSide(color: Colors.white), - ), - ), ); } diff --git a/lib/component/image_preview_holder.dart b/lib/component/image_preview_holder.dart index eb2e0e3..9e31c9d 100644 --- a/lib/component/image_preview_holder.dart +++ b/lib/component/image_preview_holder.dart @@ -39,9 +39,8 @@ class _ImagePreviewHolderState extends State { child: widget.image, ), const SizedBox(height: regularSpace), - FlatButton( + TextButton( key: const Key('Button Hapus Foto'), - padding: EdgeInsets.zero, onPressed: widget.onPressed, child: Container( width: MediaQuery.of(context).size.width * 0.3, diff --git a/lib/page/addLokasi/add_lokasi.dart b/lib/page/addLokasi/add_lokasi.dart index 80c6661..2bc1e88 100644 --- a/lib/page/addLokasi/add_lokasi.dart +++ b/lib/page/addLokasi/add_lokasi.dart @@ -56,81 +56,82 @@ class _AddLokasiState extends State { @override Widget build(BuildContext context) { return WillPopScope( - child: Scaffold( - resizeToAvoidBottomInset: true, - appBar: BisaGoAppBar( - title: 'Tambah Lokasi', - leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (BuildContext context) => const Pencarian()))), + onWillPop: () => Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (BuildContext context) => const Pencarian())), + child: Scaffold( + resizeToAvoidBottomInset: true, + appBar: BisaGoAppBar( + title: 'Tambah Lokasi', + leading: InkWell( + onTap: () => Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (BuildContext context) => const Pencarian())), + child: const Icon(Icons.arrow_back_ios), ), - body: Stack( - children: [ - checkAvailabilityofUserLocation(), - InkWell( - key: const Key('InkWell'), - onTap: () async { - resetData(); - final locationPrediction = await PlacesAutocomplete.show( + ), + body: Stack( + children: [ + checkAvailabilityofUserLocation(), + InkWell( + key: const Key('InkWell'), + onTap: () async { + resetData(); + final locationPrediction = await PlacesAutocomplete.show( + context: context, + apiKey: DotEnv().env['API_KEY'], + mode: Mode.overlay); + if (locationPrediction != null) { + final placemark = await Geolocator() + .placemarkFromAddress(locationPrediction.description); + final latitude = placemark[0].position.latitude; + final longitude = placemark[0].position.longitude; + final position = LatLng(latitude, longitude); + setState(() { + data['latitude'] = latitude; + data['longitude'] = longitude; + alamatController.text = locationPrediction.description + .split(',') + .sublist(1) + .join(); + namaLokasitController.text = + locationPrediction.description.split(',')[0]; + markers.add(Marker( + markerId: MarkerId('Selected Location'), + position: position)); + }); + await mapController.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: position, zoom: 15), + ), + ); + await Future.delayed(const Duration(seconds: 1)); + await showModalBottomSheet( context: context, - apiKey: DotEnv().env['API_KEY'], - mode: Mode.overlay); - if (locationPrediction != null) { - final placemark = await Geolocator() - .placemarkFromAddress(locationPrediction.description); - final latitude = placemark[0].position.latitude; - final longitude = placemark[0].position.longitude; - final position = LatLng(latitude, longitude); - setState(() { - data['latitude'] = latitude; - data['longitude'] = longitude; - alamatController.text = locationPrediction.description - .split(',') - .sublist(1) - .join(); - namaLokasitController.text = - locationPrediction.description.split(',')[0]; - markers.add(Marker( - markerId: MarkerId('Selected Location'), - position: position)); - }); - await mapController.animateCamera( - CameraUpdate.newCameraPosition( - CameraPosition(target: position, zoom: 15), - ), - ); - await Future.delayed(const Duration(seconds: 1)); - await showModalBottomSheet( - context: context, - builder: (context) => addLokasiModal(), - backgroundColor: Colors.transparent, - isScrollControlled: true); - } - }, - child: Container( - width: double.infinity, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: regularBorderRadius, - boxShadow: regularShadow), - padding: const EdgeInsets.all(doubleSpace), - margin: const EdgeInsets.only( - top: doubleSpace, left: doubleSpace, right: doubleSpace), - child: const Text( - 'Cari lokasi yang anda inginkan', - style: TextStyle(color: Colors.grey), - ), + builder: (context) => addLokasiModal(), + backgroundColor: Colors.transparent, + isScrollControlled: true); + } + }, + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: regularBorderRadius, + boxShadow: regularShadow), + padding: const EdgeInsets.all(doubleSpace), + margin: const EdgeInsets.only( + top: doubleSpace, left: doubleSpace, right: doubleSpace), + child: const Text( + 'Cari lokasi yang anda inginkan', + style: TextStyle(color: Colors.grey), ), ), - if (isLoading) const Center(child: CircularProgressIndicator()) - ], - ), + ), + if (isLoading) const Center(child: CircularProgressIndicator()) + ], ), - onWillPop: () => Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (BuildContext context) => const Pencarian()))); + ), + ); } void onCreated(GoogleMapController controller) { diff --git a/lib/page/add_informasi/add_informasi.dart b/lib/page/add_informasi/add_informasi.dart index 4af1838..079cae1 100644 --- a/lib/page/add_informasi/add_informasi.dart +++ b/lib/page/add_informasi/add_informasi.dart @@ -322,6 +322,8 @@ class AddInformasiState extends State { color: greenPrimary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: _validateInformationInput, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -333,8 +335,6 @@ class AddInformasiState extends State { color: Colors.white, fontSize: 20.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: _validateInformationInput, ), )), const SizedBox( @@ -419,7 +419,7 @@ class AddInformasiState extends State { .buffer .asUint8List(); newKomentarData['image'] = - await MultipartFile.fromBytes(bytes, filename: 'kursiroda.jpg'); + MultipartFile.fromBytes(bytes, filename: 'kursiroda.jpg'); print('Fasilitas null dalem addinfo adalah: ' + _jenisFasilitas); break; case 'LF': @@ -427,103 +427,103 @@ class AddInformasiState extends State { (await rootBundle.load('assets/images/liftdisabilitas.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'liftdisabilitas.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'liftdisabilitas.jpg'); break; case 'TD': var bytes = (await rootBundle.load('assets/images/toiletdisabilitas.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'toiletdisabilitas.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'toiletdisabilitas.jpg'); break; case 'MM': var bytes = (await rootBundle.load('assets/images/masjidmushola.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'masjidmushola.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'masjidmushola.jpg'); break; case 'GB': var bytes = (await rootBundle.load('assets/images/guidingblock.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'guidingblock.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'guidingblock.jpg'); break; case 'BM': var bytes = (await rootBundle.load('assets/images/bidangmiring.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'bidangmiring.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'bidangmiring.jpg'); break; case 'CP': var bytes = (await rootBundle.load('assets/images/temandisabilitas.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'temandisabilitas.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'temandisabilitas.jpg'); break; case 'JI': var bytes = (await rootBundle.load('assets/images/juruisyarat.jpg')) .buffer .asUint8List(); newKomentarData['image'] = - await MultipartFile.fromBytes(bytes, filename: 'juruisyarat.jpg'); + MultipartFile.fromBytes(bytes, filename: 'juruisyarat.jpg'); break; case 'TN': var bytes = (await rootBundle.load('assets/images/tongkatnetra.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'tongkatnetra.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'tongkatnetra.jpg'); break; case 'KD': var bytes = (await rootBundle.load('assets/images/kursidisabilitas.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'kursidisabilitas.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'kursidisabilitas.jpg'); break; case 'PK': var bytes = (await rootBundle.load('assets/images/parkirdisabilitas.jpg')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'parkirdisabilitas.jpg'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'parkirdisabilitas.jpg'); break; case 'RT': var bytes = (await rootBundle.load('assets/images/runningtext.jpg')) .buffer .asUint8List(); newKomentarData['image'] = - await MultipartFile.fromBytes(bytes, filename: 'runningtext.jpg'); + MultipartFile.fromBytes(bytes, filename: 'runningtext.jpg'); break; case 'TB': var bytes = (await rootBundle.load('assets/images/parkirbiasa.jpg')) .buffer .asUint8List(); newKomentarData['image'] = - await MultipartFile.fromBytes(bytes, filename: 'parkirbiasa.jpg'); + MultipartFile.fromBytes(bytes, filename: 'parkirbiasa.jpg'); break; default: var bytes = (await rootBundle.load('assets/images/defaultDisable.png')) .buffer .asUint8List(); - newKomentarData['image'] = await MultipartFile.fromBytes(bytes, - filename: 'defaultDisable.png'); + newKomentarData['image'] = + MultipartFile.fromBytes(bytes, filename: 'defaultDisable.png'); print('Fasilitas null default addinfo adalah: ' + _jenisFasilitas); break; } } else { final fileName = _image.path.split('/').last; - newKomentarData['image'] = await MultipartFile.fromFile( + newKomentarData['image'] = MultipartFile.fromFile( _image.path, filename: fileName, ); diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index eac8b3a..57a8e46 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -194,8 +194,8 @@ class DashboardState extends State { // floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, appBar: const PreferredSize( preferredSize: Size.fromHeight(55), - child: BisaGoAppBar(), key: Key('Scaffold Text Field'), + child: BisaGoAppBar(), ), ); } @@ -262,7 +262,8 @@ class DashboardState extends State { return details.result.name; } - void _navigateToDetailFasilitasPage(BuildContext context, String placeId, String fasilitasId) async { + void _navigateToDetailFasilitasPage( + BuildContext context, String placeId, String fasilitasId) async { final fetches = await Future.wait([ KomentarRepository().fetchDetailFasilitas(placeId, fasilitasId), getLokasiName(placeId), @@ -272,38 +273,36 @@ class DashboardState extends State { final lokasi = Lokasi() ..placeId = placeId ..name = namaLokasi; - final fasilitasRoute = - MaterialPageRoute( + final fasilitasRoute = MaterialPageRoute( builder: (BuildContext context) => DetailPostPage( - lokasi: lokasi, - komentar: KomentarModel( - creator: fasilitas.creator, - dateTime: fasilitas.dateTime, - deskripsi: fasilitas.deskripsi, - id: fasilitas.id, - image: fasilitas.image, - isVerified: fasilitas.isVerified, - namaLokasi: lokasi.name, - tag: fasilitas.tag, - disabilitas: fasilitas.disabilitas, - jumlah: fasilitas.jumlah, - ), - ) - ); + lokasi: lokasi, + komentar: KomentarModel( + creator: fasilitas.creator, + dateTime: fasilitas.dateTime, + deskripsi: fasilitas.deskripsi, + id: fasilitas.id, + image: fasilitas.image, + isVerified: fasilitas.isVerified, + namaLokasi: lokasi.name, + tag: fasilitas.tag, + disabilitas: fasilitas.disabilitas, + jumlah: fasilitas.jumlah, + ), + )); await Navigator.of(context).push(fasilitasRoute); -} + } -void initDynamicLinks() async { - final data = await FirebaseDynamicLinks.instance.getInitialLink(); + void initDynamicLinks() async { + final data = await FirebaseDynamicLinks.instance.getInitialLink(); - _handleDeepLink(data); - FirebaseDynamicLinks.instance.onLink( - onSuccess: (PendingDynamicLinkData dynamicLink) async { + _handleDeepLink(data); + FirebaseDynamicLinks.instance.onLink( + onSuccess: (PendingDynamicLinkData dynamicLink) async { _handleDeepLink(dynamicLink); }, onError: (OnLinkErrorException e) async { print('Link Failed: ${e.message}'); - }); -} + }); + } void _handleDeepLink(PendingDynamicLinkData data) async { final deepLink = data?.link; diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index 5102854..16148ca 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post.dart @@ -54,353 +54,352 @@ class _DetailPostPageState extends State { Widget build(BuildContext context) { var namaLokasi = widget.komentar.namaLokasi ?? 'Invalid Lokasi Name'; return WillPopScope( - child: Scaffold( - appBar: BisaGoAppBar( - title: namaLokasi, - key: Key('appbar-text-${namaLokasi}'), - actions: [ - InkWell( - child: const Icon(Icons.share), - onTap: () async { - final link = await DynamicLinksServiceRepository() - .createDynamicLinkForFasilitas( - widget.komentar.id.toString(), - widget.lokasi.placeId, - ); - await Share.share( - 'Tersedia ${fasilitas[widget.komentar.tag]} di ${widget.lokasi.name}, Oleh: ${widget.komentar.creator}\n\n' - 'Dapatkan info fasilitas ramah disabilitas selengkapnya dari aplikasi BisaGo!\n' - '$link\n', - ); - }), - ], - ), - body: SingleChildScrollView( - child: Column( - children: [ - Container( - key: const Key('Text Jenis Fasilitas'), - margin: const EdgeInsets.symmetric( - vertical: 10.0, horizontal: 15.0), - alignment: Alignment.centerLeft, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: MediaQuery.of(context).size.width * 0.6, - child: Text( - fasilitas[widget.komentar.tag], - style: const TextStyle( - fontSize: 28, - fontWeight: FontWeight.w800, - letterSpacing: -0.3, - color: Colors.black, - fontFamily: 'Comfortaa', - ), + onWillPop: () => Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (BuildContext context) => Fasilitas( + lokasi: widget.lokasi, + ))), + child: Scaffold( + appBar: BisaGoAppBar( + title: namaLokasi, + key: Key('appbar-text-$namaLokasi'), + actions: [ + InkWell( + onTap: () async { + final link = await DynamicLinksServiceRepository() + .createDynamicLinkForFasilitas( + widget.komentar.id.toString(), + widget.lokasi.placeId, + ); + await Share.share( + 'Tersedia ${fasilitas[widget.komentar.tag]} di ${widget.lokasi.name}, Oleh: ${widget.komentar.creator}\n\n' + 'Dapatkan info fasilitas ramah disabilitas selengkapnya dari aplikasi BisaGo!\n' + '$link\n', + ); + }, + child: const Icon(Icons.share), + ), + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + Container( + key: const Key('Text Jenis Fasilitas'), + margin: const EdgeInsets.symmetric( + vertical: 10.0, horizontal: 15.0), + alignment: Alignment.centerLeft, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.6, + child: Text( + fasilitas[widget.komentar.tag], + style: const TextStyle( + fontSize: 28, + fontWeight: FontWeight.w800, + letterSpacing: -0.3, + color: Colors.black, + fontFamily: 'Comfortaa', ), ), - PopupMenuButton( - key: const Key('Button Ubah Informasi'), - elevation: 4.0, - offset: const Offset(0.0, 40.0), - itemBuilder: (BuildContext context) { - final choices = ['Ubah Informasi']; - return choices.map((String choice) { - return PopupMenuItem( - key: Key(choice), - child: RaisedButton( - padding: EdgeInsets.zero, - color: Colors.white, - elevation: 0, - onPressed: _updateInformasi, - child: SizedBox( - width: double.infinity, - child: Text(choice), - ), + ), + PopupMenuButton( + key: const Key('Button Ubah Informasi'), + elevation: 4.0, + offset: const Offset(0.0, 40.0), + itemBuilder: (BuildContext context) { + final choices = ['Ubah Informasi']; + return choices.map((String choice) { + return PopupMenuItem( + key: Key(choice), + child: RaisedButton( + padding: EdgeInsets.zero, + color: Colors.white, + elevation: 0, + onPressed: _updateInformasi, + child: SizedBox( + width: double.infinity, + child: Text(choice), ), - ); - }).toList(); - }, - ), - ], - ), + ), + ); + }).toList(); + }, + ), + ], ), - Container( - key: const Key('Text Jumlah'), - width: MediaQuery.of(context).size.width, - color: red, - padding: const EdgeInsets.symmetric( - vertical: regularSpace, horizontal: doubleSpace), - child: Text( - 'Tersedia sebanyak ${widget.komentar.jumlah} ' - 'unit fasilitas.', - style: const TextStyle( - fontSize: 16, - color: Colors.white, - fontFamily: 'Comfortaa', - ), - )), - Container( - margin: const EdgeInsets.all(doubleSpace), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 150, - child: ImageHolder( - url: widget.komentar.image, - fasilitas: widget.komentar.tag)), - const SizedBox( - height: 10, - ), - // Wrap( - // alignment: WrapAlignment.start, - // direction: Axis.horizontal, - // crossAxisAlignment: WrapCrossAlignment.start, - // children: widget.komentar.tag - // .map((tag) => - // _createTagContainer(getTag(tag))) - // .toList(), - // ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + ), + Container( + key: const Key('Text Jumlah'), + width: MediaQuery.of(context).size.width, + color: red, + padding: const EdgeInsets.symmetric( + vertical: regularSpace, horizontal: doubleSpace), + child: Text( + 'Tersedia sebanyak ${widget.komentar.jumlah} ' + 'unit fasilitas.', + style: const TextStyle( + fontSize: 16, + color: Colors.white, + fontFamily: 'Comfortaa', + ), + )), + Container( + margin: const EdgeInsets.all(doubleSpace), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 150, + child: ImageHolder( + url: widget.komentar.image, + fasilitas: widget.komentar.tag)), + const SizedBox( + height: 10, + ), + // Wrap( + // alignment: WrapAlignment.start, + // direction: Axis.horizontal, + // crossAxisAlignment: WrapCrossAlignment.start, + // children: widget.komentar.tag + // .map((tag) => + // _createTagContainer(getTag(tag))) + // .toList(), + // ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Dapat digunakan oleh', + style: TextStyle(fontSize: 16), + textAlign: TextAlign.left, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _showIfContains('DF'), + _showIfContains('DI'), + _showIfContains('DM'), + _showIfContains('DS'), + ], + ) + ], + ), + Container( + key: const Key('desc'), + decoration: BoxDecoration( + color: gray, + boxShadow: regularShadow, + borderRadius: regularBorderRadius), + padding: const EdgeInsets.all(doubleSpace), + margin: const EdgeInsets.symmetric(vertical: doubleSpace), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - 'Dapat digunakan oleh', - style: TextStyle(fontSize: 16), - textAlign: TextAlign.left, - ), Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - _showIfContains('DF'), - _showIfContains('DI'), - _showIfContains('DM'), - _showIfContains('DS'), - ], - ) - ], - ), - Container( - key: const Key('desc'), - decoration: BoxDecoration( - color: gray, - boxShadow: regularShadow, - borderRadius: regularBorderRadius), - padding: const EdgeInsets.all(doubleSpace), - margin: - const EdgeInsets.symmetric(vertical: doubleSpace), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - const Expanded( - child: Text( - 'Cara menggunakan', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w800), - ), + const Expanded( + child: Text( + 'Cara menggunakan', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w800), ), - ], - ), - Container( - margin: const EdgeInsets.symmetric( - vertical: regularSpace), - child: Text( - widget.komentar.deskripsi, - key: const Key('Text Cara Menggunakan'), - style: const TextStyle(fontSize: 16), ), - ), - ], - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - const Text( - 'informasi ditambahkan oleh ', - style: TextStyle( - fontSize: 12, - fontStyle: FontStyle.italic, - fontWeight: FontWeight.w200, - ), + ], ), Container( - padding: EdgeInsets.zero, - constraints: BoxConstraints( - maxWidth: - MediaQuery.of(context).size.width * 0.3), + margin: const EdgeInsets.symmetric( + vertical: regularSpace), child: Text( - '${widget.komentar.creator} ', - key: Key('creator-${widget.komentar.creator}'), - overflow: TextOverflow.fade, - softWrap: false, - style: const TextStyle( - fontSize: 12, - fontStyle: FontStyle.italic, - ), + widget.komentar.deskripsi, + key: const Key('Text Cara Menggunakan'), + style: const TextStyle(fontSize: 16), ), ), - Text( - '(${DateFormat('dd MMM yyy').format(widget.komentar.dateTime)})', - key: const Key('timestamp'), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Text( + 'informasi ditambahkan oleh ', + style: TextStyle( + fontSize: 12, + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w200, + ), + ), + Container( + padding: EdgeInsets.zero, + constraints: BoxConstraints( + maxWidth: + MediaQuery.of(context).size.width * 0.3), + child: Text( + '${widget.komentar.creator} ', + key: Key('creator-${widget.komentar.creator}'), + overflow: TextOverflow.fade, + softWrap: false, style: const TextStyle( fontSize: 12, fontStyle: FontStyle.italic, ), ), - ], - ), - const SizedBox( - height: regularSpace, - ), - const Divider( - color: grayPrimary, - thickness: 1.0, - ), - Container( - key: const Key('Komentar'), - padding: const EdgeInsets.symmetric( - vertical: regularSpace), - child: const Text( - 'Komentar', - style: TextStyle( - fontSize: 20, fontWeight: FontWeight.w800), - )), - StreamBuilder( - stream: _bloc.komentarPostingListStream, - builder: (context, snapshot) { - if (snapshot.hasData) { - switch (snapshot.data.status) { - case Status.loading: + ), + Text( + '(${DateFormat('dd MMM yyy').format(widget.komentar.dateTime)})', + key: const Key('timestamp'), + style: const TextStyle( + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ], + ), + const SizedBox( + height: regularSpace, + ), + const Divider( + color: grayPrimary, + thickness: 1.0, + ), + Container( + key: const Key('Komentar'), + padding: + const EdgeInsets.symmetric(vertical: regularSpace), + child: const Text( + 'Komentar', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.w800), + )), + StreamBuilder( + stream: _bloc.komentarPostingListStream, + builder: (context, snapshot) { + if (snapshot.hasData) { + switch (snapshot.data.status) { + case Status.loading: + return const Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + greenPrimary), + ), + ); + break; + case Status.completed: + allKomentarPostingFromApi = + snapshot.data.data.allKomentar; + if (allKomentarPostingFromApi.isEmpty) { return const Center( - child: CircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - greenPrimary), - ), - ); - break; - case Status.completed: - allKomentarPostingFromApi = - snapshot.data.data.allKomentar; - if (allKomentarPostingFromApi.isEmpty) { - return const Center( - child: Text('Tidak ada Komentar')); - } else { - return Column( - children: allKomentarPostingFromApi - .map((k) => - komentarPlaceHolder(k.creator, - k.dateTime, k.deskripsi)) - .toList()); - } - break; - case Status.error: - return Center( - child: Text(snapshot.data.data.toString()), - ); - break; - } + child: Text('Tidak ada Komentar')); + } else { + return Column( + children: allKomentarPostingFromApi + .map((k) => + komentarPlaceHolder(k.creator, + k.dateTime, k.deskripsi)) + .toList()); + } + break; + case Status.error: + return Center( + child: Text(snapshot.data.data.toString()), + ); + break; } - return Container(); - }), - const SizedBox(height: regularSpace), - Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - key: const Key('Text Field Komentar'), - keyboardType: TextInputType.multiline, - maxLines: null, - minLines: 3, - validator: FieldValidator.validateInfo, - controller: komentarController, - style: const TextStyle( - fontSize: 18, - ), - decoration: InputDecoration( - hintStyle: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 15), - hintText: 'Tulis komentar...', - contentPadding: const EdgeInsets.all(8.0), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - borderSide: BorderSide( - color: Theme.of(context).primaryColor, - ), + } + return Container(); + }), + const SizedBox(height: regularSpace), + Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + key: const Key('Text Field Komentar'), + keyboardType: TextInputType.multiline, + maxLines: null, + minLines: 3, + validator: FieldValidator.validateInfo, + controller: komentarController, + style: const TextStyle( + fontSize: 18, + ), + decoration: InputDecoration( + hintStyle: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 15), + hintText: 'Tulis komentar...', + contentPadding: const EdgeInsets.all(8.0), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - borderSide: BorderSide( - color: Theme.of(context).primaryColor, - ), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, ), ), ), - Container( - key: const Key('tambah komentar'), - padding: - const EdgeInsets.only(top: doubleSpace), - alignment: Alignment.center, - child: ButtonTheme( - minWidth: double.infinity, - height: 40, - child: RaisedButton( - key: const Key('Button Tambah Komentar'), - padding: const EdgeInsets.symmetric( - vertical: 13), - highlightElevation: 0.0, - splashColor: greenPrimary, - highlightColor: Colors.white, - elevation: 0.0, - color: greenPrimary, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(10)), - ), - child: Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - const Icon( - Icons.add, - size: 30, - color: Colors.white, - ), - const SizedBox(width: 5.0), - const Text( - 'Tambah Komentar', - style: TextStyle( - fontSize: 20, - color: Colors.white, - fontWeight: FontWeight.bold), - ), - ], - ), - onPressed: () { - _checkLoginStatus(); - }, + ), + Container( + key: const Key('tambah komentar'), + padding: + const EdgeInsets.only(top: doubleSpace), + alignment: Alignment.center, + child: ButtonTheme( + minWidth: double.infinity, + height: 40, + child: RaisedButton( + key: const Key('Button Tambah Komentar'), + padding: const EdgeInsets.symmetric( + vertical: 13), + highlightElevation: 0.0, + splashColor: greenPrimary, + highlightColor: Colors.white, + elevation: 0.0, + color: greenPrimary, + shape: const RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(10)), ), - )), - ], - )), - ], - ), + onPressed: () { + _checkLoginStatus(); + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons.add, + size: 30, + color: Colors.white, + ), + const SizedBox(width: 5.0), + const Text( + 'Tambah Komentar', + style: TextStyle( + fontSize: 20, + color: Colors.white, + fontWeight: FontWeight.bold), + ), + ], + ), + ), + )), + ], + )), + ], ), - ], - ), + ), + ], ), ), - onWillPop: () => - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (BuildContext context) => Fasilitas( - lokasi: widget.lokasi, - )))); + ), + ); } Future _checkLoginStatus() async { diff --git a/lib/page/informasi/layanan_disabilitas.dart b/lib/page/informasi/layanan_disabilitas.dart index c8d3dda..59cc586 100644 --- a/lib/page/informasi/layanan_disabilitas.dart +++ b/lib/page/informasi/layanan_disabilitas.dart @@ -17,8 +17,8 @@ class _LayananDisabilitasState extends State { return Scaffold( appBar: const PreferredSize( preferredSize: Size.fromHeight(55), - child: BisaGoAppBar(), key: Key('Scaffold Text Field'), + child: BisaGoAppBar(), ), drawer: BisaGoDrawer(), body: Container( diff --git a/lib/page/login/login.dart b/lib/page/login/login.dart index 79e9600..4d3f601 100644 --- a/lib/page/login/login.dart +++ b/lib/page/login/login.dart @@ -73,13 +73,13 @@ class LoginState extends State { Padding( padding: const EdgeInsets.all(doubleSpace), child: InkWell( + onTap: () { + _navigateToRegistrasiPage(context); + }, child: const Text( 'Daftar', style: TextStyle(fontSize: 15), ), - onTap: () { - _navigateToRegistrasiPage(context); - }, ), ) ], @@ -162,6 +162,11 @@ class LoginState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: () async { + Navigator.of(context).pop(true); + await _updateUser(newUser); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -173,11 +178,6 @@ class LoginState extends State { color: greenPrimary, fontSize: 25.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: () async { - Navigator.of(context).pop(true); - await _updateUser(newUser); - }, ))), const SizedBox(width: 10.0), Expanded( @@ -189,6 +189,11 @@ class LoginState extends State { color: greenPrimary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: () { + Navigator.of(context).pop(true); + _navigateToPilihDisabilitas(context); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -200,11 +205,6 @@ class LoginState extends State { color: Colors.white, fontSize: 25.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: () { - Navigator.of(context).pop(true); - _navigateToPilihDisabilitas(context); - }, ))), ], ), diff --git a/lib/page/login/pilih_disabilitas.dart b/lib/page/login/pilih_disabilitas.dart index fc08a5b..758a125 100644 --- a/lib/page/login/pilih_disabilitas.dart +++ b/lib/page/login/pilih_disabilitas.dart @@ -29,8 +29,9 @@ class _PilihDisabilitasState extends State { child: BisaGoAppBar( title: '', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), ), body: Container( diff --git a/lib/page/profile/edit_profile.dart b/lib/page/profile/edit_profile.dart index af2aabb..49648b3 100644 --- a/lib/page/profile/edit_profile.dart +++ b/lib/page/profile/edit_profile.dart @@ -49,13 +49,14 @@ class _EditProfileState extends State { final name = user.name; return Scaffold( appBar: PreferredSize( + preferredSize: const Size.fromHeight(55), child: BisaGoAppBar( title: 'Edit Profile', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), - preferredSize: const Size.fromHeight(55), ), body: SingleChildScrollView( child: Form( @@ -174,12 +175,12 @@ class _EditProfileState extends State { }); }); }, + color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle( fontSize: 15.0, color: Colors.white), ), - color: greenPrimary, ), ], ), diff --git a/lib/page/profile/profile.dart b/lib/page/profile/profile.dart index 0903be1..2f2f74c 100644 --- a/lib/page/profile/profile.dart +++ b/lib/page/profile/profile.dart @@ -30,28 +30,29 @@ class _ProfileState extends State { Widget build(BuildContext context) { return Scaffold( appBar: PreferredSize( + preferredSize: const Size.fromHeight(55), child: BisaGoAppBar( title: 'Profile', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), actions: [ Padding( padding: const EdgeInsets.all(doubleSpace), child: InkWell( key: const Key('Edit User Profile'), + onTap: () { + _navigateToEditProfile(context); + }, child: const Text( 'Edit', style: TextStyle(fontSize: 15), ), - onTap: () { - _navigateToEditProfile(context); - }, ), ) ], ), - preferredSize: const Size.fromHeight(55), ), body: FutureBuilder( future: _bloc.fetchUser(email), @@ -89,6 +90,9 @@ class _ProfileState extends State { child: ListView( children: [ Container( + padding: const EdgeInsets.only( + bottom: doubleSpace, + ), child: CircleAvatar( key: Key('Avatar ${user.name.split(' ')[0]}'), radius: 50, @@ -103,9 +107,6 @@ class _ProfileState extends State { ), ), ), - padding: const EdgeInsets.only( - bottom: doubleSpace, - ), ), Text( 'Halo, ${user.name.split(' ')[0]}!', diff --git a/lib/page/registrasi/registrasi.dart b/lib/page/registrasi/registrasi.dart index c5cab28..a3b2263 100644 --- a/lib/page/registrasi/registrasi.dart +++ b/lib/page/registrasi/registrasi.dart @@ -72,13 +72,13 @@ class RegistrasiState extends State { Padding( padding: const EdgeInsets.all(doubleSpace), child: InkWell( + onTap: () { + Navigator.pop(context); + }, child: const Text( 'Login', style: TextStyle(fontSize: 15), ), - onTap: () { - Navigator.pop(context); - }, ), ) ], @@ -169,12 +169,12 @@ class RegistrasiState extends State { }); }); }, + color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle( fontSize: 12.0, color: Colors.white), ), - color: greenPrimary, ), const SizedBox(height: 10.0), ], diff --git a/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart b/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart index 131816b..a752874 100644 --- a/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart +++ b/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart @@ -187,11 +187,11 @@ class _RegistrasiInformasiLayananDisabilitasState }); }); }, + color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle(color: Colors.white), ), - color: greenPrimary, ) ], )), @@ -223,8 +223,8 @@ class _RegistrasiInformasiLayananDisabilitasState key: const Key('Jenis Kelamin Dropdown'), items: _dropdownValues .map((value) => DropdownMenuItem( - child: Text(value), value: value, + child: Text(value), )) .toList(), onChanged: (String value) { @@ -268,8 +268,8 @@ class _RegistrasiInformasiLayananDisabilitasState key: const Key('Pendidikan Dropdown'), items: _dropdownValues2 .map((value) => DropdownMenuItem( - child: Text(value), value: value, + child: Text(value), )) .toList(), onChanged: (String value) { @@ -313,8 +313,8 @@ class _RegistrasiInformasiLayananDisabilitasState key: const Key('Pekerjaan Dropdown'), items: pekerjaanList .map((value) => DropdownMenuItem( - child: Text(value), value: value, + child: Text(value), )) .toList(), onChanged: (String value) { @@ -359,8 +359,8 @@ class _RegistrasiInformasiLayananDisabilitasState key: const Key('Kategori Dropdown'), items: _dropdownValues3 .map((value) => DropdownMenuItem( - child: Text(value), value: value, + child: Text(value), )) .toList(), onChanged: (String value) { @@ -481,7 +481,7 @@ class _RegistrasiInformasiLayananDisabilitasState } Future _validateRegisInput() async { - await createPenyandang(); + createPenyandang(); //_showDialog(); } diff --git a/lib/page/riwayat_pencarian/riwayat_pencarian.dart b/lib/page/riwayat_pencarian/riwayat_pencarian.dart index 9145990..24569e4 100644 --- a/lib/page/riwayat_pencarian/riwayat_pencarian.dart +++ b/lib/page/riwayat_pencarian/riwayat_pencarian.dart @@ -23,15 +23,15 @@ class _RiwayatPencarianState extends State { /// BLoC for pencarian LokasiResponseBloc bloc = LokasiResponseBloc(); - + @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, appBar: const PreferredSize( preferredSize: Size.fromHeight(55), - child: BisaGoAppBar(), key: Key('Scaffold Text Field'), + child: BisaGoAppBar(), ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/page/tentang_disabilitas/tentang_disabilitas_fisik.dart b/lib/page/tentang_disabilitas/tentang_disabilitas_fisik.dart index 4a3e1f8..493d88d 100644 --- a/lib/page/tentang_disabilitas/tentang_disabilitas_fisik.dart +++ b/lib/page/tentang_disabilitas/tentang_disabilitas_fisik.dart @@ -18,8 +18,9 @@ class _TentangDisabilitasFisik extends State { child: BisaGoAppBar( title: 'Tentang Disabilitas', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), ), body: ListView( diff --git a/lib/page/tentang_disabilitas/tentang_disabilitas_intelektual.dart b/lib/page/tentang_disabilitas/tentang_disabilitas_intelektual.dart index f0864ae..50316f9 100644 --- a/lib/page/tentang_disabilitas/tentang_disabilitas_intelektual.dart +++ b/lib/page/tentang_disabilitas/tentang_disabilitas_intelektual.dart @@ -20,8 +20,9 @@ class _TentangDisabilitasIntelektual child: BisaGoAppBar( title: 'Tentang Disabilitas', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), ), body: ListView( diff --git a/lib/page/tentang_disabilitas/tentang_disabilitas_mental.dart b/lib/page/tentang_disabilitas/tentang_disabilitas_mental.dart index e25fb6c..705f9f3 100644 --- a/lib/page/tentang_disabilitas/tentang_disabilitas_mental.dart +++ b/lib/page/tentang_disabilitas/tentang_disabilitas_mental.dart @@ -18,8 +18,9 @@ class _TentangDisabilitasMental extends State { child: BisaGoAppBar( title: 'Tentang Disabilitas', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), ), body: ListView( diff --git a/lib/page/tentang_disabilitas/tentang_disabilitas_sensorik.dart b/lib/page/tentang_disabilitas/tentang_disabilitas_sensorik.dart index 54ae82c..6d82778 100644 --- a/lib/page/tentang_disabilitas/tentang_disabilitas_sensorik.dart +++ b/lib/page/tentang_disabilitas/tentang_disabilitas_sensorik.dart @@ -18,8 +18,9 @@ class _TentangDisabilitasSensorik extends State { child: BisaGoAppBar( title: 'Tentang Disabilitas', leading: InkWell( - child: const Icon(Icons.arrow_back_ios), - onTap: () => Navigator.pop(context, 'Take me back')), + onTap: () => Navigator.pop(context, 'Take me back'), + child: const Icon(Icons.arrow_back_ios), + ), ), ), body: ListView( diff --git a/lib/page/updateInformasi/update_informasi.dart b/lib/page/updateInformasi/update_informasi.dart index 0e80bda..97a4414 100644 --- a/lib/page/updateInformasi/update_informasi.dart +++ b/lib/page/updateInformasi/update_informasi.dart @@ -209,7 +209,7 @@ class UpdateInformasiState extends State { style: TextStyle(fontSize: 18), textAlign: TextAlign.left, ), - FlatButton( + TextButton( key: const Key('Button Input Foto'), padding: EdgeInsets.zero, onPressed: () async { @@ -294,27 +294,28 @@ class UpdateInformasiState extends State { minWidth: double.infinity, height: 40, child: RaisedButton( - padding: const EdgeInsets.symmetric(vertical: 15), - highlightElevation: 0.0, - splashColor: const Color(0xff3A903A), - highlightColor: const Color(0xff3A903A), - elevation: 0.0, - color: Colors.white70, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(10)), - side: BorderSide(color: Color(0xff3A903A))), - child: const Text( - 'Batal', - style: TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.bold), - ), - onPressed: () { - _resetInput(); - Navigator.of(context).pop(); - }), + padding: const EdgeInsets.symmetric(vertical: 15), + highlightElevation: 0.0, + splashColor: const Color(0xff3A903A), + highlightColor: const Color(0xff3A903A), + elevation: 0.0, + color: Colors.white70, + shape: const RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(10)), + side: BorderSide(color: Color(0xff3A903A))), + onPressed: () { + _resetInput(); + Navigator.of(context).pop(); + }, + child: const Text( + 'Batal', + style: TextStyle( + fontSize: 20, + color: Colors.black, + fontWeight: FontWeight.bold), + ), + ), ), ), const SizedBox( @@ -507,7 +508,7 @@ class UpdateInformasiState extends State { const SizedBox(height: doubleSpace), SizedBox(height: 200, child: ImageHolder(url: widget.komentar.image)), const SizedBox(height: regularSpace), - FlatButton( + TextButton( key: const Key('Button Hapus Foto'), padding: EdgeInsets.zero, onPressed: () async { diff --git a/lib/repository/lokasi_repository.dart b/lib/repository/lokasi_repository.dart index f0d541c..6185473 100644 --- a/lib/repository/lokasi_repository.dart +++ b/lib/repository/lokasi_repository.dart @@ -131,7 +131,7 @@ class LokasiRepository implements BaseLokasiRepository { @override String fetchPhoto(String photoReference, int maxHeight, int maxWidth) { - return 'https://maps.googleapis.com/maps/api/place/photo?photoreference=${photoReference}&sensor=false&maxheight=${maxHeight}&maxwidth=${maxWidth}&key=${DotEnv().env['API_KEY']}'; + return 'https://maps.googleapis.com/maps/api/place/photo?photoreference=$photoReference&sensor=false&maxheight=$maxHeight&maxwidth=$maxWidth&key=${DotEnv().env['API_KEY']}'; } @override diff --git a/lib/utils/custom_alert_dialog.dart b/lib/utils/custom_alert_dialog.dart index 5d0bcbf..7923ab4 100644 --- a/lib/utils/custom_alert_dialog.dart +++ b/lib/utils/custom_alert_dialog.dart @@ -48,6 +48,8 @@ class _CustomAlertDialog extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: widget.leftFunction, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -58,8 +60,6 @@ class _CustomAlertDialog extends State { color: greenPrimary, fontSize: 25.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: widget.leftFunction, ))), const SizedBox(width: 10.0), Expanded( @@ -71,6 +71,8 @@ class _CustomAlertDialog extends State { color: greenPrimary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: widget.rightFunction, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -81,8 +83,6 @@ class _CustomAlertDialog extends State { color: Colors.white, fontSize: 25.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: widget.rightFunction, ))), ], ), diff --git a/lib/utils/custom_button.dart b/lib/utils/custom_button.dart index a0641ab..d51ae3b 100644 --- a/lib/utils/custom_button.dart +++ b/lib/utils/custom_button.dart @@ -16,12 +16,12 @@ Widget submitButton(String text, void Function() function) { shape: RoundedRectangleBorder( borderRadius: regularBorderRadius, ), + onPressed: () => function(), child: Text( text, style: const TextStyle( fontSize: 20, color: white, fontWeight: FontWeight.bold), ), - onPressed: () => function(), ), ); } @@ -116,8 +116,8 @@ Widget iconButton( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), - child: icon, onPressed: () => function(), + child: icon, ), ); } diff --git a/lib/utils/custom_dropdown.dart b/lib/utils/custom_dropdown.dart index 336435d..39e7575 100644 --- a/lib/utils/custom_dropdown.dart +++ b/lib/utils/custom_dropdown.dart @@ -36,8 +36,8 @@ class _CustomDropdownState extends State { for (final key in widget.dropdownList.keys) { _dropdownMenuItems.add(DropdownMenuItem( key: Key('Dropdown Item ${widget.dropdownList[key]}'), - child: Text(widget.dropdownList[key]), value: key, + child: Text(widget.dropdownList[key]), )); } } diff --git a/lib/utils/location_turn_on_dialog.dart b/lib/utils/location_turn_on_dialog.dart index c6b5562..b974acb 100644 --- a/lib/utils/location_turn_on_dialog.dart +++ b/lib/utils/location_turn_on_dialog.dart @@ -21,41 +21,39 @@ class LocationTurnOnDialog extends StatelessWidget { title: Text(title, textAlign: TextAlign.center), titleTextStyle: const TextStyle(fontSize: 25.0, color: Colors.black), titlePadding: const EdgeInsets.fromLTRB(0.0, 30.0, 0.0, 20.0), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible( - child: Text(message, textAlign: TextAlign.center), - ), - Flexible( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - key: Key('Turn On Location Services Button'), - decoration: BoxDecoration(boxShadow: regularShadow), - height: 64.0, - child: FlatButton( - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), - side: const BorderSide(color: greenPrimary)), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox(width: 2.0), - Text(buttonMessage, - style: const TextStyle( - color: greenPrimary, fontSize: 20.0)), - ], - ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: onPressed, - )) - ] - )) - ]), - contentPadding: const EdgeInsets.fromLTRB(25.0, 0.0, 25.0, 30.0), - shape: RoundedRectangleBorder(borderRadius:regularBorderRadius),); + content: Column(mainAxisSize: MainAxisSize.min, children: [ + Flexible( + child: Text(message, textAlign: TextAlign.center), + ), + Flexible( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + key: Key('Turn On Location Services Button'), + decoration: BoxDecoration(boxShadow: regularShadow), + height: 64.0, + child: FlatButton( + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: const BorderSide(color: greenPrimary)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 2.0), + Text(buttonMessage, + style: const TextStyle( + color: greenPrimary, fontSize: 20.0)), + ], + ), + padding: const EdgeInsets.symmetric(vertical: 10.0), + onPressed: onPressed, + )) + ])) + ]), + contentPadding: const EdgeInsets.fromLTRB(25.0, 0.0, 25.0, 30.0), + shape: RoundedRectangleBorder(borderRadius: regularBorderRadius), + ); } } -- GitLab From f0ac39f491c1ceadc816a33f9fa16d7ede935de8 Mon Sep 17 00:00:00 2001 From: Yoga Pratama Date: Tue, 4 May 2021 16:20:29 +0700 Subject: [PATCH 17/27] [REFACTOR] Update to the newest linter --- lib/page/updateInformasi/update_informasi.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/page/updateInformasi/update_informasi.dart b/lib/page/updateInformasi/update_informasi.dart index 97a4414..8ea7849 100644 --- a/lib/page/updateInformasi/update_informasi.dart +++ b/lib/page/updateInformasi/update_informasi.dart @@ -209,7 +209,7 @@ class UpdateInformasiState extends State { style: TextStyle(fontSize: 18), textAlign: TextAlign.left, ), - TextButton( + FlatButton( key: const Key('Button Input Foto'), padding: EdgeInsets.zero, onPressed: () async { @@ -508,7 +508,7 @@ class UpdateInformasiState extends State { const SizedBox(height: doubleSpace), SizedBox(height: 200, child: ImageHolder(url: widget.komentar.image)), const SizedBox(height: regularSpace), - TextButton( + FlatButton( key: const Key('Button Hapus Foto'), padding: EdgeInsets.zero, onPressed: () async { -- GitLab From bc49e2ed395ba11fa74f14f189aeaaffed353741 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 17:10:10 +0700 Subject: [PATCH 18/27] change flutter version on pipeline from 1.22 to 2.0.3 change sonar scanner version on pipeline from 4.2 to 4.6 --- .gitlab-ci.yml | 2 +- Dockerfile | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3123fbf..b0a600e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,7 +13,7 @@ stages: flutter pub get flutter doctor -v -image: poipole/bisago-be:latest +image: poipole/bisago-be:2.0.5-4.6.0.2311 before_script: - *flutter_before_script diff --git a/Dockerfile b/Dockerfile index e203794..5e272cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,9 @@ -FROM cirrusci/flutter:latest - - -ENV SONARSCANNER="https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip" \ - SONAR_SCANNER_CLI_VERSION=4.2.0.1873 +FROM cirrusci/flutter:2.0.5 +ENV SONAR_SCANNER_CLI_VERSION=4.6.0.2311 RUN wget -qO sonar-scanner-cli.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_CLI_VERSION}-linux.zip && \ unzip sonar-scanner-cli.zip -d /opt && \ rm sonar-scanner-cli.zip && \ chmod +x /opt/sonar-scanner-${SONAR_SCANNER_CLI_VERSION}-linux/bin/sonar-scanner && \ ln -s /opt/sonar-scanner-${SONAR_SCANNER_CLI_VERSION}-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner - - -- GitLab From 97a13e1b7cd13429482607f06c17f6fbc72e4a05 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 17:16:47 +0700 Subject: [PATCH 19/27] remove flutter clean and update-packages, change image version to 2.0.5-4.6.0.2311 --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b0a600e..80eb0fc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,10 +8,7 @@ stages: .flutter_before_script: &flutter_before_script |- export PATH=$PATH:/sdk/android-sdk-linux/platform-tools/ mv $FLUTTER_ENV .env - flutter clean - flutter update-packages flutter pub get - flutter doctor -v image: poipole/bisago-be:2.0.5-4.6.0.2311 -- GitLab From 3bf91044bbe5287112de7fa093948f70aa23bef9 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Tue, 4 May 2021 23:42:25 +0700 Subject: [PATCH 20/27] [CHORE] Migrate deprecated widgets - FlatButton to TextButton - RaisedButton to ElevatedButton --- lib/page/addLokasi/add_lokasi.dart | 4 +- lib/page/add_informasi/add_informasi.dart | 20 +++--- lib/page/filter_fasilitas/fasilitas.dart | 31 +++++--- .../postingan/detail_post.dart | 34 +++++---- lib/page/informasi/layanan_disabilitas.dart | 50 +++++++------ lib/page/login/login.dart | 22 +++--- lib/page/pencarian/pencarian.dart | 7 +- lib/page/profile/edit_profile.dart | 12 ++-- lib/page/registrasi/registrasi.dart | 12 ++-- ...istrasi_informasi_layanan_disabilitas.dart | 70 ++++++++++++------- .../tentang_disabilitas.dart | 8 +-- .../updateInformasi/update_informasi.dart | 41 +++++++---- lib/utils/custom_alert_dialog.dart | 22 +++--- lib/utils/custom_button.dart | 59 ++++++++++------ .../custom_dashboard_location_button.dart | 6 +- lib/utils/custom_disabilitas_button.dart | 6 +- lib/utils/location_turn_on_dialog.dart | 16 +++-- test/layanan_disabilitas_test.dart | 2 +- ...si_informasi_layanan_disabilitas_test.dart | 4 +- test/widget_test.dart | 2 +- 20 files changed, 259 insertions(+), 169 deletions(-) diff --git a/lib/page/addLokasi/add_lokasi.dart b/lib/page/addLokasi/add_lokasi.dart index 2bc1e88..90fd864 100644 --- a/lib/page/addLokasi/add_lokasi.dart +++ b/lib/page/addLokasi/add_lokasi.dart @@ -284,8 +284,8 @@ class _AddLokasiState extends State { ), )), Expanded( - child: FlatButton( - color: greenPrimary, + child: TextButton( + style: TextButton.styleFrom(backgroundColor: greenPrimary), onPressed: () { addLocationToApi(); setState(() { diff --git a/lib/page/add_informasi/add_informasi.dart b/lib/page/add_informasi/add_informasi.dart index 079cae1..77e2df8 100644 --- a/lib/page/add_informasi/add_informasi.dart +++ b/lib/page/add_informasi/add_informasi.dart @@ -206,9 +206,9 @@ class AddInformasiState extends State { style: TextStyle(fontSize: 18), textAlign: TextAlign.left, ), - FlatButton( + TextButton( key: const Key('Button Input Foto Gallery'), - padding: EdgeInsets.zero, + style: TextButton.styleFrom(padding: EdgeInsets.zero), onPressed: () async { final imageSelected = await _getImage(); setState(() { @@ -240,9 +240,9 @@ class AddInformasiState extends State { ), ), ), - FlatButton( + TextButton( key: const Key('Button Input Foto Camera'), - padding: EdgeInsets.zero, + style: TextButton.styleFrom(padding: EdgeInsets.zero), onPressed: () async { final imageSelected = await _getCameraImage(); setState(() { @@ -318,11 +318,13 @@ class AddInformasiState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: ButtonTheme( height: 55.0, - child: FlatButton( - color: greenPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0)), - padding: const EdgeInsets.symmetric(vertical: 10.0), + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: greenPrimary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0) + ), onPressed: _validateInformationInput, child: Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/page/filter_fasilitas/fasilitas.dart b/lib/page/filter_fasilitas/fasilitas.dart index 06baea9..5682d74 100644 --- a/lib/page/filter_fasilitas/fasilitas.dart +++ b/lib/page/filter_fasilitas/fasilitas.dart @@ -134,17 +134,30 @@ class _FasilitasState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: SizedBox( width: double.infinity, - child: FlatButton( + child: TextButton( key: const Key('Tambah Informasi'), - color: Colors.green[700], - textColor: Colors.white, - disabledColor: Colors.grey, - disabledTextColor: Colors.black, - padding: const EdgeInsets.all(8), - shape: RoundedRectangleBorder( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return Colors.grey; + } + return Colors.green[700]; + }), + foregroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return Colors.black; + } + return Colors.white; + }), + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 8, horizontal: 8) + ), + shape: MaterialStateProperty.all(RoundedRectangleBorder( borderRadius: regularBorderRadius, - side: const BorderSide(color: Colors.transparent)), - splashColor: Colors.lightGreen, + side: const BorderSide(color: Colors.transparent), + )), + overlayColor: MaterialStateColor.resolveWith((states) => Colors.lightGreen), + ), onPressed: () { checkLoginStatus(); }, diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index 16148ca..e1c0999 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post.dart @@ -113,10 +113,15 @@ class _DetailPostPageState extends State { return choices.map((String choice) { return PopupMenuItem( key: Key(choice), - child: RaisedButton( - padding: EdgeInsets.zero, - color: Colors.white, - elevation: 0, + child: ElevatedButton( + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 0, horizontal: 0) + ), + backgroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.all(Colors.black), + elevation: MaterialStateProperty.all(0) + ), onPressed: _updateInformasi, child: SizedBox( width: double.infinity, @@ -353,18 +358,17 @@ class _DetailPostPageState extends State { child: ButtonTheme( minWidth: double.infinity, height: 40, - child: RaisedButton( + child: ElevatedButton( key: const Key('Button Tambah Komentar'), - padding: const EdgeInsets.symmetric( - vertical: 13), - highlightElevation: 0.0, - splashColor: greenPrimary, - highlightColor: Colors.white, - elevation: 0.0, - color: greenPrimary, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(10)), + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 13) + ), + elevation: MaterialStateProperty.all(0.0), + backgroundColor: MaterialStateProperty.all(greenPrimary), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10)) + )), ), onPressed: () { _checkLoginStatus(); diff --git a/lib/page/informasi/layanan_disabilitas.dart b/lib/page/informasi/layanan_disabilitas.dart index 59cc586..56f7fb8 100644 --- a/lib/page/informasi/layanan_disabilitas.dart +++ b/lib/page/informasi/layanan_disabilitas.dart @@ -14,6 +14,30 @@ class LayananDisabilitas extends StatefulWidget { class _LayananDisabilitasState extends State { @override Widget build(BuildContext context) { + final buttonStyle = ButtonStyle( + backgroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return Colors.grey; + } + return Colors.white; + }), + foregroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return Colors.black; + } + return Colors.black; + }), + padding: MaterialStateProperty.all( + EdgeInsets.all(regularBiggerSpace) + ), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: regularBorderRadius, + side: BorderSide( + width: 2, color: greenPrimary.withOpacity(0.4)), + )), + overlayColor: MaterialStateColor.resolveWith((states) => + Colors.lightGreen), + ); return Scaffold( appBar: const PreferredSize( preferredSize: Size.fromHeight(55), @@ -44,17 +68,8 @@ class _LayananDisabilitasState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: SizedBox( width: double.infinity, - child: FlatButton( - color: Colors.white, - textColor: Colors.black, - disabledColor: Colors.grey, - disabledTextColor: Colors.black, - padding: const EdgeInsets.all(regularBiggerSpace), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: BorderSide( - width: 2, color: greenPrimary.withOpacity(0.4))), - //splashColor: Colors.lightGreen, + child: TextButton( + style: buttonStyle, onPressed: () { _navigateToRegistrasiDisabilitasPage(context); }, @@ -83,17 +98,8 @@ class _LayananDisabilitasState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: SizedBox( width: double.infinity, - child: FlatButton( - color: Colors.white, - textColor: Colors.black, - disabledColor: Colors.grey, - disabledTextColor: Colors.black, - padding: const EdgeInsets.all(regularBiggerSpace), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: BorderSide( - width: 2, color: greenPrimary.withOpacity(0.4))), - //splashColor: Colors.lightGreen, + child: TextButton( + style: buttonStyle, onPressed: () { _navigateToListSekolahPage(context); }, diff --git a/lib/page/login/login.dart b/lib/page/login/login.dart index 4d3f601..59c0bef 100644 --- a/lib/page/login/login.dart +++ b/lib/page/login/login.dart @@ -157,12 +157,14 @@ class LoginState extends State { key: const Key('Button'), decoration: BoxDecoration(boxShadow: regularShadow), height: 64.0, - child: FlatButton( - color: Colors.white, - shape: RoundedRectangleBorder( + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), - padding: const EdgeInsets.symmetric(vertical: 10.0), + padding: const EdgeInsets.symmetric(vertical: 10.0) + ), onPressed: () async { Navigator.of(context).pop(true); await _updateUser(newUser); @@ -185,11 +187,13 @@ class LoginState extends State { key: const Key('Button'), decoration: BoxDecoration(boxShadow: regularShadow), height: 64.0, - child: FlatButton( - color: greenPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0)), - padding: const EdgeInsets.symmetric(vertical: 10.0), + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: greenPrimary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0) + ), onPressed: () { Navigator.of(context).pop(true); _navigateToPilihDisabilitas(context); diff --git a/lib/page/pencarian/pencarian.dart b/lib/page/pencarian/pencarian.dart index 0afddd3..9344b01 100644 --- a/lib/page/pencarian/pencarian.dart +++ b/lib/page/pencarian/pencarian.dart @@ -195,8 +195,11 @@ class PencarianState extends State { 'Tidak menemukan lokasi yang anda cari?', style: TextStyle(color: grayPrimary), ), - RaisedButton( - color: greenPrimary, + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + greenPrimary) + ), onPressed: () { Navigator.of(context).pushReplacement( MaterialPageRoute( diff --git a/lib/page/profile/edit_profile.dart b/lib/page/profile/edit_profile.dart index 49648b3..71d73eb 100644 --- a/lib/page/profile/edit_profile.dart +++ b/lib/page/profile/edit_profile.dart @@ -160,11 +160,14 @@ class _EditProfileState extends State { textAlign: TextAlign.left, ), const SizedBox(height: 10.0), - FlatButton( + TextButton( key: const Key('Button Tanggal Lahir'), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0)), - padding: const EdgeInsets.all(13.0), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0)), + padding: const EdgeInsets.all(13.0), + backgroundColor: greenPrimary, + ), onPressed: () { DatePicker.showDatePicker(context, currentTime: DateTime.parse(tanggalLahir), @@ -175,7 +178,6 @@ class _EditProfileState extends State { }); }); }, - color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle( diff --git a/lib/page/registrasi/registrasi.dart b/lib/page/registrasi/registrasi.dart index a3b2263..7c64eca 100644 --- a/lib/page/registrasi/registrasi.dart +++ b/lib/page/registrasi/registrasi.dart @@ -155,11 +155,14 @@ class RegistrasiState extends State { ], ), const SizedBox(height: 10.0), - FlatButton( + TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0)), + padding: const EdgeInsets.all(9.0), + backgroundColor: greenPrimary, + ), key: const Key('Button Tanggal Lahir'), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0)), - padding: const EdgeInsets.all(9.0), onPressed: () { DatePicker.showDatePicker(context, maxTime: DateTime.now(), onChanged: (date) { @@ -169,7 +172,6 @@ class RegistrasiState extends State { }); }); }, - color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle( diff --git a/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart b/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart index a752874..9cd65f1 100644 --- a/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart +++ b/lib/page/registrasi_penyandang_disabilitas/registrasi_informasi_layanan_disabilitas.dart @@ -176,7 +176,10 @@ class _RegistrasiInformasiLayananDisabilitasState crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('Tanggal Lahir'), - FlatButton( + TextButton( + style: TextButton.styleFrom( + backgroundColor: greenPrimary, + ), key: const Key('Tanggal Lahir Flat Button'), onPressed: () { DatePicker.showDatePicker(context, @@ -187,7 +190,6 @@ class _RegistrasiInformasiLayananDisabilitasState }); }); }, - color: greenPrimary, child: Text( tanggalLahir, style: const TextStyle(color: Colors.white), @@ -416,18 +418,25 @@ class _RegistrasiInformasiLayananDisabilitasState top: regularSpace, bottom: regularSpace), decoration: const BoxDecoration(), child: SizedBox( - child: FlatButton( - color: Colors.transparent, - textColor: Colors.black, - padding: const EdgeInsets.only( - top: regularBiggerSpace, - bottom: regularBiggerSpace, - left: doubleSpace, - right: doubleSpace), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: const BorderSide(color: Colors.grey)), - splashColor: white, + child: TextButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.transparent), + foregroundColor: MaterialStateProperty.all( + Colors.black), + padding: MaterialStateProperty.all( + EdgeInsets.only( + top: regularBiggerSpace, + bottom: regularBiggerSpace, + left: doubleSpace, + right: doubleSpace + )), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: regularBorderRadius, + side: const BorderSide(color: Colors.grey), + )), + ), onPressed: () { /*...*/ }, @@ -444,20 +453,27 @@ class _RegistrasiInformasiLayananDisabilitasState top: regularSpace, bottom: regularSpace), decoration: BoxDecoration(boxShadow: regularShadow), child: SizedBox( - child: FlatButton( + child: TextButton( key: const Key('Simpan Key'), - color: greenPrimary, - textColor: Colors.white, - padding: const EdgeInsets.only( - top: regularBiggerSpace, - bottom: regularBiggerSpace, - left: spaceFourty, - right: spaceFourty), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: const BorderSide( - color: Colors.transparent)), - splashColor: greenPrimary, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + greenPrimary), + foregroundColor: MaterialStateProperty.all( + Colors.white), + padding: MaterialStateProperty.all( + EdgeInsets.only( + top: regularBiggerSpace, + bottom: regularBiggerSpace, + left: spaceFourty, + right: spaceFourty + )), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: regularBorderRadius, + side: const BorderSide( + color: Colors.transparent), + )), + ), onPressed: () { _validateRegisInput(); }, diff --git a/lib/page/tentang_disabilitas/tentang_disabilitas.dart b/lib/page/tentang_disabilitas/tentang_disabilitas.dart index b585aec..e598d0f 100644 --- a/lib/page/tentang_disabilitas/tentang_disabilitas.dart +++ b/lib/page/tentang_disabilitas/tentang_disabilitas.dart @@ -48,7 +48,7 @@ class _TentangDisabilitasState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - FlatButton( + TextButton( onPressed: () { _navigateDetailDisabilitasPage(context, 'Fisik'); }, @@ -85,7 +85,7 @@ class _TentangDisabilitasState extends State { ], )), ), - FlatButton( + TextButton( onPressed: () { _navigateDetailDisabilitasPage(context, 'Intelektual'); }, @@ -127,7 +127,7 @@ class _TentangDisabilitasState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - FlatButton( + TextButton( onPressed: () { _navigateDetailDisabilitasPage(context, 'Mental'); }, @@ -164,7 +164,7 @@ class _TentangDisabilitasState extends State { ], )), ), - FlatButton( + TextButton( onPressed: () { _navigateDetailDisabilitasPage(context, 'Sensorik'); }, diff --git a/lib/page/updateInformasi/update_informasi.dart b/lib/page/updateInformasi/update_informasi.dart index 8ea7849..592fada 100644 --- a/lib/page/updateInformasi/update_informasi.dart +++ b/lib/page/updateInformasi/update_informasi.dart @@ -209,9 +209,11 @@ class UpdateInformasiState extends State { style: TextStyle(fontSize: 18), textAlign: TextAlign.left, ), - FlatButton( + TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.zero + ), key: const Key('Button Input Foto'), - padding: EdgeInsets.zero, onPressed: () async { final imageSelected = await _getImage(); setState(() { @@ -293,17 +295,26 @@ class UpdateInformasiState extends State { key: const Key('Button Batal'), minWidth: double.infinity, height: 40, - child: RaisedButton( - padding: const EdgeInsets.symmetric(vertical: 15), - highlightElevation: 0.0, - splashColor: const Color(0xff3A903A), - highlightColor: const Color(0xff3A903A), - elevation: 0.0, - color: Colors.white70, - shape: const RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(10)), - side: BorderSide(color: Color(0xff3A903A))), + child: ElevatedButton( + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 15) + ), + overlayColor: MaterialStateProperty.all( + greenPrimary + ), + backgroundColor: MaterialStateProperty.all( + Colors.white70 + ), + elevation: MaterialStateProperty.all(0.0), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(10)), + side: BorderSide(color: greenPrimary) + ) + ) + ), onPressed: () { _resetInput(); Navigator.of(context).pop(); @@ -508,9 +519,9 @@ class UpdateInformasiState extends State { const SizedBox(height: doubleSpace), SizedBox(height: 200, child: ImageHolder(url: widget.komentar.image)), const SizedBox(height: regularSpace), - FlatButton( + TextButton( + style: TextButton.styleFrom(padding: EdgeInsets.zero), key: const Key('Button Hapus Foto'), - padding: EdgeInsets.zero, onPressed: () async { setState(() { _existingImageUrl = '/media/'; diff --git a/lib/utils/custom_alert_dialog.dart b/lib/utils/custom_alert_dialog.dart index 7923ab4..03b1afd 100644 --- a/lib/utils/custom_alert_dialog.dart +++ b/lib/utils/custom_alert_dialog.dart @@ -43,12 +43,14 @@ class _CustomAlertDialog extends State { key: Key('Pop Up Button ${widget.leftText}'), decoration: BoxDecoration(boxShadow: regularShadow), height: 64.0, - child: FlatButton( - color: Colors.white, - shape: RoundedRectangleBorder( + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), - padding: const EdgeInsets.symmetric(vertical: 10.0), + padding: const EdgeInsets.symmetric(vertical: 10.0), + ), onPressed: widget.leftFunction, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -67,11 +69,13 @@ class _CustomAlertDialog extends State { key: Key('Pop Up Button ${widget.rightText}'), decoration: BoxDecoration(boxShadow: regularShadow), height: 64.0, - child: FlatButton( - color: greenPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0)), - padding: const EdgeInsets.symmetric(vertical: 10.0), + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: greenPrimary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0)), + padding: const EdgeInsets.symmetric(vertical: 10.0), + ), onPressed: widget.rightFunction, child: Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/utils/custom_button.dart b/lib/utils/custom_button.dart index d51ae3b..fd49186 100644 --- a/lib/utils/custom_button.dart +++ b/lib/utils/custom_button.dart @@ -5,24 +5,39 @@ import 'package:bisaGo/config/styles.dart'; Widget submitButton(String text, void Function() function) { return Container( decoration: BoxDecoration(boxShadow: regularShadow), - child: RaisedButton( - padding: const EdgeInsets.symmetric(vertical: 15), - highlightElevation: 0.0, - splashColor: greenPale, - disabledColor: grayPrimary, - disabledTextColor: Colors.black, - elevation: 0.0, - color: greenPrimary, - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - ), - onPressed: () => function(), - child: Text( - text, - style: const TextStyle( - fontSize: 20, color: white, fontWeight: FontWeight.bold), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 15, horizontal: 0) + ), + elevation: MaterialStateProperty.all(0.0), + overlayColor: MaterialStateProperty.all(greenPale), + backgroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return grayPrimary; + } + return greenPrimary; + }), + foregroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return Colors.black; + } + return null; + }), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: regularBorderRadius + )) + ), + onPressed: () => function(), + child: Text( + text, + style: const TextStyle( + fontSize: 20, color: white, fontWeight: FontWeight.bold), + ), ), - ), + ) ); } @@ -110,12 +125,14 @@ Widget iconButton( borderRadius: BorderRadius.circular(5.0)), height: height, width: width, - child: FlatButton( - padding: EdgeInsets.zero, - color: Colors.white, - shape: RoundedRectangleBorder( + child: TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), side: const BorderSide(color: greenPrimary)), + ), onPressed: () => function(), child: icon, ), diff --git a/lib/utils/custom_dashboard_location_button.dart b/lib/utils/custom_dashboard_location_button.dart index 01e7f9e..4cf4019 100644 --- a/lib/utils/custom_dashboard_location_button.dart +++ b/lib/utils/custom_dashboard_location_button.dart @@ -29,8 +29,10 @@ class _LocationIconButtonState extends State { @override Widget build(BuildContext context) { - return FlatButton( - padding: EdgeInsets.zero, + return TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + ), onPressed: () { _navigateToDetailLokasiPage(context); }, diff --git a/lib/utils/custom_disabilitas_button.dart b/lib/utils/custom_disabilitas_button.dart index 1972337..6108dab 100644 --- a/lib/utils/custom_disabilitas_button.dart +++ b/lib/utils/custom_disabilitas_button.dart @@ -28,8 +28,10 @@ class DisabilitasIconButton extends StatefulWidget { class _DisabilitasIconButtonState extends State { @override Widget build(BuildContext context) { - return FlatButton( - padding: EdgeInsets.zero, + return TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + ), onPressed: widget.onPressed, child: Container( width: MediaQuery.of(context).size.width * 0.4, diff --git a/lib/utils/location_turn_on_dialog.dart b/lib/utils/location_turn_on_dialog.dart index b974acb..e7f9488 100644 --- a/lib/utils/location_turn_on_dialog.dart +++ b/lib/utils/location_turn_on_dialog.dart @@ -33,11 +33,15 @@ class LocationTurnOnDialog extends StatelessWidget { key: Key('Turn On Location Services Button'), decoration: BoxDecoration(boxShadow: regularShadow), height: 64.0, - child: FlatButton( - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), - side: const BorderSide(color: greenPrimary)), + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 10.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: const BorderSide(color: greenPrimary)), + ), + onPressed: onPressed, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -47,8 +51,6 @@ class LocationTurnOnDialog extends StatelessWidget { color: greenPrimary, fontSize: 20.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: onPressed, )) ])) ]), diff --git a/test/layanan_disabilitas_test.dart b/test/layanan_disabilitas_test.dart index c66a3b2..22fac95 100644 --- a/test/layanan_disabilitas_test.dart +++ b/test/layanan_disabilitas_test.dart @@ -22,7 +22,7 @@ void main() { expect(find.byType(Row), findsNWidgets(3)); expect(find.byType(Scaffold), findsOneWidget); expect(find.byType(SizedBox), findsNWidgets(9)); - expect(find.byType(FlatButton), findsNWidgets(2)); + expect(find.byType(TextButton), findsNWidgets(2)); expect(find.byKey(scaffoldTextFieldKey), findsOneWidget); //negative test diff --git a/test/registrasi_informasi_layanan_disabilitas_test.dart b/test/registrasi_informasi_layanan_disabilitas_test.dart index 88b5504..c84ca84 100644 --- a/test/registrasi_informasi_layanan_disabilitas_test.dart +++ b/test/registrasi_informasi_layanan_disabilitas_test.dart @@ -16,14 +16,14 @@ void main() { final scaffoldTextFieldKey = Key('Scaffold Text Field'); //positive test - expect(find.byType(Container), findsNWidgets(53)); + expect(find.byType(Container), findsNWidgets(50)); expect(find.byType(Column), findsNWidgets(10)); expect(find.byType(Text), findsNWidgets(45)); expect(find.byType(Icon), findsNWidgets(5)); expect(find.byType(Row), findsNWidgets(6)); expect(find.byType(Scaffold), findsOneWidget); expect(find.byType(SizedBox), findsNWidgets(61)); - expect(find.byType(FlatButton), findsNWidgets(3)); + expect(find.byType(TextButton), findsNWidgets(3)); //negative test expect(find.byType(FormField), findsNothing); diff --git a/test/widget_test.dart b/test/widget_test.dart index 8f4f411..2e1bdfa 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -111,7 +111,7 @@ void main() { testWidgets('finds a google map in dashboard', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp(home: Dashboard())); await tester.pump(); - expect(find.byType(Container), findsNWidgets(9)); + expect(find.byType(Container), findsNWidgets(8)); }); // testWidgets('finds a floating in dashboard', (WidgetTester tester) async { -- GitLab From 3a1794f461854904189ff06021b8da2ea30c7609 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Wed, 5 May 2021 00:25:13 +0700 Subject: [PATCH 21/27] [CHORE] fixing the method 'ancestorStateOfType' isn't defined for the class 'BuildContext' - change flutter_google_places to 0.2.8 - change rxdart to 0.25.0 --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index d063af2..5687e61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,7 +38,7 @@ dependencies: dio: ^3.0.9 share: ^0.6.4 flutter_datetime_picker: ^1.3.8 - flutter_google_places: ^0.2.4 + flutter_google_places: ^0.2.8 google_maps_webservice: ^0.0.16 geolocator: ^5.3.1 google_sign_in: ^4.5.1 @@ -58,7 +58,7 @@ dev_dependencies: # Linter dependency pedantic: ^1.8.0 # The default Linter package used in Google build_runner: ^1.8.0 - rxdart: ^0.23.1 + rxdart: ^0.25.0 flutter_icons: android: "launcher_icon" -- GitLab From afcd84787ae0d45a66218eb29638833cb862bbfe Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Wed, 5 May 2021 15:46:48 +0700 Subject: [PATCH 22/27] [CHORE] changelog for fixed google oauth in 3.1.2 --- .../android/id/changelogs/changelogs.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index 3719d84..5101c41 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1,6 +1,10 @@ -Add dialog to turn on Location services upon starting the app -New feature for layanan search -Add feature to upload image for a fasilitas straight from the camera -Add default image for facilities -Add search history feature -Now all fields are required in edit profile \ No newline at end of file +3.1.2: +- Fix google oauth + +3.1.1: +- Add dialog to turn on Location services upon starting the app +- New feature for layanan search +- Add feature to upload image for a fasilitas straight from the camera +- Add default image for facilities +- Add search history feature +- Now all fields are required in edit profile -- GitLab From 8079870dc9daf38f6aeb941330afc377f2c8f03d Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Wed, 5 May 2021 23:16:19 +0700 Subject: [PATCH 23/27] [CHORE] changelog for 3.2.0 new feature share fasilitas as a link --- android/fastlane/metadata/android/id/changelogs/changelogs.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index 5101c41..9136efa 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1,3 +1,6 @@ +3.2.0: +- New feature share fasilitas as a link + 3.1.2: - Fix google oauth -- GitLab From 81eb7d8e2866a1d511ac848edfa3ec261311898d Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Sun, 9 May 2021 18:44:09 +0700 Subject: [PATCH 24/27] [CHORE] fix cant update informasi - migrate from using namaLokasi to placeId when send put request - fix flow for change and delete image --- lib/bloc/komentar_bloc.dart | 4 +-- .../updateInformasi/update_informasi.dart | 31 +++++++++++-------- lib/repository/komentar_repository.dart | 4 +-- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/bloc/komentar_bloc.dart b/lib/bloc/komentar_bloc.dart index c644d55..6d91905 100644 --- a/lib/bloc/komentar_bloc.dart +++ b/lib/bloc/komentar_bloc.dart @@ -33,10 +33,10 @@ class KomentarBloc { } Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { + String placeId, int id, String token) async { try { return await _komentarRepository.updateKomentar( - newKomentarData, namaLokasi, id, token); + newKomentarData, placeId, id, token); } catch (e) { return Response('Failed to update komentar', 400); } diff --git a/lib/page/updateInformasi/update_informasi.dart b/lib/page/updateInformasi/update_informasi.dart index 592fada..8090bcd 100644 --- a/lib/page/updateInformasi/update_informasi.dart +++ b/lib/page/updateInformasi/update_informasi.dart @@ -50,20 +50,18 @@ class UpdateInformasiState extends State { _mentalClicked = widget.komentar.disabilitas.toString().contains('DM'); _sensorikClicked = widget.komentar.disabilitas.toString().contains('DS'); _existingImageUrl = widget.komentar.image; + if (widget.komentar.image == '/media/') { + _existingImageUrl = ''; + } _isDisabilitasValid = true; } Future _getImage() async { final image = await picker.getImage(source: ImageSource.gallery); + _existingImageUrl = ''; return _image = File(image.path); } - Future _clearImage() async { - setState(() { - _image = null; - }); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -247,7 +245,8 @@ class UpdateInformasiState extends State { ) ], ), - if (_existingImageUrl == '/media/') + if (_existingImageUrl == null || _existingImageUrl == '' || + _existingImageUrl == '/media/') _showImagePreview() else _showExistingImage(), @@ -387,8 +386,7 @@ class UpdateInformasiState extends State { final sharedPreferences = await SharedPreferences.getInstance(); _bloc = KomentarBloc(widget.komentar.namaLokasi); - final namaLokasi = widget.komentar.namaLokasi.replaceAll(' ', '%20'); - final response = await _bloc.updateKomentar(newKomentarData, namaLokasi, + final response = await _bloc.updateKomentar(newKomentarData, widget.lokasi.placeId, widget.komentar.id, 'token ${sharedPreferences.getString('token')}'); if (response.statusCode == 201 || response.statusCode == 202) { final newKomentar = KomentarModel( @@ -402,7 +400,7 @@ class UpdateInformasiState extends State { isVerified: widget.komentar.isVerified, jumlah: newKomentarData['jumlah'], rating: widget.komentar.rating, - image: newKomentarData['image']); + image: newKomentarData['image'] ?? ''); final route = MaterialPageRoute( builder: (_) => DetailPostPage(komentar: newKomentar, lokasi: widget.lokasi)); @@ -456,13 +454,17 @@ class UpdateInformasiState extends State { _setJenisDisabilitas(); newKomentarData['disabilitas'] = _disabilitas; newKomentarData['jumlah'] = _jumlahFasilitas; - newKomentarData['image'] = ''; + if (_image != null) { final fileName = _image.path.split('/').last; newKomentarData['image'] = await MultipartFile.fromFile( _image.path, filename: fileName, ); + } else { + if (_existingImageUrl == null) { + newKomentarData['image'] = ''; + } } } @@ -524,7 +526,7 @@ class UpdateInformasiState extends State { key: const Key('Button Hapus Foto'), onPressed: () async { setState(() { - _existingImageUrl = '/media/'; + _existingImageUrl = null; _image = null; }); }, @@ -549,7 +551,10 @@ class UpdateInformasiState extends State { Future _resetInput() async { _jumlahFasilitas = widget.komentar.jumlah; deskripsiController.text = widget.komentar.deskripsi; - await _clearImage(); + _existingImageUrl = widget.komentar.image; + if (widget.komentar.image == '/media/') { + _existingImageUrl = ''; + } } void _incrementCount() { diff --git a/lib/repository/komentar_repository.dart b/lib/repository/komentar_repository.dart index b2adf34..4ea9ef6 100644 --- a/lib/repository/komentar_repository.dart +++ b/lib/repository/komentar_repository.dart @@ -36,9 +36,9 @@ class KomentarRepository implements BaseKomentarRepository { } Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { + String placeId, int id, String token) async { final response = await http.put( - '${ApiFlavor.getBaseUrl()}/informasi-fasilitas/lokasi/update-fasilitas/$namaLokasi/${id.toString()}/', + '${ApiFlavor.getBaseUrl()}/informasi-fasilitas/lokasi/update-fasilitas/$placeId/${id.toString()}/', headers: {'Authorization': token, 'content-type': 'application/json'}, body: json.encode(newKomentarData)); return response; -- GitLab From 06b4fd1872fd9fe78de1593073a9bd951a032f95 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Sun, 9 May 2021 21:18:51 +0700 Subject: [PATCH 25/27] changelogs 3.2.1 fix cant update fasilitas --- android/fastlane/metadata/android/id/changelogs/changelogs.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index 9136efa..d436ce7 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1,3 +1,6 @@ +3.2.1: +- Fix cant update fasilitas + 3.2.0: - New feature share fasilitas as a link -- GitLab From ea67c0f311f097b507d01c5ef096b87a138f64c6 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 10 May 2021 21:24:15 +0700 Subject: [PATCH 26/27] [CHORES] fix cant remove existing fasilitas image on update fasilitas - fix flow when fasilitas updated using Navigator.pushAndRemoveUntil - added expects on test --- lib/bloc/komentar_bloc.dart | 17 +++-- lib/network/network_interface.dart | 19 ++++-- lib/page/dashboard/dashboard.dart | 4 +- .../updateInformasi/update_informasi.dart | 39 ++++------- .../komentar_posting_repository.dart | 2 +- lib/repository/komentar_repository.dart | 23 +++---- test/fasilitas_test.dart | 66 +++++++++---------- test/update_informasi_test.dart | 2 +- 8 files changed, 90 insertions(+), 82 deletions(-) diff --git a/lib/bloc/komentar_bloc.dart b/lib/bloc/komentar_bloc.dart index 6d91905..37b9a3d 100644 --- a/lib/bloc/komentar_bloc.dart +++ b/lib/bloc/komentar_bloc.dart @@ -22,6 +22,15 @@ class KomentarBloc { fetchKomentarList(placeId); } + Future fetchDetailFasilitas(String placeId, int id) async { + try { + return await _komentarRepository.fetchDetailFasilitas( + placeId, id); + } catch (e) { + return KomentarModel(); + } + } + Future addNewKomentar( Map newKomentarData, String namaLokasi) async { try { @@ -32,13 +41,13 @@ class KomentarBloc { } } - Future updateKomentar(Map newKomentarData, - String placeId, int id, String token) async { + Future updateKomentar(Map newKomentarData, + String placeId, int id) async { try { return await _komentarRepository.updateKomentar( - newKomentarData, placeId, id, token); + newKomentarData, placeId, id); } catch (e) { - return Response('Failed to update komentar', 400); + return {'response': 'FAILED'}; } } diff --git a/lib/network/network_interface.dart b/lib/network/network_interface.dart index b16da83..4641b1d 100644 --- a/lib/network/network_interface.dart +++ b/lib/network/network_interface.dart @@ -32,16 +32,25 @@ class NetworkInterface { return responseJson; } - Future put({String url}) async { + Future put({ + String url, + Map bodyParams, + bool isLogin, + bool formData = true, + }) async { var responseJson; try { - final sharedPreferences = await SharedPreferences.getInstance(); - dio.options.headers['Authorization'] = + if (isLogin) { + final sharedPreferences = await SharedPreferences.getInstance(); + dio.options.headers['Authorization'] = 'Token ${sharedPreferences.getString('token')}'; + } + dio.options.headers['content-type'] = 'application/json'; final response = await dio.put( '${ApiFlavor.getBaseUrl()}$url', + data: formData ? FormData.fromMap(bodyParams) : json.encode(bodyParams), ); - responseJson = response.data; + responseJson = _response(response); } on SocketException { throw FetchDataException('No Internet Connection'); } on DioError catch (e) { @@ -77,6 +86,8 @@ class NetworkInterface { return response.data; case 201: return response.data; + case 202: + return response.data; case 400: throw BadRequestException(response.data.toString()); break; diff --git a/lib/page/dashboard/dashboard.dart b/lib/page/dashboard/dashboard.dart index 45ffa9e..f88a05e 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -263,7 +263,7 @@ class DashboardState extends State { } void _navigateToDetailFasilitasPage( - BuildContext context, String placeId, String fasilitasId) async { + BuildContext context, String placeId, int fasilitasId) async { final fetches = await Future.wait([ KomentarRepository().fetchDetailFasilitas(placeId, fasilitasId), getLokasiName(placeId), @@ -310,7 +310,7 @@ class DashboardState extends State { final params = deepLink.queryParameters; final path = deepLink.pathSegments; final placeId = params['place_id']; - final id = params['id']; + final id = int.parse(params['id']); final type = params['type']; if (path[0] == 'link') { if (type == 'fasilitas') { diff --git a/lib/page/updateInformasi/update_informasi.dart b/lib/page/updateInformasi/update_informasi.dart index 8090bcd..e812ec5 100644 --- a/lib/page/updateInformasi/update_informasi.dart +++ b/lib/page/updateInformasi/update_informasi.dart @@ -19,7 +19,6 @@ import 'package:bisaGo/utils/validator.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:image_picker/image_picker.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:shared_preferences/shared_preferences.dart'; class UpdateInformasi extends StatefulWidget { final KomentarModel komentar; @@ -58,8 +57,11 @@ class UpdateInformasiState extends State { Future _getImage() async { final image = await picker.getImage(source: ImageSource.gallery); - _existingImageUrl = ''; - return _image = File(image.path); + if (image != null) { + _existingImageUrl = ''; + return _image = File(image.path); + } + return _image; } @override @@ -383,33 +385,18 @@ class UpdateInformasiState extends State { } Future submitInfo() async { - final sharedPreferences = await SharedPreferences.getInstance(); _bloc = KomentarBloc(widget.komentar.namaLokasi); - final response = await _bloc.updateKomentar(newKomentarData, widget.lokasi.placeId, - widget.komentar.id, 'token ${sharedPreferences.getString('token')}'); - if (response.statusCode == 201 || response.statusCode == 202) { - final newKomentar = KomentarModel( - id: widget.komentar.id, - namaLokasi: widget.komentar.namaLokasi, - deskripsi: newKomentarData['deskripsi'], - creator: widget.komentar.creator, - dateTime: widget.komentar.dateTime, - tag: widget.komentar.tag, - disabilitas: newKomentarData['disabilitas'].split(' '), - isVerified: widget.komentar.isVerified, - jumlah: newKomentarData['jumlah'], - rating: widget.komentar.rating, - image: newKomentarData['image'] ?? ''); + widget.komentar.id); + if (response['response'] != 'FAILED') { + final komentar = await _bloc.fetchDetailFasilitas( + widget.lokasi.placeId, widget.komentar.id); final route = MaterialPageRoute( builder: (_) => - DetailPostPage(komentar: newKomentar, lokasi: widget.lokasi)); + DetailPostPage(komentar: komentar, lokasi: widget.lokasi)); successDialog(context); - Timer(const Duration(seconds: 2), () { - Navigator.of(context).pop(Navigator.pop(context)); - Navigator.pop(context); - Navigator.of(context).push(route); - }); + await Future.delayed(Duration(seconds: 2)); + await Navigator.pushAndRemoveUntil(context, route, (route) => route.isFirst); } else { failedDialog(context); } @@ -454,7 +441,7 @@ class UpdateInformasiState extends State { _setJenisDisabilitas(); newKomentarData['disabilitas'] = _disabilitas; newKomentarData['jumlah'] = _jumlahFasilitas; - + newKomentarData.remove('image'); if (_image != null) { final fileName = _image.path.split('/').last; newKomentarData['image'] = await MultipartFile.fromFile( diff --git a/lib/repository/komentar_posting_repository.dart b/lib/repository/komentar_posting_repository.dart index 4bdf3f0..47ca6bf 100644 --- a/lib/repository/komentar_posting_repository.dart +++ b/lib/repository/komentar_posting_repository.dart @@ -15,7 +15,7 @@ class KomentarPostingRepository implements BaseKomentarPostingRepository { String namaLokasi, int id) async { final nama = namaLokasi.replaceAll(' ', '%20'); final url = - '/informasi-fasilitas/lokasi/list-komentar/$nama/${id.toString()}'; + '/informasi-fasilitas/lokasi/list-komentar/$nama/${id.toString()}/'; final response = await _network.get(url: url, isLogin: false); final data = response.values.toList(); return KomentarPostingList(data diff --git a/lib/repository/komentar_repository.dart b/lib/repository/komentar_repository.dart index 4ea9ef6..cf34a3e 100644 --- a/lib/repository/komentar_repository.dart +++ b/lib/repository/komentar_repository.dart @@ -1,15 +1,14 @@ -import 'dart:convert'; -import 'package:bisaGo/flavor/flavor.dart'; import 'package:bisaGo/model/komentar.dart'; import 'package:bisaGo/network/network_interface.dart'; -import 'package:http/http.dart' as http; abstract class BaseKomentarRepository { Future fetchKomentar(String namaLokasi); Future createKomentar( Map newKomentarData, String namaLokasi); + Future updateKomentar( + Map newKomentarData, String placeId, int id); Future fetchDetailFasilitas( - String placeId, String fasilitasId); + String placeId, int fasilitasId); } class KomentarRepository implements BaseKomentarRepository { @@ -17,7 +16,7 @@ class KomentarRepository implements BaseKomentarRepository { @override Future fetchKomentar(String placeId) async { - final url = '/informasi-fasilitas/lokasi/list-fasilitas/$placeId'; + final url = '/informasi-fasilitas/lokasi/list-fasilitas/$placeId/'; final response = await _network.get(url: url, isLogin: false); final data = response.values.toList().reversed.toList(); return KomentarList(data @@ -35,17 +34,19 @@ class KomentarRepository implements BaseKomentarRepository { return response; } + @override Future updateKomentar(Map newKomentarData, - String placeId, int id, String token) async { - final response = await http.put( - '${ApiFlavor.getBaseUrl()}/informasi-fasilitas/lokasi/update-fasilitas/$placeId/${id.toString()}/', - headers: {'Authorization': token, 'content-type': 'application/json'}, - body: json.encode(newKomentarData)); + String placeId, int id) async { + final response = await _network.put( + url: '/informasi-fasilitas/lokasi/update-fasilitas/$placeId/${id.toString()}/', + bodyParams: newKomentarData, + isLogin: true, + ); return response; } @override - Future fetchDetailFasilitas(String placeId, String fasilitasId) async { + Future fetchDetailFasilitas(String placeId, int fasilitasId) async { final url = '/informasi-fasilitas/lokasi/detail-fasilitas/$placeId/$fasilitasId/'; final response = await _network.get(url: url, isLogin: false); return KomentarModel.fromJson(response); diff --git a/test/fasilitas_test.dart b/test/fasilitas_test.dart index 0d7bec6..37eec86 100644 --- a/test/fasilitas_test.dart +++ b/test/fasilitas_test.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:bisaGo/model/komentar.dart'; import 'package:bisaGo/model/lokasi.dart'; import 'package:bisaGo/page/filter_fasilitas/fasilitas.dart'; @@ -10,25 +12,25 @@ import 'package:bisaGo/utils/custom_alert_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; -import 'package:http/http.dart'; import 'package:mockito/mockito.dart'; import 'package:network_image_mock/network_image_mock.dart'; -class MockKomentarRepository extends Fake implements KomentarRepository { - final mockFasilitas = { - 'id': 119, - 'nama_lokasi': 'Margo City', - 'deskripsi': 'loremipsum ipsmum', - 'creator': 'Putra Novial', - 'date_time': '12-11-2020 02:56:49', - 'tag': 'JI', - 'disabilitas': ['DS'], - 'image': 'static/img/2669211407.jpg', - 'is_verified': false, - 'jumlah': 2, - 'rating': 5 - }; +const mockFasilitas = { + 'id': 119, + 'nama_lokasi': 'Margo City', + 'deskripsi': 'loremipsum ipsmum', + 'creator': 'Putra Novial', + 'date_time': '12-11-2020 02:56:49', + 'tag': 'JI', + 'disabilitas': ['DS'], + 'image': 'static/img/2669211407.jpg', + 'is_verified': false, + 'jumlah': 2, + 'rating': 5 +}; +const newDeskripsi = 'Test update fasilitas'; +class MockKomentarRepository extends Fake implements KomentarRepository { @override Future fetchKomentar(String namaLokasi) async { return Future.value(KomentarList([KomentarModel.fromJson(mockFasilitas)])); @@ -36,15 +38,22 @@ class MockKomentarRepository extends Fake implements KomentarRepository { @override Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { + String placeId, int id) async { final responseBody = {'response': 'Fasilitas updated'}; - final statusCode = 202; - return Future.value(Response(responseBody.toString(), statusCode)); + return Future.value(responseBody); + } + + @override + Future fetchDetailFasilitas(String placeId, int fasilitasId) async { + final newFasilitas = {...mockFasilitas} + ..['deskripsi'] = newDeskripsi; + return Future.value(KomentarModel.fromJson(newFasilitas)); } } class MockLokasiRepository extends Fake implements LokasiRepository { final mockLokasi = { + 'placeId': 'lKHBIUnKLJnKjnKLN', 'name': 'Margo City', 'alamat': 'Jl. Margonda Raya No.358, Kemiri Muka, Kecamatan Beji, Kota Depok, Jawa Barat 16423', @@ -72,20 +81,6 @@ void main() { 'counter': 69, }; - final mockFasilitas = { - 'id': 119, - 'nama_lokasi': 'Margo City', - 'deskripsi': 'loremipsum ipsmum', - 'creator': 'Putra Novial', - 'date_time': '12-11-2020 02:56:49', - 'tag': 'JI', - 'disabilitas': ['DS'], - 'image': 'static/img/2669211407.jpg', - 'is_verified': false, - 'jumlah': 2, - 'rating': 5 - }; - setUpAll(() { final _getIt = GetIt.instance; _getIt.registerLazySingleton( @@ -138,8 +133,10 @@ void main() { )); await tester.pump(); expect(find.byType(UpdateInformasi), findsOneWidget); + expect(find.text(newDeskripsi), findsNothing); + expect(find.text(mockFasilitas['deskripsi']), findsOneWidget); - await tester.enterText(find.byKey(informasiKey), 'Test Update Informasi'); + await tester.enterText(find.byKey(informasiKey), newDeskripsi); await tester .ensureVisible(find.byKey(Key('Button Simpan'), skipOffstage: false)); await tester.tap(find.byKey(buttonDFKey)); @@ -148,6 +145,9 @@ void main() { expect(find.byType(CustomAlertDialog), findsOneWidget); await tester.tap(find.text('Ya')); + await tester.pump(Duration(seconds: 2)); + expect(find.text(newDeskripsi), findsNWidgets(2)); + expect(find.text(mockFasilitas['deskripsi']), findsNothing); }); testWidgets('Test Fasilitas in Lokasi - Negative', diff --git a/test/update_informasi_test.dart b/test/update_informasi_test.dart index fcd4244..7b43d55 100644 --- a/test/update_informasi_test.dart +++ b/test/update_informasi_test.dart @@ -12,7 +12,7 @@ import 'package:shared_preferences/shared_preferences.dart'; class MockKomentarRepository extends Fake implements KomentarRepository { @override Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { + String namaLokasi, int id) async { final responseBody = {'response': 'Fasilitas updated'}; final statusCode = 201; return Future.value(Response(responseBody.toString(), statusCode)); -- GitLab From ea205910240c886ab2a118b0274a3ec4a9eea812 Mon Sep 17 00:00:00 2001 From: ariqbasyar Date: Mon, 10 May 2021 21:54:15 +0700 Subject: [PATCH 27/27] [CHORE] add padding to share button --- lib/page/filter_fasilitas/postingan/detail_post.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index e1c0999..ef3150b 100644 --- a/lib/page/filter_fasilitas/postingan/detail_post.dart +++ b/lib/page/filter_fasilitas/postingan/detail_post.dart @@ -76,7 +76,10 @@ class _DetailPostPageState extends State { '$link\n', ); }, - child: const Icon(Icons.share), + child: const Padding( + padding: EdgeInsets.all(doubleSpace), + child: Icon(Icons.share), + ), ), ], ), -- GitLab