import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart' as permission; import '../theme/app_colors.dart'; import '../widgets/glassmorphism_card.dart'; import '../routes/app_routes.dart'; import '../l10n/app_localizations.dart'; import '../services/sms_service.dart'; import '../utils/platform_helper.dart'; class SmsPermissionScreen extends StatefulWidget { const SmsPermissionScreen({super.key}); @override State createState() => _SmsPermissionScreenState(); } class _SmsPermissionScreenState extends State { bool _requesting = false; Future _handleRequest() async { if (_requesting) return; setState(() => _requesting = true); try { if (!PlatformHelper.isAndroid) { // iOS/Web은 권한 흐름 없이 메인으로 이동 if (mounted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } return; } final status = await permission.Permission.sms.status; if (status.isGranted) { if (mounted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } return; } // 권한 요청 final granted = await SMSService.requestSMSPermission(); if (mounted) { if (granted) { Navigator.of(context).pushReplacementNamed(AppRoutes.main); } else { final newStatus = await permission.Permission.sms.status; if (newStatus.isPermanentlyDenied) { // 설정 열기 유도 _showSettingsDialog(); } // 거부지만 영구 거부가 아니라면 그대로 대기 (사용자가 다시 시도 가능) } } } finally { if (mounted) setState(() => _requesting = false); } } void _showSettingsDialog() { final loc = AppLocalizations.of(context); showDialog( context: context, builder: (_) => AlertDialog( title: Text(loc.smsPermissionRequired), content: Text(loc.permanentlyDeniedMessage), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: Text(AppLocalizations.of(context).cancel), ), TextButton( onPressed: () async { await permission.openAppSettings(); if (mounted) Navigator.of(context).pop(); }, child: Text(loc.openSettings), ), ], ), ); } @override Widget build(BuildContext context) { final loc = AppLocalizations.of(context); return Scaffold( body: SafeArea( child: Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.sms, size: 64, color: AppColors.primaryColor), const SizedBox(height: 16), Text( loc.smsPermissionTitle, style: Theme.of(context).textTheme.headlineSmall?.copyWith( color: AppColors.textPrimary, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( loc.smsPermissionRequired, textAlign: TextAlign.center, style: const TextStyle(color: AppColors.textSecondary), ), const SizedBox(height: 16), GlassmorphismCard( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(loc.smsPermissionReasonTitle, style: const TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 8), Text(loc.smsPermissionReasonBody), const SizedBox(height: 12), Text(loc.smsPermissionScopeTitle, style: const TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 8), Text(loc.smsPermissionScopeBody), ], ), ), const SizedBox(height: 24), SizedBox( width: double.infinity, child: ElevatedButton.icon( onPressed: _requesting ? null : _handleRequest, icon: const Icon(Icons.lock_open), label: Text( _requesting ? loc.requesting : loc.requestPermission), ), ), const SizedBox(height: 8), TextButton( onPressed: () => Navigator.of(context) .pushReplacementNamed(AppRoutes.main), child: Text(loc.later), ) ], ), ), ), ), ); } }