Support rudimentary account switching

codemagic-setup
Hank Grabowski 2023-02-27 15:39:02 -05:00
rodzic bc42e6dc7a
commit e0cd3ccaf5
5 zmienionych plików z 96 dodań i 14 usunięć

Wyświetl plik

@ -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<String?> showChooseOptions(
},
);
}
void clearCaches() {
getIt<TimelineManager>().clear();
getIt<IConnectionsRepo>().clear();
getIt<NotificationsManager>().clear();
}

Wyświetl plik

@ -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,

Wyświetl plik

@ -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<TimelineManager>().clear();
getIt<IConnectionsRepo>().clear();
getIt<NotificationsManager>().clear();
clearCaches();
}
}),
];

Wyświetl plik

@ -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<ProfileScreen> {
await getIt<AccountsService>().signOut(profile);
}
},
child: const Text('Logout'))
child: const Text('Logout')),
const VerticalPadding(),
ElevatedButton(
onPressed: () async {
context.pushNamed(ScreenPaths.switchProfiles);
},
child: const Text('Switch Profile'))
],
),
),

Wyświetl plik

@ -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<SignInScreen> {
@override
void initState() {
super.initState();
final profiles = getIt<AccountsService>().loggedOutProfiles;
if (profiles.isEmpty) {
return;
final service = getIt<AccountsService>();
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<AccountsService>();
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<SignInScreen> {
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<SignInScreen> {
serverName: serverNameController.text);
final result = await getIt<AccountsService>().signIn(creds);
if (!mounted) {
return;
}
if (result.isFailure) {
buildSnackbar(context, 'Error signing in: ${result.error}');
}
context.goNamed(ScreenPaths.timelines);
}
}
}