import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:geojson/geojson.dart'; import 'package:get/get.dart'; import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:image_picker/image_picker.dart'; import 'package:latlong2/latlong.dart'; import 'package:rogapp/model/destination.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/utils/const.dart'; import 'package:rogapp/utils/database_helper.dart'; import 'package:rogapp/utils/text_util.dart'; import 'package:rogapp/widgets/bottom_sheet_controller.dart'; import 'package:url_launcher/url_launcher.dart'; class BottomSheetNew extends GetView { BottomSheetNew({ Key? key }) : super(key: key); final IndexController indexController = Get.find(); final DestinationController destinationController = Get.find(); Image getImage(){ String server_url = ConstValues.currentServer(); if(indexController.rog_mode == 1){ //print("----- rogaining mode 1"); if(indexController.currentDestinationFeature.length <= 0 || indexController.currentDestinationFeature[0].photos! == ""){ return Image(image: AssetImage('assets/images/empty_image.png')); } else{ //print("@@@@@@@@@@@@@ rog mode -------------------- ${indexController.currentDestinationFeature[0].photos} @@@@@@@@@@@"); String _photo = indexController.currentDestinationFeature[0].photos!; if(_photo.contains('http')){ return Image(image: NetworkImage( indexController.currentDestinationFeature[0].photos!, ), errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { return Image.asset("assets/images/empty_image.png"); }, ); } else { return Image(image: NetworkImage( '${server_url}/media/compressed/' + indexController.currentDestinationFeature[0].photos!, ), errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { return Image.asset("assets/images/empty_image.png"); }, ); } } } else{ GeoJsonFeature gf = indexController.currentFeature[0]; if(gf!.properties!["photos"] == null || gf.properties!["photos"] == ""){ return Image(image: AssetImage('assets/images/empty_image.png')); } else{ String _photo = gf!.properties!["photos"]; if(_photo.contains('http')){ return Image(image: NetworkImage( gf.properties!["photos"], ), errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { return Image.asset("assets/images/empty_image.png"); }, ); } else { return Image(image: NetworkImage( '${server_url}/media/compressed/' + gf.properties!["photos"], ), errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { return Image.asset("assets/images/empty_image.png"); }, ); } } } } void _launchURL(url) async { if (!await launch(url)) throw 'Could not launch $url'; } bool isInDestination(String locationid){ int lid = int.parse(locationid); if(destinationController.destinations.where((element) => element.location_id == lid).length > 0){ return true; } else{ return false; } } @override Widget build(BuildContext context) { print('---- rog_mode ----- ${indexController.rog_mode} -----'); return indexController.rog_mode == 0 ? detailsSheet(context) : destinationSheet(context); } // Show destination detais SingleChildScrollView destinationSheet(BuildContext context) { print('---- currentDestinationFeature ----- ${indexController.currentDestinationFeature[0].name} -----'); return SingleChildScrollView( child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Container( child: Row( children: [ MaterialButton( onPressed: () { Get.back(); //destinationController.makePrevious(indexController.currentDestinationFeature[0]); }, color: Colors.blue, textColor: Colors.white, child: Icon( Icons.arrow_back_ios, size: 14, ), padding: EdgeInsets.all(16), shape: CircleBorder(), ), Expanded( child: Container( alignment: Alignment.center, child: Obx(() => indexController.currentUser.length > 0 ? Text("${TextUtils.getDisplayText(indexController.currentDestinationFeature[0].cp.toString())} : ${TextUtils.getDisplayText(indexController.currentDestinationFeature[0].checkin_point.toString())} : ${indexController.currentDestinationFeature[0].name!}", style: TextStyle( fontSize: 15.0, fontWeight: FontWeight.bold, ), ) : Text("${indexController.currentDestinationFeature[0].name!}", style: TextStyle( fontSize: 15.0, fontWeight: FontWeight.bold, ), ) ), ), ), ], ), ), ), Row( children: [ Expanded( child: SizedBox( height: 260.0, child: Obx(() => getImage()), ) ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Obx(() => indexController.currentDestinationFeature.isNotEmpty && destinationController.is_in_checkin.value == true && destinationController.is_at_start.value == false ? Row( children: [ ElevatedButton( onPressed: (){ if(indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false){ destinationController.makeCheckin(indexController.currentDestinationFeature[0], true); if(indexController.currentDestinationFeature[0].cp != -1){ destinationController.rogaining_counted.value =true; } } else{ destinationController.makeCheckin(indexController.currentDestinationFeature[0], false); } Get.back(); }, child: Text( indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false ? "Chekin" : "Checkput" ) ), ], ) : Container(), ), Obx(() => destinationController.is_at_start.value == true ? ElevatedButton( onPressed: (){ destinationController.is_in_rog.value = true; destinationController.addToRogaining(destinationController.current_lat, destinationController.current_lon, indexController.currentDestinationFeature[0].location_id!); Get.back(); }, child: Text( indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? "Start Rogaining" : "Wrong destination ..." ) ) : Container(), ), Obx(() => destinationController.is_at_goal.value == true && destinationController.rogaining_counted ==true ? ElevatedButton( onPressed: (){ Get.toNamed(AppPages.CAMERA_PAGE); Get.back(); }, child: Text( indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? "Finish Rogaining" : "Wrong destination ..." ) ) : Container(), ), ], ), Obx(() => indexController.currentDestinationFeature[0].address != null && indexController.currentDestinationFeature[0].address!.isNotEmpty ? getDetails(context, "address".tr, indexController.currentDestinationFeature[0].address! ?? '') : Container(width: 0.0, height: 0,), ), Obx(() => indexController.currentDestinationFeature[0].phone != null && indexController.currentDestinationFeature[0].phone!.isNotEmpty ? getDetails(context, "telephone".tr, indexController.currentDestinationFeature[0].phone! ?? '') : Container(width: 0.0, height: 0,), ), Obx(() => indexController.currentDestinationFeature[0].email != null && indexController.currentDestinationFeature[0].email!.isNotEmpty ? getDetails(context, "email".tr, indexController.currentDestinationFeature[0].email! ?? '') : Container(width: 0.0, height: 0,), ), Obx(() => indexController.currentDestinationFeature[0].webcontents != null && indexController.currentDestinationFeature[0].webcontents!.isNotEmpty ? getDetails(context, "web".tr, indexController.currentDestinationFeature[0].webcontents! ?? '', isurl: true) : Container(width: 0.0, height: 0,), ), Obx(() => indexController.currentDestinationFeature[0].videos != null && indexController.currentDestinationFeature[0].videos!.isNotEmpty ? getDetails(context, "video".tr, indexController.currentDestinationFeature[0].videos! ?? '', isurl: true) : Container(width: 0.0, height: 0,), ), SizedBox(height: 20.0,), // Obx(() => // //wantToGo(context), // FutureBuilder( // future: wantToGo(context), // builder: (context, snapshot) { // return Container( // child: snapshot.data, // ); // }, // ), // ), SizedBox(height: 60.0,) ], ), ); } // show add location details SingleChildScrollView detailsSheet(BuildContext context) { return SingleChildScrollView( child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Container( child: Row( children: [ MaterialButton( onPressed: () { Get.back(); //indexController.makePrevious(indexController.currentFeature[0]); }, color: Colors.blue, textColor: Colors.white, child: Icon( Icons.arrow_back_ios, size: 14, ), padding: EdgeInsets.all(16), shape: CircleBorder(), ), Expanded( child: Container( alignment: Alignment.center, child: Obx(() => Text(indexController.currentFeature[0].properties!["location_name"], style: TextStyle( fontSize: 15.0, fontWeight: FontWeight.bold, ), ) ), ), ), ], ), ), ), Row( children: [ Expanded( child: SizedBox( height: 260.0, child: Obx(() => getImage()), ) ), ], ), Obx(() => Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Obx(() => indexController.currentDestinationFeature.isNotEmpty && destinationController.is_in_checkin.value == true ? Row( children: [ ElevatedButton( onPressed: (){ if(indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false){ destinationController.makeCheckin(indexController.currentDestinationFeature[0], true); if(indexController.currentDestinationFeature[0].cp != -1){ destinationController.rogaining_counted.value =true; } } else{ destinationController.makeCheckin(indexController.currentDestinationFeature[0], false); } Get.back(); }, child: Text( indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false ? "Chekin" : "Checkput" ) ), ], ) : Container(), ), ], ), Row( children: [ Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ indexController.currentDestinationFeature.isNotEmpty && destinationController.is_in_checkin.value == true ? Container() : FutureBuilder( future: wantToGo(context), builder: (context, snapshot) { return Container( child: snapshot.data, ); }, ), indexController.currentFeature[0].properties!["location_name"] != null && (indexController.currentFeature[0].properties!["location_name"] as String).isNotEmpty ? Flexible(child: Text(indexController.currentFeature[0].properties!["location_name"])) : Container(width: 0.0, height: 0,), ], ), ), ], ), SizedBox(height: 8.0,), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Icon(Icons.roundabout_left), SizedBox(width: 8.0,), indexController.currentFeature[0].properties!["address"] != null && (indexController.currentFeature[0].properties!["address"] as String).isNotEmpty ? getDetails(context, "address".tr, indexController.currentFeature[0].properties!["address"] ?? '') : Container(width: 0.0, height: 0,), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Icon(Icons.phone), SizedBox(width: 8.0,), indexController.currentFeature[0].properties!["phone"] != null && (indexController.currentFeature[0].properties!["phone"] as String).isNotEmpty ? getDetails(context, "telephone".tr, indexController.currentFeature[0].properties!["phone"] ?? '') : Container(width: 0.0, height: 0,), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Icon(Icons.email), SizedBox(width: 8.0,), indexController.currentFeature[0].properties!["email"] != null && (indexController.currentFeature[0].properties!["email"] as String).isNotEmpty ? getDetails(context, "email".tr, indexController.currentFeature[0].properties!["email"] ?? '') : Container(width: 0.0, height: 0,), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Icon(Icons.language), SizedBox(width: 8.0,), indexController.currentFeature[0].properties!["webcontents"] != null && (indexController.currentFeature[0].properties!["webcontents"] as String).isNotEmpty ? getDetails(context, "web".tr, indexController.currentFeature[0].properties!["webcontents"] ?? '', isurl: true) : Container(width: 0.0, height: 0,), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ SizedBox(width: 8.0,), indexController.currentFeature[0].properties!["remark"] != null && (indexController.currentFeature[0].properties!["remark"] as String).isNotEmpty ? getDetails(context, "remarks".tr, indexController.currentFeature[0].properties!["remark"] ?? '', isurl: false) : Container(width: 0.0, height: 0,), ], ), ), // Text('${TextUtils.getDisplayText(indexController.currentFeature[0].properties!["cp"].toString())} - id: ${TextUtils.getDisplayText(indexController.currentFeature[0].properties!["checkin_point"].toString())}'), ], ), ) ), SizedBox(height: 60.0,) ], ), ); } Future wantToGo(BuildContext context)async { bool _selected = false; print('---target-- ${indexController.currentFeature[0].properties!["location_id"]}----'); for(Destination d in destinationController.destinations){ print('---- ${d.location_id.toString()} ----'); if(d.location_id == indexController.currentFeature[0].properties!["location_id"]){ _selected = true; break; } } DatabaseHelper db = DatabaseHelper.instance; return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ indexController.rog_mode == 0 ? IconButton( icon: Icon(Icons.pin_drop_sharp, size: 32, color: _selected == true ? Colors.amber : Colors.blue,), onPressed: (){ if(_selected){ // show remove from destination Get.defaultDialog( title: "本当にこのポイントを通過順から外しますか?", middleText: "場所は目的地リストから削除されます", backgroundColor: Colors.blue.shade300, titleStyle: TextStyle(color: Colors.white), middleTextStyle: TextStyle(color: Colors.white), textConfirm: "はい", textCancel: "いいえ", cancelTextColor: Colors.white, confirmTextColor: Colors.blue, buttonColor: Colors.white, barrierDismissible: false, radius: 10, content: Column( children: [ ], ), onConfirm: (){ int _id = indexController.currentFeature[0].properties!["location_id"]; Destination? d = destinationController.destinationById(_id); print('--- des id is : ${d} -----'); if(d != null) { //print('--- des id is : ${d.location_id} -----'); destinationController.deleteDestination(d); Get.back(); Get.back(); Get.snackbar("追加した", "場所が削除されました"); } } ); return; } // show add to destination Get.defaultDialog( title: "この場所を登録してもよろしいですか", middleText: "ロケーションがロガニング リストに追加されます", backgroundColor: Colors.blue.shade300, titleStyle: TextStyle(color: Colors.white), middleTextStyle: TextStyle(color: Colors.white), textConfirm: "はい", textCancel: "いいえ", cancelTextColor: Colors.white, confirmTextColor: Colors.blue, buttonColor: Colors.white, barrierDismissible: false, radius: 10, content: Column( children: [ ], ), onConfirm: (){ GeoJsonMultiPoint mp = indexController.currentFeature[0].geometry as GeoJsonMultiPoint; LatLng pt = LatLng(mp.geoSerie!.geoPoints[0].latitude, mp.geoSerie!.geoPoints[0].longitude); //print("----- ${indexController.currentFeature[0].properties} -----"); Destination dest = Destination( name: indexController.currentFeature[0].properties!["location_name"], address: indexController.currentFeature[0].properties!["address"], phone: indexController.currentFeature[0].properties!["phone"], email: indexController.currentFeature[0].properties!["email"], webcontents: indexController.currentFeature[0].properties!["webcontents"], videos: indexController.currentFeature[0].properties!["videos"], category: indexController.currentFeature[0].properties!["category"], series: 1, lat: pt.latitude, lon: pt.longitude, location_id: indexController.currentFeature[0].properties!["location_id"], list_order: 1, photos: indexController.currentFeature[0].properties!["photos"], checkin_radious: indexController.currentFeature[0].properties!["checkin_radius"], auto_checkin: indexController.currentFeature[0].properties!["auto_checkin"] == true ? 1 : 0, cp: indexController.currentFeature[0].properties!["cp"], checkin_point: indexController.currentFeature[0].properties!["checkin_point"], buy_point: indexController.currentFeature[0].properties!["buy_point"], selected: false, checkedin: false, hidden_location: indexController.currentFeature[0].properties!["hidden_location"] == true ?1 : 0 ); destinationController.addDestinations(dest); Get.back(); Get.back(); Get.snackbar("追加した", "場所が追加されました"); } ); }, ): Container(), SizedBox(width: 8.0,) , Obx((() => indexController.rog_mode == 1 ? ElevatedButton( onPressed: () async { Destination dest = indexController.currentDestinationFeature[0]!; //print("------ curent destination is ${dest!.checkedIn}-------"); if(dest != null){ //print("------ curent destination is ${dest!.checkedin}-------::::::::::"); destinationController.makeCheckin(dest, !dest.checkedin!); } }, child: indexController.currentDestinationFeature[0].checkedin == false ? Text("Check in") : Text("Check out") ): Container() ) ) ], ) ], ); } Widget getCheckin(BuildContext context){ //print("------ currentAction ----- ${indexController.currentAction}-----"); return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ indexController.currentAction[0][0]["checkin"] == false ? Column( children: [ Row( mainAxisSize: MainAxisSize.max, children: [ ElevatedButton( child: Text("Image"), onPressed: (){ final ImagePicker _picker = ImagePicker(); _picker.pickImage(source: ImageSource.camera).then((value){ //print("----- image---- ${value!.path}"); }); }, ) ], ), ElevatedButton( onPressed: (){ if(indexController.currentAction.isNotEmpty){ //print(indexController.currentAction[0]); indexController.currentAction[0][0]["checkin"] = true; Map temp = Map.from(indexController.currentAction[0][0]); indexController.currentAction.clear(); //print("---temp---${temp}"); indexController.currentAction.add([temp]); } indexController.makeAction(context); }, child: Text("checkin".tr) ) ], ) : ElevatedButton( onPressed: (){ if(indexController.currentAction.isNotEmpty){ //print(indexController.currentAction[0]); indexController.currentAction[0][0]["checkin"] = false; Map temp = Map.from(indexController.currentAction[0][0]); indexController.currentAction.clear(); //print("---temp---${temp}"); indexController.currentAction.add([temp]); } indexController.makeAction(context); }, child: Icon( Icons.favorite, color: Colors.red) , ) ], ) ], ); } Widget getDetails(BuildContext context, String label, String text, {bool isurl=false}){ return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(label), SizedBox(width: 10.0,), InkWell( onTap: (){ if(isurl){ if(indexController.rog_mode == 0){ _launchURL(indexController.currentFeature[0].properties!["webcontents"]); } else { indexController.currentDestinationFeature[0].webcontents; } } }, child: Container( width: MediaQuery.of(context).size.width - 160, child: Text(text, style: TextStyle( color: isurl ? Colors.blue : Colors.black, ), ), ), ), ], ); } }