ログインをメアドに変更

This commit is contained in:
2024-07-15 06:54:02 +09:00
parent ae05a8bbcd
commit 616f87c0c5
11 changed files with 140 additions and 102 deletions

View File

@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/widgets/debug_widget.dart';
class ChangePasswordPage extends StatelessWidget {
ChangePasswordPage({Key? key}) : super(key: key);
LogManager logManager = LogManager();
IndexController indexController = Get.find<IndexController>();
TextEditingController oldPasswordController = TextEditingController();
@ -20,6 +23,7 @@ class ChangePasswordPage extends StatelessWidget {
backgroundColor: Colors.white,
leading: IconButton(
onPressed: () {
logManager.addOperationLog('User clicked cancel button on the drawer');
Navigator.pop(context);
},
icon: const Icon(
@ -89,6 +93,7 @@ class ChangePasswordPage extends StatelessWidget {
.text.isEmpty ||
newPasswordController
.text.isEmpty) {
logManager.addOperationLog('User tried to login with blank old password ${oldPasswordController.text} or new password ${newPasswordController.text}.');
Get.snackbar(
"no_values".tr,
"values_required".tr,

View File

@ -5,6 +5,7 @@ import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/services/auth_service.dart';
import 'package:rogapp/utils/database_helper.dart';
import 'package:rogapp/widgets/debug_widget.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:rogapp/pages/WebView/WebView_page.dart';
@ -16,6 +17,8 @@ class DrawerPage extends StatelessWidget {
final IndexController indexController = Get.find<IndexController>();
LogManager logManager = LogManager();
// 要検討URLの起動に失敗した場合のエラーハンドリングが不十分です。適切なエラーメッセージを表示するなどの処理を追加してください。
//
/*
@ -26,6 +29,7 @@ class DrawerPage extends StatelessWidget {
void _launchURL(BuildContext context,String urlString) async {
try {
logManager.addOperationLog('User clicked ${urlString} on the drawer');
Uri url = Uri.parse(urlString);
if (await canLaunchUrl(url)) {
await launchUrl(url);
@ -52,14 +56,8 @@ class DrawerPage extends StatelessWidget {
Widget build(BuildContext context) {
return SafeArea(
child: Drawer(
// Add a ListView to the drawer. This ensures the user can scroll
// through the options in the drawer if there isn't enough vertical
// space to fit everything.
child: Column(
children: [
// 最初のアイテムは、ユーザーのログイン状態に応じて表示が変わります。
// ユーザーがログインしていない場合は、"drawer_title".trというテキストを表示します。
// ユーザーがログインしている場合は、ユーザーのメールアドレスを表示します。
Container(
height: 100,
color: Colors.amber,
@ -81,9 +79,6 @@ class DrawerPage extends StatelessWidget {
),
)),
),
// 次に、IndexControllerのcurrentUserリストが空かどうかに応じて、ログインまたはログアウトのアイテムを表示します。
// currentUserリストが空の場合は、"login".trというテキストのログインアイテムを表示し、タップするとAppPages.LOGINにナビゲートします。
// currentUserリストが空でない場合は、"logout".trというテキストのログアウトアイテムを表示し、タップするとindexController.logout()を呼び出してログアウトし、AppPages.LOGINにナビゲートします。
Obx(() => indexController.currentUser.isEmpty
? ListTile(
leading: const Icon(Icons.login),
@ -100,8 +95,6 @@ class DrawerPage extends StatelessWidget {
Get.toNamed(AppPages.LOGIN);
},
)),
// パスワード変更のアイテムは、ユーザーがログインしている場合にのみ表示されます。
// "change_password".trというテキストを表示し、タップするとAppPages.CHANGE_PASSWORDにナビゲートします。
indexController.currentUser.isNotEmpty
? ListTile(
leading: const Icon(Icons.password),
@ -114,8 +107,6 @@ class DrawerPage extends StatelessWidget {
width: 0,
height: 0,
),
// サインアップのアイテムは、ユーザーがログインしていない場合にのみ表示されます。
// "sign_up".trというテキストを表示し、タップするとAppPages.REGISTERにナビゲートします。
indexController.currentUser.isEmpty
? ListTile(
leading: const Icon(Icons.person),
@ -128,20 +119,19 @@ class DrawerPage extends StatelessWidget {
width: 0,
height: 0,
),
// リセットのアイテムは、ユーザーがログインしている場合にのみ表示されます。
// タップすると、確認ダイアログを表示し、ユーザーがリセットを確認するとDestinationControllerのresetRogaining()メソッドを呼び出してゲームデータをリセットします。
indexController.currentUser.isNotEmpty
? ListTile(
leading: const Icon(Icons.password),
title: const Text("リセット"),
title: Text('reset_button'.tr),
onTap: () {
logManager.addOperationLog('User clicked RESET button on the drawer');
// 要検討:リセット操作の確認メッセージをローカライズすることを検討してください。
//
Get.defaultDialog(
title: "リセットしますがよろしいですか?",
middleText: "これにより、すべてのゲーム データが削除され、すべての状態が削除されます",
textConfirm: "確認する",
textCancel: "キャンセルする",
title: "reset_title".tr,
middleText: "reset_message".tr,
textConfirm: "confirm".tr,
textCancel: "cancel".tr,
onCancel: () => Get.back(),
onConfirm: () async {
DestinationController destinationController =
@ -157,8 +147,8 @@ class DrawerPage extends StatelessWidget {
//destinationController.deleteDBDestinations();
Get.back();
Get.snackbar(
"リセット完了",
"すべてリセットされました。ロゲ開始から再開して下さい。",
"reset_done".tr,
"reset_explain".tr,
backgroundColor: Colors.green,
colorText: Colors.white,
duration: const Duration(seconds: 3),
@ -171,20 +161,19 @@ class DrawerPage extends StatelessWidget {
width: 0,
height: 0,
),
// アカウント削除のアイテムは、ユーザーがログインしている場合にのみ表示されます。
// "delete_account".trというテキストを表示し、タップするとAuthService.deleteUser()を呼び出してアカウントを削除し、AppPages.TRAVELにナビゲートします。
indexController.currentUser.isNotEmpty
? ListTile(
leading: const Icon(Icons.delete_forever),
title: Text("delete_account".tr),
onTap: () {
Get.defaultDialog(
title: "アカウントを削除しますがよろしいですか?",
middleText: "これにより、アカウント情報とすべてのゲーム データが削除され、すべての状態が削除されます",
textConfirm: "確認する",
textCancel: "キャンセルする",
title: "delete_account_title".tr,
middleText: "delete_account_middle".tr,
textConfirm: "confirm".tr,
textCancel: "cancel".tr,
onCancel: () => Get.back(),
onConfirm: () {
logManager.addOperationLog('User clicked Confirm button on the account delete dialog');
String token = indexController.currentUser[0]['token'];
AuthService.deleteUser(token).then((value) {
if (value.isNotEmpty) {
@ -205,53 +194,6 @@ class DrawerPage extends StatelessWidget {
width: 0,
height: 0,
),
/*
// ユーザーデータ削除のアイテムは、ユーザーがログインしている場合にのみ表示されます。
// タップすると、AuthService.deleteUser()を呼び出してユーザーデータを削除します。
indexController.currentUser.isNotEmpty
? ListTile(
// 要検討:アカウント削除のリクエストが失敗した場合のエラーハンドリングを追加することをお勧めします。
//
leading: const Icon(Icons.delete_forever),
title: Text("ユーザーデータを削除する".tr),
onTap: () {
Get.defaultDialog(
title: "アカウントを削除しますがよろしいですか?",
middleText: "これにより、アカウント情報とすべてのゲーム データが削除され、すべての状態が削除されます",
textConfirm: "確認する",
textCancel: "キャンセルする",
onCancel: () => Get.back(),
onConfirm: () {
String token = indexController.currentUser[0]['token'];
AuthService.deleteUser(token).then((value) {
Get.snackbar("ユーザーデータを削除する",
"データを削除するためにユーザーの同意が設定されています アプリとサーバーでユーザーデータが削除されました");
});
});
},
)
: const SizedBox(
width: 0,
height: 0,
),
// ListTile(
// leading: const Icon(Icons.person),
// title: Text("profile".tr),
// onTap: (){},
// ),
// ListTile(
// leading: const Icon(Icons.route),
// title: Text("recommended_route".tr),
// onTap: (){},
// ),
// ListTile(
// leading: const Icon(Icons.favorite_rounded),
// title: Text("point_rank".tr),
// onTap: (){},
// ),
*/
// "rog_web".trというテキストのアイテムは、ユーザーがログインしている場合にのみ表示されます。
// タップすると、_launchURL()メソッドを呼び出して外部のウェブサイトを開きます。
indexController.currentUser.isNotEmpty
? ListTile(
leading: const Icon(Icons.featured_video),
@ -264,8 +206,6 @@ class DrawerPage extends StatelessWidget {
width: 0,
height: 0,
),
// "privacy".trというテキストのアイテムは、常に表示されます。
// タップすると、_launchURL()メソッドを呼び出してプライバシーポリシーのURLを開きます。
ListTile(
leading: const Icon(Icons.privacy_tip),
title: Text("privacy".tr),
@ -275,7 +215,7 @@ class DrawerPage extends StatelessWidget {
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('設定'),
title: Text('open_settings'.tr),
onTap: () {
Get.back(); // ドロワーを閉じる
Get.toNamed(Routes.SETTINGS);
@ -284,7 +224,7 @@ class DrawerPage extends StatelessWidget {
),
ListTile(
leading: const Icon(Icons.developer_mode),
title: const Text('開発者メニュー'),
title: const Text('open_settings'),
onTap: () {
Get.back(); // ドロワーを閉じる
Get.toNamed('/debug'); // デバッグ画面に遷移

View File

@ -15,6 +15,7 @@ import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/services/auth_service.dart';
import 'package:rogapp/services/location_service.dart';
import 'package:rogapp/utils/database_helper.dart';
import 'package:rogapp/widgets/debug_widget.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../main.dart';
@ -52,6 +53,8 @@ class IndexController extends GetxController with WidgetsBindingObserver {
MapController mapController = MapController();
MapController rogMapController = MapController();
LogManager logManager = LogManager();
String? userToken;
// mode = 0 is map mode, mode = 1 list mode
@ -155,14 +158,15 @@ class IndexController extends GetxController with WidgetsBindingObserver {
return WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
title: Text('位置情報の許可が必要です'),
content: Text('設定>プライバシーとセキュリティ>位置情報サービス を開いて、岐阜ナビを探し、「位置情報の許可」を「常に」にして下さい。'),
title: Text('location_permission_needed_title'.tr),
content: Text('location_permission_needed_main'.tr),
actions: [
TextButton(
onPressed: () {
logManager.addOperationLog("User tapped confirm button for location permission required.");
Navigator.of(context).pop();
},
child: Text('OK'),
child: Text('confirm'.tr),
),
],
),
@ -230,6 +234,7 @@ class IndexController extends GetxController with WidgetsBindingObserver {
void _startLocationService() async {
const platform = MethodChannel('location');
try {
logManager.addOperationLog("Called start location service.");
await platform.invokeMethod('startLocationService');
} on PlatformException catch (e) {
print("Failed to start location service: '${e.message}'.");
@ -239,6 +244,7 @@ class IndexController extends GetxController with WidgetsBindingObserver {
void _stopLocationService() async {
const platform = MethodChannel('location');
try {
logManager.addOperationLog("Called stop location service.");
await platform.invokeMethod('stopLocationService');
} on PlatformException catch (e) {
print("Failed to stop location service: '${e.message}'.");
@ -301,24 +307,29 @@ class IndexController extends GetxController with WidgetsBindingObserver {
}
}
logManager.addOperationLog("Called boundsFromLatLngList (${x1!},${y1!})-(${x0!},${y0!}).");
return LatLngBounds(LatLng(x1!, y1!), LatLng(x0!, y0!));
}
// 要検討:エラーハンドリングが行われていますが、エラーメッセージをローカライズすることを検討してください。
//
void login(String email, String password, BuildContext context) {
AuthService.login(email, password).then((value) {
print("------- logged in user details ######## $value ###### --------");
if (value.isNotEmpty) {
logManager.addOperationLog("User logged in : ${value}.");
// Navigator.pop(context);
print("--------- user details login ----- $value");
//await Future.delayed(const Duration(milliseconds: 500)); // Added Akira:2024-4-6, #2800
changeUser(value);
} else {
logManager.addOperationLog("User failed login : ${email} , ${password}.");
isLoading.value = false;
Get.snackbar(
"ログイン失敗",
"ログインIDかパスワードを確認して下さい。",
"login_failed".tr,
"check_login_id_or_password".tr,
backgroundColor: Colors.red,
colorText: Colors.white,
icon: const Icon(Icons.error, size: 40.0, color: Colors.blue),
@ -340,6 +351,7 @@ class IndexController extends GetxController with WidgetsBindingObserver {
AuthService.changePassword(oldpassword, newpassword, token).then((value) {
////print("------- change password ######## $value ###### --------");
if (value.isNotEmpty) {
logManager.addOperationLog("User successed to change password : ${oldpassword} , ${newpassword}.");
isLoading.value = false;
Navigator.pop(context);
if (rogMode.value == 1) {
@ -348,6 +360,7 @@ class IndexController extends GetxController with WidgetsBindingObserver {
switchPage(AppPages.INDEX);
}
} else {
logManager.addOperationLog("User failed to change password : ${oldpassword} , ${newpassword}.");
Get.snackbar(
'failed'.tr,
'password_change_failed_please_try_again'.tr,
@ -383,6 +396,7 @@ class IndexController extends GetxController with WidgetsBindingObserver {
*/
void logout() async {
logManager.addOperationLog("User logout : ${currentUser} .");
saveGameState();
locations.clear();
DatabaseHelper db = DatabaseHelper.instance;
@ -403,12 +417,15 @@ class IndexController extends GetxController with WidgetsBindingObserver {
void register(String email, String password, BuildContext context) {
AuthService.register(email, password).then((value) {
if (value.isNotEmpty) {
logManager.addOperationLog("User tried to register new account : ${email} , ${password} .");
currentUser.clear();
currentUser.add(value);
isLoading.value = false;
Navigator.pop(context);
Get.toNamed(AppPages.INDEX);
} else {
logManager.addOperationLog("User failed to register new account : ${email} , ${password} .");
isLoading.value = false;
Get.snackbar(
'failed'.tr,

View File

@ -122,7 +122,7 @@ class LoginPage extends StatelessWidget {
BorderRadius.circular(40)),
child: Text(
"login".tr,
style: TextStyle(
style: const TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16,
color: Colors.white70),

View File

@ -15,7 +15,7 @@ class RegisterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
resizeToAvoidBottomInset: true,
backgroundColor: Colors.white,
appBar: AppBar(
elevation: 0,