[client] Allow nullable parameters in login page and password reset page

This commit is contained in:
Abhishek Shroff
2025-07-04 16:55:04 +05:30
parent a6c335661b
commit 01422daeff
5 changed files with 45 additions and 29 deletions
+4 -6
View File
@@ -105,10 +105,9 @@ class PhylumRouteInformationParser extends RouteInformationParser<PhylumRoute> {
}
if (segments[0] == 'reset_password') {
return SynchronousFuture(ResetPasswordRoute(
// TODO: Don't fallback to empty instance uri
instanceUri: Uri.tryParse(uri.queryParameters['instance'] ?? '') ?? Uri(),
email: uri.queryParameters['email'] ?? '',
token: uri.queryParameters['token'] ?? '',
instanceUrl: uri.queryParameters['instance'],
email: uri.queryParameters['email'],
token: uri.queryParameters['token'],
));
}
if (segments[0] == 'search') {
@@ -121,8 +120,7 @@ class PhylumRouteInformationParser extends RouteInformationParser<PhylumRoute> {
} else if (segments.length == 2) {
if (segments[0] == 'login' && segments[1] == 'token') {
return SynchronousFuture(TokenLoginRoute(
// TODO: Rename to instance
instanceUrl: uri.queryParameters['instance_url'] ?? '',
instanceUrl: uri.queryParameters['instance'] ?? '',
loginToken: uri.queryParameters['login_token'] ?? '',
));
}
+7 -7
View File
@@ -26,8 +26,8 @@ sealed class PhylumRoute {
}
class TokenLoginRoute extends PhylumRoute {
final String instanceUrl;
final String loginToken;
final String? instanceUrl;
final String? loginToken;
TokenLoginRoute({required this.instanceUrl, required this.loginToken});
@@ -44,18 +44,18 @@ class TokenLoginRoute extends PhylumRoute {
}
class ResetPasswordRoute extends PhylumRoute {
final Uri instanceUri;
final String email;
final String token;
final String? instanceUrl;
final String? email;
final String? token;
ResetPasswordRoute({required this.instanceUri, required this.email, required this.token});
ResetPasswordRoute({required this.instanceUrl, required this.email, required this.token});
@override
Uri get uri => Uri(path: '/reset_password');
@override
Widget buildPage(BuildContext context) => ResetPasswordPage(
instanceUrl: instanceUri,
instanceUrl: instanceUrl,
email: email,
token: token,
);
@@ -100,7 +100,10 @@ class _PasswordLoginFragmentState extends State<PasswordLoginFragment> {
if (token == null || !context.mounted) return;
Navigator.of(context).pop(false);
context.read<PhylumRouterDelegate>().go(ResetPasswordRoute(
instanceUri: widget.instanceConfig.url, email: _email, token: token));
instanceUrl: widget.instanceConfig.url.toString(),
email: _email,
token: token,
));
},
),
],
+20 -7
View File
@@ -14,9 +14,9 @@ import 'package:provider/provider.dart';
import 'package:uri/uri.dart';
class ResetPasswordPage extends StatefulWidget {
final Uri instanceUrl;
final String email;
final String token;
final String? instanceUrl;
final String? email;
final String? token;
const ResetPasswordPage({
super.key,
@@ -35,6 +35,18 @@ class _ResetPasswordPageState extends State<ResetPasswordPage> {
@override
Widget build(BuildContext context) {
if (widget.instanceUrl == null || widget.email == null || widget.token == null) {
return PhylumDialogScaffold(
child: Column(
children: [
const Text('Mising parameters'),
ElevatedButton(
child: Text('OK'),
onPressed: () => context.read<PhylumRouterDelegate>().go(ExplorerRouteHome()),
),
],
));
}
return PhylumDialogScaffold(
child: Column(
mainAxisSize: MainAxisSize.min,
@@ -85,11 +97,12 @@ class _ResetPasswordPageState extends State<ResetPasswordPage> {
void changePassword(
BuildContext context,
) async {
final builder = UriBuilder.fromUri(widget.instanceUrl);
final instanceUrl = Uri.parse(widget.instanceUrl!);
final builder = UriBuilder.fromUri(instanceUrl);
builder.path = '${builder.path}/api/v1/auth/reset-password';
final request = MultipartRequest('post', builder.build());
request.fields['email'] = widget.email;
request.fields['token'] = widget.token;
request.fields['email'] = widget.email!;
request.fields['token'] = widget.token!;
request.fields['password'] = _password;
final responseString = await sendRequest(context, 'Changing Password', request);
@@ -102,7 +115,7 @@ class _ResetPasswordPageState extends State<ResetPasswordPage> {
final response = BootstrapLoginResponse.fromResponse((jsonDecode(responseString) as Map).cast<String, dynamic>());
final account = await PhylumAccount.create(
serverUrl: widget.instanceUrl,
serverUrl: instanceUrl,
apiKey: response.apiKey!,
user: response.user,
);
+10 -8
View File
@@ -13,8 +13,8 @@ import 'package:uri/uri.dart';
import 'package:phylum/ui/app/dialog_scaffold.dart';
class TokenLoginPage extends StatefulWidget {
final String instanceUrl;
final String loginToken;
final String? instanceUrl;
final String? loginToken;
const TokenLoginPage({
super.key,
@@ -54,21 +54,23 @@ class _TokenLoginPageState extends State<TokenLoginPage> {
children: [
Text('Error: $error'),
ElevatedButton(
onPressed: () {
context.read<PhylumRouterDelegate>().go(ExplorerRouteHome());
},
child: Text('OK'))
onPressed: () => context.read<PhylumRouterDelegate>().go(ExplorerRouteHome()),
child: Text('OK'),
),
],
),
);
}
void performLogin(BuildContext context) async {
final instanceUrl = Uri.parse(widget.instanceUrl);
if (widget.instanceUrl == null || widget.loginToken == null) {
Future.microtask(() => setState(() => error = 'Missing Parameters'));
}
final instanceUrl = Uri.parse(widget.instanceUrl!);
final builder = UriBuilder.fromUri(instanceUrl);
builder.path = '${builder.path}/api/v1/auth/token/login';
final request = MultipartRequest('post', builder.build());
request.fields['login_token'] = widget.loginToken;
request.fields['login_token'] = widget.loginToken!;
try {
final response = await Client().send(request);