Skip to content

Commit

Permalink
feat: admin rights support
Browse files Browse the repository at this point in the history
  • Loading branch information
TomBursch committed Dec 5, 2021
1 parent 57504d1 commit df3892c
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 14 deletions.
23 changes: 19 additions & 4 deletions lib/cubits/settings_user_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kitchenowl/cubits/auth_cubit.dart';
import 'package:kitchenowl/enums/update_enum.dart';
import 'package:kitchenowl/models/user.dart';
import 'package:kitchenowl/services/api/api_service.dart';

class SettingsUserCubit extends Cubit<SettingsUserState> {
final int userId;
SettingsUserCubit(this.userId) : super(const SettingsUserState(null)) {
SettingsUserCubit(this.userId)
: super(const SettingsUserState(null, false, UpdateEnum.unchanged)) {
refresh();
}

Expand All @@ -18,7 +20,7 @@ class SettingsUserCubit extends Cubit<SettingsUserState> {
} else {
user = await ApiService.getInstance().getUser();
}
emit(SettingsUserState(user));
emit(state.copyWith(user: user, setAdmin: user?.admin));
}

Future<void> updateUser({
Expand All @@ -33,6 +35,7 @@ class SettingsUserCubit extends Cubit<SettingsUserState> {
userId,
name: name,
password: password,
admin: (state.setAdmin != state.user.admin) ? state.setAdmin : null,
);
} else {
res = await ApiService.getInstance().updateUser(
Expand All @@ -41,6 +44,7 @@ class SettingsUserCubit extends Cubit<SettingsUserState> {
);
}
if (res) {
emit(state.copyWith(updateState: UpdateEnum.updated));
if (userId == null &&
context != null &&
BlocProvider.of<AuthCubit>(context) != null) {
Expand All @@ -49,13 +53,24 @@ class SettingsUserCubit extends Cubit<SettingsUserState> {
await refresh();
}
}

void setAdmin(bool newAdmin) {
emit(state.copyWith(setAdmin: newAdmin));
}
}

class SettingsUserState extends Equatable {
final User user;
final bool setAdmin;
final UpdateEnum updateState;

const SettingsUserState(this.user);
const SettingsUserState(this.user, this.setAdmin, this.updateState);

@override
List<Object> get props => [user];
List<Object> get props => [user, setAdmin, updateState];

SettingsUserState copyWith(
{User user, bool setAdmin, UpdateEnum updateState}) =>
SettingsUserState(user ?? this.user, setAdmin ?? this.setAdmin,
updateState ?? this.updateState);
}
1 change: 1 addition & 0 deletions lib/l10n/app_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
},
"addRecipeToPlanner": "Zum Essensplan hinzufügen",
"address": "Adresse",
"admin": "Admin",
"appDescription": "KitchenOwl hilft dir dein Lebensmitteleinkauf zu erleichtern",
"appLegal": "2021 The KitchenOwl Authors",
"appTitle": "KitchenOwl",
Expand Down
1 change: 1 addition & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
},
"addRecipeToPlanner": "Add to meal plan",
"address": "Address",
"admin": "Admin",
"appDescription": "KitchenOwl helps you organize your grocery life.",
"appLegal": "2021 The KitchenOwl Authors",
"appTitle": "KitchenOwl",
Expand Down
8 changes: 7 additions & 1 deletion lib/models/user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class User extends Model {
final String username;
final String name;
final bool owner;
final bool admin;

final double balance;

Expand All @@ -13,6 +14,7 @@ class User extends Model {
this.name,
this.username,
this.owner = false,
this.admin = false,
this.balance = 0,
});

Expand All @@ -21,11 +23,12 @@ class User extends Model {
username: map['username'],
name: map['name'],
owner: map['owner'] ?? false,
admin: map['admin'] ?? false,
balance: map['expense_balance'] ?? 0,
);

@override
List<Object> get props => [id, name, username, owner, balance];
List<Object> get props => [id, name, username, owner, admin, balance];

@override
Map<String, dynamic> toJson() => {
Expand All @@ -38,6 +41,9 @@ class User extends Model {
"username": username,
"name": name,
"owner": owner,
"admin": admin,
"expense_balance": balance,
};

bool hasAdminRights() => admin || owner;
}
2 changes: 1 addition & 1 deletion lib/pages/home_page/profile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class ProfilePage extends StatelessWidget {
const SettingsUserPage())),
),
),
if (!isOffline && user.owner)
if (!isOffline && user.hasAdminRights())
Card(
child: ListTile(
title: Text(AppLocalizations.of(context).server),
Expand Down
18 changes: 12 additions & 6 deletions lib/pages/settings_server_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kitchenowl/cubits/auth_cubit.dart';
import 'package:kitchenowl/cubits/settings_cubit.dart';
import 'package:kitchenowl/cubits/settings_server_cubit.dart';
import 'package:kitchenowl/enums/update_enum.dart';
import 'package:kitchenowl/models/user.dart';
import 'package:kitchenowl/pages/settings/create_user_page.dart';
import 'package:kitchenowl/pages/settings_user_page.dart';
Expand Down Expand Up @@ -204,14 +205,19 @@ class _SettingsServerPageState extends State<SettingsServerPage> {
.id)
? ' (${AppLocalizations.of(context).you})'
: '')),
trailing: state.users[i].owner
trailing: state.users[i].hasAdminRights()
? const Icon(Icons.admin_panel_settings_rounded)
: null,
onTap: () =>
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => SettingsUserPage(
userId: state.users[i].id,
))),
onTap: () async {
final res = await Navigator.of(context)
.push<UpdateEnum>(MaterialPageRoute(
builder: (context) => SettingsUserPage(
userId: state.users[i].id,
)));
if (res == UpdateEnum.updated) {
cubit.refresh();
}
},
),
),
),
Expand Down
26 changes: 26 additions & 0 deletions lib/pages/settings_user_page.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:kitchenowl/cubits/settings_user_cubit.dart';
Expand Down Expand Up @@ -42,6 +43,9 @@ class _SettingsUserPageState extends State<SettingsUserPage> {
child: Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).user),
leading: BackButton(
onPressed: () => Navigator.of(context).pop(cubit.state.updateState),
),
),
body: Align(
alignment: Alignment.topCenter,
Expand Down Expand Up @@ -73,6 +77,28 @@ class _SettingsUserPageState extends State<SettingsUserPage> {
labelText: AppLocalizations.of(context).name,
),
),
if (cubit.userId != null)
BlocBuilder<SettingsUserCubit, SettingsUserState>(
bloc: cubit,
builder: (context, state) {
return ListTile(
title: Text(AppLocalizations.of(context).admin),
leading:
const Icon(Icons.admin_panel_settings_rounded),
contentPadding:
const EdgeInsets.only(left: 0, right: 0),
trailing: Transform.scale(
scale: 0.9,
child: CupertinoSwitch(
value: state.setAdmin,
activeColor:
Theme.of(context).colorScheme.secondary,
onChanged: cubit.setAdmin,
),
),
);
},
),
Padding(
padding: const EdgeInsets.only(top: 16, bottom: 8),
child: ElevatedButton(
Expand Down
5 changes: 3 additions & 2 deletions lib/services/api/user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,13 @@ extension UserApi on ApiService {
}

Future<bool> updateUserById(int userId,
{String name, String password}) async {
{String name, String password, bool admin}) async {
if (!isAuthenticated()) return null;

final body = {};
if (name != null) body['name'] = name;
if (password != null) body['name'] = password;
if (password != null) body['password'] = password;
if (admin != null) body['admin'] = admin;

final res = await post('/user/$userId', jsonEncode(body));
return res.statusCode == 200;
Expand Down

0 comments on commit df3892c

Please # to comment.