diff --git a/lib/globals.dart b/lib/globals.dart index 8a4dc17..d769391 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -5,6 +5,10 @@ import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:uuid/uuid.dart'; +import 'data/interfaces/connections_repo_intf.dart'; +import 'services/notifications_manager.dart'; +import 'services/timeline_manager.dart'; + final getIt = GetIt.instance; String randomId() => const Uuid().v4().toString(); @@ -83,3 +87,9 @@ Future showChooseOptions( }, ); } + +void clearCaches() { + getIt().clear(); + getIt().clear(); + getIt().clear(); +} diff --git a/lib/routes.dart b/lib/routes.dart index f70aa43..dd13911 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -36,6 +36,7 @@ class ScreenPaths { static String profile = '/profile'; static String notifications = '/notifications'; static String signin = '/signin'; + static String switchProfiles = '/switchProfiles'; static String signup = '/signup'; static String userProfile = '/user_profile'; static String userPosts = '/user_posts'; @@ -73,6 +74,11 @@ final appRouter = GoRouter( name: ScreenPaths.signin, builder: (context, state) => SignInScreen(), ), + GoRoute( + path: ScreenPaths.switchProfiles, + name: ScreenPaths.switchProfiles, + builder: (context, state) => SignInScreen(), + ), GoRoute( path: ScreenPaths.contacts, name: ScreenPaths.contacts, diff --git a/lib/screens/menus_screen.dart b/lib/screens/menus_screen.dart index 916d6d4..14f394c 100644 --- a/lib/screens/menus_screen.dart +++ b/lib/screens/menus_screen.dart @@ -2,11 +2,8 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../controls/app_bottom_nav_bar.dart'; -import '../data/interfaces/connections_repo_intf.dart'; import '../globals.dart'; import '../routes.dart'; -import '../services/notifications_manager.dart'; -import '../services/timeline_manager.dart'; class MenusScreen extends StatelessWidget { static const menuButtonWidth = 350.0; @@ -25,9 +22,7 @@ class MenusScreen extends StatelessWidget { final confirm = await showYesNoDialog( context, 'You want to clear all memory and disk cache data?'); if (confirm == true) { - getIt().clear(); - getIt().clear(); - getIt().clear(); + clearCaches(); } }), ]; diff --git a/lib/screens/profile_screen.dart b/lib/screens/profile_screen.dart index 771a9cb..d2f5ba7 100644 --- a/lib/screens/profile_screen.dart +++ b/lib/screens/profile_screen.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:relatica/controls/padding.dart'; +import 'package:relatica/routes.dart'; import '../controls/standard_appbar.dart'; import '../globals.dart'; @@ -41,7 +43,13 @@ class _ProfileScreenState extends State { await getIt().signOut(profile); } }, - child: const Text('Logout')) + child: const Text('Logout')), + const VerticalPadding(), + ElevatedButton( + onPressed: () async { + context.pushNamed(ScreenPaths.switchProfiles); + }, + child: const Text('Switch Profile')) ], ), ), diff --git a/lib/screens/sign_in.dart b/lib/screens/sign_in.dart index ae9df37..fe2025b 100644 --- a/lib/screens/sign_in.dart +++ b/lib/screens/sign_in.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:relatica/models/auth/basic_credentials.dart'; +import 'package:relatica/routes.dart'; import 'package:string_validator/string_validator.dart'; import '../controls/padding.dart'; @@ -22,18 +24,20 @@ class _SignInScreenState extends State { @override void initState() { super.initState(); - final profiles = getIt().loggedOutProfiles; - if (profiles.isEmpty) { - return; + final service = getIt(); + if (service.loggedIn) { + usernameController.text = service.currentProfile.username; + passwordController.text = + (service.currentProfile.credentials as BasicCredentials).password; + serverNameController.text = service.currentProfile.serverName; } - final credentials = profiles.first.credentials as BasicCredentials; - usernameController.text = credentials.username; - passwordController.text = credentials.password; - serverNameController.text = credentials.serverName; } @override Widget build(BuildContext context) { + final service = getIt(); + final loggedInProfiles = service.loggedInProfiles; + final loggedOutProfiles = service.loggedOutProfiles; return Scaffold( appBar: AppBar( title: const Text('Sign In'), @@ -127,6 +131,61 @@ class _SignInScreenState extends State { onPressed: () => _signIn(context), child: const Text('Signin'), ), + const VerticalPadding(), + const Text('Logged out:'), + Expanded( + flex: 1, + child: ListView.separated( + itemBuilder: (context, index) { + final p = loggedOutProfiles[index]; + return ListTile( + onTap: () { + setState(() { + serverNameController.text = p.serverName; + usernameController.text = p.username; + passwordController.text = + (p.credentials as BasicCredentials).password; + }); + }, + title: Text(p.handle), + subtitle: Text(p.id), + ); + }, + separatorBuilder: (_, __) => const Divider(), + itemCount: loggedOutProfiles.length, + ), + ), + const VerticalPadding(), + const Text('Logged in:'), + Expanded( + flex: 1, + child: ListView.separated( + itemBuilder: (context, index) { + final p = loggedInProfiles[index]; + final active = service.loggedIn + ? p.id == service.currentProfile.id + : false; + return ListTile( + onTap: () async { + await service.setActiveProfile(p); + if (mounted) { + clearCaches(); + context.goNamed(ScreenPaths.timelines); + } + }, + title: Text( + p.handle, + style: active + ? const TextStyle(fontWeight: FontWeight.bold) + : null, + ), + subtitle: Text(p.id), + ); + }, + separatorBuilder: (_, __) => const Divider(), + itemCount: loggedInProfiles.length, + ), + ), ], ), ), @@ -143,9 +202,13 @@ class _SignInScreenState extends State { serverName: serverNameController.text); final result = await getIt().signIn(creds); + if (!mounted) { + return; + } if (result.isFailure) { buildSnackbar(context, 'Error signing in: ${result.error}'); } + context.goNamed(ScreenPaths.timelines); } } }