Files
1356/lifetimer/lib/features/auth/presentation/auth_choice_screen.dart
T
2026-01-05 18:23:21 +01:00

195 lines
6.8 KiB
Dart

// ignore_for_file: deprecated_member_use
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../../../core/widgets/app_scaffold.dart';
import '../../../core/widgets/primary_button.dart';
import '../application/auth_controller.dart';
class AuthChoiceScreen extends ConsumerStatefulWidget {
const AuthChoiceScreen({super.key});
@override
ConsumerState<AuthChoiceScreen> createState() => _AuthChoiceScreenState();
}
class _AuthChoiceScreenState extends ConsumerState<AuthChoiceScreen> {
bool _isLoading = false;
Future<void> _handleGoogleSignIn() async {
setState(() => _isLoading = true);
try {
await ref.read(authControllerProvider.notifier).signInWithGoogle();
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Google sign-in failed: $e')),
);
}
} finally {
if (mounted) {
setState(() => _isLoading = false);
}
}
}
Future<void> _handleGithubSignIn() async {
setState(() => _isLoading = true);
try {
await ref.read(authControllerProvider.notifier).signInWithGithub();
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('GitHub sign-in failed: $e')),
);
}
} finally {
if (mounted) {
setState(() => _isLoading = false);
}
}
}
@override
Widget build(BuildContext context) {
return AppScaffold(
body: Center(
child: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
child: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 420),
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 24,
vertical: 32,
),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(32),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.06),
blurRadius: 40,
offset: const Offset(0, 24),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Align(
alignment: Alignment.centerLeft,
child: Container(
height: 56,
width: 56,
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.primary
.withOpacity(0.08),
shape: BoxShape.circle,
),
child: Icon(
Icons.timer_outlined,
size: 32,
color: Theme.of(context).colorScheme.primary,
),
),
),
const SizedBox(height: 24),
Text(
'1356',
style: Theme.of(context)
.textTheme
.headlineLarge
?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.left,
),
const SizedBox(height: 8),
Text(
'Your 1356-day journey starts here',
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context)
.colorScheme
.onSurface
.withOpacity(0.7),
),
),
const SizedBox(height: 32),
PrimaryButton(
onPressed: () => context.push('/sign-in'),
text: 'Sign In with Email',
isLoading: _isLoading,
),
const SizedBox(height: 12),
OutlinedButton(
onPressed:
_isLoading ? null : () => context.push('/sign-up'),
style: OutlinedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(999),
),
),
child: const Text('Create Account'),
),
const SizedBox(height: 24),
_SocialButton(
icon: Icons.g_mobiledata,
label: 'Continue with Google',
isLoading: _isLoading,
onPressed: _handleGoogleSignIn,
),
const SizedBox(height: 12),
_SocialButton(
icon: Icons.code,
label: 'Continue with GitHub',
isLoading: _isLoading,
onPressed: _handleGithubSignIn,
),
],
),
),
),
),
),
),
);
}
}
class _SocialButton extends StatelessWidget {
final IconData icon;
final String label;
final bool isLoading;
final VoidCallback onPressed;
const _SocialButton({
required this.icon,
required this.label,
required this.isLoading,
required this.onPressed,
});
@override
Widget build(BuildContext context) {
return ElevatedButton.icon(
onPressed: isLoading ? null : onPressed,
icon: Icon(icon, size: 24),
label: Text(label),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
);
}
}