Files
prosappweb/lib/ui/views/setup_name_view.dart
Lizandro GuarnizoandClaude Sonnet 4.6 e56ec8619e fix(onboarding): redirect to city setup after name step
Was going directly to dashboard, skipping the city selection screen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 14:44:10 -05:00

143 lines
5.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:prosapp_web_app/providers/auth_provider.dart';
import 'package:prosapp_web_app/router/router.dart';
import 'package:prosapp_web_app/services/navigation_service.dart';
import 'package:provider/provider.dart';
class SetupNameView extends StatefulWidget {
const SetupNameView({super.key});
@override
State<SetupNameView> createState() => _SetupNameViewState();
}
class _SetupNameViewState extends State<SetupNameView> {
final _nameController = TextEditingController();
bool _loading = false;
String? _error;
@override
void dispose() {
_nameController.dispose();
super.dispose();
}
Future<void> _save() async {
final name = _nameController.text.trim();
if (name.length < 3) {
setState(() => _error = 'Ingresa al menos 3 caracteres');
return;
}
setState(() { _loading = true; _error = null; });
try {
await context.read<AuthProvider>().updateName(name);
NavigationService.replaceTo(Flurorouter.setupCityRoute);
} catch (_) {
setState(() => _loading = false);
}
}
@override
Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
return Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 420),
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 40),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 72,
height: 72,
decoration: BoxDecoration(
color: const Color(0xFF42A4EF).withOpacity(0.12),
shape: BoxShape.circle,
),
child: const Icon(Icons.waving_hand_rounded,
color: Color(0xFF42A4EF), size: 34),
),
const SizedBox(height: 20),
const Text(
'¡Bienvenido a ProsApp!',
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
'¿Cómo te llamas? Usaremos tu nombre para personalizar tu experiencia.',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 14,
color: isDark ? Colors.white54 : Colors.grey[600],
),
),
const SizedBox(height: 32),
TextField(
controller: _nameController,
autofocus: true,
textCapitalization: TextCapitalization.words,
onSubmitted: (_) => _save(),
decoration: InputDecoration(
labelText: 'Tu nombre completo',
hintText: 'Ej: Juan Pérez',
prefixIcon: const Icon(Icons.person_outline),
errorText: _error,
filled: true,
fillColor: isDark
? const Color(0xFF1E293B)
: const Color(0xFFF5F8FF),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide.none,
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(
color: isDark
? const Color(0xFF334155)
: const Color(0xFFE0E7FF),
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(
color: Color(0xFF42A4EF), width: 2),
),
),
),
const SizedBox(height: 24),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: _loading ? null : _save,
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF42A4EF),
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12)),
elevation: 0,
),
child: _loading
? const SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: Colors.white, strokeWidth: 2),
)
: const Text('Continuar',
style: TextStyle(
fontSize: 15, fontWeight: FontWeight.w600)),
),
),
],
),
),
),
);
}
}