Vaani/lib/features/onboarding/view/callback_page.dart
Dr.Blank e23c0b6c5f
Some checks are pending
Flutter CI & Release / Test (push) Waiting to run
Flutter CI & Release / Build Android APKs (push) Blocked by required conditions
Flutter CI & Release / build_linux (push) Blocked by required conditions
Flutter CI & Release / Create GitHub Release (push) Blocked by required conditions
chore: run dart format
2026-01-10 16:51:05 +05:30

106 lines
3 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({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()],
),
),
);
}
}