This commit is contained in:
2026-04-07 11:30:22 +02:00
parent 4bbd1edf48
commit 130780cbb8
20 changed files with 426 additions and 131 deletions

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flux/theme/theme.dart';
import 'package:flux/core/theme/theme.dart';
class AnagraficheMainView extends StatelessWidget {
const AnagraficheMainView({super.key});

View File

@@ -1,176 +0,0 @@
// lib/ui/auth/auth_screen.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/blocs/auth/auth_bloc.dart';
import 'package:flux/theme/theme.dart';
class AuthScreen extends StatefulWidget {
const AuthScreen({super.key});
@override
State<AuthScreen> createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
final _storeController = TextEditingController();
@override
Widget build(BuildContext context) {
return BlocConsumer<AuthBloc, AuthState>(
listener: (context, state) {
if (state.status == AuthStatus.failure) {
// Mostra l'errore che arriva da Supabase (es. "Invalid login credentials")
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(state.error!), backgroundColor: Colors.red),
);
}
},
builder: (context, state) {
return Column(
children: [
_AuthTextField(
label: 'Email',
icon: Icons.email,
controller: _emailController,
),
_AuthTextField(
label: 'Password',
icon: Icons.lock,
isPassword: true,
controller: _passwordController,
),
if (!state.isLoginMode)
_AuthTextField(
label: 'Codice Negozio',
icon: Icons.store,
controller: _storeController,
),
ElevatedButton(
onPressed: state.status == AuthStatus.loading
? null
: () {
context.read<AuthBloc>().add(
LoginRequested(
email: _emailController.text.trim(),
password: _passwordController.text.trim(),
storeCode: _storeController.text.trim(),
),
);
},
child: state.status == AuthStatus.loading
? const CircularProgressIndicator()
: Text(state.isLoginMode ? 'ACCEDI' : 'REGISTRATI'),
),
],
);
},
);
}
@override
void dispose() {
_emailController.dispose();
_passwordController.dispose();
_storeController.dispose();
super.dispose();
}
}
class _FluxLogo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Icon(
Icons.all_inclusive,
size: 80,
color: context.accent,
), // Simbolo Flux/Infinito
Text(
'FLUX',
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.w900,
letterSpacing: 8,
),
),
],
);
}
}
class _AuthTextField extends StatefulWidget {
final String label;
final IconData icon;
final bool isPassword;
final TextEditingController? controller; // Aggiunto per recuperare i dati
const _AuthTextField({
required this.label,
required this.icon,
this.isPassword = false,
this.controller,
});
@override
State<_AuthTextField> createState() => _AuthTextFieldState();
}
class _AuthTextFieldState extends State<_AuthTextField> {
bool _obscureText = true; // Stato interno per la visibilità
@override
Widget build(BuildContext context) {
return TextField(
controller: widget.controller,
obscureText: widget.isPassword ? _obscureText : false,
style: TextStyle(color: context.primaryText),
decoration: InputDecoration(
prefixIcon: Icon(
widget.icon,
color: context.accent.withValues(alpha: 0.6),
),
labelText: widget.label,
labelStyle: TextStyle(color: context.secondaryText, fontSize: 14),
filled: true,
fillColor: context.surface.withValues(alpha: 0.5),
// --- LOGICA OCCHIO PASSWORD ---
suffixIcon: widget.isPassword
? IconButton(
icon: Icon(
_obscureText
? Icons.visibility_off_outlined
: Icons.visibility_outlined,
color: context.secondaryText,
size: 20,
),
onPressed: () {
setState(() {
_obscureText = !_obscureText;
});
},
)
: null,
// --- BORDI STILE FLUX ---
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(
color: context.secondaryText.withValues(alpha: 0.1),
),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: context.accent, width: 1.5),
),
contentPadding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 16,
),
),
);
}
}

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flux/theme/theme.dart';
import 'package:flux/core/theme/theme.dart';
class DashboardView extends StatelessWidget {
const DashboardView({super.key});

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flux/theme/theme.dart';
import 'package:flux/core/theme/theme.dart';
import 'package:flux/ui/anagrafiche/anagrafiche_main_view.dart';
import 'package:flux/ui/dashboard/dashboard_view.dart';
import 'package:flux/ui/settings/settings_view.dart';

View File

@@ -1,6 +1,6 @@
// lib/ui/impostazioni/impostazioni_view.dart
import 'package:flutter/material.dart';
import 'package:flux/theme/theme.dart';
import 'package:flux/core/theme/theme.dart';
import 'package:flux/ui/settings/theme_settings_view.dart';
class SettingsView extends StatelessWidget {

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/data/enums.dart';
import 'package:flux/theme/theme.dart';
import 'package:flux/theme/theme_bloc.dart';
import 'package:flux/core/theme/theme.dart';
import 'package:flux/core/theme/bloc/theme_bloc.dart';
class ThemeSettingsView extends StatelessWidget {
const ThemeSettingsView({super.key});