import 'package:flutter/material.dart'; import 'package:geojson/geojson.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:latlong2/latlong.dart'; import 'package:rogapp/main.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/services/external_service.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, required this.destination}) : super(key: key); final IndexController indexController = Get.find(); final DestinationController destinationController = Get.find(); Destination destination; Image getImage() { String serverUrl = ConstValues.currentServer(); if (indexController.rog_mode == 1) { //print("----- rogaining mode 1"); if (indexController.currentDestinationFeature.isEmpty || indexController.currentDestinationFeature[0].photos! == "") { return const 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( '$serverUrl/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 const 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( '$serverUrl/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) .isNotEmpty) { return true; } else { return false; } } @override Widget build(BuildContext context) { destinationController.skip_gps = true; 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: const Icon( Icons.arrow_back_ios, size: 14, ), padding: const EdgeInsets.all(16), shape: const CircleBorder(), ), Expanded( child: Container( alignment: Alignment.center, child: Obx(() => indexController.currentUser.isNotEmpty ? Text( "${TextUtils.getDisplayText(indexController.currentDestinationFeature[0])} : ${TextUtils.getDisplayText(indexController.currentDestinationFeature[0])} : ${indexController.currentDestinationFeature[0].name!}", style: const TextStyle( fontSize: 15.0, fontWeight: FontWeight.bold, ), ) : Text( indexController .currentDestinationFeature[0].name!, style: const 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) { if (indexController .currentDestinationFeature[0] .hidden_location == 0) { destinationController.skip_gps = false; destinationController.is_photo_shoot.value = true; Get.back(); } else { 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( //Checkin indexController.currentDestinationFeature[0] .checkedin == null || indexController .currentDestinationFeature[0] .checkedin == false ? "チェックイン" : "チェックアウト")), ], ) : 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!); saveGameState(); ExternalService() .StartRogaining() .then((value) => Get.back()); }, child: Text( // start indexController.currentDestinationFeature[0] .checkedin != null || indexController.currentDestinationFeature[0] .checkedin == true ? "ロゲイニングを開始" : "間違った目的地...")) : Container(), ), Obx( () => destinationController.is_at_goal.value == true && destinationController.rogaining_counted == true ? ElevatedButton( onPressed: () { Get.toNamed(AppPages.CAMERA_PAGE); Get.back(); }, child: Text( //goal indexController.currentDestinationFeature[0] .checkedin != null || indexController.currentDestinationFeature[0] .checkedin == true ? "ロゲイニングを終える" : "間違った目的地 ...")) : Container(), ), ], ), Obx( () => indexController.currentDestinationFeature[0].address != null && indexController .currentDestinationFeature[0].address!.isNotEmpty ? getDetails(context, "address".tr, indexController.currentDestinationFeature[0].address! ?? '') : const SizedBox( width: 0.0, height: 0, ), ), Obx( () => indexController.currentDestinationFeature[0].phone != null && indexController .currentDestinationFeature[0].phone!.isNotEmpty ? getDetails(context, "telephone".tr, indexController.currentDestinationFeature[0].phone! ?? '') : const SizedBox( width: 0.0, height: 0, ), ), Obx( () => indexController.currentDestinationFeature[0].email != null && indexController .currentDestinationFeature[0].email!.isNotEmpty ? getDetails(context, "email".tr, indexController.currentDestinationFeature[0].email! ?? '') : const SizedBox( 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) : const SizedBox( 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) : const SizedBox( width: 0.0, height: 0, ), ), const SizedBox( height: 20.0, ), // Obx(() => // //wantToGo(context), // FutureBuilder( // future: wantToGo(context), // builder: (context, snapshot) { // return Container( // child: snapshot.data, // ); // }, // ), // ), const SizedBox( height: 60.0, ) ], ), ); } // show add location details SingleChildScrollView detailsSheet(BuildContext context) { Destination _cdest = destinationController.festuretoDestination( indexController.currentFeature[0]); var distance = const Distance(); double _distance_to_dest = distance.as(LengthUnit.Meter, LatLng(destinationController.current_lat, destinationController.current_lon), LatLng(_cdest.lat!, _cdest.lon!)); 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: const Icon( Icons.arrow_back_ios, //Icons.arrow_back_ios, size: 14, ), padding: const EdgeInsets.all(16), shape: const CircleBorder(), ), Expanded( child: Container( alignment: Alignment.center, child: Obx(() => Text( indexController .currentFeature[0].properties!["location_name"], style: const 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 && indexController .currentDestinationFeature[0].cp == -1 && indexController.currentDestinationFeature[0] .checkedin == false && destinationController.is_at_start.value == true ? ElevatedButton( onPressed: () { destinationController.resetRogaining(); destinationController.is_in_rog.value = true; destinationController.addToRogaining( destinationController.current_lat, destinationController.current_lon, indexController .currentDestinationFeature[0] .location_id!); saveGameState(); ExternalService() .StartRogaining() .then((value){ Get.back(); }); }, child: Text( // start indexController .currentDestinationFeature[ 0] .checkedin != null || indexController .currentDestinationFeature[ 0] .checkedin == true ? "ロゲイニングを開始" : "間違った目的地...")) : Container(), ), Obx( () => destinationController.is_at_goal.value == true && destinationController.rogaining_counted == true ? ElevatedButton( onPressed: () { Get.toNamed(AppPages.CAMERA_PAGE); Get.back(); }, child: Text( //goal indexController .currentDestinationFeature[ 0] .checkedin != null || indexController .currentDestinationFeature[ 0] .checkedin == true ? "ロゲイニングを終える" : "間違った目的地 ...")) : Container(), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context) .colorScheme .onPrimaryContainer), onPressed: () async { Get.back(); print("---- go to ----"); GeoJsonFeature mp = indexController.currentFeature[0] as GeoJsonFeature; Position position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.bestForNavigation, forceAndroidLocationManager: true); print("------- position -------- $position"); Destination ds = Destination( lat: position.latitude, lon: position.longitude); Destination tp = Destination( lat: mp.geometry!.geoSerie!.geoPoints[0] .latitude, lon: mp.geometry!.geoSerie!.geoPoints[0] .longitude); destinationController .destinationMatrixFromCurrentPoint([ds, tp]); }, child: Text( "ここへ行く", style: TextStyle( color: Theme.of(context).colorScheme.onPrimary), )), SizedBox( width: 10, ), // forced start / checkin _distance_to_dest <= 100 ? ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary), onPressed: () async { if (destination.cp == -1) { destinationController.is_in_rog.value = true; destinationController.addToRogaining( destinationController.current_lat, destinationController.current_lon, destination.location_id!); saveGameState(); ExternalService() .StartRogaining() .then((value) => Get.back()); } else { await destinationController.CallforCheckin(destination); } }, child: Text( destinationController .festuretoDestination( indexController .currentFeature[0]) .cp == -1 ? "ロゲ開始" : "チェックイン", style: TextStyle( color: Theme.of(context) .colorScheme .onSecondary))): 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"])) : const SizedBox( width: 0.0, height: 0, ), ], ), ), ], ), const SizedBox( height: 8.0, ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ const Icon(Icons.roundabout_left), const 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"] ?? '') : const SizedBox( width: 0.0, height: 0, ), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ const Icon(Icons.phone), const 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"] ?? '') : const SizedBox( width: 0.0, height: 0, ), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ const Icon(Icons.email), const 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"] ?? '') : const SizedBox( width: 0.0, height: 0, ), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ const Icon(Icons.language), const 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) : const SizedBox( width: 0.0, height: 0, ), ], ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ const 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) : const SizedBox( width: 0.0, height: 0, ), ], ), ), // Text('${TextUtils.getDisplayText(indexController.currentFeature[0].properties!["cp"].toString())} - id: ${TextUtils.getDisplayText(indexController.currentFeature[0].properties!["checkin_point"].toString())}'), ], ), )), const 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.spaceBetween, 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("----- want to go sub location is ---- ${indexController.currentFeature[0].properties!["sub_loc_id"]} -----"); // // 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, // // sub_loc_id: indexController.currentFeature[0].properties!["sub_loc_id"], // // 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(), const SizedBox( width: 8.0, ), Obx((() => indexController.rog_mode == 1 ? ElevatedButton( onPressed: () async { Destination dest = indexController.currentDestinationFeature[0]; //print("------ curent destination is ${dest!.checkedIn}-------"); destinationController.makeCheckin( dest, !dest.checkedin!, ""); }, child: indexController .currentDestinationFeature[0].checkedin == false ? const Text("チェックイン") : const Text("チェックアウト")) : 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: const 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: const 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), const 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: SizedBox( width: MediaQuery.of(context).size.width - (MediaQuery.of(context).size.width * 0.28), child: Text( text, textDirection: TextDirection.ltr, textAlign: TextAlign.justify, style: TextStyle( color: isurl ? Colors.blue : Colors.black, ), ), ), ), ], ); } }