feat: implement admin product management panel with bulk categorization and premium user toggle

This commit is contained in:
Nils-Johan Gynther
2026-04-25 08:36:40 +02:00
parent e2b7b884aa
commit a02950c97a
9 changed files with 383 additions and 34 deletions
@@ -61,6 +61,26 @@ class _AdminUsersPanelState extends ConsumerState<AdminUsersPanel> {
}
}
Future<void> _togglePremium(UserAdmin user) async {
final newValue = !user.isPremium;
final confirmed = await _confirm(
context,
newValue ? 'Ge Premium' : 'Ta bort Premium',
'${newValue ? 'Ge' : 'Ta bort'} Premium för ${user.username}?',
);
if (!confirmed || !mounted) return;
try {
await ref
.read(adminRepositoryProvider)
.setPremium(user.id, isPremium: newValue);
if (!mounted) return;
_load();
} catch (e) {
if (!mounted) return;
_showError(e);
}
}
Future<void> _resetPassword(UserAdmin user) async {
final confirmed = await _confirm(
context,
@@ -252,6 +272,7 @@ class _AdminUsersPanelState extends ConsumerState<AdminUsersPanel> {
itemBuilder: (ctx, i) => _UserTile(
user: _users[i],
onChangeRole: () => _changeRole(_users[i]),
onTogglePremium: () => _togglePremium(_users[i]),
onResetPassword: () => _resetPassword(_users[i]),
onDelete: () => _deleteUser(_users[i]),
),
@@ -295,12 +316,14 @@ class _AdminUsersPanelState extends ConsumerState<AdminUsersPanel> {
class _UserTile extends StatelessWidget {
final UserAdmin user;
final VoidCallback onChangeRole;
final VoidCallback onTogglePremium;
final VoidCallback onResetPassword;
final VoidCallback onDelete;
const _UserTile({
required this.user,
required this.onChangeRole,
required this.onTogglePremium,
required this.onResetPassword,
required this.onDelete,
});
@@ -356,10 +379,16 @@ class _UserTile extends StatelessWidget {
switch (action) {
case 'role':
onChangeRole();
break;
case 'premium':
onTogglePremium();
break;
case 'reset':
onResetPassword();
break;
case 'delete':
onDelete();
break;
}
},
itemBuilder: (_) => [
@@ -369,6 +398,10 @@ class _UserTile extends StatelessWidget {
user.isAdmin ? 'Nedgradera till user' : 'Uppgradera till admin',
),
),
PopupMenuItem(
value: 'premium',
child: Text(user.isPremium ? 'Ta bort Premium' : 'Ge Premium'),
),
const PopupMenuItem(
value: 'reset',
child: Text('Återställ lösenord'),