feat: enhance admin product management with AI categorization, product status updates, and email editing for users

This commit is contained in:
Nils-Johan Gynther
2026-04-25 08:46:54 +02:00
parent a02950c97a
commit 6abe69e12d
6 changed files with 781 additions and 65 deletions
@@ -143,6 +143,52 @@ class _AdminUsersPanelState extends ConsumerState<AdminUsersPanel> {
}
}
Future<void> _editEmail(UserAdmin user) async {
final controller = TextEditingController(text: user.email);
try {
final newEmail = await showDialog<String>(
context: context,
builder: (dialogContext) => AlertDialog(
title: Text('Ändra e-post för ${user.username}'),
content: TextField(
controller: controller,
keyboardType: TextInputType.emailAddress,
decoration: const InputDecoration(
labelText: 'E-post',
border: OutlineInputBorder(),
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(dialogContext),
child: const Text('Avbryt'),
),
FilledButton(
onPressed: () => Navigator.pop(dialogContext, controller.text.trim()),
child: const Text('Spara'),
),
],
),
);
if (newEmail == null || newEmail.isEmpty || !mounted) return;
if (!RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(newEmail)) {
_showError('Ogiltig e-postadress.');
return;
}
await ref.read(adminRepositoryProvider).updateEmail(user.id, newEmail);
if (!mounted) return;
_load();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('E-post uppdaterad.')),
);
} catch (e) {
if (!mounted) return;
_showError(e);
} finally {
controller.dispose();
}
}
Future<void> _deleteUser(UserAdmin user) async {
final confirmed = await _confirm(
context,
@@ -273,6 +319,7 @@ class _AdminUsersPanelState extends ConsumerState<AdminUsersPanel> {
user: _users[i],
onChangeRole: () => _changeRole(_users[i]),
onTogglePremium: () => _togglePremium(_users[i]),
onEditEmail: () => _editEmail(_users[i]),
onResetPassword: () => _resetPassword(_users[i]),
onDelete: () => _deleteUser(_users[i]),
),
@@ -317,6 +364,7 @@ class _UserTile extends StatelessWidget {
final UserAdmin user;
final VoidCallback onChangeRole;
final VoidCallback onTogglePremium;
final VoidCallback onEditEmail;
final VoidCallback onResetPassword;
final VoidCallback onDelete;
@@ -324,6 +372,7 @@ class _UserTile extends StatelessWidget {
required this.user,
required this.onChangeRole,
required this.onTogglePremium,
required this.onEditEmail,
required this.onResetPassword,
required this.onDelete,
});
@@ -383,6 +432,9 @@ class _UserTile extends StatelessWidget {
case 'premium':
onTogglePremium();
break;
case 'email':
onEditEmail();
break;
case 'reset':
onResetPassword();
break;
@@ -402,6 +454,10 @@ class _UserTile extends StatelessWidget {
value: 'premium',
child: Text(user.isPremium ? 'Ta bort Premium' : 'Ge Premium'),
),
const PopupMenuItem(
value: 'email',
child: Text('Ändra e-post'),
),
const PopupMenuItem(
value: 'reset',
child: Text('Återställ lösenord'),