102 lines
4.3 KiB
Dart
102 lines
4.3 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
|||
|
|
import 'package:get/get.dart';
|
|||
|
|
import 'package:rogapp/pages/destination/destination_controller.dart';
|
|||
|
|
import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_base.dart';
|
|||
|
|
import 'package:rogapp/main.dart';
|
|||
|
|
import 'package:rogapp/services/external_service.dart';
|
|||
|
|
|
|||
|
|
class BottomSheetStart extends BottomSheetBase {
|
|||
|
|
|
|||
|
|
BottomSheetStart({super.key, required super.destination});
|
|||
|
|
|
|||
|
|
final DestinationController destinationController = Get.find<DestinationController>();
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
List<Widget> buildWidgets(BuildContext context) {
|
|||
|
|
// super.buildWidgets(context) を継承して、追加のウィジェットをリストに組み込む
|
|||
|
|
return [
|
|||
|
|
...super.buildWidgets(context),
|
|||
|
|
ElevatedButton(
|
|||
|
|
onPressed: destinationController.distanceToStart() <= 100
|
|||
|
|
? () async {
|
|||
|
|
// ボタンがタップされた際の処理
|
|||
|
|
// Check conditions to show confirmation dialog
|
|||
|
|
if (destinationController.isInRog.value == false &&
|
|||
|
|
(destinationController.distanceToStart() <= 500 || destinationController.isGpsSignalWeak() ) && //追加 Akira 2024-4-5
|
|||
|
|
(destination.cp == -1 || destination.cp == 0 ) &&
|
|||
|
|
destinationController.rogainingCounted.value == false) {
|
|||
|
|
// ロゲがまだ開始されていない: destinationController.isInRog.value == false
|
|||
|
|
// かつ (開始ポイントまでの距離が 500m 以内 destinationController.distanceToStart() <= 500
|
|||
|
|
// または GPS信号強度が弱い場合: destinationController.isGpsSignalWeak()
|
|||
|
|
// ) かつ
|
|||
|
|
// そのポイントのCP番号が -1 または 0 の場合:
|
|||
|
|
// かつ ポイントがカウントされていない場合: destinationController.rogainingCounted.value=false
|
|||
|
|
// にロゲイニング開始ができる。
|
|||
|
|
//
|
|||
|
|
print("counted ${destinationController.rogainingCounted.value}");
|
|||
|
|
|
|||
|
|
// Show confirmation dialog
|
|||
|
|
Get.dialog(
|
|||
|
|
AlertDialog(
|
|||
|
|
title: const Text("確認"), //confirm
|
|||
|
|
content: const Text(
|
|||
|
|
"ロゲを開始すると、今までのロゲデータが全てクリアされます。本当に開始しますか?"), //are you sure
|
|||
|
|
actions: <Widget>[
|
|||
|
|
TextButton(
|
|||
|
|
child: const Text("いいえ"), //no
|
|||
|
|
onPressed: () {
|
|||
|
|
Get.back(); // Close the dialog
|
|||
|
|
},
|
|||
|
|
),
|
|||
|
|
TextButton(
|
|||
|
|
child: const Text("はい"), //yes
|
|||
|
|
onPressed: () async {
|
|||
|
|
// Clear data and start game logic here
|
|||
|
|
destinationController.isInRog.value = true;
|
|||
|
|
destinationController.resetRogaining();
|
|||
|
|
destinationController.addToRogaining(
|
|||
|
|
destinationController.currentLat,
|
|||
|
|
destinationController.currentLon,
|
|||
|
|
destination.location_id!,
|
|||
|
|
);
|
|||
|
|
saveGameState(); // main.dart 参照 // ゲームの状態を保存する。
|
|||
|
|
await ExternalService().startRogaining();
|
|||
|
|
Get.back(); // Close the dialog and potentially navigate away
|
|||
|
|
},
|
|||
|
|
),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
barrierDismissible:
|
|||
|
|
false, // User must tap a button to close the dialog
|
|||
|
|
);
|
|||
|
|
} else if (destinationController.isInRog.value == true &&
|
|||
|
|
destination.cp != -1 && destination.cp != 0 ) {
|
|||
|
|
//print("counted ${destinationController.rogainingCounted.value}");
|
|||
|
|
// Existing logic for other conditions
|
|||
|
|
|
|||
|
|
Get.back();
|
|||
|
|
await destinationController.callforCheckin(destination);
|
|||
|
|
} else {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
: null,
|
|||
|
|
child: Obx(
|
|||
|
|
() => Text(
|
|||
|
|
destinationController.isInRog.value ? '競技中' : 'ロゲ開始',
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return SingleChildScrollView(
|
|||
|
|
child: Column(
|
|||
|
|
children: buildWidgets(context),
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|