diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6535cdec9bd1eccd6edd9aafefd67f76301501f..80eb0fc976e8b1b8d58208d427e74d2d00996c4c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ stages: mv $FLUTTER_ENV .env flutter pub get -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 e2037948055ccf86dd740aac10e26bf08d079027..5e272cbe5954eb0345765461904e62e5d70cc8a3 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 - - diff --git a/android/fastlane/metadata/android/id/changelogs/changelogs.txt b/android/fastlane/metadata/android/id/changelogs/changelogs.txt index 3719d84ce22378cb8b680c51bf3647f6ec202e19..d436ce72290d0c43a447e471d3f52400a6c14af0 100644 --- a/android/fastlane/metadata/android/id/changelogs/changelogs.txt +++ b/android/fastlane/metadata/android/id/changelogs/changelogs.txt @@ -1,6 +1,16 @@ -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.2.1: +- Fix cant update fasilitas + +3.2.0: +- New feature share fasilitas as a link + +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 diff --git a/lib/bloc/komentar_bloc.dart b/lib/bloc/komentar_bloc.dart index ba99cc660110853915e94d0a24a4f660b9f45408..dbfea075f49cc2ffe9e2a6f7920aa9a5ef3aecf3 100644 --- a/lib/bloc/komentar_bloc.dart +++ b/lib/bloc/komentar_bloc.dart @@ -23,6 +23,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 { @@ -33,13 +42,13 @@ class KomentarBloc { } } - Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { + Future updateKomentar(Map newKomentarData, + String placeId, int id) async { try { return await _komentarRepository.updateKomentar( - newKomentarData, namaLokasi, id, token); + newKomentarData, placeId, id); } catch (e) { - return Response('Failed to update komentar', 400); + return {'response': 'FAILED'}; } } diff --git a/lib/component/bisago_drawer.dart b/lib/component/bisago_drawer.dart index af87b28947c19d3a405f2ca83b13fc2ddb8714b6..7e45592100ef351c75abc7c430f30c47a3a6df6c 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 eb2e0e3dd7586b890ba06aed909ad0f543717d10..9e31c9dda5b4b983aee03a91594f6ae838fde4ff 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/get_it.dart b/lib/get_it.dart index 306b651a1363178e202a653dbf95730db62d17cf..3c3ec6e443a0c8b1e21a1d25b62e03c610dd6d6a 100644 --- a/lib/get_it.dart +++ b/lib/get_it.dart @@ -1,5 +1,6 @@ import 'package:bisaGo/repository/kegiatan_repository.dart'; import 'package:bisaGo/repository/komentar_posting_kegiatan_repository.dart'; +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'; @@ -30,5 +31,7 @@ class AppGetIt { () => LayananRepository()); _getIt.registerLazySingleton( () => KegiatanRepository()); + _getIt.registerLazySingleton( + () => DynamicLinksServiceRepository()); } } diff --git a/lib/network/network_interface.dart b/lib/network/network_interface.dart index b16da8359184a7d83e070c807562fc484bab5b26..4641b1db3322ac1aee24513536d4526d4eb1854e 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/addLokasi/add_lokasi.dart b/lib/page/addLokasi/add_lokasi.dart index 80c6661790c5c9fd76afea46a092c26738d849ce..90fd8643d593ee3f7a0f6b7e4db173cdf0c61986 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) { @@ -283,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 4af18383ae18b1a0a6fb7ce54880c7787ff0f8a6..77e2df8a1786f465409ff94674281e1188a834d9 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,10 +318,14 @@ class AddInformasiState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: ButtonTheme( height: 55.0, - child: FlatButton( - color: greenPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(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, children: [ @@ -333,8 +337,6 @@ class AddInformasiState extends State { color: Colors.white, fontSize: 20.0)), ], ), - padding: const EdgeInsets.symmetric(vertical: 10.0), - onPressed: _validateInformationInput, ), )), const SizedBox( @@ -419,7 +421,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 +429,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 e81abdab57f89ecfc77a31a09d9a2ece01e64f05..f88a05e62eece0094bbeab58897c51c5fe16c341 100644 --- a/lib/page/dashboard/dashboard.dart +++ b/lib/page/dashboard/dashboard.dart @@ -1,15 +1,21 @@ import 'package:bisaGo/bloc/lokasi_response_bloc.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:google_maps_webservice/places.dart'; class Dashboard extends StatefulWidget { const Dashboard({Key key}) : super(key: key); @@ -31,6 +37,7 @@ class DashboardState extends State { super.initState(); _showTurnOnLocationDialog(context); geolocator = Geolocator()..forceAndroidLocationManager; + initDynamicLinks(); setInitialLocation(); } @@ -187,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(), ), ); } @@ -243,4 +250,75 @@ 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, int 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 = int.parse(params['id']); + final type = params['type']; + if (path[0] == 'link') { + if (type == 'fasilitas') { + _navigateToDetailFasilitasPage(context, placeId, id); + } else if (type == 'kegiatan') { + // TODO(:ariqbasyar) navigate kegiatan + } + } + } + } } diff --git a/lib/page/filter_fasilitas/fasilitas.dart b/lib/page/filter_fasilitas/fasilitas.dart index c10dd8cd1e41d1ffc82d66ab2df994afcc9cecaf..4d82bf02b406eb08dbd02d6ac477565689ed3b27 100644 --- a/lib/page/filter_fasilitas/fasilitas.dart +++ b/lib/page/filter_fasilitas/fasilitas.dart @@ -85,7 +85,7 @@ class _FasilitasState extends State { SizedBox( height: 150, child: ImageHolder( - url: widget.lokasi.image, + url: widget.lokasi.image ?? '', fasilitas: null, ), ), @@ -93,7 +93,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, @@ -114,7 +114,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( @@ -137,7 +137,7 @@ class _FasilitasState extends State { ), Flexible( child: Text( - widget.lokasi.noTelp, + widget.lokasi.noTelp ?? '-', softWrap: true, textAlign: TextAlign.left, style: const TextStyle( @@ -198,17 +198,31 @@ 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(10), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: const BorderSide(color: Colors.transparent)), - splashColor: Colors.lightGreen, + 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) + ) + ), + ), onPressed: () { checkLoginStatus(); }, @@ -307,17 +321,31 @@ class _FasilitasState extends State { decoration: BoxDecoration(boxShadow: regularShadow), child: SizedBox( width: double.infinity, - child: FlatButton( - key: const Key('Tambah Kegiatan'), - color: Colors.green[700], - textColor: Colors.white, - disabledColor: Colors.grey, - disabledTextColor: Colors.black, - padding: const EdgeInsets.all(10), - shape: RoundedRectangleBorder( - borderRadius: regularBorderRadius, - side: const BorderSide(color: Colors.transparent)), - splashColor: Colors.lightGreen, + child: TextButton( + key: const Key('Tambah Informasi'), + 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) + ) + ), + ), onPressed: () { checkLoginStatus(); }, diff --git a/lib/page/filter_fasilitas/postingan/detail_post.dart b/lib/page/filter_fasilitas/postingan/detail_post.dart index 75283961d53458b154b0866e06eabcde53a17c9f..ef3150b9b825a3de8966e2bcb807ae029cb77984 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'; @@ -51,347 +52,361 @@ 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}'), - actions: [ - InkWell( - child: const Icon(Icons.share), - onTap: () => Share.share( - 'Review fasilitas disabilitas di ${widget.lokasi.name}, ' - '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')) - ], - ), - 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 Padding( + padding: EdgeInsets.all(doubleSpace), + child: 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: 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) ), - ); - }).toList(); - }, - ), - ], - ), + onPressed: _updateInformasi, + child: SizedBox( + width: double.infinity, + child: Text(choice), + ), + ), + ); + }).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), - ), - ], + ), + Container( + key: const Key('tambah komentar'), + padding: + const EdgeInsets.only(top: doubleSpace), + alignment: Alignment.center, + child: ButtonTheme( + minWidth: double.infinity, + height: 40, + child: ElevatedButton( + key: const Key('Button Tambah Komentar'), + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 13) ), - onPressed: () { - _checkLoginStatus(); - }, + elevation: MaterialStateProperty.all(0.0), + backgroundColor: MaterialStateProperty.all(greenPrimary), + shape: MaterialStateProperty.all(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 c8d3ddab919ba2b41bd65113090446349b1f72da..56f7fb80396793ed3238a473622406222c9f4172 100644 --- a/lib/page/informasi/layanan_disabilitas.dart +++ b/lib/page/informasi/layanan_disabilitas.dart @@ -14,11 +14,35 @@ 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), - child: BisaGoAppBar(), key: Key('Scaffold Text Field'), + child: BisaGoAppBar(), ), drawer: BisaGoDrawer(), body: Container( @@ -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 79e9600577fcd56a98741cc1c7ae14e3616a8620..57496777fca5c0688955ad38c1a9cd3d59909428 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); - }, ), ) ], @@ -157,11 +157,18 @@ 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) + ), + onPressed: () async { + Navigator.of(context).pop(true); + await _updateUser(newUser); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -173,11 +180,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( @@ -185,10 +187,17 @@ 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)), + 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); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -200,11 +209,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); - }, ))), ], ), @@ -371,11 +375,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, '/'); diff --git a/lib/page/login/pilih_disabilitas.dart b/lib/page/login/pilih_disabilitas.dart index fc08a5b059e4104ab306578a5e45f725316d0a73..758a125ee7d141b902bb15fc93c186d91c977bc1 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/pencarian/pencarian.dart b/lib/page/pencarian/pencarian.dart index 0afddd3338d8e7b8fb18d505b77c2201c4b708e1..9344b01c77e571e8247591c26ddba3a48befa08a 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 af2aabbeb76f624f99e60527cc487b7b98bec6fb..71d73eb456b3dca92c26cfe739615cb55d6d5c1b 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( @@ -159,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), @@ -179,7 +183,6 @@ class _EditProfileState extends State { 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 0903be114421862022e3acc06d6878e81b439754..2f2f74c587f7e02e152050c060b8861eadf3bb68 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 c5cab286251e7c7669ac3e6d4c147271d9d68b7b..7c64ecad20cbf6501dc4ba577ea151c2086ac64a 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); - }, ), ) ], @@ -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) { @@ -174,7 +177,6 @@ class RegistrasiState extends State { 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 131816bd9318de580b2caaf19c2df97cab914584..9cd65f11377380ce42a57b524f417faea8ab6f74 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, @@ -191,7 +194,6 @@ class _RegistrasiInformasiLayananDisabilitasState tanggalLahir, style: const TextStyle(color: Colors.white), ), - color: greenPrimary, ) ], )), @@ -223,8 +225,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 +270,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 +315,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 +361,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) { @@ -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(); }, @@ -481,7 +497,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 9145990916f0c1659dd019ab0c0dbbf65446c18b..24569e45efd6f152d076c958f67783d501c96b2c 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.dart b/lib/page/tentang_disabilitas/tentang_disabilitas.dart index b585aec280be5b3288eaa4d2fd17ecd0d86a0bec..e598d0f2a1b32deec23eb9ed6d8f2a0bf28eb6c6 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/tentang_disabilitas/tentang_disabilitas_fisik.dart b/lib/page/tentang_disabilitas/tentang_disabilitas_fisik.dart index 4a3e1f8c961c961621021d8fd2dcaaf63d888a7d..493d88df9f5115dcb1521c32d7c29338c2862a86 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 f0864ae14f47c42b37f026f7f14a5f86e7fa6626..50316f99c08fda83311188d9350cba14812c8575 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 e25fb6c02dcfc6afbbb311824459938e14aa2e46..705f9f349f45fbbb5eeb3aed2f4c7f374c9ec800 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 54ae82c79d57141e532f87fe54ecc48d1bcd7a42..6d82778abe012bc0b88d6816e4badb2f6fb53a9d 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 0e80bda847be0f62cad9612cb6403a414c05a696..e812ec56fc86c1f0bbba5a45c4ab545663e0268b 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; @@ -50,18 +49,19 @@ 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); - return _image = File(image.path); - } - - Future _clearImage() async { - setState(() { - _image = null; - }); + if (image != null) { + _existingImageUrl = ''; + return _image = File(image.path); + } + return _image; } @override @@ -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(() { @@ -245,7 +247,8 @@ class UpdateInformasiState extends State { ) ], ), - if (_existingImageUrl == '/media/') + if (_existingImageUrl == null || _existingImageUrl == '' || + _existingImageUrl == '/media/') _showImagePreview() else _showExistingImage(), @@ -293,28 +296,38 @@ 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: const Text( - 'Batal', - style: TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.bold), + child: ElevatedButton( + style: ButtonStyle( + padding: MaterialStateProperty.all( + EdgeInsets.symmetric(vertical: 15) + ), + overlayColor: MaterialStateProperty.all( + greenPrimary + ), + backgroundColor: MaterialStateProperty.all( + Colors.white70 ), - onPressed: () { - _resetInput(); - Navigator.of(context).pop(); - }), + 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(); + }, + child: const Text( + 'Batal', + style: TextStyle( + fontSize: 20, + color: Colors.black, + fontWeight: FontWeight.bold), + ), + ), ), ), const SizedBox( @@ -372,34 +385,18 @@ class UpdateInformasiState extends State { } Future submitInfo() async { - final sharedPreferences = await SharedPreferences.getInstance(); _bloc = KomentarBloc(widget.komentar.namaLokasi); - - final namaLokasi = widget.komentar.namaLokasi.replaceAll(' ', '%20'); - final response = await _bloc.updateKomentar(newKomentarData, namaLokasi, - 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']); + final response = await _bloc.updateKomentar(newKomentarData, widget.lokasi.placeId, + 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); } @@ -444,13 +441,17 @@ class UpdateInformasiState extends State { _setJenisDisabilitas(); newKomentarData['disabilitas'] = _disabilitas; newKomentarData['jumlah'] = _jumlahFasilitas; - newKomentarData['image'] = ''; + newKomentarData.remove('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'] = ''; + } } } @@ -507,12 +508,12 @@ 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/'; + _existingImageUrl = null; _image = null; }); }, @@ -537,7 +538,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/dynamic_links_service_repository.dart b/lib/repository/dynamic_links_service_repository.dart new file mode 100644 index 0000000000000000000000000000000000000000..7a94e7f61bb6a2aa9d2e806f5e45d53d7d13bf89 --- /dev/null +++ b/lib/repository/dynamic_links_service_repository.dart @@ -0,0 +1,51 @@ +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 + 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/link?id=$fasilitasId&place_id=$placeId&type=fasilitas', + ), + androidParameters: AndroidParameters( + packageName: 'com.ppl.bisaGo', + ), + ); + + final shortDynamicLink = await parameters.buildShortLink(); + 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(); + } +} diff --git a/lib/repository/komentar_posting_repository.dart b/lib/repository/komentar_posting_repository.dart index 4bdf3f0fa3b585da2ece24d7e13392dbfbd1864f..47ca6bf7bfd46c2634cb310fc00c8ac5acc7f92a 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 a2976ff71e04ab5c84369181b3a63bca4fd4af05..cf34a3ee609a0708d6d4990201292a75d30a7002 100644 --- a/lib/repository/komentar_repository.dart +++ b/lib/repository/komentar_repository.dart @@ -1,13 +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, int fasilitasId); } class KomentarRepository implements BaseKomentarRepository { @@ -15,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 @@ -33,12 +34,21 @@ class KomentarRepository implements BaseKomentarRepository { return response; } + @override Future updateKomentar(Map newKomentarData, - String namaLokasi, int id, String token) async { - final response = await http.put( - '${ApiFlavor.getBaseUrl()}/informasi-fasilitas/lokasi/update-fasilitas/$namaLokasi/${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, 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/lib/repository/lokasi_repository.dart b/lib/repository/lokasi_repository.dart index f0d541ca5aabe9d55c3cf6df579f4dea83596c81..6185473173ee877dacf4914e329de8ed8d53172a 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 5d0bcbf121c8c303eb0847abdecb9fc0dcca4f05..03b1afd83f228a7e661e0489db333d65aebcab61 100644 --- a/lib/utils/custom_alert_dialog.dart +++ b/lib/utils/custom_alert_dialog.dart @@ -43,11 +43,15 @@ 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), + ), + onPressed: widget.leftFunction, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -58,8 +62,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( @@ -67,10 +69,14 @@ 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)), + 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, children: [ @@ -81,8 +87,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 a0641ab357c567fe10034eccb5bb6d02da78027b..fd4918640584817d2fbc4bf0c9c94f5f13e05435 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, - ), - 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), + ), ), - onPressed: () => function(), - ), + ) ); } @@ -110,14 +125,16 @@ 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)), - child: icon, + ), onPressed: () => function(), + child: icon, ), ); } diff --git a/lib/utils/custom_dashboard_location_button.dart b/lib/utils/custom_dashboard_location_button.dart index 01e7f9e2ec25036467c7ba35ef7cff1f01ea91a8..4cf4019fc9695e240031195a2f921db20d220f4e 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 1972337dba42a3ad982d50bdbe4b0218305c58aa..6108dab7837718ae245fb7f636a0c751b7f10516 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/custom_dropdown.dart b/lib/utils/custom_dropdown.dart index 336435d15e3c187a15188309dd0124c710a1e4ef..39e7575c53d7707a96f2f70ef97128163494b3c4 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 c6b556283b1a399f51cee61f19108127dd70749a..e7f9488b30f84d3638bc1283ee9e5958d8fa4287 100644 --- a/lib/utils/location_turn_on_dialog.dart +++ b/lib/utils/location_turn_on_dialog.dart @@ -21,41 +21,41 @@ 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: 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: [ + const SizedBox(width: 2.0), + Text(buttonMessage, + style: const TextStyle( + color: greenPrimary, fontSize: 20.0)), + ], + ), + )) + ])) + ]), + contentPadding: const EdgeInsets.fromLTRB(25.0, 0.0, 25.0, 30.0), + shape: RoundedRectangleBorder(borderRadius: regularBorderRadius), + ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 0e3db6defabc0fec793b32fef4ba1a3eb395d2cc..d929511ce3c3bf444a9ed9b2d6c5099f744c9353 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,20 +37,26 @@ 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 material_design_icons_flutter: ^4.0.5755 get_it: ^5.0.1 - rxdart: ^0.23.1 + rxdart: ^0.25.0 json_annotation: ^3.1.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 + firebase_dynamic_links: ^0.7.0+1 + carousel_slider: ^3.0.0 dev_dependencies: flutter_test: sdk: flutter flutter_launcher_icons: ^0.7.4 - network_image_mock: 1.1.0 + network_image_mock: ^1.1.0 # Linter dependency pedantic: ^1.8.0 # The default Linter package used in Google build_runner: ^1.8.0 diff --git a/test/dynamic_link_service_test.dart b/test/dynamic_link_service_test.dart new file mode 100644 index 0000000000000000000000000000000000000000..305f563e45d24b5bf96be1863b901117ac61ed6a --- /dev/null +++ b/test/dynamic_link_service_test.dart @@ -0,0 +1,35 @@ +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'; + +final String _mockLink = 'https://bisago.page.link/bQ61qYhY1KajctUHA'; + +class MockDynamicLinksServiceRepository extends Fake + implements DynamicLinksServiceRepository { + @override + Future createDynamicLinkForFasilitas( + String fasilitasId, String placeId) { + return Future.value(_mockLink); + } + + @override + Future createDynamicLinkForKegiatan(String id, String placeId) { + return Future.value(_mockLink); + } +} + +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, _mockLink); + }); +} diff --git a/test/fasilitas_test.dart b/test/fasilitas_test.dart index 901b6d2b1e7a35bb172fc4845e33123c09b18934..135b182e3eb690ad7cb95307d6384d18d6687365 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/layanan_disabilitas_test.dart b/test/layanan_disabilitas_test.dart index c66a3b213e0c0678cd3c8c5850bce4ec8c1f00a6..22fac95f0fe96c813fb4fdb6739514e32b9c0bd9 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 88b5504c576e42f7af7c49a2e03a74b5741734df..c84ca84b281e26ff8bf0c104998c8a5c4236618e 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/update_informasi_test.dart b/test/update_informasi_test.dart index fcd42444e498b775749b24689f4a2a31b91b6820..7b43d55c71991d0c8d1c25b324580318de360b1f 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)); diff --git a/test/widget_test.dart b/test/widget_test.dart index 8f4f411f5d46f21063f41800ec7d0e19d8acb7d0..2e1bdfa66d979db4b18d6e9cb2ac2d15cb352719 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 {