nc-photos/lib/widget/account_picker_dialog.dart
2021-04-17 17:07:41 +08:00

116 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:nc_photos/account.dart';
import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/pref.dart';
import 'package:nc_photos/snack_bar_manager.dart';
import 'package:nc_photos/theme.dart';
import 'package:nc_photos/widget/home.dart';
import 'package:nc_photos/widget/sign_in.dart';
class AccountPickerDialog extends StatefulWidget {
AccountPickerDialog({
Key key,
@required this.account,
}) : super(key: key);
@override
createState() => _AccountPickerDialogState();
final Account account;
}
class _AccountPickerDialogState extends State<AccountPickerDialog> {
@override
initState() {
super.initState();
_accounts = Pref.inst().getAccounts([]);
}
@override
build(BuildContext context) {
final otherAccountOptions = _accounts
.where((a) => a != widget.account)
.map((a) => SimpleDialogOption(
onPressed: () => _onItemPressed(a),
child: ListTile(
title: Text(a.url),
subtitle: Text(a.username),
trailing: IconButton(
icon: Icon(
Icons.close,
color: AppTheme.getSecondaryTextColor(context),
),
onPressed: () => _onRemoveItemPressed(a)),
),
))
.toList();
final addAccountOptions = [
SimpleDialogOption(
onPressed: () {
Navigator.of(context)
..pop()
..pushNamed(SignIn.routeName);
},
child: Tooltip(
message: AppLocalizations.of(context).addServerTooltip,
child: Center(
child: Icon(
Icons.add,
color: AppTheme.getSecondaryTextColor(context),
),
),
),
),
];
return SimpleDialog(
title: ListTile(
title: Text(
widget.account.url,
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Text(
widget.account.username,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
children: otherAccountOptions + addAccountOptions,
);
}
void _onItemPressed(Account account) {
Pref.inst().setCurrentAccountIndex(_accounts.indexOf(account));
Navigator.of(context).pushNamedAndRemoveUntil(Home.routeName, (_) => false,
arguments: HomeArguments(account));
}
void _onRemoveItemPressed(Account account) {
_removeAccount(account);
setState(() {
_accounts = Pref.inst().getAccounts([]);
});
SnackBarManager().showSnackBar(SnackBar(
content: Text(AppLocalizations.of(context)
.removeServerSuccessNotification(account.url)),
duration: k.snackBarDurationNormal,
));
}
void _removeAccount(Account account) {
final currentAccounts = Pref.inst().getAccounts([]);
final currentAccount =
currentAccounts[Pref.inst().getCurrentAccountIndex()];
final newAccounts =
currentAccounts.where((element) => element != account).toList();
final newAccountIndex = newAccounts.indexOf(currentAccount);
if (newAccountIndex == -1) {
throw StateError("Active account not found in resulting account list");
}
Pref.inst()
..setAccounts(newAccounts)
..setCurrentAccountIndex(newAccountIndex);
}
List<Account> _accounts;
}