Vaani/lib/features/onboarding/view/callback_page.dart

121 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:vaani/features/onboarding/providers/oauth_provider.dart';
import 'package:vaani/features/onboarding/view/user_login_with_password.dart';
import 'package:vaani/models/error_response.dart';
import 'package:vaani/router/router.dart';
class CallbackPage extends HookConsumerWidget {
CallbackPage({super.key, this.state, this.code});
final String? state;
final String? code;
final serverErrorResponse = ErrorResponseHandler();
@override
Widget build(BuildContext context, WidgetRef ref) {
if (state == null || code == null) {
return _SomethingWentWrong(
message:
'OAuth callback missing state or code\nGot: State: $state, Code: $code',
);
}
final flows = ref.read(oauthFlowsProvider);
// check if the state is in the flows
if (!flows.containsKey(state)) {
return const _SomethingWentWrong(
message: 'State not found',
);
}
// get the token
final loginAuthToken = ref.watch(
loginInExchangeForCodeProvider(
oauthState: state!,
code: code!,
responseHandler: serverErrorResponse,
),
);
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Contacting server...\nPlease wait\n\nGot:'
'\nState: $state\nCode: $code'),
loginAuthToken.when(
data: (authenticationToken) {
if (authenticationToken == null) {
handleServerError(
context,
serverErrorResponse,
);
return const BackToLoginButton();
}
return Text('Token: $authenticationToken');
},
loading: () => const CircularProgressIndicator(),
error: (error, _) {
handleServerError(
context,
serverErrorResponse,
e: error,
);
return Column(
children: [
Text('Error with OAuth flow: $error'),
const BackToLoginButton(),
],
);
},
),
],
),
),
);
}
}
class BackToLoginButton extends StatelessWidget {
const BackToLoginButton({
super.key,
});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
GoRouter.of(context).goNamed(Routes.onboarding.name);
},
child: const Text('Return to login'),
);
}
}
class _SomethingWentWrong extends StatelessWidget {
const _SomethingWentWrong({
super.key,
this.message = 'Error with OAuth flow',
});
final String message;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(message),
const BackToLoginButton(),
],
),
),
);
}
}