jld3103
1 year ago
4 changed files with 121 additions and 93 deletions
@ -0,0 +1,64 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:meta/meta.dart'; |
||||||
|
import 'package:neon/src/blocs/accounts.dart'; |
||||||
|
import 'package:neon/src/theme/dialog.dart'; |
||||||
|
import 'package:neon/src/widgets/account_tile.dart'; |
||||||
|
import 'package:provider/provider.dart'; |
||||||
|
|
||||||
|
@internal |
||||||
|
class NeonAccountSelectionDialog extends StatelessWidget { |
||||||
|
const NeonAccountSelectionDialog({ |
||||||
|
this.highlightActiveAccount = false, |
||||||
|
this.children, |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
final bool highlightActiveAccount; |
||||||
|
final List<Widget>? children; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(final BuildContext context) { |
||||||
|
final accountsBloc = Provider.of<AccountsBloc>(context, listen: false); |
||||||
|
final accounts = accountsBloc.accounts.value; |
||||||
|
final activeAccount = accountsBloc.activeAccount.value!; |
||||||
|
|
||||||
|
final sortedAccounts = List.of(accounts) |
||||||
|
..removeWhere((final account) => account.id == activeAccount.id) |
||||||
|
..insert(0, activeAccount); |
||||||
|
|
||||||
|
final tiles = sortedAccounts |
||||||
|
.map<Widget>( |
||||||
|
(final account) => NeonAccountTile( |
||||||
|
account: account, |
||||||
|
trailing: highlightActiveAccount && account.id == activeAccount.id ? const Icon(Icons.check_circle) : null, |
||||||
|
onTap: () { |
||||||
|
Navigator.of(context).pop(account); |
||||||
|
}, |
||||||
|
), |
||||||
|
) |
||||||
|
.toList(); |
||||||
|
if (highlightActiveAccount && accounts.length > 1) { |
||||||
|
tiles.insert(1, const Divider()); |
||||||
|
} |
||||||
|
|
||||||
|
final body = SingleChildScrollView( |
||||||
|
child: Column( |
||||||
|
mainAxisSize: MainAxisSize.min, |
||||||
|
children: [ |
||||||
|
...tiles, |
||||||
|
...?children, |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
return Dialog( |
||||||
|
child: IntrinsicHeight( |
||||||
|
child: Container( |
||||||
|
padding: const EdgeInsets.all(24), |
||||||
|
constraints: NeonDialogTheme.of(context).constraints, |
||||||
|
child: body, |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -1,92 +0,0 @@ |
|||||||
import 'package:flutter/material.dart'; |
|
||||||
import 'package:meta/meta.dart'; |
|
||||||
import 'package:neon/l10n/localizations.dart'; |
|
||||||
import 'package:neon/src/blocs/accounts.dart'; |
|
||||||
import 'package:neon/src/pages/settings.dart'; |
|
||||||
import 'package:neon/src/router.dart'; |
|
||||||
import 'package:neon/src/theme/dialog.dart'; |
|
||||||
import 'package:neon/src/widgets/account_tile.dart'; |
|
||||||
import 'package:neon/src/widgets/user_avatar.dart'; |
|
||||||
import 'package:provider/provider.dart'; |
|
||||||
|
|
||||||
@internal |
|
||||||
class AccountSwitcherButton extends StatelessWidget { |
|
||||||
const AccountSwitcherButton({ |
|
||||||
super.key, |
|
||||||
}); |
|
||||||
|
|
||||||
Future<void> _onPressed(final BuildContext context) async { |
|
||||||
final accountsBloc = Provider.of<AccountsBloc>(context, listen: false); |
|
||||||
final accounts = accountsBloc.accounts.value; |
|
||||||
final aa = accountsBloc.activeAccount.value!; |
|
||||||
|
|
||||||
await showDialog( |
|
||||||
context: context, |
|
||||||
builder: (final context) { |
|
||||||
final body = Column( |
|
||||||
children: [ |
|
||||||
NeonAccountTile( |
|
||||||
account: aa, |
|
||||||
trailing: const Icon(Icons.check_circle), |
|
||||||
onTap: Navigator.of(context).pop, |
|
||||||
), |
|
||||||
const Divider(), |
|
||||||
if (accounts.length > 1) |
|
||||||
Builder( |
|
||||||
builder: (final context) { |
|
||||||
final inactiveAccounts = List.of(accounts)..removeWhere((final account) => (account.id == aa.id)); |
|
||||||
final tiles = inactiveAccounts.map( |
|
||||||
(final account) => NeonAccountTile( |
|
||||||
account: account, |
|
||||||
onTap: () { |
|
||||||
accountsBloc.setActiveAccount(account); |
|
||||||
Navigator.of(context).pop(); |
|
||||||
}, |
|
||||||
), |
|
||||||
); |
|
||||||
|
|
||||||
return SingleChildScrollView( |
|
||||||
child: ListBody( |
|
||||||
children: tiles.toList(), |
|
||||||
), |
|
||||||
); |
|
||||||
}, |
|
||||||
), |
|
||||||
ListTile( |
|
||||||
leading: const Icon(Icons.settings), |
|
||||||
title: Text(AppLocalizations.of(context).settingsAccountManage), |
|
||||||
onTap: () { |
|
||||||
Navigator.of(context).pop(); |
|
||||||
const SettingsRoute(initialCategory: SettingsCageories.accounts).push(context); |
|
||||||
}, |
|
||||||
), |
|
||||||
], |
|
||||||
); |
|
||||||
|
|
||||||
return Dialog( |
|
||||||
child: IntrinsicHeight( |
|
||||||
child: Container( |
|
||||||
padding: const EdgeInsets.all(24), |
|
||||||
constraints: NeonDialogTheme.of(context).constraints, |
|
||||||
child: body, |
|
||||||
), |
|
||||||
), |
|
||||||
); |
|
||||||
}, |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
@override |
|
||||||
Widget build(final BuildContext context) { |
|
||||||
final accountsBloc = Provider.of<AccountsBloc>(context, listen: false); |
|
||||||
final account = accountsBloc.activeAccount.value!; |
|
||||||
|
|
||||||
return IconButton( |
|
||||||
onPressed: () async => _onPressed(context), |
|
||||||
tooltip: AppLocalizations.of(context).settingsAccount, |
|
||||||
icon: NeonUserAvatar( |
|
||||||
account: account, |
|
||||||
), |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,56 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:meta/meta.dart'; |
||||||
|
import 'package:neon/l10n/localizations.dart'; |
||||||
|
import 'package:neon/src/blocs/accounts.dart'; |
||||||
|
import 'package:neon/src/models/account.dart'; |
||||||
|
import 'package:neon/src/pages/settings.dart'; |
||||||
|
import 'package:neon/src/router.dart'; |
||||||
|
import 'package:neon/src/widgets/account_selection_dialog.dart'; |
||||||
|
import 'package:neon/src/widgets/user_avatar.dart'; |
||||||
|
import 'package:provider/provider.dart'; |
||||||
|
|
||||||
|
@internal |
||||||
|
class AccountSwitcherButton extends StatelessWidget { |
||||||
|
const AccountSwitcherButton({ |
||||||
|
super.key, |
||||||
|
}); |
||||||
|
|
||||||
|
Future<void> _onPressed(final BuildContext context) async { |
||||||
|
final accountsBloc = Provider.of<AccountsBloc>(context, listen: false); |
||||||
|
|
||||||
|
final account = await showDialog<Account>( |
||||||
|
context: context, |
||||||
|
builder: (final context) => NeonAccountSelectionDialog( |
||||||
|
highlightActiveAccount: true, |
||||||
|
children: [ |
||||||
|
ListTile( |
||||||
|
leading: const Icon(Icons.settings), |
||||||
|
title: Text(AppLocalizations.of(context).settingsAccountManage), |
||||||
|
onTap: () { |
||||||
|
Navigator.of(context).pop(); |
||||||
|
const SettingsRoute(initialCategory: SettingsCageories.accounts).push(context); |
||||||
|
}, |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
if (account != null) { |
||||||
|
accountsBloc.setActiveAccount(account); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(final BuildContext context) { |
||||||
|
final accountsBloc = Provider.of<AccountsBloc>(context, listen: false); |
||||||
|
final account = accountsBloc.activeAccount.value!; |
||||||
|
|
||||||
|
return IconButton( |
||||||
|
onPressed: () async => _onPressed(context), |
||||||
|
tooltip: AppLocalizations.of(context).settingsAccount, |
||||||
|
icon: NeonUserAvatar( |
||||||
|
account: account, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue