152 lines
4.7 KiB
Dart
152 lines
4.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:flux/features/customers/blocs/customer_form_cubit.dart';
|
|
|
|
class QuickCustomerDialog extends StatefulWidget {
|
|
final String initialQuery;
|
|
|
|
const QuickCustomerDialog({super.key, required this.initialQuery});
|
|
|
|
@override
|
|
State<QuickCustomerDialog> createState() => _QuickCustomerDialogState();
|
|
}
|
|
|
|
class _QuickCustomerDialogState extends State<QuickCustomerDialog> {
|
|
late final TextEditingController _nameCtrl;
|
|
final _phoneCtrl = TextEditingController();
|
|
final _emailCtrl = TextEditingController();
|
|
final _noteCtrl = TextEditingController();
|
|
bool _isBusiness = false; // Aggiungiamo un campo per il tipo di cliente
|
|
|
|
bool _isLoading = false;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Prendiamo tutta la stringa nuda e cruda!
|
|
_nameCtrl = TextEditingController(text: widget.initialQuery.trim());
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_nameCtrl.dispose();
|
|
_phoneCtrl.dispose();
|
|
_emailCtrl.dispose();
|
|
_noteCtrl.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> _save() async {
|
|
final NavigatorState navigator = Navigator.of(context);
|
|
if (_nameCtrl.text.isEmpty) return;
|
|
|
|
setState(() => _isLoading = true);
|
|
|
|
// Chiamata al Cubit (aggiorna i parametri in base a come li hai definiti)
|
|
final newCustomer = await context
|
|
.read<CustomerFormCubit>()
|
|
.quickCreateCustomer(
|
|
isBusiness: _isBusiness,
|
|
name: _nameCtrl.text.trim(),
|
|
phone: _phoneCtrl.text.trim(),
|
|
email: _emailCtrl.text.trim(),
|
|
);
|
|
|
|
setState(() => _isLoading = false);
|
|
|
|
if (context.mounted) {
|
|
navigator.pop(newCustomer); // Restituiamo il cliente creato
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return AlertDialog(
|
|
title: const Text("Nuovo Cliente Rapido"),
|
|
content: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
ChoiceChip(
|
|
label: const Text('Privato (Domestico)'),
|
|
selected: _isBusiness == false,
|
|
selectedColor: Colors.blue.withValues(alpha: 0.2),
|
|
checkmarkColor: Colors.blue.shade700,
|
|
onSelected: (selected) {
|
|
if (selected) {
|
|
setState(() {
|
|
_isBusiness = false;
|
|
});
|
|
}
|
|
},
|
|
),
|
|
const SizedBox(width: 12),
|
|
ChoiceChip(
|
|
label: const Text('Business (P.IVA)'),
|
|
selected: _isBusiness == true,
|
|
selectedColor: Colors.orange.withValues(alpha: 0.2),
|
|
checkmarkColor: Colors.orange.shade700,
|
|
onSelected: (selected) {
|
|
if (selected) {
|
|
setState(() {
|
|
_isBusiness = true;
|
|
});
|
|
}
|
|
},
|
|
),
|
|
],
|
|
),
|
|
const Divider(height: 32),
|
|
TextField(
|
|
controller: _nameCtrl,
|
|
autofocus: true, // Focus immediato!
|
|
decoration: const InputDecoration(
|
|
labelText: "Nome / Ragione Sociale *",
|
|
),
|
|
textInputAction: TextInputAction.next,
|
|
),
|
|
const SizedBox(height: 8),
|
|
TextField(
|
|
controller: _phoneCtrl,
|
|
decoration: const InputDecoration(labelText: "Telefono"),
|
|
keyboardType: TextInputType.phone,
|
|
textInputAction: TextInputAction.next,
|
|
),
|
|
const SizedBox(height: 8),
|
|
TextField(
|
|
controller: _emailCtrl,
|
|
decoration: const InputDecoration(labelText: "Email"),
|
|
keyboardType: TextInputType.emailAddress,
|
|
textInputAction: TextInputAction.next,
|
|
),
|
|
const SizedBox(height: 8),
|
|
TextField(
|
|
controller: _noteCtrl,
|
|
decoration: const InputDecoration(labelText: "Note rapide"),
|
|
maxLines: 2,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
actions: [
|
|
TextButton(
|
|
onPressed: () => Navigator.pop(context),
|
|
child: const Text("Annulla"),
|
|
),
|
|
ElevatedButton(
|
|
onPressed: _isLoading ? null : _save,
|
|
child: _isLoading
|
|
? const SizedBox(
|
|
width: 16,
|
|
height: 16,
|
|
child: CircularProgressIndicator(strokeWidth: 2),
|
|
)
|
|
: const Text("Salva e Usa"),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|