sneaky email verification fix

This commit is contained in:
Arseni
2026-02-05 02:54:13 +03:00
parent 0ce90eef21
commit 81ffdd4291
6 changed files with 266 additions and 81 deletions

View File

@@ -0,0 +1,111 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pshared/widgets/locale.dart';
import 'package:pweb/app/router/pages.dart';
import 'package:pweb/pages/errors/error.dart';
import 'package:pweb/pages/status/success.dart';
import 'package:pweb/pages/with_footer.dart';
import 'package:pweb/pages/verification/controller.dart';
import 'package:pweb/pages/verification/resend_dialog.dart';
import 'package:pweb/utils/snackbar.dart';
import 'package:pweb/widgets/error/snackbar.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class AccountVerificationContent extends StatefulWidget {
const AccountVerificationContent();
@override
State<AccountVerificationContent> createState() =>
AccountVerificationContentState();
}
class AccountVerificationContentState
extends State<AccountVerificationContent> {
Future<void> _resendVerificationEmail() async {
final controller = context.read<AccountVerificationController>();
if (controller.isResending) return;
final locs = AppLocalizations.of(context)!;
final email = await requestVerificationEmail(context, locs);
if (!mounted || email == null) return;
if (email.isEmpty) {
notifyUser(context, locs.errorEmailMissing);
return;
}
try {
await controller.resendVerificationEmail(email);
if (!mounted) return;
await notifyUser(context, locs.signupConfirmationResent(email));
} catch (e) {
if (!mounted) return;
await postNotifyUserOfErrorX(
context: context,
errorSituation: locs.signupConfirmationResendError,
exception: e,
);
}
}
@override
Widget build(BuildContext context) {
final locs = AppLocalizations.of(context)!;
final controller = context.watch<AccountVerificationController>();
final action = OutlinedButton.icon(
onPressed: () => navigateAndReplace(context, Pages.login),
icon: const Icon(Icons.login),
label: Text(locs.login),
);
Widget content;
if (controller.isLoading) {
content = const Center(child: CircularProgressIndicator());
} else if (controller.isSuccess) {
content = StatusPageSuccess(
successMessage: locs.accountVerified,
successDescription: locs.accountVerifiedDescription,
action: action,
);
} else {
content = exceptionToErrorPage(
context: context,
title: locs.verificationFailed,
errorMessage: locs.accountVerificationFailed,
exception:
controller.error ?? Exception(locs.accountVerificationFailed),
action: controller.canResend
? OutlinedButton.icon(
onPressed: controller.isResending
? null
: _resendVerificationEmail,
icon: controller.isResending
? const SizedBox(
width: 18,
height: 18,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Icon(Icons.mark_email_unread_outlined),
label: Text(locs.signupConfirmationResend),
)
: null,
);
}
return PageWithFooter(
appBar: AppBar(
title: Text(locs.verifyAccount),
centerTitle: true,
actions: [
const LocaleChangerDropdown(
availableLocales: AppLocalizations.supportedLocales,
),
],
),
child: content,
);
}
}