// lib/pages/team/member_detail_page.dart import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rogapp/pages/team/member_controller.dart'; import 'package:intl/intl.dart'; // この行を追加 import 'package:flutter_localizations/flutter_localizations.dart'; // 追加 import 'package:flutter/cupertino.dart'; import 'package:rogapp/routes/app_pages.dart'; class MemberDetailPage extends StatefulWidget { @override _MemberDetailPageState createState() => _MemberDetailPageState(); } class _MemberDetailPageState extends State { final MemberController controller = Get.find(); late TextEditingController _firstNameController; late TextEditingController _lastNameController; late TextEditingController _emailController; @override void initState() { super.initState(); _initializeControllers(); WidgetsBinding.instance.addPostFrameCallback((_) { final mode = Get.arguments['mode']; final member = Get.arguments['member']; if (mode == 'edit' && member != null) { controller.setSelectedMember(member); } }); } void _initializeControllers() { _firstNameController = TextEditingController(text: controller.firstname.value); _lastNameController = TextEditingController(text: controller.lastname.value); _emailController = TextEditingController(text: controller.email.value); controller.firstname.listen((value) { if (_firstNameController.text != value) { _firstNameController.value = TextEditingValue( text: value, selection: TextSelection.fromPosition( TextPosition(offset: value.length)), ); } }); controller.lastname.listen((value) { if (_lastNameController.text != value) { _lastNameController.value = TextEditingValue( text: value, selection: TextSelection.fromPosition( TextPosition(offset: value.length)), ); } }); controller.email.listen((value) { if (_emailController.text != value) { _emailController.value = TextEditingValue( text: value, selection: TextSelection.fromPosition( TextPosition(offset: value.length)), ); } }); } Future _handleSaveAndNavigateBack() async { bool success = await controller.saveMember(); if (success) { Get.until((route) => Get.currentRoute == AppPages.TEAM_DETAIL); // スナックバーが表示されるのを待つ await Future.delayed(Duration(seconds: 1)); // 現在のスナックバーを安全に閉じる if (Get.isSnackbarOpen) { await Get.closeCurrentSnackbar(); } // リストページに戻る //Get.until((route) => Get.currentRoute == '/team'); // または、リストページの具体的なルート名がある場合は以下を使用 // Get.offNamed('/team'); } } Future _handleDeleteAndNavigateBack() async { final confirmed = await Get.dialog( AlertDialog( title: Text('確認'), content: Text('このメンバーを削除してもよろしいですか?'), actions: [ TextButton( child: Text('キャンセル'), onPressed: () => Get.back(result: false), ), TextButton( child: Text('削除'), onPressed: () => Get.back(result: true), ), ], ), ); if (confirmed == true) { bool success = await controller.deleteMember(); if (success) { // リストページに戻る //Get.offNamed(result: true); Get.until((route) => Get.currentRoute == AppPages.TEAM_DETAIL); // スナックバーが表示されるのを待つ await Future.delayed(Duration(seconds: 1)); // 現在のスナックバーを安全に閉じる if (Get.isSnackbarOpen) { await Get.closeCurrentSnackbar(); } } } } @override Widget build(BuildContext context) { final mode = Get.arguments['mode'] as String; //final member = Get.arguments['member']; final teamId = Get.arguments['teamId'] as int; /* return MaterialApp( // MaterialApp をここに追加 localizationsDelegates: [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ const Locale('ja', 'JP'), ], home:Scaffold( */ return Scaffold( appBar: AppBar( title: Text(mode == 'new' ? 'メンバー追加' : 'メンバー詳細'), ), body: Obx(() { if (controller.isLoading.value) { return Center(child: CircularProgressIndicator()); } // TextEditingControllerをObxの中で作成 final emailController = TextEditingController(text: controller.email.value); // カーソル位置を保持 emailController.selection = TextSelection.fromPosition( TextPosition(offset: controller.email.value.length), ); return Column( children: [ Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (mode == 'new') TextFormField( controller: _emailController, onChanged: (value) => controller.updateEmail(value), decoration: InputDecoration(labelText: 'メールアドレス'), keyboardType: TextInputType.emailAddress, // メールアドレス用のキーボードを表示 autocorrect: false, // 自動修正を無効化 enableSuggestions: false, ) else if (controller.isDummyEmail) Text('メールアドレス: (メアド無し)') else Text('メールアドレス: ${controller.email.value}'), if (controller.email.value.isEmpty || controller.isDummyEmail || mode == 'edit') ...[ TextFormField( decoration: InputDecoration(labelText: '姓'), controller: _lastNameController, onChanged: (value) => controller.updateLastName(value), //controller: TextEditingController(text: controller.lastname.value), ), TextFormField( decoration: InputDecoration(labelText: '名'), controller: _firstNameController, //onChanged: (value) => controller.firstname.value = value, onChanged: (value) => controller.updateFirstName(value), //controller: TextEditingController(text: controller.firstname.value), ), // 生年月日 if (controller.isDummyEmail || !controller.isOver18()) ListTile( title: Text('生年月日'), subtitle: Text(controller.dateOfBirth.value != null ? '${DateFormat('yyyy年MM月dd日').format(controller.dateOfBirth.value!)} (${controller.getAgeAndGrade()})' : '未設定'), onTap: () async { final date = await showDatePicker( context: context, initialDate: controller.dateOfBirth.value ?? DateTime.now(), firstDate: DateTime(1900), lastDate: DateTime.now(), //locale: const Locale('ja', 'JP'), ); if (date != null) controller.dateOfBirth.value = date; }, ) else Text('18歳以上'), SwitchListTile( title: Text('性別'), subtitle: Text(controller.female.value ? '女性' : '男性'), value: controller.female.value, onChanged: (value) => controller.female.value = value, ), ], ]), ), ), Padding( padding: EdgeInsets.all(16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ ElevatedButton( child: Text('削除'), onPressed: _handleDeleteAndNavigateBack, style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Colors.white, ), ), if (!controller.isDummyEmail && !controller.isApproved) ElevatedButton( child: Text('招待再送信'), onPressed: () => controller.resendInvitation(), style: ElevatedButton.styleFrom( backgroundColor: Colors.white, foregroundColor: Colors.black, ), ), ElevatedButton( child: Text('保存・招待'), onPressed: _handleSaveAndNavigateBack, style: ElevatedButton.styleFrom( backgroundColor: Colors.green, foregroundColor: Colors.white, ), ), ], ), ), ], ); }), ); } @override void dispose() { _firstNameController.dispose(); _lastNameController.dispose(); _emailController.dispose(); super.dispose(); } }