import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:maxkey_flutter/maxkey/maxkey.dart'; import 'package:maxkey_flutter/maxkey/services/users.service.dart'; import 'package:maxkey_flutter/utils.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; part 'package:maxkey_flutter/pages/user_page/full_user_info_dialog.dart'; class UserPage extends StatelessWidget { const UserPage({super.key, this.user}); final MaxKeyUser? user; @override Widget build(BuildContext context) { final scheme = Theme.of(context).colorScheme; return Scaffold( appBar: AppBar(title: Text(AppLocalizations.of(context)!.userPageTitle)), body: SafeArea( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column(children: [ if (user != null) Ink( decoration: BoxDecoration( color: scheme.surfaceContainer, borderRadius: BorderRadius.circular(8.0), ), child: Padding( padding: const EdgeInsets.all(8.0), child: Column(children: [ _UserCard(user: user!), _UserPageButtonTile( title: AppLocalizations.of(context)!.userPageUserInfoBtn, trailing: const Icon(Icons.info), onTap: () async { final userInfo = await MaxKey.instance.usersService .getFullUserInfo(); if (userInfo == null) return; if (context.mounted) { showDialog( context: context, builder: (context) => _FullUserInfoDialog(userInfo: userInfo), ); } }, ), ]), ), ), const SizedBox(height: 8.0), _UserPageButtonTile( title: AppLocalizations.of(context)!.userPageSettingsBtn, trailing: const Icon(Icons.settings), onTap: () { context.push(RoutePath.settingsPage); }, ), const SizedBox(height: 8.0), const _LogoutBtn(), ]), ), ), ); } } class _LogoutBtn extends StatefulWidget { const _LogoutBtn({super.key}); @override State<_LogoutBtn> createState() => _LogoutBtnState(); } class _LogoutBtnState extends State<_LogoutBtn> { bool isLogouting = false; @override Widget build(BuildContext context) { return _UserPageButtonTile( title: AppLocalizations.of(context)!.userPageLogoutBtn, trailing: isLogouting ? const SizedBox( width: 18, height: 18, child: CircularProgressIndicator(strokeWidth: 2), ) : const Icon(Icons.logout), onTap: isLogouting ? null : () async { setState(() { isLogouting = true; }); await MaxKey.instance.authnService.logout(); setState(() { isLogouting = false; }); if (context.mounted) { Navigator.of(context).pop(); context.pushReplacement(RoutePath.loginPage); } }, ); } } class _UserPageButtonTile extends StatelessWidget { const _UserPageButtonTile({ super.key, required this.title, required this.trailing, this.onTap, }); final String title; final Widget trailing; final void Function()? onTap; @override Widget build(BuildContext context) { final scheme = Theme.of(context).colorScheme; return ListTile( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.0), ), tileColor: scheme.surfaceContainer, title: Text(title), trailing: trailing, onTap: onTap, ); } } class _UserCard extends StatelessWidget { const _UserCard({super.key, required this.user}); final MaxKeyUser user; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ ClipOval( child: user.picture == null ? Image.asset("assets/logo.jpg", width: 64, height: 64) : Image.memory(user.picture!, width: 64, height: 64), ), const SizedBox(width: 8), Expanded( child: Text( user.displayName, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600), ), ), ], ), ); } }