Files
rog_app/lib/widgets/bottom_sheet_new.dart
Mohamed Nouffer 56e9861c7a update to 3.13
2023-09-03 23:37:41 +05:30

1005 lines
44 KiB
Dart

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/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<BottomSheetController> {
BottomSheetNew({Key? key}) : super(key: key);
final IndexController indexController = Get.find<IndexController>();
final DestinationController destinationController =
Get.find<DestinationController>();
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<dynamic> 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,
padding: const EdgeInsets.all(16),
shape: const CircleBorder(),
child: const Icon(
Icons.arrow_back_ios,
size: 14,
),
),
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!);
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<Widget>(
// future: wantToGo(context),
// builder: (context, snapshot) {
// return Container(
// child: snapshot.data,
// );
// },
// ),
// ),
const 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,
padding: const EdgeInsets.all(16),
shape: const CircleBorder(),
child: const Icon(
Icons.arrow_back_ios,
//Icons.arrow_back_ios,
size: 14,
),
),
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.is_in_rog.value =
true;
destinationController.addToRogaining(
destinationController.current_lat,
destinationController.current_lon,
indexController
.currentDestinationFeature[0]
.location_id!);
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(
onPressed: () async {
GeoJsonFeature<GeoJsonMultiPoint> mp =
indexController.currentFeature[0]
as GeoJsonFeature<GeoJsonMultiPoint>;
Position position =
await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
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);
Get.back();
destinationController
.destinationMatrixFromCurrentPoint([ds, tp]);
},
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context)
.colorScheme
.onPrimaryContainer),
child: Text(
"ここへ行く",
style: TextStyle(
color:
Theme.of(context).colorScheme.onPrimary),
)),
SizedBox(
width: 10,
),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor:
Theme.of(context).colorScheme.secondary),
onPressed: () async {
destinationController.CallforCheckin(
destinationController.festuretoDestination(
indexController.currentFeature[0]));
},
child: Text("チェックイン",
style: TextStyle(
color: Theme.of(context)
.colorScheme
.onSecondary))),
],
),
Row(
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
indexController.currentDestinationFeature
.isNotEmpty &&
destinationController
.is_in_checkin.value ==
true
? Container()
: FutureBuilder<Widget>(
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<Widget> 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
: Theme.of(context).colorScheme.primary,
),
onPressed: () {
if (selected) {
// show remove from destination
Get.defaultDialog(
title: "本当にこのポイントを通過順から外しますか?",
middleText: "場所は目的地リストから削除されます",
backgroundColor: Theme.of(context)
.colorScheme
.secondaryContainer,
titleStyle: const TextStyle(color: Colors.white),
middleTextStyle: TextStyle(
color: Theme.of(context)
.colorScheme
.onSecondaryContainer),
textConfirm: "はい",
textCancel: "いいえ",
cancelTextColor: Colors.white,
confirmTextColor: Colors.blue,
buttonColor: Colors.white,
barrierDismissible: false,
radius: 10,
content: const 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: const TextStyle(color: Colors.white),
middleTextStyle: const TextStyle(color: Colors.white),
textConfirm: "はい",
textCancel: "いいえ",
cancelTextColor: Colors.white,
confirmTextColor: Colors.blue,
buttonColor: Colors.white,
barrierDismissible: false,
radius: 10,
content: const 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}-------");
//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<String, dynamic> temp =
Map<String, dynamic>.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<String, dynamic> temp = Map<String, dynamic>.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 - 160,
child: Text(
text,
style: TextStyle(
color: isurl ? Colors.blue : Colors.black,
),
),
),
),
],
);
}
}