mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-18 15:53:32 +00:00
Support rudimentary account switching
This commit is contained in:
parent
bc42e6dc7a
commit
e0cd3ccaf5
5 changed files with 96 additions and 14 deletions
|
@ -5,6 +5,10 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:get_it/get_it.dart';
|
import 'package:get_it/get_it.dart';
|
||||||
import 'package:uuid/uuid.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;
|
final getIt = GetIt.instance;
|
||||||
|
|
||||||
String randomId() => const Uuid().v4().toString();
|
String randomId() => const Uuid().v4().toString();
|
||||||
|
@ -83,3 +87,9 @@ Future<String?> showChooseOptions(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clearCaches() {
|
||||||
|
getIt<TimelineManager>().clear();
|
||||||
|
getIt<IConnectionsRepo>().clear();
|
||||||
|
getIt<NotificationsManager>().clear();
|
||||||
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ class ScreenPaths {
|
||||||
static String profile = '/profile';
|
static String profile = '/profile';
|
||||||
static String notifications = '/notifications';
|
static String notifications = '/notifications';
|
||||||
static String signin = '/signin';
|
static String signin = '/signin';
|
||||||
|
static String switchProfiles = '/switchProfiles';
|
||||||
static String signup = '/signup';
|
static String signup = '/signup';
|
||||||
static String userProfile = '/user_profile';
|
static String userProfile = '/user_profile';
|
||||||
static String userPosts = '/user_posts';
|
static String userPosts = '/user_posts';
|
||||||
|
@ -73,6 +74,11 @@ final appRouter = GoRouter(
|
||||||
name: ScreenPaths.signin,
|
name: ScreenPaths.signin,
|
||||||
builder: (context, state) => SignInScreen(),
|
builder: (context, state) => SignInScreen(),
|
||||||
),
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: ScreenPaths.switchProfiles,
|
||||||
|
name: ScreenPaths.switchProfiles,
|
||||||
|
builder: (context, state) => SignInScreen(),
|
||||||
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: ScreenPaths.contacts,
|
path: ScreenPaths.contacts,
|
||||||
name: ScreenPaths.contacts,
|
name: ScreenPaths.contacts,
|
||||||
|
|
|
@ -2,11 +2,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
|
||||||
import '../controls/app_bottom_nav_bar.dart';
|
import '../controls/app_bottom_nav_bar.dart';
|
||||||
import '../data/interfaces/connections_repo_intf.dart';
|
|
||||||
import '../globals.dart';
|
import '../globals.dart';
|
||||||
import '../routes.dart';
|
import '../routes.dart';
|
||||||
import '../services/notifications_manager.dart';
|
|
||||||
import '../services/timeline_manager.dart';
|
|
||||||
|
|
||||||
class MenusScreen extends StatelessWidget {
|
class MenusScreen extends StatelessWidget {
|
||||||
static const menuButtonWidth = 350.0;
|
static const menuButtonWidth = 350.0;
|
||||||
|
@ -25,9 +22,7 @@ class MenusScreen extends StatelessWidget {
|
||||||
final confirm = await showYesNoDialog(
|
final confirm = await showYesNoDialog(
|
||||||
context, 'You want to clear all memory and disk cache data?');
|
context, 'You want to clear all memory and disk cache data?');
|
||||||
if (confirm == true) {
|
if (confirm == true) {
|
||||||
getIt<TimelineManager>().clear();
|
clearCaches();
|
||||||
getIt<IConnectionsRepo>().clear();
|
|
||||||
getIt<NotificationsManager>().clear();
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:relatica/controls/padding.dart';
|
import 'package:relatica/controls/padding.dart';
|
||||||
|
import 'package:relatica/routes.dart';
|
||||||
|
|
||||||
import '../controls/standard_appbar.dart';
|
import '../controls/standard_appbar.dart';
|
||||||
import '../globals.dart';
|
import '../globals.dart';
|
||||||
|
@ -41,7 +43,13 @@ class _ProfileScreenState extends State<ProfileScreen> {
|
||||||
await getIt<AccountsService>().signOut(profile);
|
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'))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:relatica/models/auth/basic_credentials.dart';
|
import 'package:relatica/models/auth/basic_credentials.dart';
|
||||||
|
import 'package:relatica/routes.dart';
|
||||||
import 'package:string_validator/string_validator.dart';
|
import 'package:string_validator/string_validator.dart';
|
||||||
|
|
||||||
import '../controls/padding.dart';
|
import '../controls/padding.dart';
|
||||||
|
@ -22,18 +24,20 @@ class _SignInScreenState extends State<SignInScreen> {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
final profiles = getIt<AccountsService>().loggedOutProfiles;
|
final service = getIt<AccountsService>();
|
||||||
if (profiles.isEmpty) {
|
if (service.loggedIn) {
|
||||||
return;
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final service = getIt<AccountsService>();
|
||||||
|
final loggedInProfiles = service.loggedInProfiles;
|
||||||
|
final loggedOutProfiles = service.loggedOutProfiles;
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('Sign In'),
|
title: const Text('Sign In'),
|
||||||
|
@ -127,6 +131,61 @@ class _SignInScreenState extends State<SignInScreen> {
|
||||||
onPressed: () => _signIn(context),
|
onPressed: () => _signIn(context),
|
||||||
child: const Text('Signin'),
|
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);
|
serverName: serverNameController.text);
|
||||||
|
|
||||||
final result = await getIt<AccountsService>().signIn(creds);
|
final result = await getIt<AccountsService>().signIn(creds);
|
||||||
|
if (!mounted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (result.isFailure) {
|
if (result.isFailure) {
|
||||||
buildSnackbar(context, 'Error signing in: ${result.error}');
|
buildSnackbar(context, 'Error signing in: ${result.error}');
|
||||||
}
|
}
|
||||||
|
context.goNamed(ScreenPaths.timelines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue