// 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'; 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)), ); } }); } @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' ? 'メンバー追加' : 'メンバー詳細'), actions: [ IconButton( icon: Icon(Icons.save), onPressed: () async { await controller.saveMember(); Get.back(result: true); }, ), ], ), body: Obx(() { if (controller.isLoading.value) { return Center(child: CircularProgressIndicator()); } return SingleChildScrollView( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (mode == 'new') TextField( decoration: InputDecoration(labelText: 'メールアドレス'), onChanged: (value) => controller.email.value = value, controller: TextEditingController(text: controller.email.value), ) else if (controller.isDummyEmail) Text('メールアドレス: (メアド無し)') else Text('メールアドレス: ${controller.email.value}'), if (controller.email.value.isEmpty || mode == 'edit') ...[ TextField( decoration: InputDecoration(labelText: '姓'), onChanged: (value) => controller.lastname.value = value, controller: TextEditingController(text: controller.lastname.value), ), TextField( decoration: InputDecoration(labelText: '名'), onChanged: (value) => controller.firstname.value = 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, ), ], // 招待メール再送信ボタン(通常のEmailで未承認の場合のみ) if (!controller.isDummyEmail && !controller.isApproved) ElevatedButton( child: Text('招待メールを再送信'), onPressed: () => controller.resendInvitation(), ), // メンバー削除ボタン ElevatedButton( child: Text('メンバーから削除'), onPressed: () 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) { await controller.deleteMember(); Get.back(result: true); } }, style: ElevatedButton.styleFrom(backgroundColor: Colors.red), ), ], ), ); }), ); } @override void dispose() { _firstNameController.dispose(); _lastNameController.dispose(); _emailController.dispose(); super.dispose(); } }