feat: enhance admin product management with AI categorization, product status updates, and email editing for users
This commit is contained in:
@@ -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'),
|
||||
|
||||
Reference in New Issue
Block a user